@mnaoumov/typescript-dev-toolkit 3.2.0 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/sync-upstreams.mjs +8 -0
- package/dist/lib/cjs/index.cjs +7 -1
- package/dist/lib/cjs/index.d.cts +2 -0
- package/dist/lib/cjs/library-build.cjs +8 -2
- package/dist/lib/cjs/library-build.d.cts +7 -0
- package/dist/lib/cjs/upstream-sync-cli.cjs +113 -0
- package/dist/lib/cjs/upstream-sync-cli.d.cts +34 -0
- package/dist/lib/cjs/upstream-sync.cjs +294 -0
- package/dist/lib/cjs/upstream-sync.d.cts +235 -0
- package/dist/lib/esm/index.d.mts +2 -0
- package/dist/lib/esm/index.mjs +5 -1
- package/dist/lib/esm/library-build.d.mts +7 -0
- package/dist/lib/esm/library-build.mjs +8 -2
- package/dist/lib/esm/upstream-sync-cli.d.mts +34 -0
- package/dist/lib/esm/upstream-sync-cli.mjs +77 -0
- package/dist/lib/esm/upstream-sync.d.mts +235 -0
- package/dist/lib/esm/upstream-sync.mjs +268 -0
- package/package.json +5 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// The `sync-upstreams` command. The logic lives in `src/upstream-sync-cli.ts`, built into `dist/`.
|
|
4
|
+
import process from 'node:process';
|
|
5
|
+
|
|
6
|
+
import { runSyncUpstreamsCli } from '../dist/lib/esm/upstream-sync-cli.mjs';
|
|
7
|
+
|
|
8
|
+
process.exitCode = await runSyncUpstreamsCli(process.argv.slice(2));
|
package/dist/lib/cjs/index.cjs
CHANGED
|
@@ -63,6 +63,8 @@ __export(index_exports, {
|
|
|
63
63
|
root: () => root,
|
|
64
64
|
"shared-config-files": () => shared_config_files,
|
|
65
65
|
"test-runners": () => test_runners,
|
|
66
|
+
"upstream-sync": () => upstream_sync,
|
|
67
|
+
"upstream-sync-cli": () => upstream_sync_cli,
|
|
66
68
|
"validate-declarations": () => validate_declarations,
|
|
67
69
|
version: () => version
|
|
68
70
|
});
|
|
@@ -97,6 +99,8 @@ var repo_paths = __toESM(((module) => module && module.__esModule && 'default' i
|
|
|
97
99
|
var root = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./root.cjs')), 1);
|
|
98
100
|
var shared_config_files = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./shared-config-files.cjs')), 1);
|
|
99
101
|
var test_runners = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./test-runners/index.cjs')), 1);
|
|
102
|
+
var upstream_sync_cli = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./upstream-sync-cli.cjs')), 1);
|
|
103
|
+
var upstream_sync = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./upstream-sync.cjs')), 1);
|
|
100
104
|
var validate_declarations = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./validate-declarations.cjs')), 1);
|
|
101
105
|
var version = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./version.cjs')), 1);
|
|
102
106
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -131,7 +135,9 @@ var version = __toESM(((module) => module && module.__esModule && 'default' in m
|
|
|
131
135
|
root,
|
|
132
136
|
"shared-config-files": null,
|
|
133
137
|
"test-runners": null,
|
|
138
|
+
"upstream-sync": null,
|
|
139
|
+
"upstream-sync-cli": null,
|
|
134
140
|
"validate-declarations": null,
|
|
135
141
|
version
|
|
136
142
|
});
|
|
137
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ2J1aWxkJyBmcm9tICcuL2J1aWxkLnRzJztcbmV4cG9ydCAqIGFzICdidW5kbGVycycgZnJvbSAnLi9idW5kbGVycy9pbmRleC50cyc7XG5leHBvcnQgKiBhcyAnY2hlY2stcHJvamVjdC10eXBlcycgZnJvbSAnLi9jaGVjay1wcm9qZWN0LXR5cGVzLnRzJztcbmV4cG9ydCAqIGFzICdjbGktdXRpbHMnIGZyb20gJy4vY2xpLXV0aWxzLnRzJztcbmV4cG9ydCAqIGFzICdjb2RlLWdlbmVyYXRvcicgZnJvbSAnLi9jb2RlLWdlbmVyYXRvci50cyc7XG5leHBvcnQgKiBhcyAnY29tbWl0bGludC1jb25maWcnIGZyb20gJy4vY29tbWl0bGludC1jb25maWcudHMnO1xuZXhwb3J0ICogYXMgJ2NvbW1pdGxpbnQtZm9yYmlkZGVuLXBhdHRlcm5zJyBmcm9tICcuL2NvbW1pdGxpbnQtZm9yYmlkZGVuLXBhdHRlcm5zLnRzJztcbmV4cG9ydCAqIGFzICdjb21taXRsaW50LXNwZWxsY2hlY2staGVhZGVyJyBmcm9tICcuL2NvbW1pdGxpbnQtc3BlbGxjaGVjay1oZWFkZXIudHMnO1xuZXhwb3J0ICogYXMgJ2RvY3Mtc2l0ZScgZnJvbSAnLi9kb2NzLXNpdGUvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ2Vudi10b2dnbGUnIGZyb20gJy4vZW52LXRvZ2dsZS50cyc7XG5leHBvcnQgKiBhcyAnZXhlYycgZnJvbSAnLi9leGVjLnRzJztcbmV4cG9ydCAqIGFzICdmb3JiaWRkZW4tcGF0dGVybnMnIGZyb20gJy4vZm9yYmlkZGVuLXBhdHRlcm5zLnRzJztcbmV4cG9ydCAqIGFzICdmb3JtYXR0ZXJzJyBmcm9tICcuL2Zvcm1hdHRlcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ2ZzJyBmcm9tICcuL2ZzLnRzJztcbmV4cG9ydCAqIGFzICdnYXRlJyBmcm9tICcuL2dhdGUudHMnO1xuZXhwb3J0ICogYXMgJ2dpdCcgZnJvbSAnLi9naXQudHMnO1xuZXhwb3J0ICogYXMgJ2pzb24nIGZyb20gJy4vanNvbi50cyc7XG5leHBvcnQgKiBhcyAnbGlicmFyeS1idWlsZCcgZnJvbSAnLi9saWJyYXJ5LWJ1aWxkLnRzJztcbmV4cG9ydCAqIGFzICdsaW50ZXJzJyBmcm9tICcuL2xpbnRlcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ25hbm8tc3RhZ2VkLWNvbmZpZycgZnJvbSAnLi9uYW5vLXN0YWdlZC1jb25maWcudHMnO1xuZXhwb3J0ICogYXMgJ25wbS1wdWJsaXNoJyBmcm9tICcuL25wbS1wdWJsaXNoLnRzJztcbmV4cG9ydCAqIGFzICducG0tcnVuJyBmcm9tICcuL25wbS1ydW4udHMnO1xuZXhwb3J0ICogYXMgJ25wbScgZnJvbSAnLi9ucG0udHMnO1xuZXhwb3J0ICogYXMgJ3BhY2thZ2UtbG9jay1pbnRlZ3JpdHknIGZyb20gJy4vcGFja2FnZS1sb2NrLWludGVncml0eS50cyc7XG5leHBvcnQgKiBhcyAncGFja2FnZS1tYW5hZ2VyJyBmcm9tICcuL3BhY2thZ2UtbWFuYWdlci50cyc7XG5leHBvcnQgKiBhcyAncmVsZWFzZWQtaXNzdWVzJyBmcm9tICcuL3JlbGVhc2VkLWlzc3Vlcy50cyc7XG5leHBvcnQgKiBhcyAncmVwby1wYXRocycgZnJvbSAnLi9yZXBvLXBhdGhzLnRzJztcbmV4cG9ydCAqIGFzICdyb290JyBmcm9tICcuL3Jvb3QudHMnO1xuZXhwb3J0ICogYXMgJ3NoYXJlZC1jb25maWctZmlsZXMnIGZyb20gJy4vc2hhcmVkLWNvbmZpZy1maWxlcy50cyc7XG5leHBvcnQgKiBhcyAndGVzdC1ydW5uZXJzJyBmcm9tICcuL3Rlc3QtcnVubmVycy9pbmRleC50cyc7XG5leHBvcnQgKiBhcyAndXBzdHJlYW0tc3luYy1jbGknIGZyb20gJy4vdXBzdHJlYW0tc3luYy1jbGkudHMnO1xuZXhwb3J0ICogYXMgJ3Vwc3RyZWFtLXN5bmMnIGZyb20gJy4vdXBzdHJlYW0tc3luYy50cyc7XG5leHBvcnQgKiBhcyAndmFsaWRhdGUtZGVjbGFyYXRpb25zJyBmcm9tICcuL3ZhbGlkYXRlLWRlY2xhcmF0aW9ucy50cyc7XG5leHBvcnQgKiBhcyAndmVyc2lvbicgZnJvbSAnLi92ZXJzaW9uLnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsK0JBQUFBO0FBQUEsRUFBQSxtQkFBQUM7QUFBQSxFQUFBLHdCQUFBQztBQUFBLEVBQUEsMkJBQUFDO0FBQUEsRUFBQSx1Q0FBQUM7QUFBQSxFQUFBLHNDQUFBQztBQUFBLEVBQUEsbUJBQUFDO0FBQUEsRUFBQSxvQkFBQUM7QUFBQSxFQUFBO0FBQUEsOEJBQUFDO0FBQUEsRUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEseUJBQUFDO0FBQUEsRUFBQTtBQUFBLDhCQUFBQztBQUFBLEVBQUE7QUFBQSx1QkFBQUM7QUFBQSxFQUFBLGlCQUFBQztBQUFBLEVBQUEsZ0NBQUFDO0FBQUEsRUFBQSx5QkFBQUM7QUFBQSxFQUFBLHlCQUFBQztBQUFBLEVBQUEsb0JBQUFDO0FBQUEsRUFBQTtBQUFBLCtCQUFBQztBQUFBLEVBQUEsc0JBQUFDO0FBQUEsRUFBQSx1QkFBQUM7QUFBQSxFQUFBLDJCQUFBQztBQUFBLEVBQUEsK0JBQUFDO0FBQUEsRUFBQTtBQUFBO0FBQUE7QUFFQSxZQUF5QjtBQUN6QixlQUE0QjtBQUM1QixJQUFBckIsc0JBQXVDO0FBQ3ZDLElBQUFDLFlBQTZCO0FBQzdCLElBQUFDLGlCQUFrQztBQUNsQyxJQUFBQyxvQkFBcUM7QUFDckMsSUFBQUMsZ0NBQWlEO0FBQ2pELElBQUFDLCtCQUFnRDtBQUNoRCxJQUFBQyxZQUE2QjtBQUM3QixJQUFBQyxhQUE4QjtBQUM5QixXQUF3QjtBQUN4QixJQUFBQyxxQkFBc0M7QUFDdEMsaUJBQThCO0FBQzlCLFNBQXNCO0FBQ3RCLFdBQXdCO0FBQ3hCLFVBQXVCO0FBQ3ZCLFdBQXdCO0FBQ3hCLElBQUFDLGdCQUFpQztBQUNqQyxjQUEyQjtBQUMzQixJQUFBQyxxQkFBc0M7QUFDdEMsSUFBQUMsY0FBK0I7QUFDL0IsSUFBQUMsVUFBMkI7QUFDM0IsVUFBdUI7QUFDdkIsSUFBQUMseUJBQTBDO0FBQzFDLElBQUFDLGtCQUFtQztBQUNuQyxJQUFBQyxrQkFBbUM7QUFDbkMsSUFBQUMsYUFBOEI7QUFDOUIsV0FBd0I7QUFDeEIsSUFBQUMsc0JBQXVDO0FBQ3ZDLElBQUFDLGVBQWdDO0FBQ2hDLElBQUFFLG9CQUFxQztBQUNyQyxJQUFBRCxnQkFBaUM7QUFDakMsSUFBQUUsd0JBQXlDO0FBQ3pDLGNBQTJCOyIsCiAgIm5hbWVzIjogWyJjaGVjay1wcm9qZWN0LXR5cGVzIiwgImNsaS11dGlscyIsICJjb2RlLWdlbmVyYXRvciIsICJjb21taXRsaW50LWNvbmZpZyIsICJjb21taXRsaW50LWZvcmJpZGRlbi1wYXR0ZXJucyIsICJjb21taXRsaW50LXNwZWxsY2hlY2staGVhZGVyIiwgImRvY3Mtc2l0ZSIsICJlbnYtdG9nZ2xlIiwgImZvcmJpZGRlbi1wYXR0ZXJucyIsICJsaWJyYXJ5LWJ1aWxkIiwgIm5hbm8tc3RhZ2VkLWNvbmZpZyIsICJucG0tcHVibGlzaCIsICJucG0tcnVuIiwgInBhY2thZ2UtbG9jay1pbnRlZ3JpdHkiLCAicGFja2FnZS1tYW5hZ2VyIiwgInJlbGVhc2VkLWlzc3VlcyIsICJyZXBvLXBhdGhzIiwgInNoYXJlZC1jb25maWctZmlsZXMiLCAidGVzdC1ydW5uZXJzIiwgInVwc3RyZWFtLXN5bmMiLCAidXBzdHJlYW0tc3luYy1jbGkiLCAidmFsaWRhdGUtZGVjbGFyYXRpb25zIl0KfQo=
|
package/dist/lib/cjs/index.d.cts
CHANGED
|
@@ -33,5 +33,7 @@ export * as 'repo-paths' from './repo-paths.cjs';
|
|
|
33
33
|
export * as 'root' from './root.cjs';
|
|
34
34
|
export * as 'shared-config-files' from './shared-config-files.cjs';
|
|
35
35
|
export * as 'test-runners' from './test-runners/index.cjs';
|
|
36
|
+
export * as 'upstream-sync-cli' from './upstream-sync-cli.cjs';
|
|
37
|
+
export * as 'upstream-sync' from './upstream-sync.cjs';
|
|
36
38
|
export * as 'validate-declarations' from './validate-declarations.cjs';
|
|
37
39
|
export * as 'version' from './version.cjs';
|
|
@@ -190,7 +190,7 @@ async function buildLibraryTypes() {
|
|
|
190
190
|
}
|
|
191
191
|
}
|
|
192
192
|
async function generateLibraryExports(options = {}) {
|
|
193
|
-
const { sourceCondition } = options;
|
|
193
|
+
const { additionalExports = {}, sourceCondition } = options;
|
|
194
194
|
const srcFolders = [import_repo_paths.RepoPaths.Src];
|
|
195
195
|
for (const dirent of await (0, import_fs.readdirPosix)(import_repo_paths.RepoPaths.Src, { recursive: true, withFileTypes: true })) {
|
|
196
196
|
if (!dirent.isDirectory()) {
|
|
@@ -212,6 +212,12 @@ async function generateLibraryExports(options = {}) {
|
|
|
212
212
|
await setExport({ exportConditions, isWildcard: false, sourceCondition, srcFolder });
|
|
213
213
|
await setExport({ exportConditions, isWildcard: true, sourceCondition, srcFolder });
|
|
214
214
|
}
|
|
215
|
+
for (const [subpath, entry] of Object.entries(additionalExports)) {
|
|
216
|
+
if (exportConditions[subpath] !== void 0) {
|
|
217
|
+
throw new Error(`The additional export '${subpath}' collides with an entry generated from a source folder.`);
|
|
218
|
+
}
|
|
219
|
+
exportConditions[subpath] = entry;
|
|
220
|
+
}
|
|
215
221
|
isChanged = !(0, import_object_utils.isDeepEqual)(oldExports, packageJson.exports);
|
|
216
222
|
});
|
|
217
223
|
if (isChanged) {
|
|
@@ -538,4 +544,4 @@ async function writeSubpathPackageJson(folder, packageJson) {
|
|
|
538
544
|
generateLibraryIndex,
|
|
539
545
|
runBuildSteps
|
|
540
546
|
});
|
|
541
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWJyYXJ5LWJ1aWxkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgYnVpbGQgcGlwZWxpbmUgb2YgYSBUeXBlU2NyaXB0IExJQlJBUlkgcGFja2FnZTogb25lIGBkaXN0L2xpYi97Y2pzLGVzbX1gIHRyZWUgb2YgdW5idW5kbGVkIG1vZHVsZXMgYmVzaWRlIGl0c1xuICogYC5kLmN0c2AgLyBgLmQubXRzYCBkZWNsYXJhdGlvbnMsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCBhbmQgdGhlIGdlbmVyYXRlZCBgcGFja2FnZS5qc29uYCBgZXhwb3J0c2AgbWFwLlxuICpcbiAqIEVhY2ggc3RlcCB3b3JrcyBvbiB0aGUgY3VycmVudCB3b3JraW5nIGZvbGRlciwgd2hpY2ggaXMgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQuIEEgcmVwb3NpdG9yeSdzXG4gKiBgc2NyaXB0cy9idWlsZC0qLnRzYCBlbnRyeSBwb2ludHMgYXJlIHRoaW4gYHdyYXBDbGlUYXNrYCB3cmFwcGVycyBhcm91bmQgdGhlc2UgZnVuY3Rpb25zLCBhbmQgaXRzIGBidWlsZGAgc2NyaXB0XG4gKiBydW5zIHRoZW0gaW4gb3JkZXIgdGhyb3VnaCB7QGxpbmsgcnVuQnVpbGRTdGVwc30uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZE9wdGlvbnMsXG4gIFBsdWdpblxufSBmcm9tICdlc2J1aWxkJztcbmltcG9ydCB0eXBlIHsgRGlyZW50IH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFN5bWJvbCBhcyBUc1N5bWJvbCxcbiAgVHlwZUNoZWNrZXJcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzeW5jTWFwIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGlzRGVlcEVxdWFsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgbm9ybWFsaXplSWZSZWxhdGl2ZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHsgY29udGV4dCB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtcbiAgcmVsYXRpdmUgYXMgcmVsYXRpdmVOYXRpdmUsXG4gIHJlc29sdmUgYXMgcmVzb2x2ZU5hdGl2ZVxufSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVByb2dyYW0sXG4gIGZvckVhY2hDaGlsZCxcbiAgaXNJZGVudGlmaWVyLFxuICBpc1N0cmluZ0xpdGVyYWwsXG4gIFN5bWJvbEZsYWdzXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuXG5pbXBvcnQgeyBidWlsZENsZWFuIH0gZnJvbSAnLi9idWlsZC50cyc7XG5pbXBvcnQgeyBjaGFuZ2VFeHRlbnNpb25QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9jaGFuZ2UtZXh0ZW5zaW9uLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBmaXhFc21QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9maXgtZXNtLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBwcmVwcm9jZXNzUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVycy9lc2J1aWxkLWltcGwvcHJlcHJvY2Vzcy1wbHVnaW4udHMnO1xuaW1wb3J0IHsgcGFyc2VUc0NvbmZpZyB9IGZyb20gJy4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gJy4vY29kZS1nZW5lcmF0b3IudHMnO1xuaW1wb3J0IHsgcmVhZGRpclBvc2l4IH0gZnJvbSAnLi9mcy50cyc7XG5pbXBvcnQgeyB3cml0ZUpzb24gfSBmcm9tICcuL2pzb24udHMnO1xuaW1wb3J0IHsgbnBtUnVuT3B0aW9uYWwgfSBmcm9tICcuL25wbS1ydW4udHMnO1xuaW1wb3J0IHsgZWRpdFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVRvb2xDb21tYW5kIH0gZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuaW1wb3J0IHsgUmVwb1BhdGhzIH0gZnJvbSAnLi9yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7IGV4ZWNGcm9tUm9vdCB9IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogVGhlIGJhbm5lciBldmVyeSBlbWl0dGVkIGxpYnJhcnkgbW9kdWxlIG9wZW5zIHdpdGguXG4gKi9cbmV4cG9ydCBjb25zdCBMSUJSQVJZX0JBTk5FUiA9IGAvKlxuVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgRVNCVUlMRFxuaWYgeW91IHdhbnQgdG8gdmlldyB0aGUgc291cmNlLCBwbGVhc2UgdmlzaXQgdGhlIGdpdGh1YiByZXBvc2l0b3J5IG9mIHRoaXMgcGx1Z2luXG4qL1xuYDtcblxuLyoqXG4gKiBUaGUgc3RlcHMgb2YgYSBsaWJyYXJ5IGJ1aWxkLCBpbiB0aGUgb3JkZXIge0BsaW5rIHJ1bkJ1aWxkU3RlcHN9IHJ1bnMgdGhlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IExJQlJBUllfQlVJTERfU1RFUFM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAnYnVpbGQ6Y2xlYW4nLFxuICAnYnVpbGQ6Z2VuZXJhdGUtaW5kZXgnLFxuICAnYnVpbGQ6Y29tcGlsZScsXG4gICdidWlsZDp0eXBlcycsXG4gICdidWlsZDp2YWxpZGF0ZS1kZWNsYXJhdGlvbnMnLFxuICAnYnVpbGQ6bGliJyxcbiAgJ2J1aWxkOmdlbmVyYXRlLWV4cG9ydHMnXG5dO1xuXG4vKipcbiAqIFRoZSBleHBvcnQgY29uZGl0aW9uIGEgcmVwb3NpdG9yeSBob2xkaW5nIHNldmVyYWwgcGFja2FnZXMgbWFwcyBldmVyeSBzdWJwYXRoIG9udG8gaXRzIFR5cGVTY3JpcHQgc291cmNlIHdpdGgsIHNvXG4gKiBhIHBhY2thZ2UgdGhlcmUgY2FuIGltcG9ydCBhIHNpYmxpbmcgcGFja2FnZSdzIHNvdXJjZSBiZWZvcmUgYW55dGhpbmcgaXMgYnVpbHQuIFBhc3MgaXQgdG9cbiAqIHtAbGluayBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzfSB0aHJvdWdoIHtAbGluayBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucy5zb3VyY2VDb25kaXRpb259LlxuICovXG5leHBvcnQgY29uc3QgU09VUkNFX0NPTkRJVElPTiA9ICdAbW5hb3Vtb3Yvc291cmNlJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgYnVpbGRMaWJyYXJ5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZExpYnJhcnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHByZXByb2Nlc3MgcGx1Z2luIGZvciBvbmUgb3V0cHV0IGZvcm1hdC4gRGVmYXVsdHMgdG8gdGhlIGdlbmVyaWMgb25lLCB3aGljaCBjYXJyaWVzIG5vXG4gICAqIGVudmlyb25tZW50LXNwZWNpZmljIGByZXF1aXJlYCBwYXRjaC5cbiAgICovXG4gIHJlYWRvbmx5IHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5PzogKGlzRXNtOiBib29sZWFuKSA9PiBQbHVnaW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdlbmVyYXRlTGlicmFyeUV4cG9ydHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlTGlicmFyeUV4cG9ydHNPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIGV4cG9ydCBjb25kaXRpb24gdG8gcHV0IGZpcnN0IGluIGV2ZXJ5IGVudHJ5LCBtYXBwaW5nIHRoZSBzdWJwYXRoIG9udG8gaXRzIFR5cGVTY3JpcHQgc291cmNlLiBPbmx5IGFcbiAgICogcmVwb3NpdG9yeSBob2xkaW5nIHNldmVyYWwgcGFja2FnZXMgdGhhdCBpbXBvcnQgZWFjaCBvdGhlciBuZWVkcyBvbmU7IG5vdGhpbmcgb3V0c2lkZSBpdCBzZXRzIHRoZSBjb25kaXRpb24sIGFuZFxuICAgKiB0aGUgc291cmNlcyBpdCBwb2ludHMgYXQgZG8gbm90IHNoaXAsIHNvIHRoZSBwdWJsaXNoIGhhcyB0byBzdHJpcCBpdCBhZ2Fpbi4gT21pdHRlZCwgdGhlIG1hcCBoYXMgbm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUNvbmRpdGlvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxudHlwZSBNb2R1bGVGb3JtYXQgPSAnY2pzJyB8ICdlc20nO1xuXG5jb25zdCBERUNMQVJBVElPTl9SRUZFUkVOQ0VfVFlQRVMgPSBuZXcgU2V0KFsnbm9kZSddKTtcblxuLy8gVGhlIGxpYnMgdGhhdCBkZXNjcmliZSBhIGhvc3QncyBnbG9iYWxzIHJhdGhlciB0aGFuIHRoZSBsYW5ndWFnZSwgd2hpY2ggY29uc3VtZXJzIGNvbmZsaWN0IG92ZXIuIEVhY2ggZGVjbGFyYXRpb25cbi8vIGdldHMgdGhlIG9uZXMgaXQgdXNlczsgZXZlcnkgb3RoZXIgbGliIGlzIHNoYXJlZCB0aHJvdWdoIGBsaWJyYXJ5LXJlZmVyZW5jZXNgLlxuY29uc3QgRU5WSVJPTk1FTlRfTElCX1BSRUZJWEVTOiByZWFkb25seSBzdHJpbmdbXSA9IFsnZG9tJywgJ3NjcmlwdGhvc3QnLCAnd2Vid29ya2VyJ107XG5jb25zdCBOT0RFX1RZUEVTX1BBVEhfU0VHTUVOVCA9ICcvbm9kZV9tb2R1bGVzL0B0eXBlcy9ub2RlLyc7XG5jb25zdCBMSUJfUkVQTEFDRU1FTlRfUkVHX0VYUCA9IC9cXC9ub2RlX21vZHVsZXNcXC9AdHlwZXNjcmlwdFxcL2xpYi0oPzxMaWI+W14vXSspXFwvKD88U3ViTGliPi4rKVxcLmRcXC50cyQvO1xuXG4vLyBUaGUgZGVjbGFyYXRpb24gdGhhdCBjYXJyaWVzIG9ubHkgdGhlIGBsaWJgIGFuZCBgdHlwZXNgIHJlZmVyZW5jZXMuIEV2ZXJ5IGRlY2xhcmF0aW9uIGJ1dCB0aGUgcm9vdCBvbmUgcmVmZXJlbmNlc1xuLy8gaXQsIHJhdGhlciB0aGFuIHRoZSByb290IGJhcnJlbCwgd2hpY2ggd291bGQgbG9hZCBldmVyeSBtb2R1bGUgb2YgdGhlIHBhY2thZ2UsIG9wdGlvbmFsIHBlZXJzJyB0eXBlcyBpbmNsdWRlZC5cbmNvbnN0IExJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUUgPSAnbGlicmFyeS1yZWZlcmVuY2VzJztcbi8vIFNwZWxsZWQgYXBhcnQgb24gcHVycG9zZToge0BsaW5rIGNvbGxlY3RBbGxMaWJzfSBzY2FucyBldmVyeSBzb3VyY2UgZmlsZSBvZiB0aGUgcGFja2FnZSBiZWluZyBidWlsdCBmb3IgdGhlXG4vLyBkaXJlY3RpdmUsIHRoaXMgb25lIGluY2x1ZGVkLCBzbyBhIGxpdGVyYWwgb25lIGhlcmUgd291bGQgYmUgcmVhZCBhcyBhIGxpYiB0aGlzIHBhY2thZ2UgbmVlZHMuXG5jb25zdCBSRUZFUkVOQ0VfTElCX0RJUkVDVElWRSA9IFsnPHJlZmVyZW5jZScsICdsaWI9J10uam9pbignICcpO1xuY29uc3QgUkVGRVJFTkNFX0xJQl9SRUdfRVhQID0gL1xcL1xcL1xcLyA8cmVmZXJlbmNlIGxpYj1cIig/PExpYj5bXlwiXSspXCIgXFwvPi9nbTtcblxuLy8gQSBiYXJlLXNwZWNpZmllciAobm9uLXJlbGF0aXZlKSB0eXBlLW9ubHkgaW1wb3J0LCBlLmcuIGBpbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO2AuXG5jb25zdCBCQVJFX1RZUEVfSU1QT1JUX1JFR19FWFAgPSAvXmltcG9ydCB0eXBlICg/PENsYXVzZT4uKz8pIGZyb20gJyg/PFNwZWNpZmllcj5bXi4nXVteJ10qKSc7JC9nbTtcblxuLy8gQSBiYXJlLXNwZWNpZmllciAobm9uLXJlbGF0aXZlKSBpbmxpbmUgaW1wb3J0IHR5cGUgbm9kZSwgZS5nLiBgaW1wb3J0KFwidHlwZS1mZXN0XCIpLlByb21pc2FibGVgLlxuY29uc3QgQkFSRV9JTkxJTkVfSU1QT1JUX1RZUEVfUkVHX0VYUCA9IC9pbXBvcnRcXChcIig/PFNwZWNpZmllcj5bXi5cIl1bXlwiXSopXCJcXCkvZztcblxuY29uc3QgU1RBVElDX0lNUE9SVF9SRUdfRVhQID0gL2Zyb20gJyg/PEltcG9ydFBhdGg+Lis/KVxcLnRzJzsvZ207XG5cbi8vIElubGluZSBpbXBvcnQtdHlwZSBub2RlcyAoYHR5cGVvZiBpbXBvcnQoJy4vZm9vLnRzJylgKSBwcmVzZXJ2ZSB0aGUgc291cmNlIHF1b3RlIHN0eWxlLlxuLy8gSGFuZC1hdXRob3JlZCBgLmQudHNgIGZpbGVzIGVtaXQgc2luZ2xlIHF1b3RlczsgdHNjLWdlbmVyYXRlZCBkZWNsYXJhdGlvbnMgZW1pdCBkb3VibGUgcXVvdGVzLlxuLy8gQ2FwdHVyZSB0aGUgcXVvdGUgYW5kIHJldXNlIGl0IGluIHRoZSByZXBsYWNlbWVudCBzbyBib3RoIHN0eWxlcyBhcmUgcmV3cml0dGVuLlxuY29uc3QgRFlOQU1JQ19JTVBPUlRfUkVHX0VYUCA9IC9pbXBvcnRcXCgoPzxRdW90ZT5bJ1wiXSkoPzxJbXBvcnRQYXRoPi4rPylcXC50c1xcazxRdW90ZT5cXCkvZ207XG5cbmVudW0gR2VuZXJhdGVJbmRleFJlc3VsdCB7XG4gIFNraXBwZWQgPSAnc2tpcHBlZCcsXG4gIFN1Y2Nlc3MgPSAnc3VjY2Vzcydcbn1cblxuaW50ZXJmYWNlIEFkZEVudmlyb25tZW50R2xvYmFsc1BhcmFtcyB7XG4gIHJlYWRvbmx5IGxpYnM6IFNldDxzdHJpbmc+O1xuICByZWFkb25seSBwcm9ncmFtOiBQcm9ncmFtO1xuICByZWFkb25seSBzeW1ib2w6IFRzU3ltYm9sO1xuICByZWFkb25seSB0eXBlczogU2V0PHN0cmluZz47XG59XG5cbmludGVyZmFjZSBCdWlsZExpYnJhcnlGb3JtYXRQYXJhbXMge1xuICByZWFkb25seSBmb3JtYXQ6IE1vZHVsZUZvcm1hdDtcbiAgcmVhZG9ubHkgbGliRmlsZXM6IHN0cmluZ1tdO1xuICByZWFkb25seSBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeTogKGlzRXNtOiBib29sZWFuKSA9PiBQbHVnaW47XG59XG5cbmludGVyZmFjZSBCdWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmVQYXJhbXMge1xuICByZWFkb25seSBkZWNsYXJhdGlvbkZpbGVQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGV4dGVuc2lvbjogc3RyaW5nO1xuICByZWFkb25seSBtb2R1bGVEaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENvbGxlY3RFbnZpcm9ubWVudERpcmVjdGl2ZXNQYXJhbXMge1xuICByZWFkb25seSBhdmFpbGFibGVUeXBlczogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IGRlY2xhcmF0aW9uRmlsZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2V0RXhwb3J0UGFyYW1zIHtcbiAgcmVhZG9ubHkgZXhwb3J0Q29uZGl0aW9uczogUGFja2FnZUpzb24uRXhwb3J0Q29uZGl0aW9ucztcbiAgcmVhZG9ubHkgaXNXaWxkY2FyZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc291cmNlQ29uZGl0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHNyY0ZvbGRlcjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVG9EaXN0UGF0aFBhcmFtcyB7XG4gIHJlYWRvbmx5IGZvcm1hdDogc3RyaW5nO1xuICByZWFkb25seSBpbXBvcnRQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGV2ZXJ5dGhpbmcgYW4gZWFybGllciBidWlsZCBsZWZ0OiBgZGlzdC9gLCB0aGUgZ2VuZXJhdGVkIGBpbmRleC50c2AgYmFycmVscywgdGhlIGAuZC50c2AgZmlsZXMgYHRzY2Agd3JvdGVcbiAqIGJlc2lkZSB0aGUgc291cmNlcyAoaGFuZC1hdXRob3JlZCBvbmVzIHVuZGVyIGBAdHlwZXNgIHN0YXkpLCBhbmQgdGhlIHBlci1zdWJwYXRoIGBwYWNrYWdlLmpzb25gIHN0dWJzLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVyeXRoaW5nIGhhcyBiZWVuIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZENsZWFuTGlicmFyeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgYnVpbGRDbGVhbigpO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5TcmMsIHsgcmVjdXJzaXZlOiB0cnVlIH0pKSB7XG4gICAgaWYgKGJhc2VuYW1lKGZpbGUpID09PSBSZXBvUGF0aHMuSW5kZXhUcyBhcyBzdHJpbmcpIHtcbiAgICAgIGF3YWl0IHJtKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSkpO1xuICAgIH1cblxuICAgIGlmIChmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pICYmICFmaWxlLnNwbGl0KCcvJykuaW5jbHVkZXMoUmVwb1BhdGhzLlR5cGVzKSkge1xuICAgICAgYXdhaXQgcm0oam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuQ3VycmVudEZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoKGJhc2VuYW1lKGZpbGUpICE9PSBSZXBvUGF0aHMuUGFja2FnZUpzb24gYXMgc3RyaW5nKSB8fCAoZmlsZSA9PT0gUmVwb1BhdGhzLlBhY2thZ2VKc29uIGFzIHN0cmluZykgfHwgZmlsZS5zdGFydHNXaXRoKFJlcG9QYXRocy5Ob2RlTW9kdWxlcykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGF3YWl0IHJtKGZpbGUpO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIGV2ZXJ5IHNvdXJjZSBtb2R1bGUsIHVuYnVuZGxlZCwgaW50byBgZGlzdC9saWIvY2pzYCAoYC5janNgKSBhbmQgYGRpc3QvbGliL2VzbWAgKGAubWpzYCkuXG4gKlxuICogVGhlIG91dHB1dCBmb2xkZXJzIG11c3QgYWxyZWFkeSBleGlzdDsge0BsaW5rIGJ1aWxkTGlicmFyeVR5cGVzfSBjcmVhdGVzIHRoZW0uXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgYnVpbGQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBib3RoIGZvcm1hdHMgaGF2ZSBiZWVuIGJ1aWx0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRMaWJyYXJ5KG9wdGlvbnM6IEJ1aWxkTGlicmFyeU9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5ID0gKGlzRXNtOiBib29sZWFuKTogUGx1Z2luID0+IHByZXByb2Nlc3NQbHVnaW4oeyBpc0VzbSB9KSB9ID0gb3B0aW9ucztcbiAgY29uc3QgbGliRmlsZXMgPSBhd2FpdCBnZXRMaWJGaWxlcygpO1xuICBhd2FpdCBidWlsZExpYnJhcnlGb3JtYXQoeyBmb3JtYXQ6ICdjanMnLCBsaWJGaWxlcywgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkgfSk7XG4gIGF3YWl0IGJ1aWxkTGlicmFyeUZvcm1hdCh7IGZvcm1hdDogJ2VzbScsIGxpYkZpbGVzLCBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSB9KTtcbn1cblxuLyoqXG4gKiBFbWl0cyB0aGUgZGVjbGFyYXRpb25zIHdpdGggYHRzYyAtLXByb2plY3QgLi90c2NvbmZpZy50eXBlcy5qc29uYCwgdGhlbiBjb3BpZXMgZWFjaCBvbmUgaW50byBgZGlzdC9saWJgIHR3aWNlOiBhcyBhXG4gKiBgLmQuY3RzYCB3aG9zZSByZWxhdGl2ZSBpbXBvcnRzIG5hbWUgYC5janNgIGZpbGVzIGFuZCB3aG9zZSBiYXJlIHR5cGUgaW1wb3J0cyBjYXJyeSBgcmVzb2x1dGlvbi1tb2RlOiBpbXBvcnRgLCBhbmRcbiAqIGFzIGEgYC5kLm10c2Agd2hvc2UgcmVsYXRpdmUgaW1wb3J0cyBuYW1lIGAubWpzYCBmaWxlcy5cbiAqXG4gKiBUaGUgbGlicmFyeSdzIHJvb3QgZGVjbGFyYXRpb24gKGBsaWJyYXJ5LnRzYCB3aGVyZSB0aGUgcGFja2FnZSBoYXMgb25lLCBvdGhlcndpc2UgdGhlIGdlbmVyYXRlZCBgaW5kZXgudHNgKSBjYXJyaWVzXG4gKiBldmVyeSBgbGliYCBhbmQgYHR5cGVzYCByZWZlcmVuY2UgdGhlIHBhY2thZ2UgbmVlZHMuIEV2ZXJ5IG90aGVyIGRlY2xhcmF0aW9uIHJlZmVyZW5jZXMgYSBgbGlicmFyeS1yZWZlcmVuY2VzYFxuICogZGVjbGFyYXRpb24gYmVzaWRlIGl0IGJ5IHBhdGgsIG5ldmVyIHRoZSByb290OiB0aGUgcm9vdCBiYXJyZWwgcmUtZXhwb3J0cyBldmVyeSBtb2R1bGUsIHNvIHJlZmVyZW5jaW5nIGl0IG1hZGUgZWFjaFxuICogc3VicGF0aCBsb2FkIHRoZSB3aG9sZSBwYWNrYWdlLCBhbmQgYSBjb25zdW1lciB0eXBlLWNoZWNraW5nIHdpdGggYHNraXBMaWJDaGVjazogZmFsc2VgIHRoZW4gbmVlZGVkIGV2ZXJ5IG9wdGlvbmFsXG4gKiBwZWVyIGluc3RhbGxlZC5cbiAqXG4gKiBgbGlicmFyeS1yZWZlcmVuY2VzYCBjYXJyaWVzIG9ubHkgdGhlIGxpYnMgdGhhdCBkZXNjcmliZSB0aGUgbGFuZ3VhZ2UgKGBlczIwMjJgLCBgZXNuZXh0LmRpc3Bvc2FibGVgKSwgd2hpY2ggbm9cbiAqIGNvbnN1bWVyIGNvbmZsaWN0cyB3aXRoLiBUaGUgb25lcyB0aGF0IGRlc2NyaWJlIGEgaG9zdCAoYGRvbWAsIGBkb20uaXRlcmFibGVgLCBgd2Vid29ya2VyYCkgYW5kIGB0eXBlcz1cIm5vZGVcImAgZ29cbiAqIG9ubHkgaW50byB0aGUgZGVjbGFyYXRpb25zIHRoYXQgbmFtZSBvbmUgb2YgdGhlaXIgZ2xvYmFscywgZm91bmQgYnkgcmVzb2x2aW5nIGV2ZXJ5IG5hbWUgaW4gdGhlIGVtaXR0ZWRcbiAqIGRlY2xhcmF0aW9ucyB3aXRoIHRoZSB0eXBlIGNoZWNrZXIuIE90aGVyd2lzZSBhIGJyb3dzZXIgY29uc3VtZXIgb2YgYSBwdXJlIHN1YnBhdGggZ290IGFsbCBvZiBgQHR5cGVzL25vZGVgLCBhbmQgaXRzXG4gKiBgc2V0VGltZW91dGAgcmV0dXJuZWQgYE5vZGVKUy5UaW1lb3V0YC5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRlY2xhcmF0aW9ucyBoYXZlIGJlZW4gd3JpdHRlbi5cbiAqIEB0aHJvd3MgSWYgYSBzb3VyY2UgbW9kdWxlIGlzIG5hbWVkIGBsaWJyYXJ5LXJlZmVyZW5jZXNgLCB3aGljaCB3b3VsZCBjb2xsaWRlIHdpdGggdGhlIGdlbmVyYXRlZCBkZWNsYXJhdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkTGlicmFyeVR5cGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoZXhpc3RzU3luYyhqb2luKFJlcG9QYXRocy5TcmMsIGAke0xJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUV9JHtSZXBvUGF0aHMuVHNFeHRlbnNpb259YCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBzcmMvJHtMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FfSR7UmVwb1BhdGhzLlRzRXh0ZW5zaW9ufSBjb2xsaWRlcyB3aXRoIHRoZSBnZW5lcmF0ZWQgZGVjbGFyYXRpb24gb2YgdGhlIHNhbWUgbmFtZS5gKTtcbiAgfVxuXG4gIGF3YWl0IGV4ZWNGcm9tUm9vdChbLi4ucmVzb2x2ZVRvb2xDb21tYW5kKHsgdG9vbDogJ3RzYycgfSksICctLXByb2plY3QnLCAnLi90c2NvbmZpZy50eXBlcy5qc29uJ10pO1xuXG4gIGNvbnN0IGxpYnJhcnlGaWxlTmFtZSA9IGV4aXN0c1N5bmMoam9pbihSZXBvUGF0aHMuU3JjLCAnbGlicmFyeS50cycpKSA/ICdsaWJyYXJ5JyA6ICdpbmRleCc7XG4gIGNvbnN0IGFsbExpYnMgPSBhd2FpdCBjb2xsZWN0QWxsTGlicygpO1xuICBjb25zdCBhbGxUeXBlcyA9IGNvbGxlY3RBbGxUeXBlcygpO1xuICBjb25zdCBkaXJlY3RpdmVzID0gYnVpbGRBbGxSZWZlcmVuY2VMaWJEaXJlY3RpdmVzKGFsbExpYnMpICsgYnVpbGRBbGxSZWZlcmVuY2VUeXBlc0RpcmVjdGl2ZXMoYWxsVHlwZXMpO1xuICAvLyBPbmx5IHRoZSBsaWJzIG5vIGNvbnN1bWVyIGNvbmZsaWN0cyB3aXRoLiBUaGUgZW52aXJvbm1lbnQgZ2xvYmFscyBnbyB0byB0aGUgZGVjbGFyYXRpb25zIHRoYXQgdXNlIHRoZW0uXG4gIGNvbnN0IHNoYXJlZERpcmVjdGl2ZXMgPSBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMoYWxsTGlicy5maWx0ZXIoKGxpYikgPT4gIWlzRW52aXJvbm1lbnRMaWIobGliKSkpO1xuXG4gIGF3YWl0IG1rZGlyKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5DanMpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgbWtkaXIoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkVzbSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUZpbGUoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkNqcywgTElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRSArIFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSwgc2hhcmVkRGlyZWN0aXZlcyk7XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuRXNtLCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FICsgUmVwb1BhdGhzLkRtdHNFeHRlbnNpb24pLCBzaGFyZWREaXJlY3RpdmVzKTtcblxuICBjb25zdCBzcmNGaWxlcyA9IGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgZGVjbGFyYXRpb25GaWxlcyA9IHNyY0ZpbGVzLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5lbmRzV2l0aChSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5zdGFydHNXaXRoKFJlcG9QYXRocy5UZXN0SGVscGVycykpO1xuICBjb25zdCBlbnZpcm9ubWVudERpcmVjdGl2ZXMgPSBjb2xsZWN0RW52aXJvbm1lbnREaXJlY3RpdmVzKHsgYXZhaWxhYmxlVHlwZXM6IGFsbFR5cGVzLCBkZWNsYXJhdGlvbkZpbGVzIH0pO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBkZWNsYXJhdGlvbkZpbGVzKSB7XG4gICAgY29uc3QgZm9sZGVyID0gZGlybmFtZShmaWxlKTtcbiAgICBjb25zdCBuYW1lID0gYmFzZW5hbWUoZmlsZSwgUmVwb1BhdGhzLkR0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSksICd1dGYtOCcpO1xuXG4gICAgY29uc3QgY3RzUGF0aCA9IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5DanMsIGZvbGRlciwgbmFtZSArIFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKTtcbiAgICBjb25zdCBtdHNQYXRoID0gam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkVzbSwgZm9sZGVyLCBuYW1lICsgUmVwb1BhdGhzLkRtdHNFeHRlbnNpb24pO1xuXG4gICAgYXdhaXQgbWtkaXIoZGlybmFtZShjdHNQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgbWtkaXIoZGlybmFtZShtdHNQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBsZXQgY3RzQ29udGVudCA9IHRvQ3RzQ29udGVudChjb250ZW50KTtcbiAgICBsZXQgbXRzQ29udGVudCA9IHRvTXRzQ29udGVudChjb250ZW50KTtcblxuICAgIGlmIChuYW1lID09PSBsaWJyYXJ5RmlsZU5hbWUgJiYgZm9sZGVyID09PSAnLicpIHtcbiAgICAgIGN0c0NvbnRlbnQgPSBkaXJlY3RpdmVzICsgY3RzQ29udGVudDtcbiAgICAgIG10c0NvbnRlbnQgPSBkaXJlY3RpdmVzICsgbXRzQ29udGVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZmlsZURpcmVjdGl2ZXMgPSBlbnZpcm9ubWVudERpcmVjdGl2ZXMuZ2V0KGZpbGUpID8/ICcnO1xuICAgICAgY3RzQ29udGVudCA9IGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZSh7IGRlY2xhcmF0aW9uRmlsZVBhdGg6IGN0c1BhdGgsIGV4dGVuc2lvbjogUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24sIG1vZHVsZURpcmVjdG9yeTogUmVwb1BhdGhzLkNqcyB9KVxuICAgICAgICArIGZpbGVEaXJlY3RpdmVzICsgY3RzQ29udGVudDtcbiAgICAgIG10c0NvbnRlbnQgPSBidWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmUoeyBkZWNsYXJhdGlvbkZpbGVQYXRoOiBtdHNQYXRoLCBleHRlbnNpb246IFJlcG9QYXRocy5EbXRzRXh0ZW5zaW9uLCBtb2R1bGVEaXJlY3Rvcnk6IFJlcG9QYXRocy5Fc20gfSlcbiAgICAgICAgKyBmaWxlRGlyZWN0aXZlcyArIG10c0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgYXdhaXQgd3JpdGVGaWxlKGN0c1BhdGgsIGN0c0NvbnRlbnQpO1xuICAgIGF3YWl0IHdyaXRlRmlsZShtdHNQYXRoLCBtdHNDb250ZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2VuZXJhdGVzIHRoZSBgZXhwb3J0c2AgbWFwIG9mIHRoZSBwYWNrYWdlJ3MgYHBhY2thZ2UuanNvbmAgZnJvbSBpdHMgc291cmNlIGZvbGRlcnMsIGFuZCB3cml0ZXMgYSBgcGFja2FnZS5qc29uYFxuICogc3R1YiBwZXIgc3VicGF0aCBmb3IgcmVzb2x2ZXJzIHRoYXQgZG8gbm90IHJlYWQgYGV4cG9ydHNgLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9uc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG1hcCBpcyBjdXJyZW50LlxuICogQHRocm93cyBJZiB0aGUgbWFwIGNoYW5nZWQsIHNvIHRoZSBjaGFuZ2UgZ2V0cyByZXZpZXdlZCBhbmQgY29tbWl0dGVkIHJhdGhlciB0aGFuIHNoaXBwZWQgdW5zZWVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaWJyYXJ5RXhwb3J0cyhvcHRpb25zOiBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc291cmNlQ29uZGl0aW9uIH0gPSBvcHRpb25zO1xuICBjb25zdCBzcmNGb2xkZXJzOiBzdHJpbmdbXSA9IFtSZXBvUGF0aHMuU3JjXTtcblxuICBmb3IgKGNvbnN0IGRpcmVudCBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUsIHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gam9pbihkaXJlbnQucGFyZW50UGF0aCwgZGlyZW50Lm5hbWUpO1xuXG4gICAgaWYgKHBhdGguaW5jbHVkZXMoUmVwb1BhdGhzLlN0eWxlcykgfHwgcGF0aC5pbmNsdWRlcyhSZXBvUGF0aHMuVGVzdEhlbHBlcnMpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBzcmNGb2xkZXJzLnB1c2gocGF0aCk7XG4gIH1cblxuICBzcmNGb2xkZXJzLnNvcnQoKTtcblxuICBsZXQgaXNDaGFuZ2VkID0gZmFsc2U7XG5cbiAgYXdhaXQgZWRpdFBhY2thZ2VKc29uKGFzeW5jIChwYWNrYWdlSnNvbikgPT4ge1xuICAgIGNvbnN0IG9sZEV4cG9ydHMgPSBwYWNrYWdlSnNvbi5leHBvcnRzO1xuICAgIGNvbnN0IGV4cG9ydENvbmRpdGlvbnM6IFBhY2thZ2VKc29uLkV4cG9ydENvbmRpdGlvbnMgPSB7fTtcbiAgICBwYWNrYWdlSnNvbi5leHBvcnRzID0gZXhwb3J0Q29uZGl0aW9ucztcbiAgICBmb3IgKGNvbnN0IHNyY0ZvbGRlciBvZiBzcmNGb2xkZXJzKSB7XG4gICAgICBhd2FpdCBzZXRFeHBvcnQoeyBleHBvcnRDb25kaXRpb25zLCBpc1dpbGRjYXJkOiBmYWxzZSwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSk7XG4gICAgICBhd2FpdCBzZXRFeHBvcnQoeyBleHBvcnRDb25kaXRpb25zLCBpc1dpbGRjYXJkOiB0cnVlLCBzb3VyY2VDb25kaXRpb24sIHNyY0ZvbGRlciB9KTtcbiAgICB9XG5cbiAgICBpc0NoYW5nZWQgPSAhaXNEZWVwRXF1YWwob2xkRXhwb3J0cywgcGFja2FnZUpzb24uZXhwb3J0cyk7XG4gIH0pO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEl0IGNoYW5nZWQgaW4gdGhlIGBlZGl0UGFja2FnZUpzb25gLCBFU0xpbnQgbWlzdGFrZW5seSBkb2VzIG5vdCByZWNvZ25pemUgaXQuXG4gIGlmIChpc0NoYW5nZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhY2thZ2UgZXhwb3J0cyBoYXZlIGNoYW5nZWQuIFBsZWFzZSByZXZpZXcgdGhlIGNoYW5nZXMgYW5kIGNvbW1pdCB0aGVtLicpO1xuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGFuIGBpbmRleC50c2AgYmFycmVsIGluIGV2ZXJ5IHNvdXJjZSBmb2xkZXIgdGhhdCBoYXMgc29tZXRoaW5nIHRvIGV4cG9ydCwgcmUtZXhwb3J0aW5nIGVhY2ggbW9kdWxlIGFuZFxuICogZWFjaCBzdWItYmFycmVsIHVuZGVyIGl0cyBvd24gbmFtZS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhcnJlbHMgaGF2ZSBiZWVuIHdyaXR0ZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpYnJhcnlJbmRleCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZ2VuZXJhdGVJbmRleChSZXBvUGF0aHMuU3JjKTtcbn1cblxuLyoqXG4gKiBSdW5zIGVhY2ggbmFtZWQgbnBtIHNjcmlwdCB0aGUgcGFja2FnZSBkZWZpbmVzLCBpbiBvcmRlciwgc2tpcHBpbmcgdGhlIG9uZXMgaXQgZG9lcyBub3QgZGVmaW5lLlxuICpcbiAqIEBwYXJhbSBzdGVwcyAtIFRoZSBucG0gc2NyaXB0IG5hbWVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5IHN0ZXAgaGFzIHJ1bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkJ1aWxkU3RlcHMoc3RlcHM6IHJlYWRvbmx5IHN0cmluZ1tdID0gTElCUkFSWV9CVUlMRF9TVEVQUyk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcHMpIHtcbiAgICBhd2FpdCBucG1SdW5PcHRpb25hbChzdGVwKTtcbiAgfVxufVxuXG4vKipcbiAqIEFkZHMgd2hhdCBhIGNvbnN1bWVyIG5lZWRzIGxvYWRlZCBmb3Igb25lIHN5bWJvbCBhIGRlY2xhcmF0aW9uIG5hbWVzLiBBIHN5bWJvbCBhbnkgRVMgbGliIGRlY2xhcmVzIG5lZWRzIG5vdGhpbmcsXG4gKiBiZWNhdXNlIG5vIGNvbnN1bWVyIGNvbmZsaWN0cyB3aXRoIHRob3NlIGxpYnMuIE90aGVyd2lzZSBlYWNoIGVudmlyb25tZW50IGxpYiB0aGF0IGRlY2xhcmVzIGl0IGFkZHMgaXRzZWxmLCBhbmRcbiAqIGZhaWxpbmcgdGhhdCBgQHR5cGVzL25vZGVgIGFkZHMgYG5vZGVgLiBBIHN5bWJvbCBkZWNsYXJlZCBpbiB0aGUgcGFja2FnZSdzIG93biBmaWxlcyBhZGRzIG5vdGhpbmc6IHRoZSBkZWNsYXJhdGlvblxuICogdGhhdCBob2xkcyBpdCBjYXJyaWVzIGl0cyBvd24gZGlyZWN0aXZlcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHN5bWJvbCwgdGhlIHByb2dyYW0gaXQgd2FzIHJlc29sdmVkIGluLCBhbmQgdGhlIHNldHMgdG8gYWRkIHRvLlxuICovXG5mdW5jdGlvbiBhZGRFbnZpcm9ubWVudEdsb2JhbHMocGFyYW1zOiBBZGRFbnZpcm9ubWVudEdsb2JhbHNQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgeyBsaWJzLCBwcm9ncmFtLCBzeW1ib2wsIHR5cGVzIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGVudmlyb25tZW50TGliczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGlzTm9kZSA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2Ygc3ltYm9sLmRlY2xhcmF0aW9ucyA/PyBbXSkge1xuICAgIGNvbnN0IHNvdXJjZUZpbGUgPSBkZWNsYXJhdGlvbi5nZXRTb3VyY2VGaWxlKCk7XG4gICAgaWYgKHByb2dyYW0uaXNTb3VyY2VGaWxlRGVmYXVsdExpYnJhcnkoc291cmNlRmlsZSkpIHtcbiAgICAgIGNvbnN0IGxpYiA9IHRvTGliTmFtZShzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgICAgIGlmICghaXNFbnZpcm9ubWVudExpYihsaWIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGVudmlyb25tZW50TGlicy5wdXNoKGxpYik7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VGaWxlLmZpbGVOYW1lLmluY2x1ZGVzKE5PREVfVFlQRVNfUEFUSF9TRUdNRU5UKSkge1xuICAgICAgaXNOb2RlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoZW52aXJvbm1lbnRMaWJzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IGxpYiBvZiBlbnZpcm9ubWVudExpYnMpIHtcbiAgICAgIGxpYnMuYWRkKGxpYik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTm9kZSkge1xuICAgIHR5cGVzLmFkZCgnbm9kZScpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsUmVmZXJlbmNlTGliRGlyZWN0aXZlcyhsaWJzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtcbiAgICBsaWJzXG4gICAgICAubWFwKChsaWIpID0+IGAvLy8gJHtSRUZFUkVOQ0VfTElCX0RJUkVDVElWRX1cIiR7bGlifVwiIC8+YClcbiAgICAgIC5qb2luKCdcXG4nKVxuICB9XFxuYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRBbGxSZWZlcmVuY2VUeXBlc0RpcmVjdGl2ZXModHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVzLmxlbmd0aCA9PT0gMFxuICAgID8gJydcbiAgICA6IGAke1xuICAgICAgdHlwZXNcbiAgICAgICAgLm1hcCgodHlwZSkgPT4gYC8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiJHt0eXBlfVwiIC8+YClcbiAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgfVxcbmA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkTGlicmFyeUZvcm1hdChwYXJhbXM6IEJ1aWxkTGlicmFyeUZvcm1hdFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGZvcm1hdCwgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0gPSBwYXJhbXM7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IGZvcm1hdCA9PT0gJ2NqcycgPyBSZXBvUGF0aHMuQ2pzRXh0ZW5zaW9uIDogUmVwb1BhdGhzLk1qc0V4dGVuc2lvbjtcbiAgY29uc3QgYnVpbGRPcHRpb25zOiBCdWlsZE9wdGlvbnMgPSB7XG4gICAgLy8gRXhwbGljaXQsIGJlY2F1c2UgZXNidWlsZCBvdGhlcndpc2UgdGFrZXMgdGhlIGZvbGRlciBpdHMgc2VydmljZSBwcm9jZXNzIHN0YXJ0ZWQgaW4uXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gZXNidWlsZCdzIG93biBvcHRpb24gbmFtZS5cbiAgICBhYnNXb3JraW5nRGlyOiBwcm9jZXNzLmN3ZCgpLFxuICAgIGJhbm5lcjoge1xuICAgICAganM6IExJQlJBUllfQkFOTkVSXG4gICAgfSxcbiAgICBidW5kbGU6IGZhbHNlLFxuICAgIGVudHJ5UG9pbnRzOiBsaWJGaWxlcyxcbiAgICBmb3JtYXQsXG4gICAgbG9nTGV2ZWw6ICdpbmZvJyxcbiAgICBvdXRkaXI6IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIGZvcm1hdCksXG4gICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICBwbHVnaW5zOiBbXG4gICAgICBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeShmb3JtYXQgPT09ICdlc20nKSxcbiAgICAgIGZpeEVzbVBsdWdpbigpLFxuICAgICAgY2hhbmdlRXh0ZW5zaW9uUGx1Z2luKGV4dGVuc2lvbilcbiAgICBdLFxuICAgIHNvdXJjZW1hcDogJ2lubGluZScsXG4gICAgdGFyZ2V0OiAnRVMyMDIyJyxcbiAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICB3cml0ZTogZmFsc2VcbiAgfTtcblxuICBjb25zdCBidWlsZENvbnRleHQgPSBhd2FpdCBjb250ZXh0KGJ1aWxkT3B0aW9ucyk7XG4gIHRyeSB7XG4gICAgYXdhaXQgYnVpbGRDb250ZXh0LnJlYnVpbGQoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBidWlsZENvbnRleHQuZGlzcG9zZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZShwYXJhbXM6IEJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZVBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgZGVjbGFyYXRpb25GaWxlUGF0aCwgZXh0ZW5zaW9uLCBtb2R1bGVEaXJlY3RvcnkgfSA9IHBhcmFtcztcbiAgY29uc3QgbGlicmFyeUZpbGVQYXRoID0gam9pbihSZXBvUGF0aHMuRGlzdExpYiwgbW9kdWxlRGlyZWN0b3J5LCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FICsgZXh0ZW5zaW9uKTtcbiAgbGV0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlTmF0aXZlKGRpcm5hbWUoZGVjbGFyYXRpb25GaWxlUGF0aCksIGxpYnJhcnlGaWxlUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gIGlmICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgIHJlbGF0aXZlUGF0aCA9IGAuLyR7cmVsYXRpdmVQYXRofWA7XG4gIH1cbiAgcmV0dXJuIGAvLy8gPHJlZmVyZW5jZSBwYXRoPVwiJHtyZWxhdGl2ZVBhdGh9XCIgLz5cXG5gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0QWxsTGlicygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIC8vIFRoZSBSRVNPTFZFRCBvcHRpb25zLCBiZWNhdXNlIGEgcGFja2FnZSdzIGB0c2NvbmZpZy5qc29uYCBpbmhlcml0cyBgbGliYCBmcm9tIHRoZSBzaGFyZWQgYmFzZS4gVGhlIHJlc29sdmVkXG4gIC8vIG5hbWVzIGFyZSBmaWxlIG5hbWVzIChgbGliLmRvbS5pdGVyYWJsZS5kLnRzYCksIHNvIHRoZXkgYXJlIG1hcHBlZCBiYWNrIG9udG8gdGhlIG5hbWVzIGEgZGlyZWN0aXZlIHRha2VzLlxuICBjb25zdCB7IG9wdGlvbnMgfSA9IHBhcnNlVHNDb25maWcoUmVwb1BhdGhzLlRzQ29uZmlnSnNvbik7XG4gIGNvbnN0IGxpYnMgPSBuZXcgU2V0KChvcHRpb25zLmxpYiA/PyBbXSkubWFwKChsaWIpID0+IHRvTGliTmFtZShsaWIpKSk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSkge1xuICAgIGlmICghZmlsZS5lbmRzV2l0aCgnLnRzJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZUNvbnRlbnQgPSByZWFkRmlsZVN5bmMoam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSwgJ3V0Zi04Jyk7XG4gICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbHdheXMgY2FwdHVyZXMgaXRzIG9uZSBncm91cCwgc28gbm8gZmFsbGJhY2sgZm9yIGEgbWlzc2luZyBvbmUgaXMgbmVlZGVkLlxuICAgIGZvciAoY29uc3QgWywgbGliXSBvZiBzb3VyY2VDb250ZW50Lm1hdGNoQWxsKFJFRkVSRU5DRV9MSUJfUkVHX0VYUCkpIHtcbiAgICAgIGxpYnMuYWRkKFN0cmluZyhsaWIpLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbLi4ubGlic10uc29ydCgpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0QWxsVHlwZXMoKTogc3RyaW5nW10ge1xuICBjb25zdCB7IG9wdGlvbnMgfSA9IHBhcnNlVHNDb25maWcoUmVwb1BhdGhzLlRzQ29uZmlnSnNvbik7XG4gIHJldHVybiAob3B0aW9ucy50eXBlcyA/PyBbXSlcbiAgICAuZmlsdGVyKCh0eXBlKSA9PiBERUNMQVJBVElPTl9SRUZFUkVOQ0VfVFlQRVMuaGFzKHR5cGUpKVxuICAgIC5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RFbnZpcm9ubWVudERpcmVjdGl2ZXMocGFyYW1zOiBDb2xsZWN0RW52aXJvbm1lbnREaXJlY3RpdmVzUGFyYW1zKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHsgYXZhaWxhYmxlVHlwZXMsIGRlY2xhcmF0aW9uRmlsZXMgfSA9IHBhcmFtcztcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKFJlcG9QYXRocy5Uc0NvbmZpZ0pzb24pO1xuICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbSh7XG4gICAgb3B0aW9uczogeyAuLi5vcHRpb25zLCBub0VtaXQ6IHRydWUgfSxcbiAgICByb290TmFtZXM6IGRlY2xhcmF0aW9uRmlsZXMubWFwKChmaWxlKSA9PiByZXNvbHZlTmF0aXZlKFJlcG9QYXRocy5TcmMsIGZpbGUpKVxuICB9KTtcbiAgY29uc3QgY2hlY2tlciA9IHByb2dyYW0uZ2V0VHlwZUNoZWNrZXIoKTtcbiAgY29uc3QgZGlyZWN0aXZlc0J5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGRlY2xhcmF0aW9uRmlsZXMpIHtcbiAgICAvLyBUaGUgcHJvZ3JhbSB3YXMgaGFuZGVkIGV2ZXJ5IG9uZSBvZiB0aGVzZSBhcyBhIHJvb3QgbmFtZSwgc28gZWFjaCBvbmUgaXMgaW4gaXQuXG4gICAgY29uc3Qgc291cmNlRmlsZSA9IGVuc3VyZU5vbk51bGxhYmxlKHByb2dyYW0uZ2V0U291cmNlRmlsZShyZXNvbHZlTmF0aXZlKFJlcG9QYXRocy5TcmMsIGZpbGUpKSk7XG4gICAgY29uc3QgbGlicyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHR5cGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmdW5jdGlvbiB2aXNpdChub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgICBpZiAoaXNJZGVudGlmaWVyKG5vZGUpIHx8IGlzU3RyaW5nTGl0ZXJhbChub2RlKSkge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24obm9kZSk7XG4gICAgICAgIGlmIChzeW1ib2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFkZEVudmlyb25tZW50R2xvYmFscyh7IGxpYnMsIHByb2dyYW0sIHN5bWJvbDogcmVzb2x2ZUFsaWFzKGNoZWNrZXIsIHN5bWJvbCksIHR5cGVzIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpO1xuICAgIH1cbiAgICB2aXNpdChzb3VyY2VGaWxlKTtcblxuICAgIGNvbnN0IG5lZWRlZFR5cGVzID0gWy4uLnR5cGVzXS5maWx0ZXIoKHR5cGUpID0+IGF2YWlsYWJsZVR5cGVzLmluY2x1ZGVzKHR5cGUpKTtcbiAgICBpZiAobGlicy5zaXplID4gMCB8fCBuZWVkZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICBkaXJlY3RpdmVzQnlGaWxlLnNldChcbiAgICAgICAgZmlsZSxcbiAgICAgICAgKGxpYnMuc2l6ZSA+IDAgPyBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMoWy4uLmxpYnNdLnNvcnQoKSkgOiAnJykgKyBidWlsZEFsbFJlZmVyZW5jZVR5cGVzRGlyZWN0aXZlcyhuZWVkZWRUeXBlcy5zb3J0KCkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkaXJlY3RpdmVzQnlGaWxlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4KGZvbGRlcjogc3RyaW5nKTogUHJvbWlzZTxHZW5lcmF0ZUluZGV4UmVzdWx0PiB7XG4gIGNvbnN0IGRpcmVudHMgPSBhd2FpdCByZWFkZGlyUG9zaXgoZm9sZGVyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGNvbnN0IG1heWJlTGluZXMgPSBhd2FpdCBhc3luY01hcChkaXJlbnRzLCAoZGlyZW50KSA9PiBoYW5kbGVJbmRleERpcmVudChmb2xkZXIsIGRpcmVudCkpO1xuICBjb25zdCBsaW5lcyA9IG1heWJlTGluZXMuZmlsdGVyKChsaW5lKSA9PiBsaW5lICE9PSB1bmRlZmluZWQpO1xuXG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gR2VuZXJhdGVJbmRleFJlc3VsdC5Ta2lwcGVkO1xuICB9XG5cbiAgYXdhaXQgZ2VuZXJhdGUoam9pbihmb2xkZXIsIFJlcG9QYXRocy5JbmRleFRzKSwgbGluZXMpO1xuICByZXR1cm4gR2VuZXJhdGVJbmRleFJlc3VsdC5TdWNjZXNzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMaWJGaWxlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGxldCBmaWxlcyA9IGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZmlsZXMgPSBmaWxlcy5tYXAoKGZpbGUpID0+IG5vcm1hbGl6ZUlmUmVsYXRpdmUoam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSkpO1xuICByZXR1cm4gZmlsZXMuZmlsdGVyKChmaWxlKSA9PlxuICAgIGZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLlRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5lbmRzV2l0aChSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5lbmRzV2l0aCgnLnRlc3QudHMnKVxuICAgICYmICFmaWxlLmluY2x1ZGVzKGAvJHtSZXBvUGF0aHMuVGVzdEhlbHBlcnN9L2ApXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUluZGV4RGlyZW50KGZvbGRlcjogc3RyaW5nLCBkaXJlbnQ6IERpcmVudCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmIChpc0V4Y2x1ZGVkRnJvbUluZGV4KGZvbGRlciwgZGlyZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBzb3VyY2VGaWxlOiBzdHJpbmc7XG4gIGxldCBuYW1lOiBzdHJpbmc7XG4gIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdlbmVyYXRlSW5kZXgoam9pbihmb2xkZXIsIGRpcmVudC5uYW1lKSk7XG4gICAgaWYgKHJlc3VsdCAhPT0gR2VuZXJhdGVJbmRleFJlc3VsdC5TdWNjZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNvdXJjZUZpbGUgPSBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oZGlyZW50Lm5hbWUsIFJlcG9QYXRocy5JbmRleFRzKSk7XG4gICAgbmFtZSA9IGRpcmVudC5uYW1lO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUoZGlyZW50Lm5hbWUpO1xuICAgIG5hbWUgPSBiYXNlbmFtZShkaXJlbnQubmFtZSwgZXh0ZW5zaW9uKTtcbiAgICBzb3VyY2VGaWxlID0gbm9ybWFsaXplSWZSZWxhdGl2ZShkaXJlbnQubmFtZSk7XG4gIH1cblxuICByZXR1cm4gYGV4cG9ydCAqIGFzICcke25hbWV9JyBmcm9tICcke3NvdXJjZUZpbGV9JztgO1xufVxuXG5mdW5jdGlvbiBpc0Vudmlyb25tZW50TGliKGxpYjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBFTlZJUk9OTUVOVF9MSUJfUFJFRklYRVMuc29tZSgocHJlZml4KSA9PiBsaWIuc3RhcnRzV2l0aChwcmVmaXgpKTtcbn1cblxuZnVuY3Rpb24gaXNFeGNsdWRlZEZpbGVOYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gIW5hbWUuZW5kc1dpdGgoUmVwb1BhdGhzLlRzRXh0ZW5zaW9uKSB8fCBuYW1lLmVuZHNXaXRoKCcudGVzdC50cycpIHx8IG5hbWUgPT09ICdzZXR1cC50cycgfHwgbmFtZS5lbmRzV2l0aCgnLXNldHVwLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzRXhjbHVkZWRGcm9tSW5kZXgoZm9sZGVyOiBzdHJpbmcsIGRpcmVudDogRGlyZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IGV4Y2x1ZGVkTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1JlcG9QYXRocy5JbmRleFRzLCBSZXBvUGF0aHMuVHlwZXMsIFJlcG9QYXRocy5TdHlsZXMsIFJlcG9QYXRocy5UZXN0SGVscGVyc107XG4gIGNvbnN0IGlzRXhjbHVkZWRFbnRyeSA9IGV4Y2x1ZGVkTmFtZXMuaW5jbHVkZXMoZGlyZW50Lm5hbWUpIHx8IGRpcmVudC5uYW1lLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pIHx8IGZvbGRlci5zcGxpdCgnLycpLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIHJldHVybiBpc0V4Y2x1ZGVkRW50cnkgfHwgKGRpcmVudC5pc0ZpbGUoKSAmJiBpc0V4Y2x1ZGVkRmlsZU5hbWUoZGlyZW50Lm5hbWUpKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFsaWFzKGNoZWNrZXI6IFR5cGVDaGVja2VyLCBzeW1ib2w6IFRzU3ltYm9sKTogVHNTeW1ib2wge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZSAtLSBgU3ltYm9sRmxhZ3NgIGlzIGEgYml0IHNldC5cbiAgcmV0dXJuIChzeW1ib2wuZmxhZ3MgJiBTeW1ib2xGbGFncy5BbGlhcykgPT09IDAgPyBzeW1ib2wgOiBjaGVja2VyLmdldEFsaWFzZWRTeW1ib2woc3ltYm9sKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0RXhwb3J0KHBhcmFtczogU2V0RXhwb3J0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgZXhwb3J0Q29uZGl0aW9ucywgaXNXaWxkY2FyZCwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSA9IHBhcmFtcztcbiAgY29uc3QgaW1wb3J0UGF0aCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IHNyY0ZvbGRlcixcbiAgICByZXBsYWNlcjogUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIsXG4gICAgc2VhcmNoVmFsdWU6IFJlcG9QYXRocy5TcmNcbiAgfSk7XG4gIGNvbnN0IGNvbmRpdGlvblBhdGggPSBpc1dpbGRjYXJkID8gYCR7aW1wb3J0UGF0aH0vJHtSZXBvUGF0aHMuQW55fWAgOiBpbXBvcnRQYXRoO1xuICBjb25zdCBkbXRzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5Fc20sIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55RG10cyA6IFJlcG9QYXRocy5JbmRleERtdHMgfSk7XG4gIGNvbnN0IGRjdHNQYXRoID0gdG9EaXN0UGF0aCh7IGZvcm1hdDogUmVwb1BhdGhzLkNqcywgaW1wb3J0UGF0aCwgbmFtZTogaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlEY3RzIDogUmVwb1BhdGhzLkluZGV4RGN0cyB9KTtcbiAgY29uc3QgZG10c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRtdHNQYXRoKTtcbiAgY29uc3QgZGN0c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRjdHNQYXRoKTtcblxuICBpZiAoIWlzV2lsZGNhcmQgJiYgIWV4aXN0c1N5bmMoZGN0c1BhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaXNUeXBlc09ubHkgPSBpbXBvcnRQYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIGNvbnN0IG1qc1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuRXNtLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueU1qcyA6IFJlcG9QYXRocy5JbmRleE1qcyB9KTtcbiAgY29uc3QgY2pzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5DanMsIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55Q2pzIDogUmVwb1BhdGhzLkluZGV4Q2pzIH0pO1xuXG4gIGlmIChpc1R5cGVzT25seSkge1xuICAgIGV4cG9ydENvbmRpdGlvbnNbY29uZGl0aW9uUGF0aF0gPSB7XG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGhcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNvdXJjZVBhdGggPSBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLlNyYywgaW1wb3J0UGF0aCwgaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlUcyA6IFJlcG9QYXRocy5JbmRleFRzKSk7XG5cbiAgICBleHBvcnRDb25kaXRpb25zW2NvbmRpdGlvblBhdGhdID0ge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgICAvLyBGaXJzdCwgc28gaXQgd2lucyB3aGVyZXZlciBpdCBpcyBzZXQ6IGluc2lkZSB0aGUgcmVwb3NpdG9yeSwgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LlxuICAgICAgLi4uKHNvdXJjZUNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkICYmIHsgW3NvdXJjZUNvbmRpdGlvbl06IHNvdXJjZVBhdGggfSksXG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoLFxuICAgICAgICBkZWZhdWx0OiBtanNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGgsXG4gICAgICAgIGRlZmF1bHQ6IGNqc1BhdGhcbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgfTtcbiAgfVxuXG4gIGlmIChpbXBvcnRQYXRoID09PSBSZXBvUGF0aHMuQ3VycmVudEZvbGRlciBhcyBzdHJpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWlzV2lsZGNhcmQpIHtcbiAgICBhd2FpdCB3cml0ZVN1YnBhdGhQYWNrYWdlSnNvbihcbiAgICAgIGltcG9ydFBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzOiByZWxhdGl2ZShpbXBvcnRQYXRoLCBkY3RzUGF0aCkgfVxuICAgICAgICA6IHsgbWFpbjogcmVsYXRpdmUoaW1wb3J0UGF0aCwgY2pzUGF0aCksIG1vZHVsZTogcmVsYXRpdmUoaW1wb3J0UGF0aCwgbWpzUGF0aCksIHR5cGU6ICdtb2R1bGUnLCB0eXBlczogcmVsYXRpdmUoaW1wb3J0UGF0aCwgZGN0c1BhdGgpIH1cbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoZGN0c0ZvbGRlclBhdGgpKSB7XG4gICAgaWYgKCFmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlLCBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgcGFja2FnZUpzb25Gb2xkZXJQYXRoID0gam9pbihpbXBvcnRQYXRoLCBuYW1lKTtcbiAgICBjb25zdCB0eXBlcyA9IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkY3RzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSk7XG4gICAgYXdhaXQgd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oXG4gICAgICBwYWNrYWdlSnNvbkZvbGRlclBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgbWFpbjogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRjdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLkNqc0V4dGVuc2lvbikpLFxuICAgICAgICAgIG1vZHVsZTogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRtdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLk1qc0V4dGVuc2lvbikpLFxuICAgICAgICAgIHR5cGU6ICdtb2R1bGUnLFxuICAgICAgICAgIHR5cGVzXG4gICAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ3RzQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGNvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdmcm9tIFxcJyQ8SW1wb3J0UGF0aD4uY2pzXFwnOycsXG4gICAgc2VhcmNoVmFsdWU6IFNUQVRJQ19JTVBPUlRfUkVHX0VYUFxuICB9KTtcbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQoJDxRdW90ZT4kPEltcG9ydFBhdGg+LmNqcyQ8UXVvdGU+KScsXG4gICAgc2VhcmNoVmFsdWU6IERZTkFNSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG5cbiAgLy8gQSBgLmQuY3RzYCBmaWxlIGlzIGEgQ29tbW9uSlMgbW9kdWxlLiBUeXBlLW9ubHkgaW1wb3J0cyBvZiBhIGJhcmUgc3BlY2lmaWVyIHJlc29sdmluZyB0byBhblxuICAvLyBFU00tb25seSBwYWNrYWdlIG5lZWQgYSBgcmVzb2x1dGlvbi1tb2RlYCBhdHRyaWJ1dGUsIGVsc2UgYHRzY2AgcmVwb3J0cyBUUzE1NDEgLyBUUzE1NDIuXG4gIC8vIFBhc3NpbmcgYCdpbXBvcnQnYCBpcyB2YWxpZCBmb3IgQ29tbW9uSlMgdGFyZ2V0cyB0b28sIHNvIGV2ZXJ5IGJhcmUgc3BlY2lmaWVyIHJlY2VpdmVzIGl0LlxuICAvLyBUaGUgRVNNIGAuZC5tdHNgIG5lZWRzIG5vIHN1Y2ggYXR0cmlidXRlLCBzbyB0aGlzIHRyYW5zZm9ybSBydW5zIG9uIENvbW1vbkpTIGNvbnRlbnQgb25seS5cbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQgdHlwZSAkPENsYXVzZT4gZnJvbSBcXCckPFNwZWNpZmllcj5cXCcgd2l0aCB7IFxcJ3Jlc29sdXRpb24tbW9kZVxcJzogXFwnaW1wb3J0XFwnIH07JyxcbiAgICBzZWFyY2hWYWx1ZTogQkFSRV9UWVBFX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogY3RzQ29udGVudCxcbiAgICByZXBsYWNlcjogJ2ltcG9ydChcIiQ8U3BlY2lmaWVyPlwiLCB7IHdpdGg6IHsgXFwncmVzb2x1dGlvbi1tb2RlXFwnOiBcXCdpbXBvcnRcXCcgfSB9KScsXG4gICAgc2VhcmNoVmFsdWU6IEJBUkVfSU5MSU5FX0lNUE9SVF9UWVBFX1JFR19FWFBcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvRGlzdFBhdGgocGFyYW1zOiBUb0Rpc3RQYXRoUGFyYW1zKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZUlmUmVsYXRpdmUoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgcGFyYW1zLmZvcm1hdCwgcGFyYW1zLmltcG9ydFBhdGgsIHBhcmFtcy5uYW1lKSk7XG59XG5cbmZ1bmN0aW9uIHRvTGliTmFtZShsaWJGaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gQSBsaWIgYSBwYWNrYWdlIHJlcGxhY2VkIChgQHR5cGVzY3JpcHQvbGliLWRvbWAsIGBAdHlwZXNjcmlwdC9saWItZG9tL2l0ZXJhYmxlLmQudHNgKSBpcyBuYW1lZCBieSBpdHMgcGF0aCwgbm90IGJ5XG4gIC8vIGl0cyBmaWxlIG5hbWUsIHdoaWNoIGlzIGBpbmRleC5kLnRzYCBmb3IgdGhlIGxpYidzIHJvb3QuXG4gIGNvbnN0IHJlcGxhY2VtZW50TWF0Y2ggPSBMSUJfUkVQTEFDRU1FTlRfUkVHX0VYUC5leGVjKGxpYkZpbGVQYXRoKTtcbiAgaWYgKHJlcGxhY2VtZW50TWF0Y2g/Lmdyb3VwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbHdheXMgY2FwdHVyZXMgYm90aCBncm91cHMuXG4gICAgY29uc3QgbGliID0gU3RyaW5nKHJlcGxhY2VtZW50TWF0Y2guZ3JvdXBzWydMaWInXSk7XG4gICAgY29uc3Qgc3ViTGliID0gU3RyaW5nKHJlcGxhY2VtZW50TWF0Y2guZ3JvdXBzWydTdWJMaWInXSk7XG4gICAgcmV0dXJuIChzdWJMaWIgPT09ICdpbmRleCcgPyBsaWIgOiBgJHtsaWJ9LiR7c3ViTGliLnJlcGxhY2VBbGwoJy8nLCAnLicpfWApLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgcmV0dXJuIGJhc2VuYW1lKGxpYkZpbGVQYXRoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL15saWJcXC4vLCAnJykucmVwbGFjZSgvXFwuZFxcLnRzJC8sICcnKTtcbn1cblxuZnVuY3Rpb24gdG9NdHNDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG10c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjb250ZW50LFxuICAgIHJlcGxhY2VyOiAnZnJvbSBcXCckPEltcG9ydFBhdGg+Lm1qc1xcJzsnLFxuICAgIHNlYXJjaFZhbHVlOiBTVEFUSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG4gIHJldHVybiByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBtdHNDb250ZW50LFxuICAgIHJlcGxhY2VyOiAnaW1wb3J0KCQ8UXVvdGU+JDxJbXBvcnRQYXRoPi5tanMkPFF1b3RlPiknLFxuICAgIHNlYXJjaFZhbHVlOiBEWU5BTUlDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVN1YnBhdGhQYWNrYWdlSnNvbihmb2xkZXI6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG1rZGlyKGZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlSnNvbihqb2luKGZvbGRlciwgUmVwb1BhdGhzLlBhY2thZ2VKc29uKSwgcGFja2FnZUpzb24pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXVCQSxtQkFBeUI7QUFDekIsMEJBQTRCO0FBQzVCLGtCQU9PO0FBQ1Asb0JBQTJCO0FBQzNCLHlCQUFrQztBQUNsQyxxQkFBd0I7QUFDeEIscUJBR087QUFDUCxzQkFLTztBQUNQLHVCQUdPO0FBQ1AsMEJBQW9CO0FBQ3BCLHdCQU1PO0FBSVAsbUJBQTJCO0FBQzNCLHFDQUFzQztBQUN0Qyw0QkFBNkI7QUFDN0IsK0JBQWlDO0FBQ2pDLGlDQUE4QjtBQUM5Qiw0QkFBeUI7QUFDekIsZ0JBQTZCO0FBQzdCLGtCQUEwQjtBQUMxQixxQkFBK0I7QUFDL0IsaUJBQWdDO0FBQ2hDLDZCQUFtQztBQUNuQyx3QkFBMEI7QUFDMUIsa0JBQTZCO0FBS3RCLE1BQU0saUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFTdkIsTUFBTSxzQkFBeUM7QUFBQSxFQUNwRDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBT08sTUFBTSxtQkFBbUI7QUEyQmhDLE1BQU0sOEJBQThCLG9CQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7QUFJcEQsTUFBTSwyQkFBOEMsQ0FBQyxPQUFPLGNBQWMsV0FBVztBQUNyRixNQUFNLDBCQUEwQjtBQUNoQyxNQUFNLDBCQUEwQjtBQUloQyxNQUFNLCtCQUErQjtB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V0FBVztBQUNqRSxNQUFJLGtCQUFrQixXQUFXLFFBQVc7QUFFMUMsVUFBTSxNQUFNLE9BQU8saUJBQWlCLE9BQU8sS0FBSyxDQUFDO0FBQ2pELFVBQU0sU0FBUyxPQUFPLGlCQUFpQixPQUFPLFFBQVEsQ0FBQztBQUN2RCxZQUFRLFdBQVcsVUFBVSxNQUFNLEdBQUcsR0FBRyxJQUFJLE9BQU8sV0FBVyxLQUFLLEdBQUcsQ0FBQyxJQUFJLFlBQVk7QUFBQSxFQUMxRjtBQUNBLGFBQU8sc0JBQVMsV0FBVyxFQUFFLFlBQVksRUFBRSxRQUFRLFVBQVUsRUFBRSxFQUFFLFFBQVEsWUFBWSxFQUFFO0FBQ3pGO0FBRUEsU0FBUyxhQUFhLFNBQXlCO0FBQzdDLFFBQU0saUJBQWEsMEJBQVc7QUFBQSxJQUM1QixTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsSUFDVixhQUFhO0FBQUEsRUFDZixDQUFDO0FBQ0QsYUFBTywwQkFBVztBQUFBLElBQ2hCLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxJQUNWLGFBQWE7QUFBQSxFQUNmLENBQUM7QUFDSDtBQUVBLGVBQWUsd0JBQXdCLFFBQWdCLGFBQXlDO0FBQzlGLFlBQU0sdUJBQU0sUUFBUSxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQ3ZDLFlBQU0sMkJBQVUsa0JBQUssUUFBUSw0QkFBVSxXQUFXLEdBQUcsV0FBVztBQUNsRTsiLCJuYW1lcyI6WyJwcm9jZXNzIiwicmVsYXRpdmVOYXRpdmUiLCJyZXNvbHZlTmF0aXZlIiwidmlzaXQiXX0=
|
|
547
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWJyYXJ5LWJ1aWxkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgYnVpbGQgcGlwZWxpbmUgb2YgYSBUeXBlU2NyaXB0IExJQlJBUlkgcGFja2FnZTogb25lIGBkaXN0L2xpYi97Y2pzLGVzbX1gIHRyZWUgb2YgdW5idW5kbGVkIG1vZHVsZXMgYmVzaWRlIGl0c1xuICogYC5kLmN0c2AgLyBgLmQubXRzYCBkZWNsYXJhdGlvbnMsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCBhbmQgdGhlIGdlbmVyYXRlZCBgcGFja2FnZS5qc29uYCBgZXhwb3J0c2AgbWFwLlxuICpcbiAqIEVhY2ggc3RlcCB3b3JrcyBvbiB0aGUgY3VycmVudCB3b3JraW5nIGZvbGRlciwgd2hpY2ggaXMgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQuIEEgcmVwb3NpdG9yeSdzXG4gKiBgc2NyaXB0cy9idWlsZC0qLnRzYCBlbnRyeSBwb2ludHMgYXJlIHRoaW4gYHdyYXBDbGlUYXNrYCB3cmFwcGVycyBhcm91bmQgdGhlc2UgZnVuY3Rpb25zLCBhbmQgaXRzIGBidWlsZGAgc2NyaXB0XG4gKiBydW5zIHRoZW0gaW4gb3JkZXIgdGhyb3VnaCB7QGxpbmsgcnVuQnVpbGRTdGVwc30uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZE9wdGlvbnMsXG4gIFBsdWdpblxufSBmcm9tICdlc2J1aWxkJztcbmltcG9ydCB0eXBlIHsgRGlyZW50IH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFN5bWJvbCBhcyBUc1N5bWJvbCxcbiAgVHlwZUNoZWNrZXJcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzeW5jTWFwIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGlzRGVlcEVxdWFsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgbm9ybWFsaXplSWZSZWxhdGl2ZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHsgY29udGV4dCB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtcbiAgcmVsYXRpdmUgYXMgcmVsYXRpdmVOYXRpdmUsXG4gIHJlc29sdmUgYXMgcmVzb2x2ZU5hdGl2ZVxufSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVByb2dyYW0sXG4gIGZvckVhY2hDaGlsZCxcbiAgaXNJZGVudGlmaWVyLFxuICBpc1N0cmluZ0xpdGVyYWwsXG4gIFN5bWJvbEZsYWdzXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuXG5pbXBvcnQgeyBidWlsZENsZWFuIH0gZnJvbSAnLi9idWlsZC50cyc7XG5pbXBvcnQgeyBjaGFuZ2VFeHRlbnNpb25QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9jaGFuZ2UtZXh0ZW5zaW9uLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBmaXhFc21QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9maXgtZXNtLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBwcmVwcm9jZXNzUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVycy9lc2J1aWxkLWltcGwvcHJlcHJvY2Vzcy1wbHVnaW4udHMnO1xuaW1wb3J0IHsgcGFyc2VUc0NvbmZpZyB9IGZyb20gJy4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gJy4vY29kZS1nZW5lcmF0b3IudHMnO1xuaW1wb3J0IHsgcmVhZGRpclBvc2l4IH0gZnJvbSAnLi9mcy50cyc7XG5pbXBvcnQgeyB3cml0ZUpzb24gfSBmcm9tICcuL2pzb24udHMnO1xuaW1wb3J0IHsgbnBtUnVuT3B0aW9uYWwgfSBmcm9tICcuL25wbS1ydW4udHMnO1xuaW1wb3J0IHsgZWRpdFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVRvb2xDb21tYW5kIH0gZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuaW1wb3J0IHsgUmVwb1BhdGhzIH0gZnJvbSAnLi9yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7IGV4ZWNGcm9tUm9vdCB9IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogVGhlIGJhbm5lciBldmVyeSBlbWl0dGVkIGxpYnJhcnkgbW9kdWxlIG9wZW5zIHdpdGguXG4gKi9cbmV4cG9ydCBjb25zdCBMSUJSQVJZX0JBTk5FUiA9IGAvKlxuVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgRVNCVUlMRFxuaWYgeW91IHdhbnQgdG8gdmlldyB0aGUgc291cmNlLCBwbGVhc2UgdmlzaXQgdGhlIGdpdGh1YiByZXBvc2l0b3J5IG9mIHRoaXMgcGx1Z2luXG4qL1xuYDtcblxuLyoqXG4gKiBUaGUgc3RlcHMgb2YgYSBsaWJyYXJ5IGJ1aWxkLCBpbiB0aGUgb3JkZXIge0BsaW5rIHJ1bkJ1aWxkU3RlcHN9IHJ1bnMgdGhlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IExJQlJBUllfQlVJTERfU1RFUFM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAnYnVpbGQ6Y2xlYW4nLFxuICAnYnVpbGQ6Z2VuZXJhdGUtaW5kZXgnLFxuICAnYnVpbGQ6Y29tcGlsZScsXG4gICdidWlsZDp0eXBlcycsXG4gICdidWlsZDp2YWxpZGF0ZS1kZWNsYXJhdGlvbnMnLFxuICAnYnVpbGQ6bGliJyxcbiAgJ2J1aWxkOmdlbmVyYXRlLWV4cG9ydHMnXG5dO1xuXG4vKipcbiAqIFRoZSBleHBvcnQgY29uZGl0aW9uIGEgcmVwb3NpdG9yeSBob2xkaW5nIHNldmVyYWwgcGFja2FnZXMgbWFwcyBldmVyeSBzdWJwYXRoIG9udG8gaXRzIFR5cGVTY3JpcHQgc291cmNlIHdpdGgsIHNvXG4gKiBhIHBhY2thZ2UgdGhlcmUgY2FuIGltcG9ydCBhIHNpYmxpbmcgcGFja2FnZSdzIHNvdXJjZSBiZWZvcmUgYW55dGhpbmcgaXMgYnVpbHQuIFBhc3MgaXQgdG9cbiAqIHtAbGluayBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzfSB0aHJvdWdoIHtAbGluayBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucy5zb3VyY2VDb25kaXRpb259LlxuICovXG5leHBvcnQgY29uc3QgU09VUkNFX0NPTkRJVElPTiA9ICdAbW5hb3Vtb3Yvc291cmNlJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgYnVpbGRMaWJyYXJ5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZExpYnJhcnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHByZXByb2Nlc3MgcGx1Z2luIGZvciBvbmUgb3V0cHV0IGZvcm1hdC4gRGVmYXVsdHMgdG8gdGhlIGdlbmVyaWMgb25lLCB3aGljaCBjYXJyaWVzIG5vXG4gICAqIGVudmlyb25tZW50LXNwZWNpZmljIGByZXF1aXJlYCBwYXRjaC5cbiAgICovXG4gIHJlYWRvbmx5IHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5PzogKGlzRXNtOiBib29sZWFuKSA9PiBQbHVnaW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdlbmVyYXRlTGlicmFyeUV4cG9ydHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlTGlicmFyeUV4cG9ydHNPcHRpb25zIHtcbiAgLyoqXG4gICAqIEVudHJpZXMgZm9yIGZpbGVzIHRoYXQgYXJlIG5vdCBidWlsdCBmcm9tIGEgc291cmNlIGZvbGRlciAoYSBmb2xkZXIgb2Ygc2hhcmVkIGB0c2NvbmZpZ2AgcHJlc2V0cywgYW1iaWVudCBgLmQudHNgXG4gICAqIGZpbGVzKSwga2V5ZWQgYnkgc3VicGF0aC4gVGhleSBnbyBpbnRvIHRoZSBtYXAgYWZ0ZXIgdGhlIGdlbmVyYXRlZCBlbnRyaWVzLCBhcyBnaXZlbiwgYW5kIGNvdW50IHRvd2FyZCBpdHMgY2hhbmdlXG4gICAqIGNoZWNrOyBubyBzdWJwYXRoIHN0dWIgaXMgd3JpdHRlbiBmb3IgdGhlbS4gQSBrZXkgYSBzb3VyY2UgZm9sZGVyIGFscmVhZHkgZ2VuZXJhdGVzIHRocm93cy5cbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxFeHBvcnRzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUGFja2FnZUpzb24uRXhwb3J0cz4+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBbiBleHBvcnQgY29uZGl0aW9uIHRvIHB1dCBmaXJzdCBpbiBldmVyeSBlbnRyeSwgbWFwcGluZyB0aGUgc3VicGF0aCBvbnRvIGl0cyBUeXBlU2NyaXB0IHNvdXJjZS4gT25seSBhXG4gICAqIHJlcG9zaXRvcnkgaG9sZGluZyBzZXZlcmFsIHBhY2thZ2VzIHRoYXQgaW1wb3J0IGVhY2ggb3RoZXIgbmVlZHMgb25lOyBub3RoaW5nIG91dHNpZGUgaXQgc2V0cyB0aGUgY29uZGl0aW9uLCBhbmRcbiAgICogdGhlIHNvdXJjZXMgaXQgcG9pbnRzIGF0IGRvIG5vdCBzaGlwLCBzbyB0aGUgcHVibGlzaCBoYXMgdG8gc3RyaXAgaXQgYWdhaW4uIE9taXR0ZWQsIHRoZSBtYXAgaGFzIG5vbmUuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VDb25kaXRpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbnR5cGUgTW9kdWxlRm9ybWF0ID0gJ2NqcycgfCAnZXNtJztcblxuY29uc3QgREVDTEFSQVRJT05fUkVGRVJFTkNFX1RZUEVTID0gbmV3IFNldChbJ25vZGUnXSk7XG5cbi8vIFRoZSBsaWJzIHRoYXQgZGVzY3JpYmUgYSBob3N0J3MgZ2xvYmFscyByYXRoZXIgdGhhbiB0aGUgbGFuZ3VhZ2UsIHdoaWNoIGNvbnN1bWVycyBjb25mbGljdCBvdmVyLiBFYWNoIGRlY2xhcmF0aW9uXG4vLyBnZXRzIHRoZSBvbmVzIGl0IHVzZXM7IGV2ZXJ5IG90aGVyIGxpYiBpcyBzaGFyZWQgdGhyb3VnaCBgbGlicmFyeS1yZWZlcmVuY2VzYC5cbmNvbnN0IEVOVklST05NRU5UX0xJQl9QUkVGSVhFUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbJ2RvbScsICdzY3JpcHRob3N0JywgJ3dlYndvcmtlciddO1xuY29uc3QgTk9ERV9UWVBFU19QQVRIX1NFR01FTlQgPSAnL25vZGVfbW9kdWxlcy9AdHlwZXMvbm9kZS8nO1xuY29uc3QgTElCX1JFUExBQ0VNRU5UX1JFR19FWFAgPSAvXFwvbm9kZV9tb2R1bGVzXFwvQHR5cGVzY3JpcHRcXC9saWItKD88TGliPlteL10rKVxcLyg/PFN1YkxpYj4uKylcXC5kXFwudHMkLztcblxuLy8gVGhlIGRlY2xhcmF0aW9uIHRoYXQgY2FycmllcyBvbmx5IHRoZSBgbGliYCBhbmQgYHR5cGVzYCByZWZlcmVuY2VzLiBFdmVyeSBkZWNsYXJhdGlvbiBidXQgdGhlIHJvb3Qgb25lIHJlZmVyZW5jZXNcbi8vIGl0LCByYXRoZXIgdGhhbiB0aGUgcm9vdCBiYXJyZWwsIHdoaWNoIHdvdWxkIGxvYWQgZXZlcnkgbW9kdWxlIG9mIHRoZSBwYWNrYWdlLCBvcHRpb25hbCBwZWVycycgdHlwZXMgaW5jbHVkZWQuXG5jb25zdCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FID0gJ2xpYnJhcnktcmVmZXJlbmNlcyc7XG4vLyBTcGVsbGVkIGFwYXJ0IG9uIHB1cnBvc2U6IHtAbGluayBjb2xsZWN0QWxsTGlic30gc2NhbnMgZXZlcnkgc291cmNlIGZpbGUgb2YgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQgZm9yIHRoZVxuLy8gZGlyZWN0aXZlLCB0aGlzIG9uZSBpbmNsdWRlZCwgc28gYSBsaXRlcmFsIG9uZSBoZXJlIHdvdWxkIGJlIHJlYWQgYXMgYSBsaWIgdGhpcyBwYWNrYWdlIG5lZWRzLlxuY29uc3QgUkVGRVJFTkNFX0xJQl9ESVJFQ1RJVkUgPSBbJzxyZWZlcmVuY2UnLCAnbGliPSddLmpvaW4oJyAnKTtcbmNvbnN0IFJFRkVSRU5DRV9MSUJfUkVHX0VYUCA9IC9cXC9cXC9cXC8gPHJlZmVyZW5jZSBsaWI9XCIoPzxMaWI+W15cIl0rKVwiIFxcLz4vZ207XG5cbi8vIEEgYmFyZS1zcGVjaWZpZXIgKG5vbi1yZWxhdGl2ZSkgdHlwZS1vbmx5IGltcG9ydCwgZS5nLiBgaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztgLlxuY29uc3QgQkFSRV9UWVBFX0lNUE9SVF9SRUdfRVhQID0gL15pbXBvcnQgdHlwZSAoPzxDbGF1c2U+Lis/KSBmcm9tICcoPzxTcGVjaWZpZXI+W14uJ11bXiddKiknOyQvZ207XG5cbi8vIEEgYmFyZS1zcGVjaWZpZXIgKG5vbi1yZWxhdGl2ZSkgaW5saW5lIGltcG9ydCB0eXBlIG5vZGUsIGUuZy4gYGltcG9ydChcInR5cGUtZmVzdFwiKS5Qcm9taXNhYmxlYC5cbmNvbnN0IEJBUkVfSU5MSU5FX0lNUE9SVF9UWVBFX1JFR19FWFAgPSAvaW1wb3J0XFwoXCIoPzxTcGVjaWZpZXI+W14uXCJdW15cIl0qKVwiXFwpL2c7XG5cbmNvbnN0IFNUQVRJQ19JTVBPUlRfUkVHX0VYUCA9IC9mcm9tICcoPzxJbXBvcnRQYXRoPi4rPylcXC50cyc7L2dtO1xuXG4vLyBJbmxpbmUgaW1wb3J0LXR5cGUgbm9kZXMgKGB0eXBlb2YgaW1wb3J0KCcuL2Zvby50cycpYCkgcHJlc2VydmUgdGhlIHNvdXJjZSBxdW90ZSBzdHlsZS5cbi8vIEhhbmQtYXV0aG9yZWQgYC5kLnRzYCBmaWxlcyBlbWl0IHNpbmdsZSBxdW90ZXM7IHRzYy1nZW5lcmF0ZWQgZGVjbGFyYXRpb25zIGVtaXQgZG91YmxlIHF1b3Rlcy5cbi8vIENhcHR1cmUgdGhlIHF1b3RlIGFuZCByZXVzZSBpdCBpbiB0aGUgcmVwbGFjZW1lbnQgc28gYm90aCBzdHlsZXMgYXJlIHJld3JpdHRlbi5cbmNvbnN0IERZTkFNSUNfSU1QT1JUX1JFR19FWFAgPSAvaW1wb3J0XFwoKD88UXVvdGU+WydcIl0pKD88SW1wb3J0UGF0aD4uKz8pXFwudHNcXGs8UXVvdGU+XFwpL2dtO1xuXG5lbnVtIEdlbmVyYXRlSW5kZXhSZXN1bHQge1xuICBTa2lwcGVkID0gJ3NraXBwZWQnLFxuICBTdWNjZXNzID0gJ3N1Y2Nlc3MnXG59XG5cbmludGVyZmFjZSBBZGRFbnZpcm9ubWVudEdsb2JhbHNQYXJhbXMge1xuICByZWFkb25seSBsaWJzOiBTZXQ8c3RyaW5nPjtcbiAgcmVhZG9ubHkgcHJvZ3JhbTogUHJvZ3JhbTtcbiAgcmVhZG9ubHkgc3ltYm9sOiBUc1N5bWJvbDtcbiAgcmVhZG9ubHkgdHlwZXM6IFNldDxzdHJpbmc+O1xufVxuXG5pbnRlcmZhY2UgQnVpbGRMaWJyYXJ5Rm9ybWF0UGFyYW1zIHtcbiAgcmVhZG9ubHkgZm9ybWF0OiBNb2R1bGVGb3JtYXQ7XG4gIHJlYWRvbmx5IGxpYkZpbGVzOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgcHJlcHJvY2Vzc1BsdWdpbkZhY3Rvcnk6IChpc0VzbTogYm9vbGVhbikgPT4gUGx1Z2luO1xufVxuXG5pbnRlcmZhY2UgQnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlUGFyYW1zIHtcbiAgcmVhZG9ubHkgZGVjbGFyYXRpb25GaWxlUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBleHRlbnNpb246IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kdWxlRGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDb2xsZWN0RW52aXJvbm1lbnREaXJlY3RpdmVzUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXZhaWxhYmxlVHlwZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBkZWNsYXJhdGlvbkZpbGVzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNldEV4cG9ydFBhcmFtcyB7XG4gIHJlYWRvbmx5IGV4cG9ydENvbmRpdGlvbnM6IFBhY2thZ2VKc29uLkV4cG9ydENvbmRpdGlvbnM7XG4gIHJlYWRvbmx5IGlzV2lsZGNhcmQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNvdXJjZUNvbmRpdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBzcmNGb2xkZXI6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFRvRGlzdFBhdGhQYXJhbXMge1xuICByZWFkb25seSBmb3JtYXQ6IHN0cmluZztcbiAgcmVhZG9ubHkgaW1wb3J0UGF0aDogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBldmVyeXRoaW5nIGFuIGVhcmxpZXIgYnVpbGQgbGVmdDogYGRpc3QvYCwgdGhlIGdlbmVyYXRlZCBgaW5kZXgudHNgIGJhcnJlbHMsIHRoZSBgLmQudHNgIGZpbGVzIGB0c2NgIHdyb3RlXG4gKiBiZXNpZGUgdGhlIHNvdXJjZXMgKGhhbmQtYXV0aG9yZWQgb25lcyB1bmRlciBgQHR5cGVzYCBzdGF5KSwgYW5kIHRoZSBwZXItc3VicGF0aCBgcGFja2FnZS5qc29uYCBzdHVicy5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gZXZlcnl0aGluZyBoYXMgYmVlbiByZW1vdmVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDbGVhbkxpYnJhcnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGJ1aWxkQ2xlYW4oKTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSkge1xuICAgIGlmIChiYXNlbmFtZShmaWxlKSA9PT0gUmVwb1BhdGhzLkluZGV4VHMgYXMgc3RyaW5nKSB7XG4gICAgICBhd2FpdCBybShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpKTtcbiAgICB9XG5cbiAgICBpZiAoZmlsZS5lbmRzV2l0aChSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5zcGxpdCgnLycpLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcykpIHtcbiAgICAgIGF3YWl0IHJtKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSkpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pKSB7XG4gICAgaWYgKChiYXNlbmFtZShmaWxlKSAhPT0gUmVwb1BhdGhzLlBhY2thZ2VKc29uIGFzIHN0cmluZykgfHwgKGZpbGUgPT09IFJlcG9QYXRocy5QYWNrYWdlSnNvbiBhcyBzdHJpbmcpIHx8IGZpbGUuc3RhcnRzV2l0aChSZXBvUGF0aHMuTm9kZU1vZHVsZXMpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBhd2FpdCBybShmaWxlKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyBldmVyeSBzb3VyY2UgbW9kdWxlLCB1bmJ1bmRsZWQsIGludG8gYGRpc3QvbGliL2Nqc2AgKGAuY2pzYCkgYW5kIGBkaXN0L2xpYi9lc21gIChgLm1qc2ApLlxuICpcbiAqIFRoZSBvdXRwdXQgZm9sZGVycyBtdXN0IGFscmVhZHkgZXhpc3Q7IHtAbGluayBidWlsZExpYnJhcnlUeXBlc30gY3JlYXRlcyB0aGVtLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIGJ1aWxkIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYm90aCBmb3JtYXRzIGhhdmUgYmVlbiBidWlsdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkTGlicmFyeShvcHRpb25zOiBCdWlsZExpYnJhcnlPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSA9IChpc0VzbTogYm9vbGVhbik6IFBsdWdpbiA9PiBwcmVwcm9jZXNzUGx1Z2luKHsgaXNFc20gfSkgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGxpYkZpbGVzID0gYXdhaXQgZ2V0TGliRmlsZXMoKTtcbiAgYXdhaXQgYnVpbGRMaWJyYXJ5Rm9ybWF0KHsgZm9ybWF0OiAnY2pzJywgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0pO1xuICBhd2FpdCBidWlsZExpYnJhcnlGb3JtYXQoeyBmb3JtYXQ6ICdlc20nLCBsaWJGaWxlcywgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkgfSk7XG59XG5cbi8qKlxuICogRW1pdHMgdGhlIGRlY2xhcmF0aW9ucyB3aXRoIGB0c2MgLS1wcm9qZWN0IC4vdHNjb25maWcudHlwZXMuanNvbmAsIHRoZW4gY29waWVzIGVhY2ggb25lIGludG8gYGRpc3QvbGliYCB0d2ljZTogYXMgYVxuICogYC5kLmN0c2Agd2hvc2UgcmVsYXRpdmUgaW1wb3J0cyBuYW1lIGAuY2pzYCBmaWxlcyBhbmQgd2hvc2UgYmFyZSB0eXBlIGltcG9ydHMgY2FycnkgYHJlc29sdXRpb24tbW9kZTogaW1wb3J0YCwgYW5kXG4gKiBhcyBhIGAuZC5tdHNgIHdob3NlIHJlbGF0aXZlIGltcG9ydHMgbmFtZSBgLm1qc2AgZmlsZXMuXG4gKlxuICogVGhlIGxpYnJhcnkncyByb290IGRlY2xhcmF0aW9uIChgbGlicmFyeS50c2Agd2hlcmUgdGhlIHBhY2thZ2UgaGFzIG9uZSwgb3RoZXJ3aXNlIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCkgY2Fycmllc1xuICogZXZlcnkgYGxpYmAgYW5kIGB0eXBlc2AgcmVmZXJlbmNlIHRoZSBwYWNrYWdlIG5lZWRzLiBFdmVyeSBvdGhlciBkZWNsYXJhdGlvbiByZWZlcmVuY2VzIGEgYGxpYnJhcnktcmVmZXJlbmNlc2BcbiAqIGRlY2xhcmF0aW9uIGJlc2lkZSBpdCBieSBwYXRoLCBuZXZlciB0aGUgcm9vdDogdGhlIHJvb3QgYmFycmVsIHJlLWV4cG9ydHMgZXZlcnkgbW9kdWxlLCBzbyByZWZlcmVuY2luZyBpdCBtYWRlIGVhY2hcbiAqIHN1YnBhdGggbG9hZCB0aGUgd2hvbGUgcGFja2FnZSwgYW5kIGEgY29uc3VtZXIgdHlwZS1jaGVja2luZyB3aXRoIGBza2lwTGliQ2hlY2s6IGZhbHNlYCB0aGVuIG5lZWRlZCBldmVyeSBvcHRpb25hbFxuICogcGVlciBpbnN0YWxsZWQuXG4gKlxuICogYGxpYnJhcnktcmVmZXJlbmNlc2AgY2FycmllcyBvbmx5IHRoZSBsaWJzIHRoYXQgZGVzY3JpYmUgdGhlIGxhbmd1YWdlIChgZXMyMDIyYCwgYGVzbmV4dC5kaXNwb3NhYmxlYCksIHdoaWNoIG5vXG4gKiBjb25zdW1lciBjb25mbGljdHMgd2l0aC4gVGhlIG9uZXMgdGhhdCBkZXNjcmliZSBhIGhvc3QgKGBkb21gLCBgZG9tLml0ZXJhYmxlYCwgYHdlYndvcmtlcmApIGFuZCBgdHlwZXM9XCJub2RlXCJgIGdvXG4gKiBvbmx5IGludG8gdGhlIGRlY2xhcmF0aW9ucyB0aGF0IG5hbWUgb25lIG9mIHRoZWlyIGdsb2JhbHMsIGZvdW5kIGJ5IHJlc29sdmluZyBldmVyeSBuYW1lIGluIHRoZSBlbWl0dGVkXG4gKiBkZWNsYXJhdGlvbnMgd2l0aCB0aGUgdHlwZSBjaGVja2VyLiBPdGhlcndpc2UgYSBicm93c2VyIGNvbnN1bWVyIG9mIGEgcHVyZSBzdWJwYXRoIGdvdCBhbGwgb2YgYEB0eXBlcy9ub2RlYCwgYW5kIGl0c1xuICogYHNldFRpbWVvdXRgIHJldHVybmVkIGBOb2RlSlMuVGltZW91dGAuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkZWNsYXJhdGlvbnMgaGF2ZSBiZWVuIHdyaXR0ZW4uXG4gKiBAdGhyb3dzIElmIGEgc291cmNlIG1vZHVsZSBpcyBuYW1lZCBgbGlicmFyeS1yZWZlcmVuY2VzYCwgd2hpY2ggd291bGQgY29sbGlkZSB3aXRoIHRoZSBnZW5lcmF0ZWQgZGVjbGFyYXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZExpYnJhcnlUeXBlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGV4aXN0c1N5bmMoam9pbihSZXBvUGF0aHMuU3JjLCBgJHtMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FfSR7UmVwb1BhdGhzLlRzRXh0ZW5zaW9ufWApKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgc3JjLyR7TElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRX0ke1JlcG9QYXRocy5Uc0V4dGVuc2lvbn0gY29sbGlkZXMgd2l0aCB0aGUgZ2VuZXJhdGVkIGRlY2xhcmF0aW9uIG9mIHRoZSBzYW1lIG5hbWUuYCk7XG4gIH1cblxuICBhd2FpdCBleGVjRnJvbVJvb3QoWy4uLnJlc29sdmVUb29sQ29tbWFuZCh7IHRvb2w6ICd0c2MnIH0pLCAnLS1wcm9qZWN0JywgJy4vdHNjb25maWcudHlwZXMuanNvbiddKTtcblxuICBjb25zdCBsaWJyYXJ5RmlsZU5hbWUgPSBleGlzdHNTeW5jKGpvaW4oUmVwb1BhdGhzLlNyYywgJ2xpYnJhcnkudHMnKSkgPyAnbGlicmFyeScgOiAnaW5kZXgnO1xuICBjb25zdCBhbGxMaWJzID0gYXdhaXQgY29sbGVjdEFsbExpYnMoKTtcbiAgY29uc3QgYWxsVHlwZXMgPSBjb2xsZWN0QWxsVHlwZXMoKTtcbiAgY29uc3QgZGlyZWN0aXZlcyA9IGJ1aWxkQWxsUmVmZXJlbmNlTGliRGlyZWN0aXZlcyhhbGxMaWJzKSArIGJ1aWxkQWxsUmVmZXJlbmNlVHlwZXNEaXJlY3RpdmVzKGFsbFR5cGVzKTtcbiAgLy8gT25seSB0aGUgbGlicyBubyBjb25zdW1lciBjb25mbGljdHMgd2l0aC4gVGhlIGVudmlyb25tZW50IGdsb2JhbHMgZ28gdG8gdGhlIGRlY2xhcmF0aW9ucyB0aGF0IHVzZSB0aGVtLlxuICBjb25zdCBzaGFyZWREaXJlY3RpdmVzID0gYnVpbGRBbGxSZWZlcmVuY2VMaWJEaXJlY3RpdmVzKGFsbExpYnMuZmlsdGVyKChsaWIpID0+ICFpc0Vudmlyb25tZW50TGliKGxpYikpKTtcblxuICBhd2FpdCBta2Rpcihqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuQ2pzKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IG1rZGlyKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5Fc20pLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5DanMsIExJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUUgKyBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbiksIHNoYXJlZERpcmVjdGl2ZXMpO1xuICBhd2FpdCB3cml0ZUZpbGUoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkVzbSwgTElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRSArIFJlcG9QYXRocy5EbXRzRXh0ZW5zaW9uKSwgc2hhcmVkRGlyZWN0aXZlcyk7XG5cbiAgY29uc3Qgc3JjRmlsZXMgPSBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGRlY2xhcmF0aW9uRmlsZXMgPSBzcmNGaWxlcy5maWx0ZXIoKGZpbGUpID0+IGZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuc3RhcnRzV2l0aChSZXBvUGF0aHMuVGVzdEhlbHBlcnMpKTtcbiAgY29uc3QgZW52aXJvbm1lbnREaXJlY3RpdmVzID0gY29sbGVjdEVudmlyb25tZW50RGlyZWN0aXZlcyh7IGF2YWlsYWJsZVR5cGVzOiBhbGxUeXBlcywgZGVjbGFyYXRpb25GaWxlcyB9KTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZGVjbGFyYXRpb25GaWxlcykge1xuICAgIGNvbnN0IGZvbGRlciA9IGRpcm5hbWUoZmlsZSk7XG4gICAgY29uc3QgbmFtZSA9IGJhc2VuYW1lKGZpbGUsIFJlcG9QYXRocy5EdHNFeHRlbnNpb24pO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpLCAndXRmLTgnKTtcblxuICAgIGNvbnN0IGN0c1BhdGggPSBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuQ2pzLCBmb2xkZXIsIG5hbWUgKyBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgbXRzUGF0aCA9IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5Fc20sIGZvbGRlciwgbmFtZSArIFJlcG9QYXRocy5EbXRzRXh0ZW5zaW9uKTtcblxuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUoY3RzUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUobXRzUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgbGV0IGN0c0NvbnRlbnQgPSB0b0N0c0NvbnRlbnQoY29udGVudCk7XG4gICAgbGV0IG10c0NvbnRlbnQgPSB0b010c0NvbnRlbnQoY29udGVudCk7XG5cbiAgICBpZiAobmFtZSA9PT0gbGlicmFyeUZpbGVOYW1lICYmIGZvbGRlciA9PT0gJy4nKSB7XG4gICAgICBjdHNDb250ZW50ID0gZGlyZWN0aXZlcyArIGN0c0NvbnRlbnQ7XG4gICAgICBtdHNDb250ZW50ID0gZGlyZWN0aXZlcyArIG10c0NvbnRlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZpbGVEaXJlY3RpdmVzID0gZW52aXJvbm1lbnREaXJlY3RpdmVzLmdldChmaWxlKSA/PyAnJztcbiAgICAgIGN0c0NvbnRlbnQgPSBidWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmUoeyBkZWNsYXJhdGlvbkZpbGVQYXRoOiBjdHNQYXRoLCBleHRlbnNpb246IFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uLCBtb2R1bGVEaXJlY3Rvcnk6IFJlcG9QYXRocy5DanMgfSlcbiAgICAgICAgKyBmaWxlRGlyZWN0aXZlcyArIGN0c0NvbnRlbnQ7XG4gICAgICBtdHNDb250ZW50ID0gYnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlKHsgZGVjbGFyYXRpb25GaWxlUGF0aDogbXRzUGF0aCwgZXh0ZW5zaW9uOiBSZXBvUGF0aHMuRG10c0V4dGVuc2lvbiwgbW9kdWxlRGlyZWN0b3J5OiBSZXBvUGF0aHMuRXNtIH0pXG4gICAgICAgICsgZmlsZURpcmVjdGl2ZXMgKyBtdHNDb250ZW50O1xuICAgIH1cblxuICAgIGF3YWl0IHdyaXRlRmlsZShjdHNQYXRoLCBjdHNDb250ZW50KTtcbiAgICBhd2FpdCB3cml0ZUZpbGUobXRzUGF0aCwgbXRzQ29udGVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWdlbmVyYXRlcyB0aGUgYGV4cG9ydHNgIG1hcCBvZiB0aGUgcGFja2FnZSdzIGBwYWNrYWdlLmpzb25gIGZyb20gaXRzIHNvdXJjZSBmb2xkZXJzLCBhbmQgd3JpdGVzIGEgYHBhY2thZ2UuanNvbmBcbiAqIHN0dWIgcGVyIHN1YnBhdGggZm9yIHJlc29sdmVycyB0aGF0IGRvIG5vdCByZWFkIGBleHBvcnRzYC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgR2VuZXJhdGVMaWJyYXJ5RXhwb3J0c09wdGlvbnN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBtYXAgaXMgY3VycmVudC5cbiAqIEB0aHJvd3MgSWYgdGhlIG1hcCBjaGFuZ2VkLCBzbyB0aGUgY2hhbmdlIGdldHMgcmV2aWV3ZWQgYW5kIGNvbW1pdHRlZCByYXRoZXIgdGhhbiBzaGlwcGVkIHVuc2Vlbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGlicmFyeUV4cG9ydHMob3B0aW9uczogR2VuZXJhdGVMaWJyYXJ5RXhwb3J0c09wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGFkZGl0aW9uYWxFeHBvcnRzID0ge30sIHNvdXJjZUNvbmRpdGlvbiB9ID0gb3B0aW9ucztcbiAgY29uc3Qgc3JjRm9sZGVyczogc3RyaW5nW10gPSBbUmVwb1BhdGhzLlNyY107XG5cbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5TcmMsIHsgcmVjdXJzaXZlOiB0cnVlLCB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFkaXJlbnQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGpvaW4oZGlyZW50LnBhcmVudFBhdGgsIGRpcmVudC5uYW1lKTtcblxuICAgIGlmIChwYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5TdHlsZXMpIHx8IHBhdGguaW5jbHVkZXMoUmVwb1BhdGhzLlRlc3RIZWxwZXJzKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgc3JjRm9sZGVycy5wdXNoKHBhdGgpO1xuICB9XG5cbiAgc3JjRm9sZGVycy5zb3J0KCk7XG5cbiAgbGV0IGlzQ2hhbmdlZCA9IGZhbHNlO1xuXG4gIGF3YWl0IGVkaXRQYWNrYWdlSnNvbihhc3luYyAocGFja2FnZUpzb24pID0+IHtcbiAgICBjb25zdCBvbGRFeHBvcnRzID0gcGFja2FnZUpzb24uZXhwb3J0cztcbiAgICBjb25zdCBleHBvcnRDb25kaXRpb25zOiBQYWNrYWdlSnNvbi5FeHBvcnRDb25kaXRpb25zID0ge307XG4gICAgcGFja2FnZUpzb24uZXhwb3J0cyA9IGV4cG9ydENvbmRpdGlvbnM7XG4gICAgZm9yIChjb25zdCBzcmNGb2xkZXIgb2Ygc3JjRm9sZGVycykge1xuICAgICAgYXdhaXQgc2V0RXhwb3J0KHsgZXhwb3J0Q29uZGl0aW9ucywgaXNXaWxkY2FyZDogZmFsc2UsIHNvdXJjZUNvbmRpdGlvbiwgc3JjRm9sZGVyIH0pO1xuICAgICAgYXdhaXQgc2V0RXhwb3J0KHsgZXhwb3J0Q29uZGl0aW9ucywgaXNXaWxkY2FyZDogdHJ1ZSwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbc3VicGF0aCwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKGFkZGl0aW9uYWxFeHBvcnRzKSkge1xuICAgICAgaWYgKGV4cG9ydENvbmRpdGlvbnNbc3VicGF0aF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBhZGRpdGlvbmFsIGV4cG9ydCAnJHtzdWJwYXRofScgY29sbGlkZXMgd2l0aCBhbiBlbnRyeSBnZW5lcmF0ZWQgZnJvbSBhIHNvdXJjZSBmb2xkZXIuYCk7XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydENvbmRpdGlvbnNbc3VicGF0aF0gPSBlbnRyeTtcbiAgICB9XG5cbiAgICBpc0NoYW5nZWQgPSAhaXNEZWVwRXF1YWwob2xkRXhwb3J0cywgcGFja2FnZUpzb24uZXhwb3J0cyk7XG4gIH0pO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEl0IGNoYW5nZWQgaW4gdGhlIGBlZGl0UGFja2FnZUpzb25gLCBFU0xpbnQgbWlzdGFrZW5seSBkb2VzIG5vdCByZWNvZ25pemUgaXQuXG4gIGlmIChpc0NoYW5nZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhY2thZ2UgZXhwb3J0cyBoYXZlIGNoYW5nZWQuIFBsZWFzZSByZXZpZXcgdGhlIGNoYW5nZXMgYW5kIGNvbW1pdCB0aGVtLicpO1xuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGFuIGBpbmRleC50c2AgYmFycmVsIGluIGV2ZXJ5IHNvdXJjZSBmb2xkZXIgdGhhdCBoYXMgc29tZXRoaW5nIHRvIGV4cG9ydCwgcmUtZXhwb3J0aW5nIGVhY2ggbW9kdWxlIGFuZFxuICogZWFjaCBzdWItYmFycmVsIHVuZGVyIGl0cyBvd24gbmFtZS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhcnJlbHMgaGF2ZSBiZWVuIHdyaXR0ZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpYnJhcnlJbmRleCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZ2VuZXJhdGVJbmRleChSZXBvUGF0aHMuU3JjKTtcbn1cblxuLyoqXG4gKiBSdW5zIGVhY2ggbmFtZWQgbnBtIHNjcmlwdCB0aGUgcGFja2FnZSBkZWZpbmVzLCBpbiBvcmRlciwgc2tpcHBpbmcgdGhlIG9uZXMgaXQgZG9lcyBub3QgZGVmaW5lLlxuICpcbiAqIEBwYXJhbSBzdGVwcyAtIFRoZSBucG0gc2NyaXB0IG5hbWVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5IHN0ZXAgaGFzIHJ1bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkJ1aWxkU3RlcHMoc3RlcHM6IHJlYWRvbmx5IHN0cmluZ1tdID0gTElCUkFSWV9CVUlMRF9TVEVQUyk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcHMpIHtcbiAgICBhd2FpdCBucG1SdW5PcHRpb25hbChzdGVwKTtcbiAgfVxufVxuXG4vKipcbiAqIEFkZHMgd2hhdCBhIGNvbnN1bWVyIG5lZWRzIGxvYWRlZCBmb3Igb25lIHN5bWJvbCBhIGRlY2xhcmF0aW9uIG5hbWVzLiBBIHN5bWJvbCBhbnkgRVMgbGliIGRlY2xhcmVzIG5lZWRzIG5vdGhpbmcsXG4gKiBiZWNhdXNlIG5vIGNvbnN1bWVyIGNvbmZsaWN0cyB3aXRoIHRob3NlIGxpYnMuIE90aGVyd2lzZSBlYWNoIGVudmlyb25tZW50IGxpYiB0aGF0IGRlY2xhcmVzIGl0IGFkZHMgaXRzZWxmLCBhbmRcbiAqIGZhaWxpbmcgdGhhdCBgQHR5cGVzL25vZGVgIGFkZHMgYG5vZGVgLiBBIHN5bWJvbCBkZWNsYXJlZCBpbiB0aGUgcGFja2FnZSdzIG93biBmaWxlcyBhZGRzIG5vdGhpbmc6IHRoZSBkZWNsYXJhdGlvblxuICogdGhhdCBob2xkcyBpdCBjYXJyaWVzIGl0cyBvd24gZGlyZWN0aXZlcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHN5bWJvbCwgdGhlIHByb2dyYW0gaXQgd2FzIHJlc29sdmVkIGluLCBhbmQgdGhlIHNldHMgdG8gYWRkIHRvLlxuICovXG5mdW5jdGlvbiBhZGRFbnZpcm9ubWVudEdsb2JhbHMocGFyYW1zOiBBZGRFbnZpcm9ubWVudEdsb2JhbHNQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgeyBsaWJzLCBwcm9ncmFtLCBzeW1ib2wsIHR5cGVzIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGVudmlyb25tZW50TGliczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGlzTm9kZSA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2Ygc3ltYm9sLmRlY2xhcmF0aW9ucyA/PyBbXSkge1xuICAgIGNvbnN0IHNvdXJjZUZpbGUgPSBkZWNsYXJhdGlvbi5nZXRTb3VyY2VGaWxlKCk7XG4gICAgaWYgKHByb2dyYW0uaXNTb3VyY2VGaWxlRGVmYXVsdExpYnJhcnkoc291cmNlRmlsZSkpIHtcbiAgICAgIGNvbnN0IGxpYiA9IHRvTGliTmFtZShzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgICAgIGlmICghaXNFbnZpcm9ubWVudExpYihsaWIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGVudmlyb25tZW50TGlicy5wdXNoKGxpYik7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VGaWxlLmZpbGVOYW1lLmluY2x1ZGVzKE5PREVfVFlQRVNfUEFUSF9TRUdNRU5UKSkge1xuICAgICAgaXNOb2RlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoZW52aXJvbm1lbnRMaWJzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IGxpYiBvZiBlbnZpcm9ubWVudExpYnMpIHtcbiAgICAgIGxpYnMuYWRkKGxpYik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTm9kZSkge1xuICAgIHR5cGVzLmFkZCgnbm9kZScpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsUmVmZXJlbmNlTGliRGlyZWN0aXZlcyhsaWJzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtcbiAgICBsaWJzXG4gICAgICAubWFwKChsaWIpID0+IGAvLy8gJHtSRUZFUkVOQ0VfTElCX0RJUkVDVElWRX1cIiR7bGlifVwiIC8+YClcbiAgICAgIC5qb2luKCdcXG4nKVxuICB9XFxuYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRBbGxSZWZlcmVuY2VUeXBlc0RpcmVjdGl2ZXModHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVzLmxlbmd0aCA9PT0gMFxuICAgID8gJydcbiAgICA6IGAke1xuICAgICAgdHlwZXNcbiAgICAgICAgLm1hcCgodHlwZSkgPT4gYC8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiJHt0eXBlfVwiIC8+YClcbiAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgfVxcbmA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkTGlicmFyeUZvcm1hdChwYXJhbXM6IEJ1aWxkTGlicmFyeUZvcm1hdFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGZvcm1hdCwgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0gPSBwYXJhbXM7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IGZvcm1hdCA9PT0gJ2NqcycgPyBSZXBvUGF0aHMuQ2pzRXh0ZW5zaW9uIDogUmVwb1BhdGhzLk1qc0V4dGVuc2lvbjtcbiAgY29uc3QgYnVpbGRPcHRpb25zOiBCdWlsZE9wdGlvbnMgPSB7XG4gICAgLy8gRXhwbGljaXQsIGJlY2F1c2UgZXNidWlsZCBvdGhlcndpc2UgdGFrZXMgdGhlIGZvbGRlciBpdHMgc2VydmljZSBwcm9jZXNzIHN0YXJ0ZWQgaW4uXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gZXNidWlsZCdzIG93biBvcHRpb24gbmFtZS5cbiAgICBhYnNXb3JraW5nRGlyOiBwcm9jZXNzLmN3ZCgpLFxuICAgIGJhbm5lcjoge1xuICAgICAganM6IExJQlJBUllfQkFOTkVSXG4gICAgfSxcbiAgICBidW5kbGU6IGZhbHNlLFxuICAgIGVudHJ5UG9pbnRzOiBsaWJGaWxlcyxcbiAgICBmb3JtYXQsXG4gICAgbG9nTGV2ZWw6ICdpbmZvJyxcbiAgICBvdXRkaXI6IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIGZvcm1hdCksXG4gICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICBwbHVnaW5zOiBbXG4gICAgICBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeShmb3JtYXQgPT09ICdlc20nKSxcbiAgICAgIGZpeEVzbVBsdWdpbigpLFxuICAgICAgY2hhbmdlRXh0ZW5zaW9uUGx1Z2luKGV4dGVuc2lvbilcbiAgICBdLFxuICAgIHNvdXJjZW1hcDogJ2lubGluZScsXG4gICAgdGFyZ2V0OiAnRVMyMDIyJyxcbiAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICB3cml0ZTogZmFsc2VcbiAgfTtcblxuICBjb25zdCBidWlsZENvbnRleHQgPSBhd2FpdCBjb250ZXh0KGJ1aWxkT3B0aW9ucyk7XG4gIHRyeSB7XG4gICAgYXdhaXQgYnVpbGRDb250ZXh0LnJlYnVpbGQoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBidWlsZENvbnRleHQuZGlzcG9zZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZShwYXJhbXM6IEJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZVBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgZGVjbGFyYXRpb25GaWxlUGF0aCwgZXh0ZW5zaW9uLCBtb2R1bGVEaXJlY3RvcnkgfSA9IHBhcmFtcztcbiAgY29uc3QgbGlicmFyeUZpbGVQYXRoID0gam9pbihSZXBvUGF0aHMuRGlzdExpYiwgbW9kdWxlRGlyZWN0b3J5LCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FICsgZXh0ZW5zaW9uKTtcbiAgbGV0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlTmF0aXZlKGRpcm5hbWUoZGVjbGFyYXRpb25GaWxlUGF0aCksIGxpYnJhcnlGaWxlUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gIGlmICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgIHJlbGF0aXZlUGF0aCA9IGAuLyR7cmVsYXRpdmVQYXRofWA7XG4gIH1cbiAgcmV0dXJuIGAvLy8gPHJlZmVyZW5jZSBwYXRoPVwiJHtyZWxhdGl2ZVBhdGh9XCIgLz5cXG5gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0QWxsTGlicygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIC8vIFRoZSBSRVNPTFZFRCBvcHRpb25zLCBiZWNhdXNlIGEgcGFja2FnZSdzIGB0c2NvbmZpZy5qc29uYCBpbmhlcml0cyBgbGliYCBmcm9tIHRoZSBzaGFyZWQgYmFzZS4gVGhlIHJlc29sdmVkXG4gIC8vIG5hbWVzIGFyZSBmaWxlIG5hbWVzIChgbGliLmRvbS5pdGVyYWJsZS5kLnRzYCksIHNvIHRoZXkgYXJlIG1hcHBlZCBiYWNrIG9udG8gdGhlIG5hbWVzIGEgZGlyZWN0aXZlIHRha2VzLlxuICBjb25zdCB7IG9wdGlvbnMgfSA9IHBhcnNlVHNDb25maWcoUmVwb1BhdGhzLlRzQ29uZmlnSnNvbik7XG4gIGNvbnN0IGxpYnMgPSBuZXcgU2V0KChvcHRpb25zLmxpYiA/PyBbXSkubWFwKChsaWIpID0+IHRvTGliTmFtZShsaWIpKSk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSkge1xuICAgIGlmICghZmlsZS5lbmRzV2l0aCgnLnRzJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZUNvbnRlbnQgPSByZWFkRmlsZVN5bmMoam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSwgJ3V0Zi04Jyk7XG4gICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbHdheXMgY2FwdHVyZXMgaXRzIG9uZSBncm91cCwgc28gbm8gZmFsbGJhY2sgZm9yIGEgbWlzc2luZyBvbmUgaXMgbmVlZGVkLlxuICAgIGZvciAoY29uc3QgWywgbGliXSBvZiBzb3VyY2VDb250ZW50Lm1hdGNoQWxsKFJFRkVSRU5DRV9MSUJfUkVHX0VYUCkpIHtcbiAgICAgIGxpYnMuYWRkKFN0cmluZyhsaWIpLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbLi4ubGlic10uc29ydCgpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0QWxsVHlwZXMoKTogc3RyaW5nW10ge1xuICBjb25zdCB7IG9wdGlvbnMgfSA9IHBhcnNlVHNDb25maWcoUmVwb1BhdGhzLlRzQ29uZmlnSnNvbik7XG4gIHJldHVybiAob3B0aW9ucy50eXBlcyA/PyBbXSlcbiAgICAuZmlsdGVyKCh0eXBlKSA9PiBERUNMQVJBVElPTl9SRUZFUkVOQ0VfVFlQRVMuaGFzKHR5cGUpKVxuICAgIC5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RFbnZpcm9ubWVudERpcmVjdGl2ZXMocGFyYW1zOiBDb2xsZWN0RW52aXJvbm1lbnREaXJlY3RpdmVzUGFyYW1zKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHsgYXZhaWxhYmxlVHlwZXMsIGRlY2xhcmF0aW9uRmlsZXMgfSA9IHBhcmFtcztcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKFJlcG9QYXRocy5Uc0NvbmZpZ0pzb24pO1xuICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbSh7XG4gICAgb3B0aW9uczogeyAuLi5vcHRpb25zLCBub0VtaXQ6IHRydWUgfSxcbiAgICByb290TmFtZXM6IGRlY2xhcmF0aW9uRmlsZXMubWFwKChmaWxlKSA9PiByZXNvbHZlTmF0aXZlKFJlcG9QYXRocy5TcmMsIGZpbGUpKVxuICB9KTtcbiAgY29uc3QgY2hlY2tlciA9IHByb2dyYW0uZ2V0VHlwZUNoZWNrZXIoKTtcbiAgY29uc3QgZGlyZWN0aXZlc0J5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGRlY2xhcmF0aW9uRmlsZXMpIHtcbiAgICAvLyBUaGUgcHJvZ3JhbSB3YXMgaGFuZGVkIGV2ZXJ5IG9uZSBvZiB0aGVzZSBhcyBhIHJvb3QgbmFtZSwgc28gZWFjaCBvbmUgaXMgaW4gaXQuXG4gICAgY29uc3Qgc291cmNlRmlsZSA9IGVuc3VyZU5vbk51bGxhYmxlKHByb2dyYW0uZ2V0U291cmNlRmlsZShyZXNvbHZlTmF0aXZlKFJlcG9QYXRocy5TcmMsIGZpbGUpKSk7XG4gICAgY29uc3QgbGlicyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHR5cGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmdW5jdGlvbiB2aXNpdChub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgICBpZiAoaXNJZGVudGlmaWVyKG5vZGUpIHx8IGlzU3RyaW5nTGl0ZXJhbChub2RlKSkge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24obm9kZSk7XG4gICAgICAgIGlmIChzeW1ib2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFkZEVudmlyb25tZW50R2xvYmFscyh7IGxpYnMsIHByb2dyYW0sIHN5bWJvbDogcmVzb2x2ZUFsaWFzKGNoZWNrZXIsIHN5bWJvbCksIHR5cGVzIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpO1xuICAgIH1cbiAgICB2aXNpdChzb3VyY2VGaWxlKTtcblxuICAgIGNvbnN0IG5lZWRlZFR5cGVzID0gWy4uLnR5cGVzXS5maWx0ZXIoKHR5cGUpID0+IGF2YWlsYWJsZVR5cGVzLmluY2x1ZGVzKHR5cGUpKTtcbiAgICBpZiAobGlicy5zaXplID4gMCB8fCBuZWVkZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICBkaXJlY3RpdmVzQnlGaWxlLnNldChcbiAgICAgICAgZmlsZSxcbiAgICAgICAgKGxpYnMuc2l6ZSA+IDAgPyBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMoWy4uLmxpYnNdLnNvcnQoKSkgOiAnJykgKyBidWlsZEFsbFJlZmVyZW5jZVR5cGVzRGlyZWN0aXZlcyhuZWVkZWRUeXBlcy5zb3J0KCkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkaXJlY3RpdmVzQnlGaWxlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4KGZvbGRlcjogc3RyaW5nKTogUHJvbWlzZTxHZW5lcmF0ZUluZGV4UmVzdWx0PiB7XG4gIGNvbnN0IGRpcmVudHMgPSBhd2FpdCByZWFkZGlyUG9zaXgoZm9sZGVyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGNvbnN0IG1heWJlTGluZXMgPSBhd2FpdCBhc3luY01hcChkaXJlbnRzLCAoZGlyZW50KSA9PiBoYW5kbGVJbmRleERpcmVudChmb2xkZXIsIGRpcmVudCkpO1xuICBjb25zdCBsaW5lcyA9IG1heWJlTGluZXMuZmlsdGVyKChsaW5lKSA9PiBsaW5lICE9PSB1bmRlZmluZWQpO1xuXG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gR2VuZXJhdGVJbmRleFJlc3VsdC5Ta2lwcGVkO1xuICB9XG5cbiAgYXdhaXQgZ2VuZXJhdGUoam9pbihmb2xkZXIsIFJlcG9QYXRocy5JbmRleFRzKSwgbGluZXMpO1xuICByZXR1cm4gR2VuZXJhdGVJbmRleFJlc3VsdC5TdWNjZXNzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMaWJGaWxlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGxldCBmaWxlcyA9IGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZmlsZXMgPSBmaWxlcy5tYXAoKGZpbGUpID0+IG5vcm1hbGl6ZUlmUmVsYXRpdmUoam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSkpO1xuICByZXR1cm4gZmlsZXMuZmlsdGVyKChmaWxlKSA9PlxuICAgIGZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLlRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5lbmRzV2l0aChSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5lbmRzV2l0aCgnLnRlc3QudHMnKVxuICAgICYmICFmaWxlLmluY2x1ZGVzKGAvJHtSZXBvUGF0aHMuVGVzdEhlbHBlcnN9L2ApXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUluZGV4RGlyZW50KGZvbGRlcjogc3RyaW5nLCBkaXJlbnQ6IERpcmVudCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmIChpc0V4Y2x1ZGVkRnJvbUluZGV4KGZvbGRlciwgZGlyZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBzb3VyY2VGaWxlOiBzdHJpbmc7XG4gIGxldCBuYW1lOiBzdHJpbmc7XG4gIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdlbmVyYXRlSW5kZXgoam9pbihmb2xkZXIsIGRpcmVudC5uYW1lKSk7XG4gICAgaWYgKHJlc3VsdCAhPT0gR2VuZXJhdGVJbmRleFJlc3VsdC5TdWNjZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNvdXJjZUZpbGUgPSBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oZGlyZW50Lm5hbWUsIFJlcG9QYXRocy5JbmRleFRzKSk7XG4gICAgbmFtZSA9IGRpcmVudC5uYW1lO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUoZGlyZW50Lm5hbWUpO1xuICAgIG5hbWUgPSBiYXNlbmFtZShkaXJlbnQubmFtZSwgZXh0ZW5zaW9uKTtcbiAgICBzb3VyY2VGaWxlID0gbm9ybWFsaXplSWZSZWxhdGl2ZShkaXJlbnQubmFtZSk7XG4gIH1cblxuICByZXR1cm4gYGV4cG9ydCAqIGFzICcke25hbWV9JyBmcm9tICcke3NvdXJjZUZpbGV9JztgO1xufVxuXG5mdW5jdGlvbiBpc0Vudmlyb25tZW50TGliKGxpYjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBFTlZJUk9OTUVOVF9MSUJfUFJFRklYRVMuc29tZSgocHJlZml4KSA9PiBsaWIuc3RhcnRzV2l0aChwcmVmaXgpKTtcbn1cblxuZnVuY3Rpb24gaXNFeGNsdWRlZEZpbGVOYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gIW5hbWUuZW5kc1dpdGgoUmVwb1BhdGhzLlRzRXh0ZW5zaW9uKSB8fCBuYW1lLmVuZHNXaXRoKCcudGVzdC50cycpIHx8IG5hbWUgPT09ICdzZXR1cC50cycgfHwgbmFtZS5lbmRzV2l0aCgnLXNldHVwLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzRXhjbHVkZWRGcm9tSW5kZXgoZm9sZGVyOiBzdHJpbmcsIGRpcmVudDogRGlyZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IGV4Y2x1ZGVkTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1JlcG9QYXRocy5JbmRleFRzLCBSZXBvUGF0aHMuVHlwZXMsIFJlcG9QYXRocy5TdHlsZXMsIFJlcG9QYXRocy5UZXN0SGVscGVyc107XG4gIGNvbnN0IGlzRXhjbHVkZWRFbnRyeSA9IGV4Y2x1ZGVkTmFtZXMuaW5jbHVkZXMoZGlyZW50Lm5hbWUpIHx8IGRpcmVudC5uYW1lLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pIHx8IGZvbGRlci5zcGxpdCgnLycpLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIHJldHVybiBpc0V4Y2x1ZGVkRW50cnkgfHwgKGRpcmVudC5pc0ZpbGUoKSAmJiBpc0V4Y2x1ZGVkRmlsZU5hbWUoZGlyZW50Lm5hbWUpKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFsaWFzKGNoZWNrZXI6IFR5cGVDaGVja2VyLCBzeW1ib2w6IFRzU3ltYm9sKTogVHNTeW1ib2wge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZSAtLSBgU3ltYm9sRmxhZ3NgIGlzIGEgYml0IHNldC5cbiAgcmV0dXJuIChzeW1ib2wuZmxhZ3MgJiBTeW1ib2xGbGFncy5BbGlhcykgPT09IDAgPyBzeW1ib2wgOiBjaGVja2VyLmdldEFsaWFzZWRTeW1ib2woc3ltYm9sKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0RXhwb3J0KHBhcmFtczogU2V0RXhwb3J0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgZXhwb3J0Q29uZGl0aW9ucywgaXNXaWxkY2FyZCwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSA9IHBhcmFtcztcbiAgY29uc3QgaW1wb3J0UGF0aCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IHNyY0ZvbGRlcixcbiAgICByZXBsYWNlcjogUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIsXG4gICAgc2VhcmNoVmFsdWU6IFJlcG9QYXRocy5TcmNcbiAgfSk7XG4gIGNvbnN0IGNvbmRpdGlvblBhdGggPSBpc1dpbGRjYXJkID8gYCR7aW1wb3J0UGF0aH0vJHtSZXBvUGF0aHMuQW55fWAgOiBpbXBvcnRQYXRoO1xuICBjb25zdCBkbXRzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5Fc20sIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55RG10cyA6IFJlcG9QYXRocy5JbmRleERtdHMgfSk7XG4gIGNvbnN0IGRjdHNQYXRoID0gdG9EaXN0UGF0aCh7IGZvcm1hdDogUmVwb1BhdGhzLkNqcywgaW1wb3J0UGF0aCwgbmFtZTogaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlEY3RzIDogUmVwb1BhdGhzLkluZGV4RGN0cyB9KTtcbiAgY29uc3QgZG10c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRtdHNQYXRoKTtcbiAgY29uc3QgZGN0c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRjdHNQYXRoKTtcblxuICBpZiAoIWlzV2lsZGNhcmQgJiYgIWV4aXN0c1N5bmMoZGN0c1BhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaXNUeXBlc09ubHkgPSBpbXBvcnRQYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIGNvbnN0IG1qc1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuRXNtLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueU1qcyA6IFJlcG9QYXRocy5JbmRleE1qcyB9KTtcbiAgY29uc3QgY2pzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5DanMsIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55Q2pzIDogUmVwb1BhdGhzLkluZGV4Q2pzIH0pO1xuXG4gIGlmIChpc1R5cGVzT25seSkge1xuICAgIGV4cG9ydENvbmRpdGlvbnNbY29uZGl0aW9uUGF0aF0gPSB7XG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGhcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNvdXJjZVBhdGggPSBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLlNyYywgaW1wb3J0UGF0aCwgaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlUcyA6IFJlcG9QYXRocy5JbmRleFRzKSk7XG5cbiAgICBleHBvcnRDb25kaXRpb25zW2NvbmRpdGlvblBhdGhdID0ge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgICAvLyBGaXJzdCwgc28gaXQgd2lucyB3aGVyZXZlciBpdCBpcyBzZXQ6IGluc2lkZSB0aGUgcmVwb3NpdG9yeSwgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LlxuICAgICAgLi4uKHNvdXJjZUNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkICYmIHsgW3NvdXJjZUNvbmRpdGlvbl06IHNvdXJjZVBhdGggfSksXG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoLFxuICAgICAgICBkZWZhdWx0OiBtanNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGgsXG4gICAgICAgIGRlZmF1bHQ6IGNqc1BhdGhcbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgfTtcbiAgfVxuXG4gIGlmIChpbXBvcnRQYXRoID09PSBSZXBvUGF0aHMuQ3VycmVudEZvbGRlciBhcyBzdHJpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWlzV2lsZGNhcmQpIHtcbiAgICBhd2FpdCB3cml0ZVN1YnBhdGhQYWNrYWdlSnNvbihcbiAgICAgIGltcG9ydFBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzOiByZWxhdGl2ZShpbXBvcnRQYXRoLCBkY3RzUGF0aCkgfVxuICAgICAgICA6IHsgbWFpbjogcmVsYXRpdmUoaW1wb3J0UGF0aCwgY2pzUGF0aCksIG1vZHVsZTogcmVsYXRpdmUoaW1wb3J0UGF0aCwgbWpzUGF0aCksIHR5cGU6ICdtb2R1bGUnLCB0eXBlczogcmVsYXRpdmUoaW1wb3J0UGF0aCwgZGN0c1BhdGgpIH1cbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoZGN0c0ZvbGRlclBhdGgpKSB7XG4gICAgaWYgKCFmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlLCBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgcGFja2FnZUpzb25Gb2xkZXJQYXRoID0gam9pbihpbXBvcnRQYXRoLCBuYW1lKTtcbiAgICBjb25zdCB0eXBlcyA9IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkY3RzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSk7XG4gICAgYXdhaXQgd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oXG4gICAgICBwYWNrYWdlSnNvbkZvbGRlclBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgbWFpbjogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRjdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLkNqc0V4dGVuc2lvbikpLFxuICAgICAgICAgIG1vZHVsZTogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRtdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLk1qc0V4dGVuc2lvbikpLFxuICAgICAgICAgIHR5cGU6ICdtb2R1bGUnLFxuICAgICAgICAgIHR5cGVzXG4gICAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ3RzQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGNvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdmcm9tIFxcJyQ8SW1wb3J0UGF0aD4uY2pzXFwnOycsXG4gICAgc2VhcmNoVmFsdWU6IFNUQVRJQ19JTVBPUlRfUkVHX0VYUFxuICB9KTtcbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQoJDxRdW90ZT4kPEltcG9ydFBhdGg+LmNqcyQ8UXVvdGU+KScsXG4gICAgc2VhcmNoVmFsdWU6IERZTkFNSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG5cbiAgLy8gQSBgLmQuY3RzYCBmaWxlIGlzIGEgQ29tbW9uSlMgbW9kdWxlLiBUeXBlLW9ubHkgaW1wb3J0cyBvZiBhIGJhcmUgc3BlY2lmaWVyIHJlc29sdmluZyB0byBhblxuICAvLyBFU00tb25seSBwYWNrYWdlIG5lZWQgYSBgcmVzb2x1dGlvbi1tb2RlYCBhdHRyaWJ1dGUsIGVsc2UgYHRzY2AgcmVwb3J0cyBUUzE1NDEgLyBUUzE1NDIuXG4gIC8vIFBhc3NpbmcgYCdpbXBvcnQnYCBpcyB2YWxpZCBmb3IgQ29tbW9uSlMgdGFyZ2V0cyB0b28sIHNvIGV2ZXJ5IGJhcmUgc3BlY2lmaWVyIHJlY2VpdmVzIGl0LlxuICAvLyBUaGUgRVNNIGAuZC5tdHNgIG5lZWRzIG5vIHN1Y2ggYXR0cmlidXRlLCBzbyB0aGlzIHRyYW5zZm9ybSBydW5zIG9uIENvbW1vbkpTIGNvbnRlbnQgb25seS5cbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQgdHlwZSAkPENsYXVzZT4gZnJvbSBcXCckPFNwZWNpZmllcj5cXCcgd2l0aCB7IFxcJ3Jlc29sdXRpb24tbW9kZVxcJzogXFwnaW1wb3J0XFwnIH07JyxcbiAgICBzZWFyY2hWYWx1ZTogQkFSRV9UWVBFX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogY3RzQ29udGVudCxcbiAgICByZXBsYWNlcjogJ2ltcG9ydChcIiQ8U3BlY2lmaWVyPlwiLCB7IHdpdGg6IHsgXFwncmVzb2x1dGlvbi1tb2RlXFwnOiBcXCdpbXBvcnRcXCcgfSB9KScsXG4gICAgc2VhcmNoVmFsdWU6IEJBUkVfSU5MSU5FX0lNUE9SVF9UWVBFX1JFR19FWFBcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvRGlzdFBhdGgocGFyYW1zOiBUb0Rpc3RQYXRoUGFyYW1zKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZUlmUmVsYXRpdmUoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgcGFyYW1zLmZvcm1hdCwgcGFyYW1zLmltcG9ydFBhdGgsIHBhcmFtcy5uYW1lKSk7XG59XG5cbmZ1bmN0aW9uIHRvTGliTmFtZShsaWJGaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gQSBsaWIgYSBwYWNrYWdlIHJlcGxhY2VkIChgQHR5cGVzY3JpcHQvbGliLWRvbWAsIGBAdHlwZXNjcmlwdC9saWItZG9tL2l0ZXJhYmxlLmQudHNgKSBpcyBuYW1lZCBieSBpdHMgcGF0aCwgbm90IGJ5XG4gIC8vIGl0cyBmaWxlIG5hbWUsIHdoaWNoIGlzIGBpbmRleC5kLnRzYCBmb3IgdGhlIGxpYidzIHJvb3QuXG4gIGNvbnN0IHJlcGxhY2VtZW50TWF0Y2ggPSBMSUJfUkVQTEFDRU1FTlRfUkVHX0VYUC5leGVjKGxpYkZpbGVQYXRoKTtcbiAgaWYgKHJlcGxhY2VtZW50TWF0Y2g/Lmdyb3VwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbHdheXMgY2FwdHVyZXMgYm90aCBncm91cHMuXG4gICAgY29uc3QgbGliID0gU3RyaW5nKHJlcGxhY2VtZW50TWF0Y2guZ3JvdXBzWydMaWInXSk7XG4gICAgY29uc3Qgc3ViTGliID0gU3RyaW5nKHJlcGxhY2VtZW50TWF0Y2guZ3JvdXBzWydTdWJMaWInXSk7XG4gICAgcmV0dXJuIChzdWJMaWIgPT09ICdpbmRleCcgPyBsaWIgOiBgJHtsaWJ9LiR7c3ViTGliLnJlcGxhY2VBbGwoJy8nLCAnLicpfWApLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgcmV0dXJuIGJhc2VuYW1lKGxpYkZpbGVQYXRoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL15saWJcXC4vLCAnJykucmVwbGFjZSgvXFwuZFxcLnRzJC8sICcnKTtcbn1cblxuZnVuY3Rpb24gdG9NdHNDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG10c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjb250ZW50LFxuICAgIHJlcGxhY2VyOiAnZnJvbSBcXCckPEltcG9ydFBhdGg+Lm1qc1xcJzsnLFxuICAgIHNlYXJjaFZhbHVlOiBTVEFUSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG4gIHJldHVybiByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBtdHNDb250ZW50LFxuICAgIHJlcGxhY2VyOiAnaW1wb3J0KCQ8UXVvdGU+JDxJbXBvcnRQYXRoPi5tanMkPFF1b3RlPiknLFxuICAgIHNlYXJjaFZhbHVlOiBEWU5BTUlDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVN1YnBhdGhQYWNrYWdlSnNvbihmb2xkZXI6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG1rZGlyKGZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlSnNvbihqb2luKGZvbGRlciwg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
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* runs them in order through {@link runBuildSteps}.
|
|
11
11
|
*/
|
|
12
12
|
import type { Plugin } from 'esbuild' with { 'resolution-mode': 'import' };
|
|
13
|
+
import type { PackageJson } from './npm.cjs';
|
|
13
14
|
/**
|
|
14
15
|
* The banner every emitted library module opens with.
|
|
15
16
|
*/
|
|
@@ -38,6 +39,12 @@ export interface BuildLibraryOptions {
|
|
|
38
39
|
* Options for {@link generateLibraryExports}.
|
|
39
40
|
*/
|
|
40
41
|
export interface GenerateLibraryExportsOptions {
|
|
42
|
+
/**
|
|
43
|
+
* Entries for files that are not built from a source folder (a folder of shared `tsconfig` presets, ambient `.d.ts`
|
|
44
|
+
* files), keyed by subpath. They go into the map after the generated entries, as given, and count toward its change
|
|
45
|
+
* check; no subpath stub is written for them. A key a source folder already generates throws.
|
|
46
|
+
*/
|
|
47
|
+
readonly additionalExports?: Readonly<Record<string, PackageJson.Exports>> | undefined;
|
|
41
48
|
/**
|
|
42
49
|
* An export condition to put first in every entry, mapping the subpath onto its TypeScript source. Only a
|
|
43
50
|
* repository holding several packages that import each other needs one; nothing outside it sets the condition, and
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
var __create = Object.create;
|
|
8
|
+
var __defProp = Object.defineProperty;
|
|
9
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
10
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
11
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
12
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
13
|
+
var __export = (target, all) => {
|
|
14
|
+
for (var name in all)
|
|
15
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
16
|
+
};
|
|
17
|
+
var __copyProps = (to, from, except, desc) => {
|
|
18
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
19
|
+
for (let key of __getOwnPropNames(from))
|
|
20
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
21
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
22
|
+
}
|
|
23
|
+
return to;
|
|
24
|
+
};
|
|
25
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
26
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
27
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
28
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
29
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
30
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
31
|
+
mod
|
|
32
|
+
));
|
|
33
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
34
|
+
var upstream_sync_cli_exports = {};
|
|
35
|
+
__export(upstream_sync_cli_exports, {
|
|
36
|
+
createNodeSyncDependencies: () => createNodeSyncDependencies,
|
|
37
|
+
parseSyncUpstreamsArguments: () => parseSyncUpstreamsArguments,
|
|
38
|
+
runSyncUpstreamsCli: () => runSyncUpstreamsCli
|
|
39
|
+
});
|
|
40
|
+
module.exports = __toCommonJS(upstream_sync_cli_exports);
|
|
41
|
+
var import_node_child_process = require('node:child_process');
|
|
42
|
+
var import_node_process = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('node:process')), 1);
|
|
43
|
+
var import_upstream_sync = require('./upstream-sync.cjs');
|
|
44
|
+
const DEFAULT_BASE_BRANCH = "main";
|
|
45
|
+
const DEFAULT_CONFIG_PATH = "upstreams.json";
|
|
46
|
+
function createNodeSyncDependencies() {
|
|
47
|
+
return {
|
|
48
|
+
exec(file, arguments_, env) {
|
|
49
|
+
return toResult((0, import_node_child_process.spawnSync)(file, arguments_, { encoding: "utf-8", env: { ...import_node_process.default.env, ...env } }));
|
|
50
|
+
},
|
|
51
|
+
async fetchJson(url) {
|
|
52
|
+
const headers = { Accept: "application/vnd.github+json" };
|
|
53
|
+
const token = import_node_process.default.env["GITHUB_TOKEN"];
|
|
54
|
+
if (token && url.startsWith("https://api.github.com/")) {
|
|
55
|
+
headers["Authorization"] = `Bearer ${token}`;
|
|
56
|
+
}
|
|
57
|
+
const response = await fetch(url, { headers });
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
throw new Error(`GET ${url} failed: HTTP ${String(response.status)}.`);
|
|
60
|
+
}
|
|
61
|
+
return await response.json();
|
|
62
|
+
},
|
|
63
|
+
log(text) {
|
|
64
|
+
import_node_process.default.stdout.write(`${text}
|
|
65
|
+
`);
|
|
66
|
+
},
|
|
67
|
+
shell(command, env) {
|
|
68
|
+
import_node_process.default.stdout.write(`> ${command}
|
|
69
|
+
`);
|
|
70
|
+
const result = toResult((0, import_node_child_process.spawnSync)(command, { encoding: "utf-8", env: { ...import_node_process.default.env, ...env }, shell: true }));
|
|
71
|
+
import_node_process.default.stdout.write(result.output);
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function parseSyncUpstreamsArguments(cliArguments) {
|
|
77
|
+
const known = ["--dry-run", "--only=", "--base=", "--config="];
|
|
78
|
+
const unknown = cliArguments.filter((argument) => known.every((prefix) => !(prefix.endsWith("=") ? argument.startsWith(prefix) : argument === prefix)));
|
|
79
|
+
if (unknown.length > 0) {
|
|
80
|
+
throw new Error(`sync-upstreams: unknown argument ${unknown.map((argument) => `"${argument}"`).join(", ")}. Known: --dry-run, --only=, --base=, --config=.`);
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
baseBranch: readOption(cliArguments, "base") ?? DEFAULT_BASE_BRANCH,
|
|
84
|
+
configPath: readOption(cliArguments, "config") ?? DEFAULT_CONFIG_PATH,
|
|
85
|
+
dryRun: cliArguments.includes("--dry-run"),
|
|
86
|
+
only: readOption(cliArguments, "only")?.split(",").filter((name) => name !== "") ?? []
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
async function runSyncUpstreamsCli(cliArguments, dependencies = createNodeSyncDependencies()) {
|
|
90
|
+
try {
|
|
91
|
+
const results = await (0, import_upstream_sync.syncUpstreams)(parseSyncUpstreamsArguments(cliArguments), dependencies);
|
|
92
|
+
return results.some((result) => result.outcome === "error") ? 1 : 0;
|
|
93
|
+
} catch (error) {
|
|
94
|
+
import_node_process.default.stderr.write(`${error instanceof Error ? error.message : String(error)}
|
|
95
|
+
`);
|
|
96
|
+
return 1;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function readOption(cliArguments, name) {
|
|
100
|
+
const prefix = `--${name}=`;
|
|
101
|
+
const value = cliArguments.find((argument) => argument.startsWith(prefix))?.slice(prefix.length);
|
|
102
|
+
return value === "" ? void 0 : value;
|
|
103
|
+
}
|
|
104
|
+
function toResult(result) {
|
|
105
|
+
return result.error ? { exitCode: 1, output: result.error.message } : { exitCode: result.status ?? 1, output: `${result.stdout}${result.stderr}` };
|
|
106
|
+
}
|
|
107
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
108
|
+
0 && (module.exports = {
|
|
109
|
+
createNodeSyncDependencies,
|
|
110
|
+
parseSyncUpstreamsArguments,
|
|
111
|
+
runSyncUpstreamsCli
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3Vwc3RyZWFtLXN5bmMtY2xpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGBzeW5jLXVwc3RyZWFtc2AgY29tbWFuZDogcmVhZHMgaXRzIGFyZ3VtZW50cywgd2lyZXMge0BsaW5rIHN5bmNVcHN0cmVhbXN9IHRvIHRoZSByZWFsIGdpdCwgYGdoYCwgR2l0SHViIEFQSSBhbmRcbiAqIG5wbSByZWdpc3RyeSwgYW5kIHR1cm5zIHRoZSByZXN1bHRzIGludG8gYW4gZXhpdCBjb2RlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3Bhd25TeW5jUmV0dXJucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIENvbW1hbmRSZXN1bHQsXG4gIFN5bmNEZXBlbmRlbmNpZXMsXG4gIFN5bmNVcHN0cmVhbXNPcHRpb25zXG59IGZyb20gJy4vdXBzdHJlYW0tc3luYy50cyc7XG5cbmltcG9ydCB7IHN5bmNVcHN0cmVhbXMgfSBmcm9tICcuL3Vwc3RyZWFtLXN5bmMudHMnO1xuXG5jb25zdCBERUZBVUxUX0JBU0VfQlJBTkNIID0gJ21haW4nO1xuY29uc3QgREVGQVVMVF9DT05GSUdfUEFUSCA9ICd1cHN0cmVhbXMuanNvbic7XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgc3luYydzIG91dHNpZGUgd29ybGQ6IGNvbW1hbmRzIHJ1biB3aXRoIGBzcGF3blN5bmNgLCBKU09OIGZldGNoZWQgd2l0aCBgZmV0Y2hgLCBvdXRwdXQgdG8gc3Rkb3V0LlxuICogYEdJVEhVQl9UT0tFTmAsIHdoZW4gc2V0LCBpcyBzZW50IHRvIHRoZSBHaXRIdWIgQVBJIGFuZCBub3doZXJlIGVsc2UuXG4gKlxuICogQHJldHVybnMgVGhlIGRlcGVuZGVuY2llcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5vZGVTeW5jRGVwZW5kZW5jaWVzKCk6IFN5bmNEZXBlbmRlbmNpZXMge1xuICByZXR1cm4ge1xuICAgIGV4ZWMoZmlsZSwgYXJndW1lbnRzXywgZW52KTogQ29tbWFuZFJlc3VsdCB7XG4gICAgICByZXR1cm4gdG9SZXN1bHQoc3Bhd25TeW5jKGZpbGUsIGFyZ3VtZW50c18sIHsgZW5jb2Rpbmc6ICd1dGYtOCcsIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uZW52IH0gfSkpO1xuICAgIH0sXG4gICAgYXN5bmMgZmV0Y2hKc29uKHVybCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgQWNjZXB0OiAnYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uJyB9O1xuICAgICAgY29uc3QgdG9rZW4gPSBwcm9jZXNzLmVudlsnR0lUSFVCX1RPS0VOJ107XG4gICAgICBpZiAodG9rZW4gJiYgdXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vJykpIHtcbiAgICAgICAgaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gYEJlYXJlciAke3Rva2VufWA7XG4gICAgICB9XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgeyBoZWFkZXJzIH0pO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdFVCAke3VybH0gZmFpbGVkOiBIVFRQICR7U3RyaW5nKHJlc3BvbnNlLnN0YXR1cyl9LmApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICB9LFxuICAgIGxvZyh0ZXh0KTogdm9pZCB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgJHt0ZXh0fVxcbmApO1xuICAgIH0sXG4gICAgc2hlbGwoY29tbWFuZCwgZW52KTogQ29tbWFuZFJlc3VsdCB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgPiAke2NvbW1hbmR9XFxuYCk7XG4gICAgICBjb25zdCByZXN1bHQgPSB0b1Jlc3VsdChzcGF3blN5bmMoY29tbWFuZCwgeyBlbmNvZGluZzogJ3V0Zi04JywgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi5lbnYgfSwgc2hlbGw6IHRydWUgfSkpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUocmVzdWx0Lm91dHB1dCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHN5bmMgb3B0aW9ucyBmcm9tIHRoZSBjb21tYW5kIGxpbmUuXG4gKlxuICogYC0tZHJ5LXJ1bmAgcHJpbnRzIGVhY2ggUFIgaXQgd291bGQgb3BlbiBhbmQgY2hhbmdlcyBub3RoaW5nLiBgLS1vbmx5PTxuYW1lPlssPG5hbWU+XWAgbGltaXRzIHRoZSBzeW5jIHRvIHRob3NlXG4gKiBlbnRyaWVzLCBgLS1iYXNlPTxicmFuY2g+YCBuYW1lcyB0aGUgYnJhbmNoIHRoZSBQUnMgdGFyZ2V0IChgbWFpbmAgYnkgZGVmYXVsdCksIGFuZCBgLS1jb25maWc9PHBhdGg+YCBuYW1lcyB0aGVcbiAqIGB1cHN0cmVhbXMuanNvbmAgKHRoZSBvbmUgaW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGJ5IGRlZmF1bHQpLlxuICpcbiAqIEBwYXJhbSBjbGlBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIGFmdGVyIHRoZSBjb21tYW5kIG5hbWUuXG4gKiBAcmV0dXJucyBUaGUgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3luY1Vwc3RyZWFtc0FyZ3VtZW50cyhjbGlBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogU3luY1Vwc3RyZWFtc09wdGlvbnMge1xuICBjb25zdCBrbm93biA9IFsnLS1kcnktcnVuJywgJy0tb25seT0nLCAnLS1iYXNlPScsICctLWNvbmZpZz0nXTtcbiAgY29uc3QgdW5rbm93biA9IGNsaUFyZ3VtZW50cy5maWx0ZXIoKGFyZ3VtZW50KSA9PiBrbm93bi5ldmVyeSgocHJlZml4KSA9PiAhKHByZWZpeC5lbmRzV2l0aCgnPScpID8gYXJndW1lbnQuc3RhcnRzV2l0aChwcmVmaXgpIDogYXJndW1lbnQgPT09IHByZWZpeCkpKTtcbiAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgc3luYy11cHN0cmVhbXM6IHVua25vd24gYXJndW1lbnQgJHt1bmtub3duLm1hcCgoYXJndW1lbnQpID0+IGBcIiR7YXJndW1lbnR9XCJgKS5qb2luKCcsICcpfS4gS25vd246IC0tZHJ5LXJ1biwgLS1vbmx5PSwgLS1iYXNlPSwgLS1jb25maWc9LmApO1xuICB9XG4gIHJldHVybiB7XG4gICAgYmFzZUJyYW5jaDogcmVhZE9wdGlvbihjbGlBcmd1bWVudHMsICdiYXNlJykgPz8gREVGQVVMVF9CQVNFX0JSQU5DSCxcbiAgICBjb25maWdQYXRoOiByZWFkT3B0aW9uKGNsaUFyZ3VtZW50cywgJ2NvbmZpZycpID8/IERFRkFVTFRfQ09ORklHX1BBVEgsXG4gICAgZHJ5UnVuOiBjbGlBcmd1bWVudHMuaW5jbHVkZXMoJy0tZHJ5LXJ1bicpLFxuICAgIG9ubHk6IHJlYWRPcHRpb24oY2xpQXJndW1lbnRzLCAnb25seScpPy5zcGxpdCgnLCcpLmZpbHRlcigobmFtZSkgPT4gbmFtZSAhPT0gJycpID8/IFtdXG4gIH07XG59XG5cbi8qKlxuICogUnVucyB0aGUgYHN5bmMtdXBzdHJlYW1zYCBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSBjbGlBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIGFmdGVyIHRoZSBjb21tYW5kIG5hbWUuXG4gKiBAcGFyYW0gZGVwZW5kZW5jaWVzIC0gVGhlIG91dHNpZGUgd29ybGQuIFRoZSByZWFsIG9uZSB3aGVuIG9taXR0ZWQuXG4gKiBAcmV0dXJucyBUaGUgZXhpdCBjb2RlOiBgMWAgd2hlbiB0aGUgYXJndW1lbnRzIG9yIGB1cHN0cmVhbXMuanNvbmAgYXJlIHdyb25nIG9yIGFueSBlbnRyeSBmYWlsZWQsIGAwYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5TeW5jVXBzdHJlYW1zQ2xpKGNsaUFyZ3VtZW50czogcmVhZG9ubHkgc3RyaW5nW10sIGRlcGVuZGVuY2llczogU3luY0RlcGVuZGVuY2llcyA9IGNyZWF0ZU5vZGVTeW5jRGVwZW5kZW5jaWVzKCkpOiBQcm9taXNlPG51bWJlcj4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBzeW5jVXBzdHJlYW1zKHBhcnNlU3luY1Vwc3RyZWFtc0FyZ3VtZW50cyhjbGlBcmd1bWVudHMpLCBkZXBlbmRlbmNpZXMpO1xuICAgIHJldHVybiByZXN1bHRzLnNvbWUoKHJlc3VsdCkgPT4gcmVzdWx0Lm91dGNvbWUgPT09ICdlcnJvcicpID8gMSA6IDA7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gQSB3cm9uZyBhcmd1bWVudCBvciBjb25maWcgaXMgdGhlIHVzZXIncyB0byBmaXgsIHNvIGl0IGdldHMgaXRzIG1lc3NhZ2UgcmF0aGVyIHRoYW4gYSBzdGFjayB0cmFjZS5cbiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9XFxuYCk7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn1cblxuLy8gQW4gZW1wdHkgdmFsdWUgY291bnRzIGFzIGFic2VudCwgYmVjYXVzZSBhIHdvcmtmbG93IHBhc3NlcyBhbiB1bnNldCBpbnB1dCBhcyBvbmUuXG5mdW5jdGlvbiByZWFkT3B0aW9uKGNsaUFyZ3VtZW50czogcmVhZG9ubHkgc3RyaW5nW10sIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByZWZpeCA9IGAtLSR7bmFtZX09YDtcbiAgY29uc3QgdmFsdWUgPSBjbGlBcmd1bWVudHMuZmluZCgoYXJndW1lbnQpID0+IGFyZ3VtZW50LnN0YXJ0c1dpdGgocHJlZml4KSk/LnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICByZXR1cm4gdmFsdWUgPT09ICcnID8gdW5kZWZpbmVkIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHRvUmVzdWx0KHJlc3VsdDogU3Bhd25TeW5jUmV0dXJuczxzdHJpbmc+KTogQ29tbWFuZFJlc3VsdCB7XG4gIHJldHVybiByZXN1bHQuZXJyb3IgPyB7IGV4aXRDb2RlOiAxLCBvdXRwdXQ6IHJlc3VsdC5lcnJvci5tZXNzYWdlIH0gOiB7IGV4aXRDb2RlOiByZXN1bHQuc3RhdHVzID8/IDEsIG91dHB1dDogYCR7cmVzdWx0LnN0ZG91dH0ke3Jlc3VsdC5zdGRlcnJ9YCB9O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFTQSxnQ0FBMEI7QUFDMUIsMEJBQW9CO0FBUXBCLDJCQUE4QjtBQUU5QixNQUFNLHNCQUFzQjtBQUM1QixNQUFNLHNCQUFzQjtBQVFyQixTQUFTLDZCQUErQztBQUM3RCxTQUFPO0FBQUEsSUFDTCxLQUFLLE1BQU0sWUFBWSxLQUFvQjtBQUN6QyxhQUFPLGFBQVMscUNBQVUsTUFBTSxZQUFZLEVBQUUsVUFBVSxTQUFTLEtBQUssRUFBRSxHQUFHLG9CQUFBQSxRQUFRLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQUEsSUFDckc7QUFBQSxJQUNBLE1BQU0sVUFBVSxLQUF1QjtBQUNyQyxZQUFNLFVBQWtDLEVBQUUsUUFBUSw4QkFBOEI7QUFDaEYsWUFBTSxRQUFRLG9CQUFBQSxRQUFRLElBQUksY0FBYztBQUN4QyxVQUFJLFNBQVMsSUFBSSxXQUFXLHlCQUF5QixHQUFHO0FBQ3RELGdCQUFRLGVBQWUsSUFBSSxVQUFVLEtBQUs7QUFBQSxNQUM1QztBQUNBLFlBQU0sV0FBVyxNQUFNLE1BQU0sS0FBSyxFQUFFLFFB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
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/// <reference path="./library-references.d.cts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* The `sync-upstreams` command: reads its arguments, wires {@link syncUpstreams} to the real git, `gh`, GitHub API and
|
|
6
|
+
* npm registry, and turns the results into an exit code.
|
|
7
|
+
*/
|
|
8
|
+
import type { SyncDependencies, SyncUpstreamsOptions } from './upstream-sync.cjs';
|
|
9
|
+
/**
|
|
10
|
+
* Creates the sync's outside world: commands run with `spawnSync`, JSON fetched with `fetch`, output to stdout.
|
|
11
|
+
* `GITHUB_TOKEN`, when set, is sent to the GitHub API and nowhere else.
|
|
12
|
+
*
|
|
13
|
+
* @returns The dependencies.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createNodeSyncDependencies(): SyncDependencies;
|
|
16
|
+
/**
|
|
17
|
+
* Builds the sync options from the command line.
|
|
18
|
+
*
|
|
19
|
+
* `--dry-run` prints each PR it would open and changes nothing. `--only=<name>[,<name>]` limits the sync to those
|
|
20
|
+
* entries, `--base=<branch>` names the branch the PRs target (`main` by default), and `--config=<path>` names the
|
|
21
|
+
* `upstreams.json` (the one in the working directory by default).
|
|
22
|
+
*
|
|
23
|
+
* @param cliArguments - The arguments after the command name.
|
|
24
|
+
* @returns The options.
|
|
25
|
+
*/
|
|
26
|
+
export declare function parseSyncUpstreamsArguments(cliArguments: readonly string[]): SyncUpstreamsOptions;
|
|
27
|
+
/**
|
|
28
|
+
* Runs the `sync-upstreams` command.
|
|
29
|
+
*
|
|
30
|
+
* @param cliArguments - The arguments after the command name.
|
|
31
|
+
* @param dependencies - The outside world. The real one when omitted.
|
|
32
|
+
* @returns The exit code: `1` when the arguments or `upstreams.json` are wrong or any entry failed, `0` otherwise.
|
|
33
|
+
*/
|
|
34
|
+
export declare function runSyncUpstreamsCli(cliArguments: readonly string[], dependencies?: SyncDependencies): Promise<number>;
|