@dbx-tools/databricks 0.9.154 → 0.9.158
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/index.ts +5 -4
- package/lib/index.d.ts +5 -4
- package/lib/index.js +6 -5
- package/lib/src/cloud.d.ts +3 -3
- package/lib/src/cloud.js +15 -15
- package/lib/src/databricks-fs.js +18 -18
- package/lib/src/databricks-path.d.ts +0 -3
- package/lib/src/databricks-path.js +12 -14
- package/lib/src/net.d.ts +2 -2
- package/lib/src/net.js +6 -6
- package/lib/src/workspace-client.d.ts +2 -2
- package/lib/src/workspace-client.js +11 -11
- package/package.json +8 -56
- package/src/cloud.ts +29 -16
- package/src/databricks-fs.ts +18 -18
- package/src/databricks-path.ts +17 -14
- package/src/net.ts +12 -6
- package/src/workspace-client.ts +11 -11
package/lib/src/databricks-fs.js
CHANGED
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
*
|
|
13
13
|
* @module
|
|
14
14
|
*/
|
|
15
|
-
import {
|
|
16
|
-
import { BaseFileSystem,
|
|
17
|
-
import {
|
|
15
|
+
import { fnvHash, toDate } from "@dbx-tools/shared-core";
|
|
16
|
+
import { BaseFileSystem, FileSystemError, mapFileSystemError, isHomeRelativePath, basename, } from "@dbx-tools/shared-fs";
|
|
17
|
+
import { normalizeDatabricksRoot, resolveDatabricksFilesBackend, resolveDatabricksRoot, } from "./databricks-path.js";
|
|
18
18
|
import { getWorkspaceClient } from "./workspace-client.js";
|
|
19
19
|
const DBFS_READ_CHUNK_BYTES = 1024 * 1024;
|
|
20
20
|
const DBFS_PUT_MAX_BYTES = 1024 * 1024;
|
|
@@ -45,7 +45,7 @@ export class DatabricksFileSystem extends BaseFileSystem {
|
|
|
45
45
|
constructor(options) {
|
|
46
46
|
const root = normalizeDatabricksRoot(options.root, { userName: options.userName });
|
|
47
47
|
super({
|
|
48
|
-
id: options.id ?? `databricks-${
|
|
48
|
+
id: options.id ?? `databricks-${fnvHash(root)}`,
|
|
49
49
|
backend: "databricks",
|
|
50
50
|
root,
|
|
51
51
|
readOnly: options.readOnly,
|
|
@@ -93,7 +93,7 @@ export class DatabricksFileSystem extends BaseFileSystem {
|
|
|
93
93
|
});
|
|
94
94
|
}
|
|
95
95
|
catch (error) {
|
|
96
|
-
throw
|
|
96
|
+
throw mapFileSystemError(error, resolvedPath);
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
/**
|
|
@@ -120,7 +120,7 @@ export class DatabricksFileSystem extends BaseFileSystem {
|
|
|
120
120
|
});
|
|
121
121
|
}
|
|
122
122
|
catch (error) {
|
|
123
|
-
throw
|
|
123
|
+
throw mapFileSystemError(error, resolvedPath);
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
126
|
async onInit() {
|
|
@@ -196,12 +196,12 @@ export class DatabricksFileSystem extends BaseFileSystem {
|
|
|
196
196
|
async listDirectoryAt(resolvedPath) {
|
|
197
197
|
return this.dispatch(resolvedPath, {
|
|
198
198
|
dbfs: (client) => collect(client.dbfs.list({ path: resolvedPath }), (info) => ({
|
|
199
|
-
name:
|
|
199
|
+
name: basename(info.path ?? ""),
|
|
200
200
|
type: info.is_dir ? "directory" : "file",
|
|
201
201
|
size: info.file_size,
|
|
202
202
|
})),
|
|
203
203
|
workspace: (client) => collect(client.workspace.list({ path: resolvedPath }), (info) => ({
|
|
204
|
-
name:
|
|
204
|
+
name: basename(info.path ?? ""),
|
|
205
205
|
type: info.object_type === "DIRECTORY" ? "directory" : "file",
|
|
206
206
|
metadata: {
|
|
207
207
|
createdAt: info.created_at,
|
|
@@ -210,20 +210,20 @@ export class DatabricksFileSystem extends BaseFileSystem {
|
|
|
210
210
|
},
|
|
211
211
|
})),
|
|
212
212
|
volumes: (client) => collect(client.files.listDirectoryContents({ directory_path: resolvedPath }), (entry) => ({
|
|
213
|
-
name: entry.name ??
|
|
213
|
+
name: entry.name ?? basename(entry.path ?? ""),
|
|
214
214
|
type: entry.is_directory ? "directory" : "file",
|
|
215
215
|
size: entry.file_size,
|
|
216
216
|
})),
|
|
217
217
|
});
|
|
218
218
|
}
|
|
219
219
|
async statAt(resolvedPath) {
|
|
220
|
-
const fallbackName =
|
|
220
|
+
const fallbackName = basename(resolvedPath) || basename(this.root);
|
|
221
221
|
return this.dispatch(resolvedPath, {
|
|
222
222
|
dbfs: async (client) => {
|
|
223
223
|
const info = await client.dbfs.getStatus({ path: resolvedPath });
|
|
224
|
-
const modified =
|
|
224
|
+
const modified = toDate(info.modification_time);
|
|
225
225
|
return {
|
|
226
|
-
name:
|
|
226
|
+
name: basename(info.path ?? resolvedPath) || fallbackName,
|
|
227
227
|
type: info.is_dir ? "directory" : "file",
|
|
228
228
|
size: info.file_size,
|
|
229
229
|
createdAt: modified,
|
|
@@ -233,10 +233,10 @@ export class DatabricksFileSystem extends BaseFileSystem {
|
|
|
233
233
|
workspace: async (client) => {
|
|
234
234
|
const info = await client.workspace.getStatus({ path: resolvedPath });
|
|
235
235
|
return {
|
|
236
|
-
name:
|
|
236
|
+
name: basename(info.path ?? resolvedPath) || fallbackName,
|
|
237
237
|
type: info.object_type === "DIRECTORY" ? "directory" : "file",
|
|
238
|
-
createdAt:
|
|
239
|
-
modifiedAt:
|
|
238
|
+
createdAt: toDate(info.created_at),
|
|
239
|
+
modifiedAt: toDate(info.modified_at),
|
|
240
240
|
};
|
|
241
241
|
},
|
|
242
242
|
volumes: (client) => this.statVolumePath(client, resolvedPath, fallbackName),
|
|
@@ -288,7 +288,7 @@ export class DatabricksFileSystem extends BaseFileSystem {
|
|
|
288
288
|
async statVolumePath(client, absolutePath, fallbackName) {
|
|
289
289
|
try {
|
|
290
290
|
const metadata = await client.files.getMetadata({ file_path: absolutePath });
|
|
291
|
-
const modified =
|
|
291
|
+
const modified = toDate(metadata["last-modified"]);
|
|
292
292
|
return {
|
|
293
293
|
name: fallbackName,
|
|
294
294
|
type: "file",
|
|
@@ -301,7 +301,7 @@ export class DatabricksFileSystem extends BaseFileSystem {
|
|
|
301
301
|
catch (fileErr) {
|
|
302
302
|
// A directory has no file metadata, and an unreadable one reports as
|
|
303
303
|
// missing / denied - both are worth a directory probe before failing.
|
|
304
|
-
const code =
|
|
304
|
+
const code = mapFileSystemError(fileErr, absolutePath).code;
|
|
305
305
|
if (code !== "NOT_FOUND" && code !== "PERMISSION_DENIED")
|
|
306
306
|
throw fileErr;
|
|
307
307
|
await client.files.getDirectoryMetadata({ directory_path: absolutePath });
|
|
@@ -393,4 +393,4 @@ function bufferToReadableStream(buffer) {
|
|
|
393
393
|
},
|
|
394
394
|
});
|
|
395
395
|
}
|
|
396
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJyaWNrcy1mcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYnJpY2tzLWZzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFDTCxjQUFjLEVBQ2QsTUFBTSxFQUNOLGVBQWUsRUFDZixTQUFTLEdBS1YsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHVCQUF1QixFQUN2Qiw2QkFBNkIsRUFDN0IscUJBQXFCLEdBRXRCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGtCQUFrQixFQUF3QixNQUFNLHVCQUF1QixDQUFDO0FBRWpGLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUMxQyxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFdkMsbUZBQW1GO0FBQ25GLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBd0Q1Qix3RUFBd0U7QUFDeEUsS0FBSyxVQUFVLG1CQUFtQixDQUNoQyxNQUF3RTtJQUV4RSxJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVU7UUFBRSxPQUFPLE1BQU0sRUFBRSxDQUFDO0lBQ2xELE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7QUFDaEQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxjQUE0QjtJQUM1RCxNQUFNLENBQThCO0lBQzNCLFlBQVksQ0FBbUU7SUFFaEcsWUFBWSxPQUFvQztRQUM5QyxNQUFNLElBQUksR0FBRyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFD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QUNyQixDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGF0YWJyaWNrcyB7QGxpbmsgRmlsZVN5c3RlbX0gYmFja2VkIGJ5IHtAbGluayBXb3Jrc3BhY2VDbGllbnR9LlxuICpcbiAqIEV4dGVuZHMge0BsaW5rIEJhc2VGaWxlU3lzdGVtfS4gUm91dGVzIEkvTyBieSBhYnNvbHV0ZSBwYXRoOlxuICogLSBgL1dvcmtzcGFjZWAsIGAvVXNlcnNgLCBgL1JlcG9zYCwgYC9TaGFyZWRgIOKGkiB3b3Jrc3BhY2Ugb2JqZWN0cyBBUElcbiAqIC0gYC9Wb2x1bWVzLy4uLmAgKG9yIGBjYXRhbG9nLnNjaGVtYS52b2x1bWVgIHJvb3RzKSDihpIgVW5pdHkgQ2F0YWxvZyBGaWxlcyBBUElcbiAqIC0gYC9kYmZzLy4uLmAg4oaSIERCRlMgQVBJXG4gKlxuICogRXZlcnkgcHJpbWl0aXZlIHBpY2tzIGl0cyBBUEkgdGhyb3VnaCB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0uZGlzcGF0Y2h9XG4gKiByYXRoZXIgdGhhbiByZS1icmFuY2hpbmcgYnkgaGFuZCwgYW5kIGVycm9yIG5vcm1hbGl6YXRpb24gaXMgaW5oZXJpdGVkIGZyb21cbiAqIHtAbGluayBCYXNlRmlsZVN5c3RlbX0sIHNvIGEgcHJpbWl0aXZlIGhlcmUgaXMganVzdCB0aGUgU0RLIGNhbGwuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGhhc2gsIG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBCYXNlRmlsZVN5c3RlbSxcbiAgYmFzZUZTLFxuICBGaWxlU3lzdGVtRXJyb3IsXG4gIHBvc2l4UGF0aCxcbiAgdHlwZSBDb3B5T3B0aW9ucyxcbiAgdHlwZSBGaWxlRW50cnksXG4gIHR5cGUgRmlsZVN0YXQsXG4gIHR5cGUgV3JpdGVGaWxlT3B0aW9ucyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWZzXCI7XG5pbXBvcnQge1xuICBpc0hvbWVSZWxhdGl2ZVBhdGgsXG4gIG5vcm1hbGl6ZURhdGFicmlja3NSb290LFxuICByZXNvbHZlRGF0YWJyaWNrc0ZpbGVzQmFja2VuZCxcbiAgcmVzb2x2ZURhdGFicmlja3NSb290LFxuICB0eXBlIERhdGFicmlja3NGaWxlc0JhY2tlbmQsXG59IGZyb20gXCIuL2RhdGFicmlja3MtcGF0aC50c1wiO1xuaW1wb3J0IHsgZ2V0V29ya3NwYWNlQ2xpZW50LCB0eXBlIFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCIuL3dvcmtzcGFjZS1jbGllbnQudHNcIjtcblxuY29uc3QgREJGU19SRUFEX0NIVU5LX0JZVEVTID0gMTAyNCAqIDEwMjQ7XG5jb25zdCBEQkZTX1BVVF9NQVhfQllURVMgPSAxMDI0ICogMTAyNDtcblxuLyoqIFNlZ21lbnRzIGluIGAvVm9sdW1lcy88Y2F0YWxvZz4vPHNjaGVtYT4vPHZvbHVtZT5gLCBwcm92aXNpb25lZCBvdXQgb2YgYmFuZC4gKi9cbmNvbnN0IFZPTFVNRV9ST09UX0RFUFRIID0gNDtcblxuLyoqXG4gKiBPbmUgaGFuZGxlciBwZXIgRGF0YWJyaWNrcyBBUEksIGtleWVkIGJ5IHtAbGluayBEYXRhYnJpY2tzRmlsZXNCYWNrZW5kfSBzb1xuICogYWRkaW5nIGEgYmFja2VuZCBpcyBhIGNvbXBpbGUgZXJyb3IgdW50aWwgZXZlcnkgY2FsbCBzaXRlIGhhbmRsZXMgaXQuXG4gKi9cbnR5cGUgQmFja2VuZEhhbmRsZXJzPFQ+ID0gUmVjb3JkPERhdGFicmlja3NGaWxlc0JhY2tlbmQsIChjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCkgPT4gUHJvbWlzZTxUPj47XG5cbi8qKiBSZXNvbHZlIHRoZSBEYXRhYnJpY2tzIGNsaWVudCB1c2VkIGZvciB0aGUgY3VycmVudCBmaWxlc3lzdGVtIG9wZXJhdGlvbi4gKi9cbmV4cG9ydCB0eXBlIERhdGFicmlja3NGaWxlU3lzdGVtQ2xpZW50UmVzb2x2ZXIgPSAoKSA9PiBXb3Jrc3BhY2VDbGllbnQgfCBQcm9taXNlPFdvcmtzcGFjZUNsaWVudD47XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW19LiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzRmlsZVN5c3RlbU9wdGlvbnMge1xuICAvKiogVW5pcXVlIGlkZW50aWZpZXIuIERlZmF1bHRzIHRvIGEgc3RhYmxlIGhhc2ggb2YgdGhlIG5vcm1hbGl6ZWQgcm9vdC4gKi9cbiAgaWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbGVzeXN0ZW0gcm9vdC4gQWNjZXB0czpcbiAgICogLSBgL1ZvbHVtZXMvY2F0YWxvZy9zY2hlbWEvdm9sdW1lYCAoYWxzbyBgL1ZvbHVtZS8uLi5gKVxuICAgKiAtIGBjYXRhbG9nLnNjaGVtYS52b2x1bWVgXG4gICAqIC0gYH5gIC8gYH4vLi4uYCDihpIgYC9Xb3Jrc3BhY2UvVXNlcnMvPHVzZXJOYW1lPi8uLi5gIChuZWVkcyB7QGxpbmsgdXNlck5hbWV9LFxuICAgKiAgIG9yIHVzZSB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0uY3JlYXRlfSlcbiAgICogLSBgL1dvcmtzcGFjZS8uLi5gLCBgL1VzZXJzLy4uLmAsIGAvUmVwb3MvLi4uYCwgYC9TaGFyZWQvLi4uYFxuICAgKiAtIGAvZGJmcy8uLi5gXG4gICAqL1xuICByb290OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVzZXJuYW1lIGZvciBleHBhbmRpbmcgYH5gLiBXaGVuIG9taXR0ZWQgYW5kIHtAbGluayByb290fSBpcyBob21lLXJlbGF0aXZlLFxuICAgKiBwcmVmZXIge0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtLmNyZWF0ZX0gd2hpY2ggcmVzb2x2ZXMgaXQgdmlhXG4gICAqIGBnZXRDdXJyZW50VXNlck5hbWVgLlxuICAgKi9cbiAgdXNlck5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERhdGFicmlja3Mgd29ya3NwYWNlIGNsaWVudC4gRGVmYXVsdHMgdG8gYHRyeUdldFdvcmtzcGFjZUNsaWVudCgpYCwgb3RoZXJ3aXNlXG4gICAqIGEgZGVmYXVsdCB7QGxpbmsgV29ya3NwYWNlQ2xpZW50fSBmcm9tIGVudiAvIHByb2ZpbGUgYXV0aC5cbiAgICovXG4gIGNsaWVudD86IFdvcmtzcGFjZUNsaWVudCB8IERhdGFicmlja3NGaWxlU3lzdGVtQ2xpZW50UmVzb2x2ZXI7XG5cbiAgLyoqIEJsb2NrIGFsbCB3cml0ZSBvcGVyYXRpb25zLiBEZWZhdWx0cyB0byBmYWxzZS4gKi9cbiAgcmVhZE9ubHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUge0BsaW5rIHJvb3R9IChhbmQgcGFyZW50cykgZHVyaW5nIGluaXQuIERlZmF1bHRzIHRvIGZhbHNlICh2b2x1bWVcbiAgICogYW5kIHdvcmtzcGFjZSByb290cyBhcmUgdXN1YWxseSBwcm92aXNpb25lZCBvdXQgb2YgYmFuZCkuXG4gICAqL1xuICBjcmVhdGVSb290PzogYm9vbGVhbjtcbn1cblxuLyoqIEV4aXN0aW5nLWZpbGUgYmVoYXZpb3IgZm9yIGEgc3RyZWFtZWQgVUMgVm9sdW1lIHVwbG9hZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJyaWNrc1N0cmVhbVdyaXRlT3B0aW9ucyB7XG4gIC8qKiBSZXBsYWNlIGFuIGV4aXN0aW5nIGZpbGUuIERlZmF1bHRzIHRvIHRydWUuICovXG4gIG92ZXJ3cml0ZT86IGJvb2xlYW47XG59XG5cbi8qKiBSZXNvbHZlIGEgc3RhdGljLCBvcGVyYXRpb24tc2NvcGVkLCBvciBhbWJpZW50IERhdGFicmlja3MgY2xpZW50LiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNsaWVudE9wdGlvbihcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQgfCBEYXRhYnJpY2tzRmlsZVN5c3RlbUNsaWVudFJlc29sdmVyIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VDbGllbnQ+IHtcbiAgaWYgKHR5cGVvZiBjbGllbnQgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGNsaWVudCgpO1xuICByZXR1cm4gY2xpZW50ID8/IChhd2FpdCBnZXRXb3Jrc3BhY2VDbGllbnQoKSk7XG59XG5cbi8qKlxuICoge0BsaW5rIEZpbGVTeXN0ZW19IGltcGxlbWVudGF0aW9uIG92ZXIgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgZmlsZXMsIFVDXG4gKiB2b2x1bWVzLCBhbmQgREJGUy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGZzID0gbmV3IERhdGFicmlja3NGaWxlU3lzdGVtKHsgcm9vdDogXCJtYWluLmRlZmF1bHQuYXNzZXRzXCIgfSk7XG4gKiBhd2FpdCBmcy53cml0ZUZpbGUoXCJub3Rlcy9oZWxsby50eHRcIiwgXCJoaVwiKTtcbiAqXG4gKiBjb25zdCBob21lID0gYXdhaXQgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0uY3JlYXRlKHsgcm9vdDogXCJ+XCIgfSk7XG4gKiBjb25zdCBsaXN0aW5nID0gYXdhaXQgaG9tZS5yZWFkZGlyKFwiLlwiKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0gZXh0ZW5kcyBCYXNlRmlsZVN5c3RlbTxcImRhdGFicmlja3NcIj4ge1xuICBwcml2YXRlIGNsaWVudDogV29ya3NwYWNlQ2xpZW50IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudE9wdGlvbjogV29ya3NwYWNlQ2xpZW50IHwgRGF0YWJyaWNrc0ZpbGVTeXN0ZW1DbGllbnRSZXNvbHZlciB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBEYXRhYnJpY2tzRmlsZVN5c3RlbU9wdGlvbnMpIHtcbiAgICBjb25zdCByb290ID0gbm9ybWFsaXplRGF0YWJyaWNrc1Jvb3Qob3B0aW9ucy5yb290LCB7IHVzZXJOYW1lOiBvcHRpb25zLnVzZXJOYW1lIH0pO1xuICAgIHN1cGVyKHtcbiAgICAgIGlkOiBvcHRpb25zLmlkID8/IGBkYXRhYnJpY2tzLSR7aGFzaC5mbnZIYXNoKHJvb3QpfWAsXG4gICAgICBiYWNrZW5kOiBcImRhdGFicmlja3NcIixcbiAgICAgIHJvb3QsXG4gICAgICByZWFkT25seTogb3B0aW9ucy5yZWFkT25seSxcbiAgICAgIGNyZWF0ZVJvb3Q6IG9wdGlvbnMuY3JlYXRlUm9vdCA/PyBmYWxzZSxcbiAgICB9KTtcbiAgICB0aGlzLmNsaWVudE9wdGlvbiA9IG9wdGlvbnMuY2xpZW50O1xuICAgIHRoaXMuY2xpZW50ID0gdHlwZW9mIG9wdGlvbnMuY2xpZW50ID09PSBcImZ1bmN0aW9uXCIgPyB1bmRlZmluZWQgOiBvcHRpb25zLmNsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW19LCByZXNvbHZpbmcgYH5gIHJvb3RzIHZpYSB0aGVcbiAgICogd29ya3NwYWNlIGN1cnJlbnQgdXNlciB3aGVuIG5lZWRlZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBjcmVhdGUob3B0aW9uczogRGF0YWJyaWNrc0ZpbGVTeXN0ZW1PcHRpb25zKTogUHJvbWlzZTxEYXRhYnJpY2tzRmlsZVN5c3RlbT4ge1xuICAgIGlmICghaXNIb21lUmVsYXRpdmVQYXRoKG9wdGlvbnMucm9vdCkgfHwgb3B0aW9ucy51c2VyTmFtZT8udHJpbSgpKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGFicmlja3NGaWxlU3lzdGVtKG9wdGlvbnMpO1xuICAgIH1cbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCByZXNvbHZlQ2xpZW50T3B0aW9uKG9wdGlvbnMuY2xpZW50KTtcbiAgICBjb25zdCByb290ID0gYXdhaXQgcmVzb2x2ZURhdGFicmlja3NSb290KG9wdGlvbnMucm9vdCwgeyBjbGllbnQgfSk7XG4gICAgcmV0dXJuIG5ldyBEYXRhYnJpY2tzRmlsZVN5c3RlbSh7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgcm9vdCxcbiAgICAgIGNsaWVudDogb3B0aW9ucy5jbGllbnQgPz8gY2xpZW50LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gYSBVQyBWb2x1bWUgZmlsZSBhcyBhIHdlYiBzdHJlYW0gd2l0aG91dCBidWZmZXJpbmcgaXQgaW4gbWVtb3J5LlxuICAgKlxuICAgKiBSZXVzZSB0aGlzIGZvciBsYXJnZSBWb2x1bWUgdHJhbnNmZXJzLiBXb3Jrc3BhY2UgZmlsZXMgYW5kIERCRlMgcmV0YWluXG4gICAqIHRoZWlyIGV4aXN0aW5nIGJ1ZmZlcmVkIEFQSXMgYmVjYXVzZSB0aGVpciBTREsgc3VyZmFjZXMgYXJlIG5vdCByYXcgc3RyZWFtcy5cbiAgICovXG4gIGFzeW5jIHJlYWRTdHJlYW0oaW5wdXRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4+IHtcbiAgICBjb25zdCByZXNvbHZlZFBhdGggPSBhd2FpdCB0aGlzLnJlc29sdmVGb3IoaW5wdXRQYXRoKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZGlzcGF0Y2gocmVzb2x2ZWRQYXRoLCB7XG4gICAgICAgIGRiZnM6IHVucmVhY2hhYmxlQmFja2VuZCxcbiAgICAgICAgd29ya3NwYWNlOiB1bnJlYWNoYWJsZUJhY2tlbmQsXG4gICAgICAgIHZvbHVtZXM6IGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5maWxlcy5kb3dubG9hZCh7IGZpbGVfcGF0aDogcmVzb2x2ZWRQYXRoIH0pO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnRzID0gcmVzcG9uc2UuY29udGVudHMgYXMgZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAoIWNvbnRlbnRzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUVycm9yKFxuICAgICAgICAgICAgICBcIklPX0VSUk9SXCIsXG4gICAgICAgICAgICAgIFwiVm9sdW1lIGRvd25sb2FkIHJldHVybmVkIG5vIGNvbnRlbnRcIixcbiAgICAgICAgICAgICAgcmVzb2x2ZWRQYXRoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNvbnRlbnRzO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGJhc2VGUy5tYXBGaWxlU3lzdGVtRXJyb3IoZXJyb3IsIHJlc29sdmVkUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSBhIGZpbGUgdG8gYSBVQyBWb2x1bWUgd2l0aG91dCBsb2FkaW5nIGl0IGNvbXBsZXRlbHkgaW50byBtZW1vcnkuXG4gICAqXG4gICAqIFBhcmVudCBkaXJlY3RvcmllcyBhcmUgY3JlYXRlZCBjb25zaXN0ZW50bHkgd2l0aCB7QGxpbmsgd3JpdGVGaWxlfS4gVGhlXG4gICAqIEZpbGVzIEFQSSBvd25zIHRyYW5zZmVyIHJldHJpZXMgYW5kIGF1dGhlbnRpY2F0aW9uIHRocm91Z2ggdGhlIGluamVjdGVkXG4gICAqIHtAbGluayBXb3Jrc3BhY2VDbGllbnR9LlxuICAgKi9cbiAgYXN5bmMgd3JpdGVTdHJlYW0oXG4gICAgaW5wdXRQYXRoOiBzdHJpbmcsXG4gICAgY29udGVudDogZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PixcbiAgICBvcHRpb25zOiBEYXRhYnJpY2tzU3RyZWFtV3JpdGVPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuX2luaXQoKTtcbiAgICB0aGlzLmFzc2VydFdyaXRhYmxlKFwid3JpdGUgc3RyZWFtXCIpO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUGFyZW50RGlyZWN0b3J5KGlucHV0UGF0aCk7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gYXdhaXQgdGhpcy5yZXNvbHZlRm9yKGlucHV0UGF0aCwgeyBhbGxvd01pc3Npbmc6IHRydWUgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2gocmVzb2x2ZWRQYXRoLCB7XG4gICAgICAgIGRiZnM6IHVucmVhY2hhYmxlQmFja2VuZCxcbiAgICAgICAgd29ya3NwYWNlOiB1bnJlYWNoYWJsZUJhY2tlbmQsXG4gICAgICAgIHZvbHVtZXM6IChjbGllbnQpID0+XG4gICAgICAgICAgY2xpZW50LmZpbGVzLnVwbG9hZCh7XG4gICAgICAgICAgICBmaWxlX3BhdGg6IHJlc29sdmVkUGF0aCxcbiAgICAgICAgICAgIGNvbnRlbnRzOiBjb250ZW50IGFzIG5ldmVyLFxuICAgICAgICAgICAgb3ZlcndyaXRlOiBvcHRpb25zLm92ZXJ3cml0ZSA/PyB0cnVlLFxuICAgICAgICAgIH0pLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGJhc2VGUy5tYXBGaWxlU3lzdGVtRXJyb3IoZXJyb3IsIHJlc29sdmVkUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIG9uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNsaWVudCA9IGF3YWl0IHJlc29sdmVDbGllbnRPcHRpb24odGhpcy5jbGllbnRPcHRpb24pO1xuICB9XG5cbiAgLyoqIFJ1biB0aGUgaGFuZGxlciBmb3IgYGFic29sdXRlUGF0aGAncyBEYXRhYnJpY2tzIEFQSSB3aXRoIHRoZSBsaXZlIGNsaWVudC4gKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaDxUPihhYnNvbHV0ZVBhdGg6IHN0cmluZywgaGFuZGxlcnM6IEJhY2tlbmRIYW5kbGVyczxUPik6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGNsaWVudCA9XG4gICAgICB0eXBlb2YgdGhpcy5jbGllbnRPcHRpb24gPT09IFwiZnVuY3Rpb25cIiA/IGF3YWl0IHRoaXMuY2xpZW50T3B0aW9uKCkgOiB0aGlzLmNsaWVudDtcbiAgICBpZiAoIWNsaWVudCkge1xuICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FcnJvcihcbiAgICAgICAgXCJJT19FUlJPUlwiLFxuICAgICAgICBcIkRhdGFicmlja3MgZmlsZXN5c3RlbSBpcyBub3QgaW5pdGlhbGl6ZWQgKG5vIFdvcmtzcGFjZUNsaWVudClcIixcbiAgICAgICAgYWJzb2x1dGVQYXRoLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhbmRsZXJzW3Jlc29sdmVEYXRhYnJpY2tzRmlsZXNCYWNrZW5kKGFic29sdXRlUGF0aCldKGNsaWVudCk7XG4gIH1cblxuICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgLyogUHJpbWl0aXZlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVSb290RGlyZWN0b3J5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY3JlYXRlRGlyZWN0b3J5QXQodGhpcy5yb290KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZWFkQnl0ZXNBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHRoaXMuZGlzcGF0Y2g8QnVmZmVyPihyZXNvbHZlZFBhdGgsIHtcbiAgICAgIGRiZnM6IChjbGllbnQpID0+IHRoaXMucmVhZERiZnNGaWxlKGNsaWVudCwgcmVzb2x2ZWRQYXRoKSxcbiAgICAgIHdvcmtzcGFjZTogYXN5bmMgKGNsaWVudCkgPT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC53b3Jrc3BhY2UuZXhwb3J0KHsgcGF0aDogcmVzb2x2ZWRQYXRoLCBmb3JtYXQ6IFwiQVVUT1wiIH0pO1xuICAgICAgICByZXR1cm4gZGVjb2RlQmFzZTY0KHJlc3BvbnNlLmNvbnRlbnQpO1xuICAgICAgfSxcbiAgICAgIHZvbHVtZXM6IGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZmlsZXMuZG93bmxvYWQoeyBmaWxlX3BhdGg6IHJlc29sdmVkUGF0aCB9KTtcbiAgICAgICAgcmV0dXJuIHJlYWRSZXNwb25zZUJvZHkoXG4gICAgICAgICAgcmVzcG9uc2UuY29udGVudHMgYXMgZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PiB8IHVuZGVmaW5lZCxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ1ZmZlci5idWZmZXIsIGJ1ZmZlci5ieXRlT2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgd3JpdGVCeXRlc0F0KFxuICAgIHJlc29sdmVkUGF0aDogc3RyaW5nLFxuICAgIGNvbnRlbnQ6IFVpbnQ4QXJyYXksXG4gICAgb3B0aW9uczogUmVxdWlyZWQ8V3JpdGVGaWxlT3B0aW9ucz4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGNvbnRlbnQpO1xuICAgIGNvbnN0IG92ZXJ3cml0ZSA9IG9wdGlvbnMub3ZlcndyaXRlO1xuICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2g8dW5rbm93bj4ocmVzb2x2ZWRQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PiB0aGlzLndyaXRlRGJmc0ZpbGUoY2xpZW50LCByZXNvbHZlZFBhdGgsIGJ1ZmZlciwgb3ZlcndyaXRlKSxcbiAgICAgIHdvcmtzcGFjZTogKGNsaWVudCkgPT5cbiAgICAgICAgY2xpZW50LndvcmtzcGFjZS5pbXBvcnQoe1xuICAgICAgICAgIHBhdGg6IHJlc29sdmVkUGF0aCxcbiAgICAgICAgICBmb3JtYXQ6IFwiQVVUT1wiLFxuICAgICAgICAgIGNvbnRlbnQ6IGJ1ZmZlci50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICAgICAgICBvdmVyd3JpdGUsXG4gICAgICAgIH0pLFxuICAgICAgdm9sdW1lczogKGNsaWVudCkgPT5cbiAgICAgICAgY2xpZW50LmZpbGVzLnVwbG9hZCh7XG4gICAgICAgICAgZmlsZV9wYXRoOiByZXNvbHZlZFBhdGgsXG4gICAgICAgICAgY29udGVudHM6IGJ1ZmZlclRvUmVhZGFibGVTdHJlYW0oYnVmZmVyKSBhcyBuZXZlcixcbiAgICAgICAgICBvdmVyd3JpdGUsXG4gICAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUZpbGVBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2g8dW5rbm93bj4ocmVzb2x2ZWRQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PiBjbGllbnQuZGJmcy5kZWxldGUoeyBwYXRoOiByZXNvbHZlZFBhdGgsIHJlY3Vyc2l2ZTogZmFsc2UgfSksXG4gICAgICB3b3Jrc3BhY2U6IChjbGllbnQpID0+IGNsaWVudC53b3Jrc3BhY2UuZGVsZXRlKHsgcGF0aDogcmVzb2x2ZWRQYXRoLCByZWN1cnNpdmU6IGZhbHNlIH0pLFxuICAgICAgdm9sdW1lczogKGNsaWVudCkgPT4gY2xpZW50LmZpbGVzLmRlbGV0ZSh7IGZpbGVfcGF0aDogcmVzb2x2ZWRQYXRoIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZURpcmVjdG9yeUF0KHJlc29sdmVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kaXNwYXRjaDx1bmtub3duPihyZXNvbHZlZFBhdGgsIHtcbiAgICAgIGRiZnM6IChjbGllbnQpID0+IGNsaWVudC5kYmZzLm1rZGlycyh7IHBhdGg6IHJlc29sdmVkUGF0aCB9KSxcbiAgICAgIHdvcmtzcGFjZTogKGNsaWVudCkgPT4gY2xpZW50LndvcmtzcGFjZS5ta2RpcnMoeyBwYXRoOiByZXNvbHZlZFBhdGggfSksXG4gICAgICB2b2x1bWVzOiAoY2xpZW50KSA9PiB0aGlzLmNyZWF0ZVZvbHVtZURpcmVjdG9yaWVzKGNsaWVudCwgcmVzb2x2ZWRQYXRoKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZW1vdmVEaXJlY3RvcnlBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2g8dW5rbm93bj4ocmVzb2x2ZWRQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PiBjbGllbnQuZGJmcy5kZWxldGUoeyBwYXRoOiByZXNvbHZlZFBhdGgsIHJlY3Vyc2l2ZTogZmFsc2UgfSksXG4gICAgICB3b3Jrc3BhY2U6IChjbGllbnQpID0+IGNsaWVudC53b3Jrc3BhY2UuZGVsZXRlKHsgcGF0aDogcmVzb2x2ZWRQYXRoLCByZWN1cnNpdmU6IGZhbHNlIH0pLFxuICAgICAgdm9sdW1lczogKGNsaWVudCkgPT4gY2xpZW50LmZpbGVzLmRlbGV0ZURpcmVjdG9yeSh7IGRpcmVjdG9yeV9wYXRoOiByZXNvbHZlZFBhdGggfSksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgbGlzdERpcmVjdG9yeUF0KHJlc29sdmVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTxGaWxlRW50cnlbXT4ge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoPEZpbGVFbnRyeVtdPihyZXNvbHZlZFBhdGgsIHtcbiAgICAgIGRiZnM6IChjbGllbnQpID0+XG4gICAgICAgIGNvbGxlY3QoY2xpZW50LmRiZnMubGlzdCh7IHBhdGg6IHJlc29sdmVkUGF0aCB9KSwgKGluZm8pID0+ICh7XG4gICAgICAgICAgbmFtZTogcG9zaXhQYXRoLmJhc2VuYW1lKGluZm8ucGF0aCA/PyBcIlwiKSxcbiAgICAgICAgICB0eXBlOiBpbmZvLmlzX2RpciA/IFwiZGlyZWN0b3J5XCIgOiBcImZpbGVcIixcbiAgICAgICAgICBzaXplOiBpbmZvLmZpbGVfc2l6ZSxcbiAgICAgICAgfSkpLFxuICAgICAgd29ya3NwYWNlOiAoY2xpZW50KSA9PlxuICAgICAgICBjb2xsZWN0KGNsaWVudC53b3Jrc3BhY2UubGlzdCh7IHBhdGg6IHJlc29sdmVkUGF0aCB9KSwgKGluZm8pID0+ICh7XG4gICAgICAgICAgbmFtZTogcG9zaXhQYXRoLmJhc2VuYW1lKGluZm8ucGF0aCA/PyBcIlwiKSxcbiAgICAgICAgICB0eXBlOiBpbmZvLm9iamVjdF90eXBlID09PSBcIkRJUkVDVE9SWVwiID8gXCJkaXJlY3RvcnlcIiA6IFwiZmlsZVwiLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICBjcmVhdGVkQXQ6IGluZm8uY3JlYXRlZF9hdCxcbiAgICAgICAgICAgIG1vZGlmaWVkQXQ6IGluZm8ubW9kaWZpZWRfYXQsXG4gICAgICAgICAgICBvYmplY3RJZDogaW5mby5vYmplY3RfaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpLFxuICAgICAgdm9sdW1lczogKGNsaWVudCkgPT5cbiAgICAgICAgY29sbGVjdChjbGllbnQuZmlsZXMubGlzdERpcmVjdG9yeUNvbnRlbnRzKHsgZGlyZWN0b3J5X3BhdGg6IHJlc29sdmVkUGF0aCB9KSwgKGVudHJ5KSA9PiAoe1xuICAgICAgICAgIG5hbWU6IGVudHJ5Lm5hbWUgPz8gcG9zaXhQYXRoLmJhc2VuYW1lKGVudHJ5LnBhdGggPz8gXCJcIiksXG4gICAgICAgICAgdHlwZTogZW50cnkuaXNfZGlyZWN0b3J5ID8gXCJkaXJlY3RvcnlcIiA6IFwiZmlsZVwiLFxuICAgICAgICAgIHNpemU6IGVudHJ5LmZpbGVfc2l6ZSxcbiAgICAgICAgfSkpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHN0YXRBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8T21pdDxGaWxlU3RhdCwgXCJwYXRoXCI+PiB7XG4gICAgY29uc3QgZmFsbGJhY2tOYW1lID0gcG9zaXhQYXRoLmJhc2VuYW1lKHJlc29sdmVkUGF0aCkgfHwgcG9zaXhQYXRoLmJhc2VuYW1lKHRoaXMucm9vdCk7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2g8T21pdDxGaWxlU3RhdCwgXCJwYXRoXCI+PihyZXNvbHZlZFBhdGgsIHtcbiAgICAgIGRiZnM6IGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IGNsaWVudC5kYmZzLmdldFN0YXR1cyh7IHBhdGg6IHJlc29sdmVkUGF0aCB9KTtcbiAgICAgICAgY29uc3QgbW9kaWZpZWQgPSBvYmplY3QudG9EYXRlKGluZm8ubW9kaWZpY2F0aW9uX3RpbWUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IHBvc2l4UGF0aC5iYXNlbmFtZShpbmZvLnBhdGggPz8gcmVzb2x2ZWRQYXRoKSB8fCBmYWxsYmFja05hbWUsXG4gICAgICAgICAgdHlwZTogaW5mby5pc19kaXIgPyBcImRpcmVjdG9yeVwiIDogXCJmaWxlXCIsXG4gICAgICAgICAgc2l6ZTogaW5mby5maWxlX3NpemUsXG4gICAgICAgICAgY3JlYXRlZEF0OiBtb2RpZmllZCxcbiAgICAgICAgICBtb2RpZmllZEF0OiBtb2RpZmllZCxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICB3b3Jrc3BhY2U6IGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IGNsaWVudC53b3Jrc3BhY2UuZ2V0U3RhdHVzKHsgcGF0aDogcmVzb2x2ZWRQYXRoIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IHBvc2l4UGF0aC5iYXNlbmFtZShpbmZvLnBhdGggPz8gcmVzb2x2ZWRQYXRoKSB8fCBmYWxsYmFja05hbWUsXG4gICAgICAgICAgdHlwZTogaW5mby5vYmplY3RfdHlwZSA9PT0gXCJESVJFQ1RPUllcIiA/IFwiZGlyZWN0b3J5XCIgOiBcImZpbGVcIixcbiAgICAgICAgICBjcmVhdGVkQXQ6IG9iamVjdC50b0RhdGUoaW5mby5jcmVhdGVkX2F0KSxcbiAgICAgICAgICBtb2RpZmllZEF0OiBvYmplY3QudG9EYXRlKGluZm8ubW9kaWZpZWRfYXQpLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHZvbHVtZXM6IChjbGllbnQpID0+IHRoaXMuc3RhdFZvbHVtZVBhdGgoY2xpZW50LCByZXNvbHZlZFBhdGgsIGZhbGxiYWNrTmFtZSksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdHJ5TW92ZUZpbGVBdChcbiAgICBzb3VyY2VQYXRoOiBzdHJpbmcsXG4gICAgZGVzdGluYXRpb25QYXRoOiBzdHJpbmcsXG4gICAgX29wdGlvbnM6IFJlcXVpcmVkPENvcHlPcHRpb25zPixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gT25seSBEQkZTIGV4cG9zZXMgYSBzZXJ2ZXItc2lkZSBtb3ZlOyBldmVyeXRoaW5nIGVsc2UgZmFsbHMgYmFjayB0byB0aGVcbiAgICAvLyBwb3J0YWJsZSBjb3B5ICsgZGVsZXRlIGluIEJhc2VGaWxlU3lzdGVtLlxuICAgIGlmIChcbiAgICAgIHJlc29sdmVEYXRhYnJpY2tzRmlsZXNCYWNrZW5kKHNvdXJjZVBhdGgpICE9PSBcImRiZnNcIiB8fFxuICAgICAgcmVzb2x2ZURhdGFicmlja3NGaWxlc0JhY2tlbmQoZGVzdGluYXRpb25QYXRoKSAhPT0gXCJkYmZzXCJcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5kaXNwYXRjaDx1bmtub3duPihzb3VyY2VQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PlxuICAgICAgICBjbGllbnQuZGJmcy5tb3ZlKHsgc291cmNlX3BhdGg6IHNvdXJjZVBhdGgsIGRlc3RpbmF0aW9uX3BhdGg6IGRlc3RpbmF0aW9uUGF0aCB9KSxcbiAgICAgIHdvcmtzcGFjZTogdW5yZWFjaGFibGVCYWNrZW5kLFxuICAgICAgdm9sdW1lczogdW5yZWFjaGFibGVCYWNrZW5kLFxuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4gIC8qIEJhY2tlbmQtc3BlY2lmaWMgSS9PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICAvKipcbiAgICogVUMgYGNyZWF0ZURpcmVjdG9yeWAgaXMgc2luZ2xlLWxldmVsLCBzbyB3YWxrIHRoZSBwYXRoIGNyZWF0aW5nIGVhY2ggbGV2ZWxcbiAgICogYmVsb3cgdGhlIHZvbHVtZSBpdHNlbGYuIEEgbGV2ZWwgdGhhdCBhbHJlYWR5IGV4aXN0cyBpcyBub3QgYW4gZXJyb3IuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNyZWF0ZVZvbHVtZURpcmVjdG9yaWVzKFxuICAgIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICAgIGFic29sdXRlUGF0aDogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJ0cyA9IGFic29sdXRlUGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBjdXJyZW50ID0gXCJcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjdXJyZW50ID0gYCR7Y3VycmVudH0vJHtwYXJ0c1tpXX1gO1xuICAgICAgaWYgKGkgPCBWT0xVTUVfUk9PVF9ERVBUSCkgY29udGludWU7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjbGllbnQuZmlsZXMuY3JlYXRlRGlyZWN0b3J5KHsgZGlyZWN0b3J5X3BhdGg6IGN1cnJlbnQgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gQWxyZWFkeSBwcmVzZW50IGlzIGZpbmU7IGFueXRoaW5nIGVsc2UgaXMgYSByZWFsIGZhaWx1cmUuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgY2xpZW50LmZpbGVzLmdldERpcmVjdG9yeU1ldGFkYXRhKHsgZGlyZWN0b3J5X3BhdGg6IGN1cnJlbnQgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBTdGF0IGEgVUMgcGF0aDogZmlsZSBtZXRhZGF0YSBmaXJzdCwgdGhlbiBhIGRpcmVjdG9yeSBwcm9iZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBzdGF0Vm9sdW1lUGF0aChcbiAgICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgICBhYnNvbHV0ZVBhdGg6IHN0cmluZyxcbiAgICBmYWxsYmFja05hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxPbWl0PEZpbGVTdGF0LCBcInBhdGhcIj4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCBjbGllbnQuZmlsZXMuZ2V0TWV0YWRhdGEoeyBmaWxlX3BhdGg6IGFic29sdXRlUGF0aCB9KTtcbiAgICAgIGNvbnN0IG1vZGlmaWVkID0gb2JqZWN0LnRvRGF0ZShtZXRhZGF0YVtcImxhc3QtbW9kaWZpZWRcIl0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZmFsbGJhY2tOYW1lLFxuICAgICAgICB0eXBlOiBcImZpbGVcIixcbiAgICAgICAgc2l6ZTogTnVtYmVyKG1ldGFkYXRhW1wiY29udGVudC1sZW5ndGhcIl0gPz8gMCksXG4gICAgICAgIGNyZWF0ZWRBdDogbW9kaWZpZWQsXG4gICAgICAgIG1vZGlmaWVkQXQ6IG1vZGlmaWVkLFxuICAgICAgICBtaW1lVHlwZTogbWV0YWRhdGFbXCJjb250ZW50LXR5cGVcIl0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGZpbGVFcnIpIHtcbiAgICAgIC8vIEEgZGlyZWN0b3J5IGhhcyBubyBmaWxlIG1ldGFkYXRhLCBhbmQgYW4gdW5yZWFkYWJsZSBvbmUgcmVwb3J0cyBhc1xuICAgICAgLy8gbWlzc2luZyAvIGRlbmllZCAtIGJvdGggYXJlIHdvcnRoIGEgZGlyZWN0b3J5IHByb2JlIGJlZm9yZSBmYWlsaW5nLlxuICAgICAgY29uc3QgY29kZSA9IGJhc2VGUy5tYXBGaWxlU3lzdGVtRXJyb3IoZmlsZUVyciwgYWJzb2x1dGVQYXRoKS5jb2RlO1xuICAgICAgaWYgKGNvZGUgIT09IFwiTk9UX0ZPVU5EXCIgJiYgY29kZSAhPT0gXCJQRVJNSVNTSU9OX0RFTklFRFwiKSB0aHJvdyBmaWxlRXJyO1xuICAgICAgYXdhaXQgY2xpZW50LmZpbGVzLmdldERpcmVjdG9yeU1ldGFkYXRhKHsgZGlyZWN0b3J5X3BhdGg6IGFic29sdXRlUGF0aCB9KTtcbiAgICAgIHJldHVybiB7IG5hbWU6IGZhbGxiYWNrTmFtZSwgdHlwZTogXCJkaXJlY3RvcnlcIiB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVhZERiZnNGaWxlKGNsaWVudDogV29ya3NwYWNlQ2xpZW50LCBhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgY29uc3QgY2h1bmtzOiBCdWZmZXJbXSA9IFtdO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5kYmZzLnJlYWQoe1xuICAgICAgICBwYXRoOiBhYnNvbHV0ZVBhdGgsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgbGVuZ3RoOiBEQkZTX1JFQURfQ0hVTktfQllURVMsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGNodW5rID0gZGVjb2RlQmFzZTY0KHJlc3BvbnNlLmRhdGEpO1xuICAgICAgaWYgKGNodW5rLmxlbmd0aCA9PT0gMCkgYnJlYWs7XG4gICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICBvZmZzZXQgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgaWYgKGNodW5rLmxlbmd0aCA8IERCRlNfUkVBRF9DSFVOS19CWVRFUykgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGNodW5rcyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdyaXRlRGJmc0ZpbGUoXG4gICAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gICAgYWJzb2x1dGVQYXRoOiBzdHJpbmcsXG4gICAgYnVmZmVyOiBCdWZmZXIsXG4gICAgb3ZlcndyaXRlOiBib29sZWFuLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoYnVmZmVyLmxlbmd0aCA8PSBEQkZTX1BVVF9NQVhfQllURVMpIHtcbiAgICAgIGF3YWl0IGNsaWVudC5kYmZzLnB1dCh7XG4gICAgICAgIHBhdGg6IGFic29sdXRlUGF0aCxcbiAgICAgICAgY29udGVudHM6IGJ1ZmZlci50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICAgICAgb3ZlcndyaXRlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBjbGllbnQuZGJmcy5jcmVhdGUoeyBwYXRoOiBhYnNvbHV0ZVBhdGgsIG92ZXJ3cml0ZSB9KTtcbiAgICBjb25zdCBoYW5kbGUgPSBjcmVhdGVkLmhhbmRsZTtcbiAgICBpZiAoaGFuZGxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXJyb3IoXCJJT19FUlJPUlwiLCBcIkRCRlMgdXBsb2FkIGhhbmRsZSBtaXNzaW5nXCIsIGFic29sdXRlUGF0aCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBidWZmZXIubGVuZ3RoOyBvZmZzZXQgKz0gREJGU19QVVRfTUFYX0JZVEVTKSB7XG4gICAgICAgIGNvbnN0IHNsaWNlID0gYnVmZmVyLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgREJGU19QVVRfTUFYX0JZVEVTKTtcbiAgICAgICAgYXdhaXQgY2xpZW50LmRiZnMuYWRkQmxvY2soeyBoYW5kbGUsIGRhdGE6IHNsaWNlLnRvU3RyaW5nKFwiYmFzZTY0XCIpIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgYXdhaXQgY2xpZW50LmRiZnMuY2xvc2UoeyBoYW5kbGUgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgYXdhaXQgY2xpZW50LmRiZnMuY2xvc2UoeyBoYW5kbGUgfSk7XG4gIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBEcmFpbiBhbiBTREsgYXN5bmMgaXRlcmFibGUgaW50byBhIG1hcHBlZCBhcnJheS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3Q8UywgVD4oc291cmNlOiBBc3luY0l0ZXJhYmxlPFM+LCBtYXA6IChpdGVtOiBTKSA9PiBUKTogUHJvbWlzZTxUW10+IHtcbiAgY29uc3QgaXRlbXM6IFRbXSA9IFtdO1xuICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2Ygc291cmNlKSBpdGVtcy5wdXNoKG1hcChpdGVtKSk7XG4gIHJldHVybiBpdGVtcztcbn1cblxuLyoqIEhhbmRsZXIgZm9yIGEgYmFja2VuZCBhIGNhbGwgc2l0ZSBoYXMgYWxyZWFkeSBydWxlZCBvdXQuICovXG5mdW5jdGlvbiB1bnJlYWNoYWJsZUJhY2tlbmQoKTogUHJvbWlzZTxuZXZlcj4ge1xuICB0aHJvdyBuZXcgRmlsZVN5c3RlbUVycm9yKFwiTk9UX1NVUFBPUlRFRFwiLCBcIlVuc3VwcG9ydGVkIERhdGFicmlja3MgYmFja2VuZCBmb3IgdGhpcyBvcGVyYXRpb25cIik7XG59XG5cbmZ1bmN0aW9uIGRlY29kZUJhc2U2NChkYXRhOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBCdWZmZXIge1xuICBpZiAoIWRhdGEpIHJldHVybiBCdWZmZXIuYWxsb2MoMCk7XG4gIHJldHVybiBCdWZmZXIuZnJvbShkYXRhLCBcImJhc2U2NFwiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFJlc3BvbnNlQm9keShcbiAgY29udGVudHM6IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4gfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICBpZiAoIWNvbnRlbnRzKSByZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xuICBjb25zdCByZWFkZXIgPSBjb250ZW50cy5nZXRSZWFkZXIoKTtcbiAgY29uc3QgY2h1bmtzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgIGlmIChkb25lKSBicmVhaztcbiAgICBpZiAodmFsdWUpIGNodW5rcy5wdXNoKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChjaHVua3MubWFwKChjaHVuaykgPT4gQnVmZmVyLmZyb20oY2h1bmspKSk7XG59XG5cbmZ1bmN0aW9uIGJ1ZmZlclRvUmVhZGFibGVTdHJlYW0oYnVmZmVyOiBCdWZmZXIpOiBnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHtcbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pih7XG4gICAgc3RhcnQoY29udHJvbGxlcikge1xuICAgICAgY29udHJvbGxlci5lbnF1ZXVlKG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpO1xuICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgIH0sXG4gIH0pO1xufVxuIl19
|
|
396
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJyaWNrcy1mcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYnJpY2tzLWZzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFDTCxjQUFjLEVBQ2QsZUFBZSxFQUtmLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsUUFBUSxHQUNULE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLHVCQUF1QixFQUN2Qiw2QkFBNkIsRUFDN0IscUJBQXFCLEdBRXRCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGtCQUFrQixFQUF3QixNQUFNLHVCQUF1QixDQUFDO0FBRWpGLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUMxQyxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFdkMsbUZBQW1GO0FBQ25GLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBd0Q1Qix3RUFBd0U7QUFDeEUsS0FBSyxVQUFVLG1CQUFtQixDQUNoQyxNQUF3RTtJQUV4RSxJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVU7UUFBRSxPQUFPLE1BQU0sRUFBRSxDQUFDO0lBQ2xELE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7QUFDaEQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxjQUE0QjtJQUM1RCxNQUFNLENBQThCO0lBQzNCLFlBQVksQ0FBbUU7SUFFaEcsWUFBWSxPQUFvQztRQUM5QyxNQUFNLElBQUksR0FBRyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxD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SyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELEtBQUssVUFBVSxnQkFBZ0IsQ0FDN0IsUUFBMkQ7SUFFM0QsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3BDLE1BQU0sTUFBTSxHQUFpQixFQUFFLENBQUM7SUFDaEMsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNaLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUMsSUFBSSxJQUFJO1lBQUUsTUFBTTtRQUNoQixJQUFJLEtBQUs7WUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsTUFBYztJQUM1QyxPQUFPLElBQUksY0FBYyxDQUFhO1FBQ3BDLEtBQUssQ0FBQyxVQUFVO1lBQ2QsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzNDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNyQixDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGF0YWJyaWNrcyB7QGxpbmsgRmlsZVN5c3RlbX0gYmFja2VkIGJ5IHtAbGluayBXb3Jrc3BhY2VDbGllbnR9LlxuICpcbiAqIEV4dGVuZHMge0BsaW5rIEJhc2VGaWxlU3lzdGVtfS4gUm91dGVzIEkvTyBieSBhYnNvbHV0ZSBwYXRoOlxuICogLSBgL1dvcmtzcGFjZWAsIGAvVXNlcnNgLCBgL1JlcG9zYCwgYC9TaGFyZWRgIOKGkiB3b3Jrc3BhY2Ugb2JqZWN0cyBBUElcbiAqIC0gYC9Wb2x1bWVzLy4uLmAgKG9yIGBjYXRhbG9nLnNjaGVtYS52b2x1bWVgIHJvb3RzKSDihpIgVW5pdHkgQ2F0YWxvZyBGaWxlcyBBUElcbiAqIC0gYC9kYmZzLy4uLmAg4oaSIERCRlMgQVBJXG4gKlxuICogRXZlcnkgcHJpbWl0aXZlIHBpY2tzIGl0cyBBUEkgdGhyb3VnaCB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0uZGlzcGF0Y2h9XG4gKiByYXRoZXIgdGhhbiByZS1icmFuY2hpbmcgYnkgaGFuZCwgYW5kIGVycm9yIG5vcm1hbGl6YXRpb24gaXMgaW5oZXJpdGVkIGZyb21cbiAqIHtAbGluayBCYXNlRmlsZVN5c3RlbX0sIHNvIGEgcHJpbWl0aXZlIGhlcmUgaXMganVzdCB0aGUgU0RLIGNhbGwuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGZudkhhc2gsIHRvRGF0ZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBCYXNlRmlsZVN5c3RlbSxcbiAgRmlsZVN5c3RlbUVycm9yLFxuICB0eXBlIENvcHlPcHRpb25zLFxuICB0eXBlIEZpbGVFbnRyeSxcbiAgdHlwZSBGaWxlU3RhdCxcbiAgdHlwZSBXcml0ZUZpbGVPcHRpb25zLFxuICBtYXBGaWxlU3lzdGVtRXJyb3IsXG4gIGlzSG9tZVJlbGF0aXZlUGF0aCxcbiAgYmFzZW5hbWUsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1mc1wiO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplRGF0YWJyaWNrc1Jvb3QsXG4gIHJlc29sdmVEYXRhYnJpY2tzRmlsZXNCYWNrZW5kLFxuICByZXNvbHZlRGF0YWJyaWNrc1Jvb3QsXG4gIHR5cGUgRGF0YWJyaWNrc0ZpbGVzQmFja2VuZCxcbn0gZnJvbSBcIi4vZGF0YWJyaWNrcy1wYXRoLnRzXCI7XG5pbXBvcnQgeyBnZXRXb3Jrc3BhY2VDbGllbnQsIHR5cGUgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIi4vd29ya3NwYWNlLWNsaWVudC50c1wiO1xuXG5jb25zdCBEQkZTX1JFQURfQ0hVTktfQllURVMgPSAxMDI0ICogMTAyNDtcbmNvbnN0IERCRlNfUFVUX01BWF9CWVRFUyA9IDEwMjQgKiAxMDI0O1xuXG4vKiogU2VnbWVudHMgaW4gYC9Wb2x1bWVzLzxjYXRhbG9nPi88c2NoZW1hPi88dm9sdW1lPmAsIHByb3Zpc2lvbmVkIG91dCBvZiBiYW5kLiAqL1xuY29uc3QgVk9MVU1FX1JPT1RfREVQVEggPSA0O1xuXG4vKipcbiAqIE9uZSBoYW5kbGVyIHBlciBEYXRhYnJpY2tzIEFQSSwga2V5ZWQgYnkge0BsaW5rIERhdGFicmlja3NGaWxlc0JhY2tlbmR9IHNvXG4gKiBhZGRpbmcgYSBiYWNrZW5kIGlzIGEgY29tcGlsZSBlcnJvciB1bnRpbCBldmVyeSBjYWxsIHNpdGUgaGFuZGxlcyBpdC5cbiAqL1xudHlwZSBCYWNrZW5kSGFuZGxlcnM8VD4gPSBSZWNvcmQ8RGF0YWJyaWNrc0ZpbGVzQmFja2VuZCwgKGNsaWVudDogV29ya3NwYWNlQ2xpZW50KSA9PiBQcm9taXNlPFQ+PjtcblxuLyoqIFJlc29sdmUgdGhlIERhdGFicmlja3MgY2xpZW50IHVzZWQgZm9yIHRoZSBjdXJyZW50IGZpbGVzeXN0ZW0gb3BlcmF0aW9uLiAqL1xuZXhwb3J0IHR5cGUgRGF0YWJyaWNrc0ZpbGVTeXN0ZW1DbGllbnRSZXNvbHZlciA9ICgpID0+IFdvcmtzcGFjZUNsaWVudCB8IFByb21pc2U8V29ya3NwYWNlQ2xpZW50PjtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBEYXRhYnJpY2tzRmlsZVN5c3RlbX0uICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFicmlja3NGaWxlU3lzdGVtT3B0aW9ucyB7XG4gIC8qKiBVbmlxdWUgaWRlbnRpZmllci4gRGVmYXVsdHMgdG8gYSBzdGFibGUgaGFzaCBvZiB0aGUgbm9ybWFsaXplZCByb290LiAqL1xuICBpZD86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsZXN5c3RlbSByb290LiBBY2NlcHRzOlxuICAgKiAtIGAvVm9sdW1lcy9jYXRhbG9nL3NjaGVtYS92b2x1bWVgIChhbHNvIGAvVm9sdW1lLy4uLmApXG4gICAqIC0gYGNhdGFsb2cuc2NoZW1hLnZvbHVtZWBcbiAgICogLSBgfmAgLyBgfi8uLi5gIOKGkiBgL1dvcmtzcGFjZS9Vc2Vycy88dXNlck5hbWU+Ly4uLmAgKG5lZWRzIHtAbGluayB1c2VyTmFtZX0sXG4gICAqICAgb3IgdXNlIHtAbGluayBEYXRhYnJpY2tzRmlsZVN5c3RlbS5jcmVhdGV9KVxuICAgKiAtIGAvV29ya3NwYWNlLy4uLmAsIGAvVXNlcnMvLi4uYCwgYC9SZXBvcy8uLi5gLCBgL1NoYXJlZC8uLi5gXG4gICAqIC0gYC9kYmZzLy4uLmBcbiAgICovXG4gIHJvb3Q6IHN0cmluZztcblxuICAvKipcbiAgICogVXNlcm5hbWUgZm9yIGV4cGFuZGluZyBgfmAuIFdoZW4gb21pdHRlZCBhbmQge0BsaW5rIHJvb3R9IGlzIGhvbWUtcmVsYXRpdmUsXG4gICAqIHByZWZlciB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0uY3JlYXRlfSB3aGljaCByZXNvbHZlcyBpdCB2aWFcbiAgICogYGdldEN1cnJlbnRVc2VyTmFtZWAuXG4gICAqL1xuICB1c2VyTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRGF0YWJyaWNrcyB3b3Jrc3BhY2UgY2xpZW50LiBEZWZhdWx0cyB0byBgdHJ5R2V0V29ya3NwYWNlQ2xpZW50KClgLCBvdGhlcndpc2VcbiAgICogYSBkZWZhdWx0IHtAbGluayBXb3Jrc3BhY2VDbGllbnR9IGZyb20gZW52IC8gcHJvZmlsZSBhdXRoLlxuICAgKi9cbiAgY2xpZW50PzogV29ya3NwYWNlQ2xpZW50IHwgRGF0YWJyaWNrc0ZpbGVTeXN0ZW1DbGllbnRSZXNvbHZlcjtcblxuICAvKiogQmxvY2sgYWxsIHdyaXRlIG9wZXJhdGlvbnMuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICByZWFkT25seT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB7QGxpbmsgcm9vdH0gKGFuZCBwYXJlbnRzKSBkdXJpbmcgaW5pdC4gRGVmYXVsdHMgdG8gZmFsc2UgKHZvbHVtZVxuICAgKiBhbmQgd29ya3NwYWNlIHJvb3RzIGFyZSB1c3VhbGx5IHByb3Zpc2lvbmVkIG91dCBvZiBiYW5kKS5cbiAgICovXG4gIGNyZWF0ZVJvb3Q/OiBib29sZWFuO1xufVxuXG4vKiogRXhpc3RpbmctZmlsZSBiZWhhdmlvciBmb3IgYSBzdHJlYW1lZCBVQyBWb2x1bWUgdXBsb2FkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzU3RyZWFtV3JpdGVPcHRpb25zIHtcbiAgLyoqIFJlcGxhY2UgYW4gZXhpc3RpbmcgZmlsZS4gRGVmYXVsdHMgdG8gdHJ1ZS4gKi9cbiAgb3ZlcndyaXRlPzogYm9vbGVhbjtcbn1cblxuLyoqIFJlc29sdmUgYSBzdGF0aWMsIG9wZXJhdGlvbi1zY29wZWQsIG9yIGFtYmllbnQgRGF0YWJyaWNrcyBjbGllbnQuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQ2xpZW50T3B0aW9uKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCB8IERhdGFicmlja3NGaWxlU3lzdGVtQ2xpZW50UmVzb2x2ZXIgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPFdvcmtzcGFjZUNsaWVudD4ge1xuICBpZiAodHlwZW9mIGNsaWVudCA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gY2xpZW50KCk7XG4gIHJldHVybiBjbGllbnQgPz8gKGF3YWl0IGdldFdvcmtzcGFjZUNsaWVudCgpKTtcbn1cblxuLyoqXG4gKiB7QGxpbmsgRmlsZVN5c3RlbX0gaW1wbGVtZW50YXRpb24gb3ZlciBEYXRhYnJpY2tzIHdvcmtzcGFjZSBmaWxlcywgVUNcbiAqIHZvbHVtZXMsIGFuZCBEQkZTLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgZnMgPSBuZXcgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0oeyByb290OiBcIm1haW4uZGVmYXVsdC5hc3NldHNcIiB9KTtcbiAqIGF3YWl0IGZzLndyaXRlRmlsZShcIm5vdGVzL2hlbGxvLnR4dFwiLCBcImhpXCIpO1xuICpcbiAqIGNvbnN0IGhvbWUgPSBhd2FpdCBEYXRhYnJpY2tzRmlsZVN5c3RlbS5jcmVhdGUoeyByb290OiBcIn5cIiB9KTtcbiAqIGNvbnN0IGxpc3RpbmcgPSBhd2FpdCBob21lLnJlYWRkaXIoXCIuXCIpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhYnJpY2tzRmlsZVN5c3RlbSBleHRlbmRzIEJhc2VGaWxlU3lzdGVtPFwiZGF0YWJyaWNrc1wiPiB7XG4gIHByaXZhdGUgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50T3B0aW9uOiBXb3Jrc3BhY2VDbGllbnQgfCBEYXRhYnJpY2tzRmlsZVN5c3RlbUNsaWVudFJlc29sdmVyIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IERhdGFicmlja3NGaWxlU3lzdGVtT3B0aW9ucykge1xuICAgIGNvbnN0IHJvb3QgPSBub3JtYWxpemVEYXRhYnJpY2tzUm9vdChvcHRpb25zLnJvb3QsIHsgdXNlck5hbWU6IG9wdGlvbnMudXNlck5hbWUgfSk7XG4gICAgc3VwZXIoe1xuICAgICAgaWQ6IG9wdGlvbnMuaWQgPz8gYGRhdGFicmlja3MtJHtmbnZIYXNoKHJvb3QpfWAsXG4gICAgICBiYWNrZW5kOiBcImRhdGFicmlja3NcIixcbiAgICAgIHJvb3QsXG4gICAgICByZWFkT25seTogb3B0aW9ucy5yZWFkT25seSxcbiAgICAgIGNyZWF0ZVJvb3Q6IG9wdGlvbnMuY3JlYXRlUm9vdCA/PyBmYWxzZSxcbiAgICB9KTtcbiAgICB0aGlzLmNsaWVudE9wdGlvbiA9IG9wdGlvbnMuY2xpZW50O1xuICAgIHRoaXMuY2xpZW50ID0gdHlwZW9mIG9wdGlvbnMuY2xpZW50ID09PSBcImZ1bmN0aW9uXCIgPyB1bmRlZmluZWQgOiBvcHRpb25zLmNsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW19LCByZXNvbHZpbmcgYH5gIHJvb3RzIHZpYSB0aGVcbiAgICogd29ya3NwYWNlIGN1cnJlbnQgdXNlciB3aGVuIG5lZWRlZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBjcmVhdGUob3B0aW9uczogRGF0YWJyaWNrc0ZpbGVTeXN0ZW1PcHRpb25zKTogUHJvbWlzZTxEYXRhYnJpY2tzRmlsZVN5c3RlbT4ge1xuICAgIGlmICghaXNIb21lUmVsYXRpdmVQYXRoKG9wdGlvbnMucm9vdCkgfHwgb3B0aW9ucy51c2VyTmFtZT8udHJpbSgpKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGFicmlja3NGaWxlU3lzdGVtKG9wdGlvbnMpO1xuICAgIH1cbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCByZXNvbHZlQ2xpZW50T3B0aW9uKG9wdGlvbnMuY2xpZW50KTtcbiAgICBjb25zdCByb290ID0gYXdhaXQgcmVzb2x2ZURhdGFicmlja3NSb290KG9wdGlvbnMucm9vdCwgeyBjbGllbnQgfSk7XG4gICAgcmV0dXJuIG5ldyBEYXRhYnJpY2tzRmlsZVN5c3RlbSh7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgcm9vdCxcbiAgICAgIGNsaWVudDogb3B0aW9ucy5jbGllbnQgPz8gY2xpZW50LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gYSBVQyBWb2x1bWUgZmlsZSBhcyBhIHdlYiBzdHJlYW0gd2l0aG91dCBidWZmZXJpbmcgaXQgaW4gbWVtb3J5LlxuICAgKlxuICAgKiBSZXVzZSB0aGlzIGZvciBsYXJnZSBWb2x1bWUgdHJhbnNmZXJzLiBXb3Jrc3BhY2UgZmlsZXMgYW5kIERCRlMgcmV0YWluXG4gICAqIHRoZWlyIGV4aXN0aW5nIGJ1ZmZlcmVkIEFQSXMgYmVjYXVzZSB0aGVpciBTREsgc3VyZmFjZXMgYXJlIG5vdCByYXcgc3RyZWFtcy5cbiAgICovXG4gIGFzeW5jIHJlYWRTdHJlYW0oaW5wdXRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4+IHtcbiAgICBjb25zdCByZXNvbHZlZFBhdGggPSBhd2FpdCB0aGlzLnJlc29sdmVGb3IoaW5wdXRQYXRoKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZGlzcGF0Y2gocmVzb2x2ZWRQYXRoLCB7XG4gICAgICAgIGRiZnM6IHVucmVhY2hhYmxlQmFja2VuZCxcbiAgICAgICAgd29ya3NwYWNlOiB1bnJlYWNoYWJsZUJhY2tlbmQsXG4gICAgICAgIHZvbHVtZXM6IGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5maWxlcy5kb3dubG9hZCh7IGZpbGVfcGF0aDogcmVzb2x2ZWRQYXRoIH0pO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnRzID0gcmVzcG9uc2UuY29udGVudHMgYXMgZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAoIWNvbnRlbnRzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUVycm9yKFxuICAgICAgICAgICAgICBcIklPX0VSUk9SXCIsXG4gICAgICAgICAgICAgIFwiVm9sdW1lIGRvd25sb2FkIHJldHVybmVkIG5vIGNvbnRlbnRcIixcbiAgICAgICAgICAgICAgcmVzb2x2ZWRQYXRoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNvbnRlbnRzO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG1hcEZpbGVTeXN0ZW1FcnJvcihlcnJvciwgcmVzb2x2ZWRQYXRoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RyZWFtIGEgZmlsZSB0byBhIFVDIFZvbHVtZSB3aXRob3V0IGxvYWRpbmcgaXQgY29tcGxldGVseSBpbnRvIG1lbW9yeS5cbiAgICpcbiAgICogUGFyZW50IGRpcmVjdG9yaWVzIGFyZSBjcmVhdGVkIGNvbnNpc3RlbnRseSB3aXRoIHtAbGluayB3cml0ZUZpbGV9LiBUaGVcbiAgICogRmlsZXMgQVBJIG93bnMgdHJhbnNmZXIgcmV0cmllcyBhbmQgYXV0aGVudGljYXRpb24gdGhyb3VnaCB0aGUgaW5qZWN0ZWRcbiAgICoge0BsaW5rIFdvcmtzcGFjZUNsaWVudH0uXG4gICAqL1xuICBhc3luYyB3cml0ZVN0cmVhbShcbiAgICBpbnB1dFBhdGg6IHN0cmluZyxcbiAgICBjb250ZW50OiBnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+LFxuICAgIG9wdGlvbnM6IERhdGFicmlja3NTdHJlYW1Xcml0ZU9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5faW5pdCgpO1xuICAgIHRoaXMuYXNzZXJ0V3JpdGFibGUoXCJ3cml0ZSBzdHJlYW1cIik7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVQYXJlbnREaXJlY3RvcnkoaW5wdXRQYXRoKTtcbiAgICBjb25zdCByZXNvbHZlZFBhdGggPSBhd2FpdCB0aGlzLnJlc29sdmVGb3IoaW5wdXRQYXRoLCB7IGFsbG93TWlzc2luZzogdHJ1ZSB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5kaXNwYXRjaChyZXNvbHZlZFBhdGgsIHtcbiAgICAgICAgZGJmczogdW5yZWFjaGFibGVCYWNrZW5kLFxuICAgICAgICB3b3Jrc3BhY2U6IHVucmVhY2hhYmxlQmFja2VuZCxcbiAgICAgICAgdm9sdW1lczogKGNsaWVudCkgPT5cbiAgICAgICAgICBjbGllbnQuZmlsZXMudXBsb2FkKHtcbiAgICAgICAgICAgIGZpbGVfcGF0aDogcmVzb2x2ZWRQYXRoLFxuICAgICAgICAgICAgY29udGVudHM6IGNvbnRlbnQgYXMgbmV2ZXIsXG4gICAgICAgICAgICBvdmVyd3JpdGU6IG9wdGlvbnMub3ZlcndyaXRlID8/IHRydWUsXG4gICAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbWFwRmlsZVN5c3RlbUVycm9yKGVycm9yLCByZXNvbHZlZFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBvbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jbGllbnQgPSBhd2FpdCByZXNvbHZlQ2xpZW50T3B0aW9uKHRoaXMuY2xpZW50T3B0aW9uKTtcbiAgfVxuXG4gIC8qKiBSdW4gdGhlIGhhbmRsZXIgZm9yIGBhYnNvbHV0ZVBhdGhgJ3MgRGF0YWJyaWNrcyBBUEkgd2l0aCB0aGUgbGl2ZSBjbGllbnQuICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2g8VD4oYWJzb2x1dGVQYXRoOiBzdHJpbmcsIGhhbmRsZXJzOiBCYWNrZW5kSGFuZGxlcnM8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBjbGllbnQgPVxuICAgICAgdHlwZW9mIHRoaXMuY2xpZW50T3B0aW9uID09PSBcImZ1bmN0aW9uXCIgPyBhd2FpdCB0aGlzLmNsaWVudE9wdGlvbigpIDogdGhpcy5jbGllbnQ7XG4gICAgaWYgKCFjbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXJyb3IoXG4gICAgICAgIFwiSU9fRVJST1JcIixcbiAgICAgICAgXCJEYXRhYnJpY2tzIGZpbGVzeXN0ZW0gaXMgbm90IGluaXRpYWxpemVkIChubyBXb3Jrc3BhY2VDbGllbnQpXCIsXG4gICAgICAgIGFic29sdXRlUGF0aCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBoYW5kbGVyc1tyZXNvbHZlRGF0YWJyaWNrc0ZpbGVzQmFja2VuZChhYnNvbHV0ZVBhdGgpXShjbGllbnQpO1xuICB9XG5cbiAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4gIC8qIFByaW1pdGl2ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlUm9vdERpcmVjdG9yeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNyZWF0ZURpcmVjdG9yeUF0KHRoaXMucm9vdCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgcmVhZEJ5dGVzQXQocmVzb2x2ZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBidWZmZXIgPSBhd2FpdCB0aGlzLmRpc3BhdGNoPEJ1ZmZlcj4ocmVzb2x2ZWRQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PiB0aGlzLnJlYWREYmZzRmlsZShjbGllbnQsIHJlc29sdmVkUGF0aCksXG4gICAgICB3b3Jrc3BhY2U6IGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQud29ya3NwYWNlLmV4cG9ydCh7IHBhdGg6IHJlc29sdmVkUGF0aCwgZm9ybWF0OiBcIkFVVE9cIiB9KTtcbiAgICAgICAgcmV0dXJuIGRlY29kZUJhc2U2NChyZXNwb25zZS5jb250ZW50KTtcbiAgICAgIH0sXG4gICAgICB2b2x1bWVzOiBhc3luYyAoY2xpZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmZpbGVzLmRvd25sb2FkKHsgZmlsZV9wYXRoOiByZXNvbHZlZFBhdGggfSk7XG4gICAgICAgIHJldHVybiByZWFkUmVzcG9uc2VCb2R5KFxuICAgICAgICAgIHJlc3BvbnNlLmNvbnRlbnRzIGFzIGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4gfCB1bmRlZmluZWQsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShidWZmZXIuYnVmZmVyLCBidWZmZXIuYnl0ZU9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHdyaXRlQnl0ZXNBdChcbiAgICByZXNvbHZlZFBhdGg6IHN0cmluZyxcbiAgICBjb250ZW50OiBVaW50OEFycmF5LFxuICAgIG9wdGlvbnM6IFJlcXVpcmVkPFdyaXRlRmlsZU9wdGlvbnM+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShjb250ZW50KTtcbiAgICBjb25zdCBvdmVyd3JpdGUgPSBvcHRpb25zLm92ZXJ3cml0ZTtcbiAgICBhd2FpdCB0aGlzLmRpc3BhdGNoPHVua25vd24+KHJlc29sdmVkUGF0aCwge1xuICAgICAgZGJmczogKGNsaWVudCkgPT4gdGhpcy53cml0ZURiZnNGaWxlKGNsaWVudCwgcmVzb2x2ZWRQYXRoLCBidWZmZXIsIG92ZXJ3cml0ZSksXG4gICAgICB3b3Jrc3BhY2U6IChjbGllbnQpID0+XG4gICAgICAgIGNsaWVudC53b3Jrc3BhY2UuaW1wb3J0KHtcbiAgICAgICAgICBwYXRoOiByZXNvbHZlZFBhdGgsXG4gICAgICAgICAgZm9ybWF0OiBcIkFVVE9cIixcbiAgICAgICAgICBjb250ZW50OiBidWZmZXIudG9TdHJpbmcoXCJiYXNlNjRcIiksXG4gICAgICAgICAgb3ZlcndyaXRlLFxuICAgICAgICB9KSxcbiAgICAgIHZvbHVtZXM6IChjbGllbnQpID0+XG4gICAgICAgIGNsaWVudC5maWxlcy51cGxvYWQoe1xuICAgICAgICAgIGZpbGVfcGF0aDogcmVzb2x2ZWRQYXRoLFxuICAgICAgICAgIGNvbnRlbnRzOiBidWZmZXJUb1JlYWRhYmxlU3RyZWFtKGJ1ZmZlcikgYXMgbmV2ZXIsXG4gICAgICAgICAgb3ZlcndyaXRlLFxuICAgICAgICB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBkZWxldGVGaWxlQXQocmVzb2x2ZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRpc3BhdGNoPHVua25vd24+KHJlc29sdmVkUGF0aCwge1xuICAgICAgZGJmczogKGNsaWVudCkgPT4gY2xpZW50LmRiZnMuZGVsZXRlKHsgcGF0aDogcmVzb2x2ZWRQYXRoLCByZWN1cnNpdmU6IGZhbHNlIH0pLFxuICAgICAgd29ya3NwYWNlOiAoY2xpZW50KSA9PiBjbGllbnQud29ya3NwYWNlLmRlbGV0ZSh7IHBhdGg6IHJlc29sdmVkUGF0aCwgcmVjdXJzaXZlOiBmYWxzZSB9KSxcbiAgICAgIHZvbHVtZXM6IChjbGllbnQpID0+IGNsaWVudC5maWxlcy5kZWxldGUoeyBmaWxlX3BhdGg6IHJlc29sdmVkUGF0aCB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVEaXJlY3RvcnlBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2g8dW5rbm93bj4ocmVzb2x2ZWRQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PiBjbGllbnQuZGJmcy5ta2RpcnMoeyBwYXRoOiByZXNvbHZlZFBhdGggfSksXG4gICAgICB3b3Jrc3BhY2U6IChjbGllbnQpID0+IGNsaWVudC53b3Jrc3BhY2UubWtkaXJzKHsgcGF0aDogcmVzb2x2ZWRQYXRoIH0pLFxuICAgICAgdm9sdW1lczogKGNsaWVudCkgPT4gdGhpcy5jcmVhdGVWb2x1bWVEaXJlY3RvcmllcyhjbGllbnQsIHJlc29sdmVkUGF0aCksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgcmVtb3ZlRGlyZWN0b3J5QXQocmVzb2x2ZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRpc3BhdGNoPHVua25vd24+KHJlc29sdmVkUGF0aCwge1xuICAgICAgZGJmczogKGNsaWVudCkgPT4gY2xpZW50LmRiZnMuZGVsZXRlKHsgcGF0aDogcmVzb2x2ZWRQYXRoLCByZWN1cnNpdmU6IGZhbHNlIH0pLFxuICAgICAgd29ya3NwYWNlOiAoY2xpZW50KSA9PiBjbGllbnQud29ya3NwYWNlLmRlbGV0ZSh7IHBhdGg6IHJlc29sdmVkUGF0aCwgcmVjdXJzaXZlOiBmYWxzZSB9KSxcbiAgICAgIHZvbHVtZXM6IChjbGllbnQpID0+IGNsaWVudC5maWxlcy5kZWxldGVEaXJlY3RvcnkoeyBkaXJlY3RvcnlfcGF0aDogcmVzb2x2ZWRQYXRoIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGxpc3REaXJlY3RvcnlBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8RmlsZUVudHJ5W10+IHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaDxGaWxlRW50cnlbXT4ocmVzb2x2ZWRQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PlxuICAgICAgICBjb2xsZWN0KGNsaWVudC5kYmZzLmxpc3QoeyBwYXRoOiByZXNvbHZlZFBhdGggfSksIChpbmZvKSA9PiAoe1xuICAgICAgICAgIG5hbWU6IGJhc2VuYW1lKGluZm8ucGF0aCA/PyBcIlwiKSxcbiAgICAgICAgICB0eXBlOiBpbmZvLmlzX2RpciA/IFwiZGlyZWN0b3J5XCIgOiBcImZpbGVcIixcbiAgICAgICAgICBzaXplOiBpbmZvLmZpbGVfc2l6ZSxcbiAgICAgICAgfSkpLFxuICAgICAgd29ya3NwYWNlOiAoY2xpZW50KSA9PlxuICAgICAgICBjb2xsZWN0KGNsaWVudC53b3Jrc3BhY2UubGlzdCh7IHBhdGg6IHJlc29sdmVkUGF0aCB9KSwgKGluZm8pID0+ICh7XG4gICAgICAgICAgbmFtZTogYmFzZW5hbWUoaW5mby5wYXRoID8/IFwiXCIpLFxuICAgICAgICAgIHR5cGU6IGluZm8ub2JqZWN0X3R5cGUgPT09IFwiRElSRUNUT1JZXCIgPyBcImRpcmVjdG9yeVwiIDogXCJmaWxlXCIsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogaW5mby5jcmVhdGVkX2F0LFxuICAgICAgICAgICAgbW9kaWZpZWRBdDogaW5mby5tb2RpZmllZF9hdCxcbiAgICAgICAgICAgIG9iamVjdElkOiBpbmZvLm9iamVjdF9pZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSksXG4gICAgICB2b2x1bWVzOiAoY2xpZW50KSA9PlxuICAgICAgICBjb2xsZWN0KGNsaWVudC5maWxlcy5saXN0RGlyZWN0b3J5Q29udGVudHMoeyBkaXJlY3RvcnlfcGF0aDogcmVzb2x2ZWRQYXRoIH0pLCAoZW50cnkpID0+ICh7XG4gICAgICAgICAgbmFtZTogZW50cnkubmFtZSA/PyBiYXNlbmFtZShlbnRyeS5wYXRoID8/IFwiXCIpLFxuICAgICAgICAgIHR5cGU6IGVudHJ5LmlzX2RpcmVjdG9yeSA/IFwiZGlyZWN0b3J5XCIgOiBcImZpbGVcIixcbiAgICAgICAgICBzaXplOiBlbnRyeS5maWxlX3NpemUsXG4gICAgICAgIH0pKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBzdGF0QXQocmVzb2x2ZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPE9taXQ8RmlsZVN0YXQsIFwicGF0aFwiPj4ge1xuICAgIGNvbnN0IGZhbGxiYWNrTmFtZSA9IGJhc2VuYW1lKHJlc29sdmVkUGF0aCkgfHwgYmFzZW5hbWUodGhpcy5yb290KTtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaDxPbWl0PEZpbGVTdGF0LCBcInBhdGhcIj4+KHJlc29sdmVkUGF0aCwge1xuICAgICAgZGJmczogYXN5bmMgKGNsaWVudCkgPT4ge1xuICAgICAgICBjb25zdCBpbmZvID0gYXdhaXQgY2xpZW50LmRiZnMuZ2V0U3RhdHVzKHsgcGF0aDogcmVzb2x2ZWRQYXRoIH0pO1xuICAgICAgICBjb25zdCBtb2RpZmllZCA9IHRvRGF0ZShpbmZvLm1vZGlmaWNhdGlvbl90aW1lKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBiYXNlbmFtZShpbmZvLnBhdGggPz8gcmVzb2x2ZWRQYXRoKSB8fCBmYWxsYmFja05hbWUsXG4gICAgICAgICAgdHlwZTogaW5mby5pc19kaXIgPyBcImRpcmVjdG9yeVwiIDogXCJmaWxlXCIsXG4gICAgICAgICAgc2l6ZTogaW5mby5maWxlX3NpemUsXG4gICAgICAgICAgY3JlYXRlZEF0OiBtb2RpZmllZCxcbiAgICAgICAgICBtb2RpZmllZEF0OiBtb2RpZmllZCxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICB3b3Jrc3BhY2U6IGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IGNsaWVudC53b3Jrc3BhY2UuZ2V0U3RhdHVzKHsgcGF0aDogcmVzb2x2ZWRQYXRoIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IGJhc2VuYW1lKGluZm8ucGF0aCA/PyByZXNvbHZlZFBhdGgpIHx8IGZhbGxiYWNrTmFtZSxcbiAgICAgICAgICB0eXBlOiBpbmZvLm9iamVjdF90eXBlID09PSBcIkRJUkVDVE9SWVwiID8gXCJkaXJlY3RvcnlcIiA6IFwiZmlsZVwiLFxuICAgICAgICAgIGNyZWF0ZWRBdDogdG9EYXRlKGluZm8uY3JlYXRlZF9hdCksXG4gICAgICAgICAgbW9kaWZpZWRBdDogdG9EYXRlKGluZm8ubW9kaWZpZWRfYXQpLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHZvbHVtZXM6IChjbGllbnQpID0+IHRoaXMuc3RhdFZvbHVtZVBhdGgoY2xpZW50LCByZXNvbHZlZFBhdGgsIGZhbGxiYWNrTmFtZSksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdHJ5TW92ZUZpbGVBdChcbiAgICBzb3VyY2VQYXRoOiBzdHJpbmcsXG4gICAgZGVzdGluYXRpb25QYXRoOiBzdHJpbmcsXG4gICAgX29wdGlvbnM6IFJlcXVpcmVkPENvcHlPcHRpb25zPixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gT25seSBEQkZTIGV4cG9zZXMgYSBzZXJ2ZXItc2lkZSBtb3ZlOyBldmVyeXRoaW5nIGVsc2UgZmFsbHMgYmFjayB0byB0aGVcbiAgICAvLyBwb3J0YWJsZSBjb3B5ICsgZGVsZXRlIGluIEJhc2VGaWxlU3lzdGVtLlxuICAgIGlmIChcbiAgICAgIHJlc29sdmVEYXRhYnJpY2tzRmlsZXNCYWNrZW5kKHNvdXJjZVBhdGgpICE9PSBcImRiZnNcIiB8fFxuICAgICAgcmVzb2x2ZURhdGFicmlja3NGaWxlc0JhY2tlbmQoZGVzdGluYXRpb25QYXRoKSAhPT0gXCJkYmZzXCJcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5kaXNwYXRjaDx1bmtub3duPihzb3VyY2VQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PlxuICAgICAgICBjbGllbnQuZGJmcy5tb3ZlKHsgc291cmNlX3BhdGg6IHNvdXJjZVBhdGgsIGRlc3RpbmF0aW9uX3BhdGg6IGRlc3RpbmF0aW9uUGF0aCB9KSxcbiAgICAgIHdvcmtzcGFjZTogdW5yZWFjaGFibGVCYWNrZW5kLFxuICAgICAgdm9sdW1lczogdW5yZWFjaGFibGVCYWNrZW5kLFxuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4gIC8qIEJhY2tlbmQtc3BlY2lmaWMgSS9PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICAvKipcbiAgICogVUMgYGNyZWF0ZURpcmVjdG9yeWAgaXMgc2luZ2xlLWxldmVsLCBzbyB3YWxrIHRoZSBwYXRoIGNyZWF0aW5nIGVhY2ggbGV2ZWxcbiAgICogYmVsb3cgdGhlIHZvbHVtZSBpdHNlbGYuIEEgbGV2ZWwgdGhhdCBhbHJlYWR5IGV4aXN0cyBpcyBub3QgYW4gZXJyb3IuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNyZWF0ZVZvbHVtZURpcmVjdG9yaWVzKFxuICAgIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICAgIGFic29sdXRlUGF0aDogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJ0cyA9IGFic29sdXRlUGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBjdXJyZW50ID0gXCJcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjdXJyZW50ID0gYCR7Y3VycmVudH0vJHtwYXJ0c1tpXX1gO1xuICAgICAgaWYgKGkgPCBWT0xVTUVfUk9PVF9ERVBUSCkgY29udGludWU7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjbGllbnQuZmlsZXMuY3JlYXRlRGlyZWN0b3J5KHsgZGlyZWN0b3J5X3BhdGg6IGN1cnJlbnQgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gQWxyZWFkeSBwcmVzZW50IGlzIGZpbmU7IGFueXRoaW5nIGVsc2UgaXMgYSByZWFsIGZhaWx1cmUuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgY2xpZW50LmZpbGVzLmdldERpcmVjdG9yeU1ldGFkYXRhKHsgZGlyZWN0b3J5X3BhdGg6IGN1cnJlbnQgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBTdGF0IGEgVUMgcGF0aDogZmlsZSBtZXRhZGF0YSBmaXJzdCwgdGhlbiBhIGRpcmVjdG9yeSBwcm9iZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBzdGF0Vm9sdW1lUGF0aChcbiAgICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgICBhYnNvbHV0ZVBhdGg6IHN0cmluZyxcbiAgICBmYWxsYmFja05hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxPbWl0PEZpbGVTdGF0LCBcInBhdGhcIj4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCBjbGllbnQuZmlsZXMuZ2V0TWV0YWRhdGEoeyBmaWxlX3BhdGg6IGFic29sdXRlUGF0aCB9KTtcbiAgICAgIGNvbnN0IG1vZGlmaWVkID0gdG9EYXRlKG1ldGFkYXRhW1wibGFzdC1tb2RpZmllZFwiXSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBmYWxsYmFja05hbWUsXG4gICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICBzaXplOiBOdW1iZXIobWV0YWRhdGFbXCJjb250ZW50LWxlbmd0aFwiXSA/PyAwKSxcbiAgICAgICAgY3JlYXRlZEF0OiBtb2RpZmllZCxcbiAgICAgICAgbW9kaWZpZWRBdDogbW9kaWZpZWQsXG4gICAgICAgIG1pbWVUeXBlOiBtZXRhZGF0YVtcImNvbnRlbnQtdHlwZVwiXSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZmlsZUVycikge1xuICAgICAgLy8gQSBkaXJlY3RvcnkgaGFzIG5vIGZpbGUgbWV0YWRhdGEsIGFuZCBhbiB1bnJlYWRhYmxlIG9uZSByZXBvcnRzIGFzXG4gICAgICAvLyBtaXNzaW5nIC8gZGVuaWVkIC0gYm90aCBhcmUgd29ydGggYSBkaXJlY3RvcnkgcHJvYmUgYmVmb3JlIGZhaWxpbmcuXG4gICAgICBjb25zdCBjb2RlID0gbWFwRmlsZVN5c3RlbUVycm9yKGZpbGVFcnIsIGFic29sdXRlUGF0aCkuY29kZTtcbiAgICAgIGlmIChjb2RlICE9PSBcIk5PVF9GT1VORFwiICYmIGNvZGUgIT09IFwiUEVSTUlTU0lPTl9ERU5JRURcIikgdGhyb3cgZmlsZUVycjtcbiAgICAgIGF3YWl0IGNsaWVudC5maWxlcy5nZXREaXJlY3RvcnlNZXRhZGF0YSh7IGRpcmVjdG9yeV9wYXRoOiBhYnNvbHV0ZVBhdGggfSk7XG4gICAgICByZXR1cm4geyBuYW1lOiBmYWxsYmFja05hbWUsIHR5cGU6IFwiZGlyZWN0b3J5XCIgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYWREYmZzRmlsZShjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCwgYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGNvbnN0IGNodW5rczogQnVmZmVyW10gPSBbXTtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZGJmcy5yZWFkKHtcbiAgICAgICAgcGF0aDogYWJzb2x1dGVQYXRoLFxuICAgICAgICBvZmZzZXQsXG4gICAgICAgIGxlbmd0aDogREJGU19SRUFEX0NIVU5LX0JZVEVTLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBjaHVuayA9IGRlY29kZUJhc2U2NChyZXNwb25zZS5kYXRhKTtcbiAgICAgIGlmIChjaHVuay5sZW5ndGggPT09IDApIGJyZWFrO1xuICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgb2Zmc2V0ICs9IGNodW5rLmxlbmd0aDtcbiAgICAgIGlmIChjaHVuay5sZW5ndGggPCBEQkZTX1JFQURfQ0hVTktfQllURVMpIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChjaHVua3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZURiZnNGaWxlKFxuICAgIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICAgIGFic29sdXRlUGF0aDogc3RyaW5nLFxuICAgIGJ1ZmZlcjogQnVmZmVyLFxuICAgIG92ZXJ3cml0ZTogYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGJ1ZmZlci5sZW5ndGggPD0gREJGU19QVVRfTUFYX0JZVEVTKSB7XG4gICAgICBhd2FpdCBjbGllbnQuZGJmcy5wdXQoe1xuICAgICAgICBwYXRoOiBhYnNvbHV0ZVBhdGgsXG4gICAgICAgIGNvbnRlbnRzOiBidWZmZXIudG9TdHJpbmcoXCJiYXNlNjRcIiksXG4gICAgICAgIG92ZXJ3cml0ZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgY2xpZW50LmRiZnMuY3JlYXRlKHsgcGF0aDogYWJzb2x1dGVQYXRoLCBvdmVyd3JpdGUgfSk7XG4gICAgY29uc3QgaGFuZGxlID0gY3JlYXRlZC5oYW5kbGU7XG4gICAgaWYgKGhhbmRsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUVycm9yKFwiSU9fRVJST1JcIiwgXCJEQkZTIHVwbG9hZCBoYW5kbGUgbWlzc2luZ1wiLCBhYnNvbHV0ZVBhdGgpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgYnVmZmVyLmxlbmd0aDsgb2Zmc2V0ICs9IERCRlNfUFVUX01BWF9CWVRFUykge1xuICAgICAgICBjb25zdCBzbGljZSA9IGJ1ZmZlci5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIERCRlNfUFVUX01BWF9CWVRFUyk7XG4gICAgICAgIGF3YWl0IGNsaWVudC5kYmZzLmFkZEJsb2NrKHsgaGFuZGxlLCBkYXRhOiBzbGljZS50b1N0cmluZyhcImJhc2U2NFwiKSB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGF3YWl0IGNsaWVudC5kYmZzLmNsb3NlKHsgaGFuZGxlIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIGF3YWl0IGNsaWVudC5kYmZzLmNsb3NlKHsgaGFuZGxlIH0pO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogRHJhaW4gYW4gU0RLIGFzeW5jIGl0ZXJhYmxlIGludG8gYSBtYXBwZWQgYXJyYXkuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0PFMsIFQ+KHNvdXJjZTogQXN5bmNJdGVyYWJsZTxTPiwgbWFwOiAoaXRlbTogUykgPT4gVCk6IFByb21pc2U8VFtdPiB7XG4gIGNvbnN0IGl0ZW1zOiBUW10gPSBbXTtcbiAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIHNvdXJjZSkgaXRlbXMucHVzaChtYXAoaXRlbSkpO1xuICByZXR1cm4gaXRlbXM7XG59XG5cbi8qKiBIYW5kbGVyIGZvciBhIGJhY2tlbmQgYSBjYWxsIHNpdGUgaGFzIGFscmVhZHkgcnVsZWQgb3V0LiAqL1xuZnVuY3Rpb24gdW5yZWFjaGFibGVCYWNrZW5kKCk6IFByb21pc2U8bmV2ZXI+IHtcbiAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FcnJvcihcIk5PVF9TVVBQT1JURURcIiwgXCJVbnN1cHBvcnRlZCBEYXRhYnJpY2tzIGJhY2tlbmQgZm9yIHRoaXMgb3BlcmF0aW9uXCIpO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVCYXNlNjQoZGF0YTogc3RyaW5nIHwgdW5kZWZpbmVkKTogQnVmZmVyIHtcbiAgaWYgKCFkYXRhKSByZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xuICByZXR1cm4gQnVmZmVyLmZyb20oZGF0YSwgXCJiYXNlNjRcIik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRSZXNwb25zZUJvZHkoXG4gIGNvbnRlbnRzOiBnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgaWYgKCFjb250ZW50cykgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgY29uc3QgcmVhZGVyID0gY29udGVudHMuZ2V0UmVhZGVyKCk7XG4gIGNvbnN0IGNodW5rczogVWludDhBcnJheVtdID0gW107XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICBpZiAoZG9uZSkgYnJlYWs7XG4gICAgaWYgKHZhbHVlKSBjaHVua3MucHVzaCh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoY2h1bmtzLm1hcCgoY2h1bmspID0+IEJ1ZmZlci5mcm9tKGNodW5rKSkpO1xufVxuXG5mdW5jdGlvbiBidWZmZXJUb1JlYWRhYmxlU3RyZWFtKGJ1ZmZlcjogQnVmZmVyKTogZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PiB7XG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4oe1xuICAgIHN0YXJ0KGNvbnRyb2xsZXIpIHtcbiAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICB9LFxuICB9KTtcbn1cbiJdfQ==
|
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
*
|
|
11
11
|
* @module
|
|
12
12
|
*/
|
|
13
|
-
import { posixPath } from "@dbx-tools/shared-fs";
|
|
14
13
|
import { type WorkspaceClient } from "./workspace-client.ts";
|
|
15
14
|
/** Which Databricks Files API serves an absolute path. */
|
|
16
15
|
export type DatabricksFilesBackend = "workspace" | "volumes" | "dbfs";
|
|
@@ -29,8 +28,6 @@ export interface ResolveDatabricksRootOptions {
|
|
|
29
28
|
/** Client used to resolve the current username for `~` expansion. */
|
|
30
29
|
client?: WorkspaceClient;
|
|
31
30
|
}
|
|
32
|
-
/** True when {@link input} is `~` or a path under `~/`. See {@link posixPath.isHomeRelativePath}. */
|
|
33
|
-
export declare const isHomeRelativePath: typeof posixPath.isHomeRelativePath;
|
|
34
31
|
/**
|
|
35
32
|
* Expand `~` / `~/...` to `/Workspace/Users/<userName>/...`.
|
|
36
33
|
* Non-home inputs are returned unchanged (POSIX separators only).
|
|
@@ -10,12 +10,10 @@
|
|
|
10
10
|
*
|
|
11
11
|
* @module
|
|
12
12
|
*/
|
|
13
|
-
import {
|
|
13
|
+
import { isHomeRelativePath, toPosix, expandHome, normalizeRoot, isAbsolute, } from "@dbx-tools/shared-fs";
|
|
14
14
|
import { getCurrentUserName } from "./workspace-client.js";
|
|
15
15
|
/** `catalog.schema.volume` (no slashes, exactly three dotted segments). */
|
|
16
16
|
const VOLUME_THREE_PART = /^([^.\/\s]+)\.([^.\/\s]+)\.([^.\/\s]+)$/;
|
|
17
|
-
/** True when {@link input} is `~` or a path under `~/`. See {@link posixPath.isHomeRelativePath}. */
|
|
18
|
-
export const isHomeRelativePath = posixPath.isHomeRelativePath;
|
|
19
17
|
/**
|
|
20
18
|
* Expand `~` / `~/...` to `/Workspace/Users/<userName>/...`.
|
|
21
19
|
* Non-home inputs are returned unchanged (POSIX separators only).
|
|
@@ -26,9 +24,9 @@ export function expandHomePath(input, userName) {
|
|
|
26
24
|
throw new TypeError("Databricks home expansion requires a non-empty userName");
|
|
27
25
|
}
|
|
28
26
|
if (!isHomeRelativePath(input)) {
|
|
29
|
-
return
|
|
27
|
+
return toPosix(input.trim());
|
|
30
28
|
}
|
|
31
|
-
return
|
|
29
|
+
return expandHome(input, `/Workspace/Users/${name}`);
|
|
32
30
|
}
|
|
33
31
|
/**
|
|
34
32
|
* Normalize a Databricks filesystem root to an absolute POSIX path.
|
|
@@ -49,20 +47,20 @@ export function normalizeDatabricksRoot(root, options = {}) {
|
|
|
49
47
|
if (!options.userName?.trim()) {
|
|
50
48
|
throw new TypeError(`Databricks home path "${root}" requires userName; use resolveDatabricksRoot() or pass userName`);
|
|
51
49
|
}
|
|
52
|
-
return
|
|
50
|
+
return normalizeRoot(expandHomePath(trimmed, options.userName));
|
|
53
51
|
}
|
|
54
52
|
const threePart = VOLUME_THREE_PART.exec(trimmed);
|
|
55
53
|
if (threePart) {
|
|
56
|
-
return
|
|
54
|
+
return normalizeRoot(`/Volumes/${threePart[1]}/${threePart[2]}/${threePart[3]}`);
|
|
57
55
|
}
|
|
58
|
-
let posix =
|
|
56
|
+
let posix = toPosix(trimmed);
|
|
59
57
|
if (posix === "/Volume" || posix.startsWith("/Volume/")) {
|
|
60
58
|
posix = `/Volumes${posix.slice("/Volume".length)}`;
|
|
61
59
|
}
|
|
62
|
-
if (!
|
|
60
|
+
if (!isAbsolute(posix)) {
|
|
63
61
|
throw new TypeError(`Databricks filesystem root must be absolute, catalog.schema.volume, or ~, got: ${root}`);
|
|
64
62
|
}
|
|
65
|
-
return
|
|
63
|
+
return normalizeRoot(posix);
|
|
66
64
|
}
|
|
67
65
|
/**
|
|
68
66
|
* Like {@link normalizeDatabricksRoot}, but resolves `~` via
|
|
@@ -77,7 +75,7 @@ export async function resolveDatabricksRoot(root, options = {}) {
|
|
|
77
75
|
}
|
|
78
76
|
/** True when {@link absolutePath} is served by the workspace objects API. */
|
|
79
77
|
export function isWorkspaceFilesPath(absolutePath) {
|
|
80
|
-
const p =
|
|
78
|
+
const p = toPosix(absolutePath);
|
|
81
79
|
return (p === "/Workspace" ||
|
|
82
80
|
p.startsWith("/Workspace/") ||
|
|
83
81
|
p.startsWith("/Users/") ||
|
|
@@ -86,12 +84,12 @@ export function isWorkspaceFilesPath(absolutePath) {
|
|
|
86
84
|
}
|
|
87
85
|
/** True when {@link absolutePath} is a Unity Catalog volume path. */
|
|
88
86
|
export function isVolumesPath(absolutePath) {
|
|
89
|
-
const p =
|
|
87
|
+
const p = toPosix(absolutePath);
|
|
90
88
|
return p === "/Volumes" || p.startsWith("/Volumes/");
|
|
91
89
|
}
|
|
92
90
|
/** True when {@link absolutePath} is a DBFS path. */
|
|
93
91
|
export function isDbfsPath(absolutePath) {
|
|
94
|
-
const p =
|
|
92
|
+
const p = toPosix(absolutePath);
|
|
95
93
|
return p === "/dbfs" || p.startsWith("/dbfs/");
|
|
96
94
|
}
|
|
97
95
|
/**
|
|
@@ -110,4 +108,4 @@ export function resolveDatabricksFilesBackend(absolutePath) {
|
|
|
110
108
|
// Default: UC Files API (covers unusual absolute roots under the workspace host).
|
|
111
109
|
return "volumes";
|
|
112
110
|
}
|
|
113
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJyaWNrcy1wYXRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFicmlja3MtcGF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7R0FXRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsa0JBQWtCLEVBQXdCLE1BQU0sdUJBQXVCLENBQUM7QUFLakYsMkVBQTJFO0FBQzNFLE1BQU0saUJBQWlCLEdBQUcseUNBQXlDLENBQUM7QUFtQnBFLHFHQUFxRztBQUNyRyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUM7QUFFL0Q7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUFhLEVBQUUsUUFBZ0I7SUFDNUQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE1BQU0sSUFBSSxTQUFTLENBQUMseURBQXlELENBQUMsQ0FBQztJQUNqRixDQUFDO0lBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDL0IsT0FBTyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLG9CQUFvQixJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLElBQVksRUFDWixVQUEwQyxFQUFFO0lBRTVDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixNQUFNLElBQUksU0FBUyxDQUFDLDRD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Q0FBQyxRQUFRLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQUMsWUFBb0I7SUFDaEUsSUFBSSxVQUFVLENBQUMsWUFBWSxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDNUMsSUFBSSxvQkFBb0IsQ0FBQyxZQUFZLENBQUM7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUMzRCxJQUFJLGFBQWEsQ0FBQyxZQUFZLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNsRCxrRkFBa0Y7SUFDbEYsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGF0YWJyaWNrcyBwYXRoIHJlY29nbml0aW9uIGFuZCBub3JtYWxpemF0aW9uIGZvciB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW19LlxuICpcbiAqIFJvb3RzIG1heSBiZSB3cml0dGVuIGFzOlxuICogLSBVbml0eSBDYXRhbG9nIHZvbHVtZTogYC9Wb2x1bWVzL2NhdGFsb2cvc2NoZW1hL3ZvbHVtZWAgKGFsc28gYWNjZXB0cyBgL1ZvbHVtZS8uLi5gKVxuICogLSBUaHJlZS1wYXJ0IHZvbHVtZSBpZDogYGNhdGFsb2cuc2NoZW1hLnZvbHVtZWAg4oaSIGAvVm9sdW1lcy9jYXRhbG9nL3NjaGVtYS92b2x1bWVgXG4gKiAtIEhvbWUgc2hvcnRoYW5kOiBgfmAgLyBgfi8uLi5gIOKGkiBgL1dvcmtzcGFjZS9Vc2Vycy88dXNlck5hbWU+Ly4uLmBcbiAqIC0gV29ya3NwYWNlIHRyZWU6IGAvV29ya3NwYWNlLy4uLmAsIGAvVXNlcnMvLi4uYCwgYC9SZXBvcy8uLi5gLCBgL1NoYXJlZC8uLi5gXG4gKiAtIERCRlM6IGAvZGJmcy8uLi5gXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHBvc2l4UGF0aCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1mc1wiO1xuaW1wb3J0IHsgZ2V0Q3VycmVudFVzZXJOYW1lLCB0eXBlIFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCIuL3dvcmtzcGFjZS1jbGllbnQudHNcIjtcblxuLyoqIFdoaWNoIERhdGFicmlja3MgRmlsZXMgQVBJIHNlcnZlcyBhbiBhYnNvbHV0ZSBwYXRoLiAqL1xuZXhwb3J0IHR5cGUgRGF0YWJyaWNrc0ZpbGVzQmFja2VuZCA9IFwid29ya3NwYWNlXCIgfCBcInZvbHVtZXNcIiB8IFwiZGJmc1wiO1xuXG4vKiogYGNhdGFsb2cuc2NoZW1hLnZvbHVtZWAgKG5vIHNsYXNoZXMsIGV4YWN0bHkgdGhyZWUgZG90dGVkIHNlZ21lbnRzKS4gKi9cbmNvbnN0IFZPTFVNRV9USFJFRV9QQVJUID0gL14oW14uXFwvXFxzXSspXFwuKFteLlxcL1xcc10rKVxcLihbXi5cXC9cXHNdKykkLztcblxuLyoqIE9wdGlvbnMgZm9yIHN5bmNocm9ub3VzIHtAbGluayBub3JtYWxpemVEYXRhYnJpY2tzUm9vdH0uICovXG5leHBvcnQgaW50ZXJmYWNlIE5vcm1hbGl6ZURhdGFicmlja3NSb290T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBVc2VybmFtZSB1c2VkIHRvIGV4cGFuZCBgfmAg4oaSIGAvV29ya3NwYWNlL1VzZXJzLzx1c2VyTmFtZT5gLlxuICAgKiBSZXF1aXJlZCB3aGVuIHtAbGluayByb290fSBpcyBgfmAgb3IgYH4vLi4uYC4gUHJlZmVyXG4gICAqIHtAbGluayByZXNvbHZlRGF0YWJyaWNrc1Jvb3R9IHdoZW4gdGhlIG5hbWUgc2hvdWxkIGNvbWUgZnJvbSB0aGUgd29ya3NwYWNlXG4gICAqIGNsaWVudC5cbiAgICovXG4gIHVzZXJOYW1lPzogc3RyaW5nO1xufVxuXG4vKiogT3B0aW9ucyBmb3IgYXN5bmMge0BsaW5rIHJlc29sdmVEYXRhYnJpY2tzUm9vdH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVEYXRhYnJpY2tzUm9vdE9wdGlvbnMge1xuICAvKiogQ2xpZW50IHVzZWQgdG8gcmVzb2x2ZSB0aGUgY3VycmVudCB1c2VybmFtZSBmb3IgYH5gIGV4cGFuc2lvbi4gKi9cbiAgY2xpZW50PzogV29ya3NwYWNlQ2xpZW50O1xufVxuXG4vKiogVHJ1ZSB3aGVuIHtAbGluayBpbnB1dH0gaXMgYH5gIG9yIGEgcGF0aCB1bmRlciBgfi9gLiBTZWUge0BsaW5rIHBvc2l4UGF0aC5pc0hvbWVSZWxhdGl2ZVBhdGh9LiAqL1xuZXhwb3J0IGNvbnN0IGlzSG9tZVJlbGF0aXZlUGF0aCA9IHBvc2l4UGF0aC5pc0hvbWVSZWxhdGl2ZVBhdGg7XG5cbi8qKlxuICogRXhwYW5kIGB+YCAvIGB+Ly4uLmAgdG8gYC9Xb3Jrc3BhY2UvVXNlcnMvPHVzZXJOYW1lPi8uLi5gLlxuICogTm9uLWhvbWUgaW5wdXRzIGFyZSByZXR1cm5lZCB1bmNoYW5nZWQgKFBPU0lYIHNlcGFyYXRvcnMgb25seSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBhbmRIb21lUGF0aChpbnB1dDogc3RyaW5nLCB1c2VyTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbmFtZSA9IHVzZXJOYW1lLnRyaW0oKTtcbiAgaWYgKCFuYW1lKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRhdGFicmlja3MgaG9tZSBleHBhbnNpb24gcmVxdWlyZXMgYSBub24tZW1wdHkgdXNlck5hbWVcIik7XG4gIH1cbiAgaWYgKCFpc0hvbWVSZWxhdGl2ZVBhdGgoaW5wdXQpKSB7XG4gICAgcmV0dXJuIHBvc2l4UGF0aC50b1Bvc2l4KGlucHV0LnRyaW0oKSk7XG4gIH1cbiAgcmV0dXJuIHBvc2l4UGF0aC5leHBhbmRIb21lKGlucHV0LCBgL1dvcmtzcGFjZS9Vc2Vycy8ke25hbWV9YCk7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGEgRGF0YWJyaWNrcyBmaWxlc3lzdGVtIHJvb3QgdG8gYW4gYWJzb2x1dGUgUE9TSVggcGF0aC5cbiAqXG4gKiAtIGBjYXRhbG9nLnNjaGVtYS52b2x1bWVgIOKGkiBgL1ZvbHVtZXMvY2F0YWxvZy9zY2hlbWEvdm9sdW1lYFxuICogLSBgL1ZvbHVtZS8uLi5gIOKGkiBgL1ZvbHVtZXMvLi4uYCAoc2luZ3VsYXIgdHlwbyAvIHNob3J0aGFuZClcbiAqIC0gYH5gIC8gYH4vLi4uYCDihpIgYC9Xb3Jrc3BhY2UvVXNlcnMvPHVzZXJOYW1lPi8uLi5gIChuZWVkcyB7QGxpbmsgTm9ybWFsaXplRGF0YWJyaWNrc1Jvb3RPcHRpb25zLnVzZXJOYW1lfSlcbiAqIC0gc3RyaXBzIHRyYWlsaW5nIHNsYXNoZXMgKGV4Y2VwdCBgL2ApXG4gKlxuICogRm9yIGB+YCB3aXRob3V0IGEga25vd24gdXNlcm5hbWUsIHVzZSB7QGxpbmsgcmVzb2x2ZURhdGFicmlja3NSb290fS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZURhdGFicmlja3NSb290KFxuICByb290OiBzdHJpbmcsXG4gIG9wdGlvbnM6IE5vcm1hbGl6ZURhdGFicmlja3NSb290T3B0aW9ucyA9IHt9LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbW1lZCA9IHJvb3QudHJpbSgpO1xuICBpZiAoIXRyaW1tZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGF0YWJyaWNrcyBmaWxlc3lzdGVtIHJvb3QgY2Fubm90IGJlIGVtcHR5XCIpO1xuICB9XG5cbiAgaWYgKGlzSG9tZVJlbGF0aXZlUGF0aCh0cmltbWVkKSkge1xuICAgIGlmICghb3B0aW9ucy51c2VyTmFtZT8udHJpbSgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgRGF0YWJyaWNrcyBob21lIHBhdGggXCIke3Jvb3R9XCIgcmVxdWlyZXMgdXNlck5hbWU7IHVzZSByZXNvbHZlRGF0YWJyaWNrc1Jvb3QoKSBvciBwYXNzIHVzZXJOYW1lYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBwb3NpeFBhdGgubm9ybWFsaXplUm9vdChleHBhbmRIb21lUGF0aCh0cmltbWVkLCBvcHRpb25zLnVzZXJOYW1lKSk7XG4gIH1cblxuICBjb25zdCB0aHJlZVBhcnQgPSBWT0xVTUVfVEhSRUVfUEFSVC5leGVjKHRyaW1tZWQpO1xuICBpZiAodGhyZWVQYXJ0KSB7XG4gICAgcmV0dXJuIHBvc2l4UGF0aC5ub3JtYWxpemVSb290KGAvVm9sdW1lcy8ke3RocmVlUGFydFsxXX0vJHt0aHJlZVBhcnRbMl19LyR7dGhyZWVQYXJ0WzNdfWApO1xuICB9XG5cbiAgbGV0IHBvc2l4ID0gcG9zaXhQYXRoLnRvUG9zaXgodHJpbW1lZCk7XG4gIGlmIChwb3NpeCA9PT0gXCIvVm9sdW1lXCIgfHwgcG9zaXguc3RhcnRzV2l0aChcIi9Wb2x1bWUvXCIpKSB7XG4gICAgcG9zaXggPSBgL1ZvbHVtZXMke3Bvc2l4LnNsaWNlKFwiL1ZvbHVtZVwiLmxlbmd0aCl9YDtcbiAgfVxuXG4gIGlmICghcG9zaXhQYXRoLmlzQWJzb2x1dGUocG9zaXgpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIGBEYXRhYnJpY2tzIGZpbGVzeXN0ZW0gcm9vdCBtdXN0IGJlIGFic29sdXRlLCBjYXRhbG9nLnNjaGVtYS52b2x1bWUsIG9yIH4sIGdvdDogJHtyb290fWAsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBwb3NpeFBhdGgubm9ybWFsaXplUm9vdChwb3NpeCk7XG59XG5cbi8qKlxuICogTGlrZSB7QGxpbmsgbm9ybWFsaXplRGF0YWJyaWNrc1Jvb3R9LCBidXQgcmVzb2x2ZXMgYH5gIHZpYVxuICoge0BsaW5rIGdldEN1cnJlbnRVc2VyTmFtZX0gKEFwcEtpdCBjb250ZXh0IHVzZXIsIGVsc2UgYGN1cnJlbnRVc2VyLm1lKClgKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVEYXRhYnJpY2tzUm9vdChcbiAgcm9vdDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlRGF0YWJyaWNrc1Jvb3RPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoIWlzSG9tZVJlbGF0aXZlUGF0aChyb290KSkge1xuICAgIHJldHVybiBub3JtYWxpemVEYXRhYnJpY2tzUm9vdChyb290KTtcbiAgfVxuICBjb25zdCB1c2VyTmFtZSA9IGF3YWl0IGdldEN1cnJlbnRVc2VyTmFtZShvcHRpb25zLmNsaWVudCk7XG4gIHJldHVybiBub3JtYWxpemVEYXRhYnJpY2tzUm9vdChyb290LCB7IHVzZXJOYW1lIH0pO1xufVxuXG4vKiogVHJ1ZSB3aGVuIHtAbGluayBhYnNvbHV0ZVBhdGh9IGlzIHNlcnZlZCBieSB0aGUgd29ya3NwYWNlIG9iamVjdHMgQVBJLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV29ya3NwYWNlRmlsZXNQYXRoKGFic29sdXRlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHAgPSBwb3NpeFBhdGgudG9Qb3NpeChhYnNvbHV0ZVBhdGgpO1xuICByZXR1cm4gKFxuICAgIHAgPT09IFwiL1dvcmtzcGFjZVwiIHx8XG4gICAgcC5zdGFydHNXaXRoKFwiL1dvcmtzcGFjZS9cIikgfHxcbiAgICBwLnN0YXJ0c1dpdGgoXCIvVXNlcnMvXCIpIHx8XG4gICAgcC5zdGFydHNXaXRoKFwiL1JlcG9zL1wiKSB8fFxuICAgIHAuc3RhcnRzV2l0aChcIi9TaGFyZWQvXCIpXG4gICk7XG59XG5cbi8qKiBUcnVlIHdoZW4ge0BsaW5rIGFic29sdXRlUGF0aH0gaXMgYSBVbml0eSBDYXRhbG9nIHZvbHVtZSBwYXRoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVm9sdW1lc1BhdGgoYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcCA9IHBvc2l4UGF0aC50b1Bvc2l4KGFic29sdXRlUGF0aCk7XG4gIHJldHVybiBwID09PSBcIi9Wb2x1bWVzXCIgfHwgcC5zdGFydHNXaXRoKFwiL1ZvbHVtZXMvXCIpO1xufVxuXG4vKiogVHJ1ZSB3aGVuIHtAbGluayBhYnNvbHV0ZVBhdGh9IGlzIGEgREJGUyBwYXRoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGJmc1BhdGgoYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcCA9IHBvc2l4UGF0aC50b1Bvc2l4KGFic29sdXRlUGF0aCk7XG4gIHJldHVybiBwID09PSBcIi9kYmZzXCIgfHwgcC5zdGFydHNXaXRoKFwiL2RiZnMvXCIpO1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIERhdGFicmlja3MgQVBJIGJhY2tlbmQgZm9yIGFuIGFic29sdXRlIHBhdGguXG4gKlxuICogVm9sdW1lIHRocmVlLXBhcnQgcm9vdHMgYXJlIG5vcm1hbGl6ZWQgYmVmb3JlIHRoaXMgcnVucywgc28gY2FsbGVycyBzaG91bGRcbiAqIHBhc3MgcGF0aHMgZnJvbSB7QGxpbmsgbm9ybWFsaXplRGF0YWJyaWNrc1Jvb3R9IC8ge0BsaW5rIEJhc2VGaWxlU3lzdGVtLnJlc29sdmVQYXRofS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEYXRhYnJpY2tzRmlsZXNCYWNrZW5kKGFic29sdXRlUGF0aDogc3RyaW5nKTogRGF0YWJyaWNrc0ZpbGVzQmFja2VuZCB7XG4gIGlmIChpc0RiZnNQYXRoKGFic29sdXRlUGF0aCkpIHJldHVybiBcImRiZnNcIjtcbiAgaWYgKGlzV29ya3NwYWNlRmlsZXNQYXRoKGFic29sdXRlUGF0aCkpIHJldHVybiBcIndvcmtzcGFjZVwiO1xuICBpZiAoaXNWb2x1bWVzUGF0aChhYnNvbHV0ZVBhdGgpKSByZXR1cm4gXCJ2b2x1bWVzXCI7XG4gIC8vIERlZmF1bHQ6IFVDIEZpbGVzIEFQSSAoY292ZXJzIHVudXN1YWwgYWJzb2x1dGUgcm9vdHMgdW5kZXIgdGhlIHdvcmtzcGFjZSBob3N0KS5cbiAgcmV0dXJuIFwidm9sdW1lc1wiO1xufVxuIl19
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJyaWNrcy1wYXRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFicmlja3MtcGF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7R0FXRztBQUVILE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsT0FBTyxFQUNQLFVBQVUsRUFDVixhQUFhLEVBQ2IsVUFBVSxHQUNYLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGtCQUFrQixFQUF3QixNQUFNLHVCQUF1QixDQUFDO0FBS2pGLDJFQUEyRTtBQUMzRSxNQUFNLGlCQUFpQixHQUFHLHlDQUF5QyxDQUFDO0FBbUJwRTs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQWEsRUFBRSxRQUFnQjtJQUM1RCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDN0IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFJLFNBQVMsQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFDRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMvQixPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUMsS0FBSyxFQUFFLG9CQUFvQixJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZELENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLElBQVksRUFDWixVQUEwQyxFQUFFO0lBRTVDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixNQUFNLElBQUksU0FBUyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELElBQUksa0JBQWtCLENB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QUFDO0lBQzVDLElBQUksb0JBQW9CLENBQUMsWUFBWSxDQUFDO1FBQUUsT0FBTyxXQUFXLENBQUM7SUFDM0QsSUFBSSxhQUFhLENBQUMsWUFBWSxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDbEQsa0ZBQWtGO0lBQ2xGLE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERhdGFicmlja3MgcGF0aCByZWNvZ25pdGlvbiBhbmQgbm9ybWFsaXphdGlvbiBmb3Ige0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtfS5cbiAqXG4gKiBSb290cyBtYXkgYmUgd3JpdHRlbiBhczpcbiAqIC0gVW5pdHkgQ2F0YWxvZyB2b2x1bWU6IGAvVm9sdW1lcy9jYXRhbG9nL3NjaGVtYS92b2x1bWVgIChhbHNvIGFjY2VwdHMgYC9Wb2x1bWUvLi4uYClcbiAqIC0gVGhyZWUtcGFydCB2b2x1bWUgaWQ6IGBjYXRhbG9nLnNjaGVtYS52b2x1bWVgIOKGkiBgL1ZvbHVtZXMvY2F0YWxvZy9zY2hlbWEvdm9sdW1lYFxuICogLSBIb21lIHNob3J0aGFuZDogYH5gIC8gYH4vLi4uYCDihpIgYC9Xb3Jrc3BhY2UvVXNlcnMvPHVzZXJOYW1lPi8uLi5gXG4gKiAtIFdvcmtzcGFjZSB0cmVlOiBgL1dvcmtzcGFjZS8uLi5gLCBgL1VzZXJzLy4uLmAsIGAvUmVwb3MvLi4uYCwgYC9TaGFyZWQvLi4uYFxuICogLSBEQkZTOiBgL2RiZnMvLi4uYFxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBpc0hvbWVSZWxhdGl2ZVBhdGgsXG4gIHRvUG9zaXgsXG4gIGV4cGFuZEhvbWUsXG4gIG5vcm1hbGl6ZVJvb3QsXG4gIGlzQWJzb2x1dGUsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1mc1wiO1xuaW1wb3J0IHsgZ2V0Q3VycmVudFVzZXJOYW1lLCB0eXBlIFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCIuL3dvcmtzcGFjZS1jbGllbnQudHNcIjtcblxuLyoqIFdoaWNoIERhdGFicmlja3MgRmlsZXMgQVBJIHNlcnZlcyBhbiBhYnNvbHV0ZSBwYXRoLiAqL1xuZXhwb3J0IHR5cGUgRGF0YWJyaWNrc0ZpbGVzQmFja2VuZCA9IFwid29ya3NwYWNlXCIgfCBcInZvbHVtZXNcIiB8IFwiZGJmc1wiO1xuXG4vKiogYGNhdGFsb2cuc2NoZW1hLnZvbHVtZWAgKG5vIHNsYXNoZXMsIGV4YWN0bHkgdGhyZWUgZG90dGVkIHNlZ21lbnRzKS4gKi9cbmNvbnN0IFZPTFVNRV9USFJFRV9QQVJUID0gL14oW14uXFwvXFxzXSspXFwuKFteLlxcL1xcc10rKVxcLihbXi5cXC9cXHNdKykkLztcblxuLyoqIE9wdGlvbnMgZm9yIHN5bmNocm9ub3VzIHtAbGluayBub3JtYWxpemVEYXRhYnJpY2tzUm9vdH0uICovXG5leHBvcnQgaW50ZXJmYWNlIE5vcm1hbGl6ZURhdGFicmlja3NSb290T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBVc2VybmFtZSB1c2VkIHRvIGV4cGFuZCBgfmAg4oaSIGAvV29ya3NwYWNlL1VzZXJzLzx1c2VyTmFtZT5gLlxuICAgKiBSZXF1aXJlZCB3aGVuIHtAbGluayByb290fSBpcyBgfmAgb3IgYH4vLi4uYC4gUHJlZmVyXG4gICAqIHtAbGluayByZXNvbHZlRGF0YWJyaWNrc1Jvb3R9IHdoZW4gdGhlIG5hbWUgc2hvdWxkIGNvbWUgZnJvbSB0aGUgd29ya3NwYWNlXG4gICAqIGNsaWVudC5cbiAgICovXG4gIHVzZXJOYW1lPzogc3RyaW5nO1xufVxuXG4vKiogT3B0aW9ucyBmb3IgYXN5bmMge0BsaW5rIHJlc29sdmVEYXRhYnJpY2tzUm9vdH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVEYXRhYnJpY2tzUm9vdE9wdGlvbnMge1xuICAvKiogQ2xpZW50IHVzZWQgdG8gcmVzb2x2ZSB0aGUgY3VycmVudCB1c2VybmFtZSBmb3IgYH5gIGV4cGFuc2lvbi4gKi9cbiAgY2xpZW50PzogV29ya3NwYWNlQ2xpZW50O1xufVxuXG4vKipcbiAqIEV4cGFuZCBgfmAgLyBgfi8uLi5gIHRvIGAvV29ya3NwYWNlL1VzZXJzLzx1c2VyTmFtZT4vLi4uYC5cbiAqIE5vbi1ob21lIGlucHV0cyBhcmUgcmV0dXJuZWQgdW5jaGFuZ2VkIChQT1NJWCBzZXBhcmF0b3JzIG9ubHkpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kSG9tZVBhdGgoaW5wdXQ6IHN0cmluZywgdXNlck5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG5hbWUgPSB1c2VyTmFtZS50cmltKCk7XG4gIGlmICghbmFtZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJEYXRhYnJpY2tzIGhvbWUgZXhwYW5zaW9uIHJlcXVpcmVzIGEgbm9uLWVtcHR5IHVzZXJOYW1lXCIpO1xuICB9XG4gIGlmICghaXNIb21lUmVsYXRpdmVQYXRoKGlucHV0KSkge1xuICAgIHJldHVybiB0b1Bvc2l4KGlucHV0LnRyaW0oKSk7XG4gIH1cbiAgcmV0dXJuIGV4cGFuZEhvbWUoaW5wdXQsIGAvV29ya3NwYWNlL1VzZXJzLyR7bmFtZX1gKTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgYSBEYXRhYnJpY2tzIGZpbGVzeXN0ZW0gcm9vdCB0byBhbiBhYnNvbHV0ZSBQT1NJWCBwYXRoLlxuICpcbiAqIC0gYGNhdGFsb2cuc2NoZW1hLnZvbHVtZWAg4oaSIGAvVm9sdW1lcy9jYXRhbG9nL3NjaGVtYS92b2x1bWVgXG4gKiAtIGAvVm9sdW1lLy4uLmAg4oaSIGAvVm9sdW1lcy8uLi5gIChzaW5ndWxhciB0eXBvIC8gc2hvcnRoYW5kKVxuICogLSBgfmAgLyBgfi8uLi5gIOKGkiBgL1dvcmtzcGFjZS9Vc2Vycy88dXNlck5hbWU+Ly4uLmAgKG5lZWRzIHtAbGluayBOb3JtYWxpemVEYXRhYnJpY2tzUm9vdE9wdGlvbnMudXNlck5hbWV9KVxuICogLSBzdHJpcHMgdHJhaWxpbmcgc2xhc2hlcyAoZXhjZXB0IGAvYClcbiAqXG4gKiBGb3IgYH5gIHdpdGhvdXQgYSBrbm93biB1c2VybmFtZSwgdXNlIHtAbGluayByZXNvbHZlRGF0YWJyaWNrc1Jvb3R9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRGF0YWJyaWNrc1Jvb3QoXG4gIHJvb3Q6IHN0cmluZyxcbiAgb3B0aW9uczogTm9ybWFsaXplRGF0YWJyaWNrc1Jvb3RPcHRpb25zID0ge30sXG4pOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkID0gcm9vdC50cmltKCk7XG4gIGlmICghdHJpbW1lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJEYXRhYnJpY2tzIGZpbGVzeXN0ZW0gcm9vdCBjYW5ub3QgYmUgZW1wdHlcIik7XG4gIH1cblxuICBpZiAoaXNIb21lUmVsYXRpdmVQYXRoKHRyaW1tZWQpKSB7XG4gICAgaWYgKCFvcHRpb25zLnVzZXJOYW1lPy50cmltKCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGBEYXRhYnJpY2tzIGhvbWUgcGF0aCBcIiR7cm9vdH1cIiByZXF1aXJlcyB1c2VyTmFtZTsgdXNlIHJlc29sdmVEYXRhYnJpY2tzUm9vdCgpIG9yIHBhc3MgdXNlck5hbWVgLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVJvb3QoZXhwYW5kSG9tZVBhdGgodHJpbW1lZCwgb3B0aW9ucy51c2VyTmFtZSkpO1xuICB9XG5cbiAgY29uc3QgdGhyZWVQYXJ0ID0gVk9MVU1FX1RIUkVFX1BBUlQuZXhlYyh0cmltbWVkKTtcbiAgaWYgKHRocmVlUGFydCkge1xuICAgIHJldHVybiBub3JtYWxpemVSb290KGAvVm9sdW1lcy8ke3RocmVlUGFydFsxXX0vJHt0aHJlZVBhcnRbMl19LyR7dGhyZWVQYXJ0WzNdfWApO1xuICB9XG5cbiAgbGV0IHBvc2l4ID0gdG9Qb3NpeCh0cmltbWVkKTtcbiAgaWYgKHBvc2l4ID09PSBcIi9Wb2x1bWVcIiB8fCBwb3NpeC5zdGFydHNXaXRoKFwiL1ZvbHVtZS9cIikpIHtcbiAgICBwb3NpeCA9IGAvVm9sdW1lcyR7cG9zaXguc2xpY2UoXCIvVm9sdW1lXCIubGVuZ3RoKX1gO1xuICB9XG5cbiAgaWYgKCFpc0Fic29sdXRlKHBvc2l4KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBgRGF0YWJyaWNrcyBmaWxlc3lzdGVtIHJvb3QgbXVzdCBiZSBhYnNvbHV0ZSwgY2F0YWxvZy5zY2hlbWEudm9sdW1lLCBvciB+LCBnb3Q6ICR7cm9vdH1gLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplUm9vdChwb3NpeCk7XG59XG5cbi8qKlxuICogTGlrZSB7QGxpbmsgbm9ybWFsaXplRGF0YWJyaWNrc1Jvb3R9LCBidXQgcmVzb2x2ZXMgYH5gIHZpYVxuICoge0BsaW5rIGdldEN1cnJlbnRVc2VyTmFtZX0gKEFwcEtpdCBjb250ZXh0IHVzZXIsIGVsc2UgYGN1cnJlbnRVc2VyLm1lKClgKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVEYXRhYnJpY2tzUm9vdChcbiAgcm9vdDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlRGF0YWJyaWNrc1Jvb3RPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoIWlzSG9tZVJlbGF0aXZlUGF0aChyb290KSkge1xuICAgIHJldHVybiBub3JtYWxpemVEYXRhYnJpY2tzUm9vdChyb290KTtcbiAgfVxuICBjb25zdCB1c2VyTmFtZSA9IGF3YWl0IGdldEN1cnJlbnRVc2VyTmFtZShvcHRpb25zLmNsaWVudCk7XG4gIHJldHVybiBub3JtYWxpemVEYXRhYnJpY2tzUm9vdChyb290LCB7IHVzZXJOYW1lIH0pO1xufVxuXG4vKiogVHJ1ZSB3aGVuIHtAbGluayBhYnNvbHV0ZVBhdGh9IGlzIHNlcnZlZCBieSB0aGUgd29ya3NwYWNlIG9iamVjdHMgQVBJLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV29ya3NwYWNlRmlsZXNQYXRoKGFic29sdXRlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHAgPSB0b1Bvc2l4KGFic29sdXRlUGF0aCk7XG4gIHJldHVybiAoXG4gICAgcCA9PT0gXCIvV29ya3NwYWNlXCIgfHxcbiAgICBwLnN0YXJ0c1dpdGgoXCIvV29ya3NwYWNlL1wiKSB8fFxuICAgIHAuc3RhcnRzV2l0aChcIi9Vc2Vycy9cIikgfHxcbiAgICBwLnN0YXJ0c1dpdGgoXCIvUmVwb3MvXCIpIHx8XG4gICAgcC5zdGFydHNXaXRoKFwiL1NoYXJlZC9cIilcbiAgKTtcbn1cblxuLyoqIFRydWUgd2hlbiB7QGxpbmsgYWJzb2x1dGVQYXRofSBpcyBhIFVuaXR5IENhdGFsb2cgdm9sdW1lIHBhdGguICovXG5leHBvcnQgZnVuY3Rpb24gaXNWb2x1bWVzUGF0aChhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwID0gdG9Qb3NpeChhYnNvbHV0ZVBhdGgpO1xuICByZXR1cm4gcCA9PT0gXCIvVm9sdW1lc1wiIHx8IHAuc3RhcnRzV2l0aChcIi9Wb2x1bWVzL1wiKTtcbn1cblxuLyoqIFRydWUgd2hlbiB7QGxpbmsgYWJzb2x1dGVQYXRofSBpcyBhIERCRlMgcGF0aC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RiZnNQYXRoKGFic29sdXRlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHAgPSB0b1Bvc2l4KGFic29sdXRlUGF0aCk7XG4gIHJldHVybiBwID09PSBcIi9kYmZzXCIgfHwgcC5zdGFydHNXaXRoKFwiL2RiZnMvXCIpO1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIERhdGFicmlja3MgQVBJIGJhY2tlbmQgZm9yIGFuIGFic29sdXRlIHBhdGguXG4gKlxuICogVm9sdW1lIHRocmVlLXBhcnQgcm9vdHMgYXJlIG5vcm1hbGl6ZWQgYmVmb3JlIHRoaXMgcnVucywgc28gY2FsbGVycyBzaG91bGRcbiAqIHBhc3MgcGF0aHMgZnJvbSB7QGxpbmsgbm9ybWFsaXplRGF0YWJyaWNrc1Jvb3R9IC8ge0BsaW5rIEJhc2VGaWxlU3lzdGVtLnJlc29sdmVQYXRofS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEYXRhYnJpY2tzRmlsZXNCYWNrZW5kKGFic29sdXRlUGF0aDogc3RyaW5nKTogRGF0YWJyaWNrc0ZpbGVzQmFja2VuZCB7XG4gIGlmIChpc0RiZnNQYXRoKGFic29sdXRlUGF0aCkpIHJldHVybiBcImRiZnNcIjtcbiAgaWYgKGlzV29ya3NwYWNlRmlsZXNQYXRoKGFic29sdXRlUGF0aCkpIHJldHVybiBcIndvcmtzcGFjZVwiO1xuICBpZiAoaXNWb2x1bWVzUGF0aChhYnNvbHV0ZVBhdGgpKSByZXR1cm4gXCJ2b2x1bWVzXCI7XG4gIC8vIERlZmF1bHQ6IFVDIEZpbGVzIEFQSSAoY292ZXJzIHVudXN1YWwgYWJzb2x1dGUgcm9vdHMgdW5kZXIgdGhlIHdvcmtzcGFjZSBob3N0KS5cbiAgcmV0dXJuIFwidm9sdW1lc1wiO1xufVxuIl19
|
package/lib/src/net.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
9
|
-
import {
|
|
9
|
+
import { type UrlLike } from "@dbx-tools/shared-core";
|
|
10
10
|
/**
|
|
11
11
|
* This process's outbound public IP, cached for 5 minutes. Asks Cloudflare's
|
|
12
12
|
* `cdn-cgi/trace` first and falls back to ipify. Useful for allowlisting or for
|
|
@@ -26,4 +26,4 @@ export declare const getPublicIp: () => Promise<string>;
|
|
|
26
26
|
* platform resolver order are honored, matching what an outbound connection to
|
|
27
27
|
* the host would actually use.
|
|
28
28
|
*/
|
|
29
|
-
export declare function resolveHostIps(input:
|
|
29
|
+
export declare function resolveHostIps(input: UrlLike): Promise<string[]>;
|
package/lib/src/net.js
CHANGED
|
@@ -7,13 +7,13 @@
|
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
9
9
|
import { lookup } from "node:dns/promises";
|
|
10
|
-
import {
|
|
10
|
+
import { memoize, createFetchError, urlBuilder, parseIp, } from "@dbx-tools/shared-core";
|
|
11
11
|
/**
|
|
12
12
|
* This process's outbound public IP, cached for 5 minutes. Asks Cloudflare's
|
|
13
13
|
* `cdn-cgi/trace` first and falls back to ipify. Useful for allowlisting or for
|
|
14
14
|
* reasoning about egress from a Databricks App.
|
|
15
15
|
*/
|
|
16
|
-
export const getPublicIp =
|
|
16
|
+
export const getPublicIp = memoize(async () => {
|
|
17
17
|
const cloudflareResponse = await fetch("https://cloudflare.com/cdn-cgi/trace");
|
|
18
18
|
if (cloudflareResponse.ok) {
|
|
19
19
|
const trace = await cloudflareResponse.text();
|
|
@@ -28,7 +28,7 @@ export const getPublicIp = functionUtils.memoize(async () => {
|
|
|
28
28
|
}
|
|
29
29
|
const ipifyResponse = await fetch("https://api.ipify.org?format=json");
|
|
30
30
|
if (!ipifyResponse.ok) {
|
|
31
|
-
throw await
|
|
31
|
+
throw await createFetchError(ipifyResponse);
|
|
32
32
|
}
|
|
33
33
|
const ipifyData = (await ipifyResponse.json());
|
|
34
34
|
const ip = ipifyData?.ip;
|
|
@@ -50,11 +50,11 @@ export const getPublicIp = functionUtils.memoize(async () => {
|
|
|
50
50
|
* the host would actually use.
|
|
51
51
|
*/
|
|
52
52
|
export async function resolveHostIps(input) {
|
|
53
|
-
const host =
|
|
53
|
+
const host = urlBuilder(input)?.hostname;
|
|
54
54
|
if (!host)
|
|
55
55
|
return [];
|
|
56
56
|
// WHATWG `URL.hostname` brackets IPv6 literals; strip before parsing.
|
|
57
|
-
const literal =
|
|
57
|
+
const literal = parseIp(host.replace(/^\[|\]$/g, ""));
|
|
58
58
|
if (literal)
|
|
59
59
|
return [host.replace(/^\[|\]$/g, "")];
|
|
60
60
|
try {
|
|
@@ -65,4 +65,4 @@ export async function resolveHostIps(input) {
|
|
|
65
65
|
return [];
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25ldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNDLE9BQU8sRUFDTCxPQUFPLEVBQ1AsZ0JBQWdCLEVBRWhCLFVBQVUsRUFDVixPQUFPLEdBQ1IsTUFBTSx3QkFBd0IsQ0FBQztBQUVoQzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FDaEMsS0FBSyxJQUFJLEVBQUU7SUFDVCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDL0UsSUFBSSxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMxQixNQUFNLEtBQUssR0FBRyxNQUFNLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQzlDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNwQixNQUFNLEVBQUUsR0FBRyxLQUFLO2FBQ2IsS0FBSyxDQUFDLElBQUksQ0FBQzthQUNYLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQzFCLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEIsSUFBSSxFQUFFO1lBQUUsT0FBTyxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUNELE1BQU0sYUFBYSxHQUFHLE1BQU0sS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7SUFDdkUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN0QixNQUFNLE1BQU0sZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBTSxhQUFhLENBQUMsSUFBSSxFQUFFLENBQW9CLENBQUM7SUFDbEUsTUFBTSxFQUFFLEdBQUcsU0FBUyxFQUFFLEVBQUUsQ0FBQztJQUN6QixJQUFJLEVBQUU7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7QUFDbkQsQ0FBQyxFQUNELEVBQUUsS0FBSyxFQUFFLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQ3pCLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWMsQ0FBQyxLQUFjO0lBQ2pELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxRQUFRLENBQUM7SUFDekMsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNyQixzRUFBc0U7SUFDdEUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEQsSUFBSSxPQUFPO1FBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbEQsT0FBTyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2VydmVyLXNpZGUgbmV0d29ya2luZyBoZWxwZXJzIHRoYXQgbmVlZCBOb2RlIGJ1aWx0aW5zLCBsYXllcmVkIG92ZXIgdGhlXG4gKiBicm93c2VyLXNhZmUgVVJMIC8gSVAgdG9vbGtpdCBpbiBgQGRieC10b29scy9zaGFyZWQtY29yZWAncyBgbmV0YCBtb2R1bGU6IEROU1xuICogcmVzb2x1dGlvbiAoe0BsaW5rIHJlc29sdmVIb3N0SXBzfSwgYG5vZGU6ZG5zYCkgYW5kIHB1YmxpYy1JUCBkaXNjb3ZlcnlcbiAqICh7QGxpbmsgZ2V0UHVibGljSXB9KS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbG9va3VwIH0gZnJvbSBcIm5vZGU6ZG5zL3Byb21pc2VzXCI7XG5pbXBvcnQge1xuICBtZW1vaXplLFxuICBjcmVhdGVGZXRjaEVycm9yLFxuICB0eXBlIFVybExpa2UsXG4gIHVybEJ1aWxkZXIsXG4gIHBhcnNlSXAsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbi8qKlxuICogVGhpcyBwcm9jZXNzJ3Mgb3V0Ym91bmQgcHVibGljIElQLCBjYWNoZWQgZm9yIDUgbWludXRlcy4gQXNrcyBDbG91ZGZsYXJlJ3NcbiAqIGBjZG4tY2dpL3RyYWNlYCBmaXJzdCBhbmQgZmFsbHMgYmFjayB0byBpcGlmeS4gVXNlZnVsIGZvciBhbGxvd2xpc3Rpbmcgb3IgZm9yXG4gKiByZWFzb25pbmcgYWJvdXQgZWdyZXNzIGZyb20gYSBEYXRhYnJpY2tzIEFwcC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFB1YmxpY0lwID0gbWVtb2l6ZShcbiAgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNsb3VkZmxhcmVSZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9jbG91ZGZsYXJlLmNvbS9jZG4tY2dpL3RyYWNlXCIpO1xuICAgIGlmIChjbG91ZGZsYXJlUmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IHRyYWNlID0gYXdhaXQgY2xvdWRmbGFyZVJlc3BvbnNlLnRleHQoKTtcbiAgICAgIGNvbnN0IGlwS2V5ID0gXCJpcD1cIjtcbiAgICAgIGNvbnN0IGlwID0gdHJhY2VcbiAgICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgICAgICAuZmluZCgobGluZSkgPT4gbGluZS5zdGFydHNXaXRoKGlwS2V5KSlcbiAgICAgICAgPy5zbGljZShpcEtleS5sZW5ndGgpO1xuICAgICAgaWYgKGlwKSByZXR1cm4gaXA7XG4gICAgfVxuICAgIGNvbnN0IGlwaWZ5UmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vYXBpLmlwaWZ5Lm9yZz9mb3JtYXQ9anNvblwiKTtcbiAgICBpZiAoIWlwaWZ5UmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IGF3YWl0IGNyZWF0ZUZldGNoRXJyb3IoaXBpZnlSZXNwb25zZSk7XG4gICAgfVxuICAgIGNvbnN0IGlwaWZ5RGF0YSA9IChhd2FpdCBpcGlmeVJlc3BvbnNlLmpzb24oKSkgYXMgeyBpcD86IHN0cmluZyB9O1xuICAgIGNvbnN0IGlwID0gaXBpZnlEYXRhPy5pcDtcbiAgICBpZiAoaXApIHJldHVybiBpcDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZGV0ZXJtaW5lIHB1YmxpYyBJUFwiKTtcbiAgfSxcbiAgeyB0dGxNczogMTAwMCAqIDYwICogNSB9LFxuKTtcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBob3N0IG9mIGBpbnB1dGAgdG8gaXRzIElQIGFkZHJlc3MoZXMpIHZpYSB0aGUgT1MgcmVzb2x2ZXJcbiAqIChgZG5zLmxvb2t1cGAgd2l0aCBgYWxsOiB0cnVlYCwgc28gYm90aCBBIGFuZCBBQUFBIHJlY29yZHMgYXJlIHJldHVybmVkIHdoZW5cbiAqIHRoZSBob3N0IGlzIGR1YWwtc3RhY2tlZCkuIEFjY2VwdHMgYW55IGBuZXQuVXJsTGlrZWAgLSBhIGJhcmUgaG9zdG5hbWUsIGEgZnVsbFxuICogVVJMLCBvciBhIGB7IHVybCB9YCB3cmFwcGVyIC0gYW5kIHJldHVybnMgdGhlIGRlZHVwbGljYXRlZCBsaXN0IG9mIGxpdGVyYWxcbiAqIGFkZHJlc3Nlcy4gTmV2ZXIgdGhyb3dzOiBhbiB1bnBhcnNlYWJsZSBpbnB1dCwgYW4gSVAtbGl0ZXJhbCBob3N0IChyZXR1cm5lZFxuICogYXMtaXMgd2l0aG91dCBhIEROUyByb3VuZC10cmlwKSwgb3IgYSByZXNvbHV0aW9uIGZhaWx1cmUgYWxsIHlpZWxkIHRoZVxuICogYXBwcm9wcmlhdGUgbGlzdCBvciBgW11gLlxuICpcbiAqIGBkbnMubG9va3VwYCAobm90IGByZXNvbHZlNGAgLyBgcmVzb2x2ZTZgKSBpcyB1c2VkIHNvIGAvZXRjL2hvc3RzYCBhbmQgdGhlXG4gKiBwbGF0Zm9ybSByZXNvbHZlciBvcmRlciBhcmUgaG9ub3JlZCwgbWF0Y2hpbmcgd2hhdCBhbiBvdXRib3VuZCBjb25uZWN0aW9uIHRvXG4gKiB0aGUgaG9zdCB3b3VsZCBhY3R1YWxseSB1c2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlSG9zdElwcyhpbnB1dDogVXJsTGlrZSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgaG9zdCA9IHVybEJ1aWxkZXIoaW5wdXQpPy5ob3N0bmFtZTtcbiAgaWYgKCFob3N0KSByZXR1cm4gW107XG4gIC8vIFdIQVRXRyBgVVJMLmhvc3RuYW1lYCBicmFja2V0cyBJUHY2IGxpdGVyYWxzOyBzdHJpcCBiZWZvcmUgcGFyc2luZy5cbiAgY29uc3QgbGl0ZXJhbCA9IHBhcnNlSXAoaG9zdC5yZXBsYWNlKC9eXFxbfFxcXSQvZywgXCJcIikpO1xuICBpZiAobGl0ZXJhbCkgcmV0dXJuIFtob3N0LnJlcGxhY2UoL15cXFt8XFxdJC9nLCBcIlwiKV07XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IGxvb2t1cChob3N0LCB7IGFsbDogdHJ1ZSB9KTtcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQocmVzdWx0cy5tYXAoKHIpID0+IHIuYWRkcmVzcykpXTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG4iXX0=
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { type WorkspaceClient as AppKitWorkspaceClient } from "@databricks/appkit";
|
|
9
9
|
import { type DatabricksAuthOptions } from "@dbx-tools/auth";
|
|
10
|
-
import {
|
|
10
|
+
import { type UrlBuilder } from "@dbx-tools/shared-core";
|
|
11
11
|
/** Legacy SDK client exposed by AppKit for APIs not yet on its facade. */
|
|
12
12
|
export type WorkspaceClient = ReturnType<AppKitWorkspaceClient["toLegacyWorkspaceClient"]>;
|
|
13
13
|
/**
|
|
@@ -51,7 +51,7 @@ export declare function getCurrentUserName(client?: WorkspaceClient): Promise<st
|
|
|
51
51
|
* Resolve the current workspace host as a `net.UrlBuilder`: the workspace
|
|
52
52
|
* `Config` host first, then the `DATABRICKS_HOST` env var, else `undefined`.
|
|
53
53
|
*/
|
|
54
|
-
export declare function getWorkspaceUrl(): Promise<
|
|
54
|
+
export declare function getWorkspaceUrl(): Promise<UrlBuilder | undefined>;
|
|
55
55
|
/**
|
|
56
56
|
* Resolve the numeric workspace id: the workspace `Config`'s `workspaceId`
|
|
57
57
|
* first, else the 10-20 digit run of `workspaceHost` (defaulting to
|