@dbx-tools/auth 0.9.54 → 0.9.60

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 CHANGED
@@ -3,7 +3,7 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/auth";
6
- export const PACKAGE_VERSION = "0.9.54";
6
+ export const PACKAGE_VERSION = "0.9.60";
7
7
  export * as bindings from "./src/bindings.ts";
8
8
  export * as client from "./src/client.ts";
9
9
  export * as config from "./src/config.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/auth";
2
- export declare const PACKAGE_VERSION = "0.9.54";
2
+ export declare const PACKAGE_VERSION = "0.9.60";
3
3
  export * as bindings from "./src/bindings.ts";
4
4
  export * as client from "./src/client.ts";
5
5
  export * as config from "./src/config.ts";
package/lib/index.js CHANGED
@@ -2,11 +2,11 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/auth";
5
- export const PACKAGE_VERSION = "0.9.54";
5
+ export const PACKAGE_VERSION = "0.9.60";
6
6
  export * as bindings from "./src/bindings.js";
7
7
  export * as client from "./src/client.js";
8
8
  export * as config from "./src/config.js";
9
9
  export * as profile from "./src/profile.js";
10
10
  export * as runtimeAuth from "./src/runtime-auth.js";
11
11
  export { AuthOptionsSchema, DatabricksAuthOptionsSchema, AUTH_DEFAULTS, DEFAULT_CLIENT_ID, DEFAULT_CONFIG_FILE, DEFAULT_ACCESS_TOKEN_HEADER, WORKSPACE_ID_HEADER } from "./src/config.js";
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQztBQUNwRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsMkJBQTJCLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLDJCQUEyQixFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2F1dGhcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS41NFwiO1xuZXhwb3J0ICogYXMgYmluZGluZ3MgZnJvbSBcIi4vc3JjL2JpbmRpbmdzLnRzXCI7XG5leHBvcnQgKiBhcyBjbGllbnQgZnJvbSBcIi4vc3JjL2NsaWVudC50c1wiO1xuZXhwb3J0ICogYXMgY29uZmlnIGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCAqIGFzIHByb2ZpbGUgZnJvbSBcIi4vc3JjL3Byb2ZpbGUudHNcIjtcbmV4cG9ydCAqIGFzIHJ1bnRpbWVBdXRoIGZyb20gXCIuL3NyYy9ydW50aW1lLWF1dGgudHNcIjtcbmV4cG9ydCB0eXBlIHsgQWNjZXNzVG9rZW4sIFRva2VuT3B0aW9ucywgQXV0aENsaWVudCwgRGF0YWJyaWNrc0F1dGhEZXBlbmRlbmNpZXMgfSBmcm9tIFwiLi9zcmMvY2xpZW50LnRzXCI7XG5leHBvcnQgeyBBdXRoT3B0aW9uc1NjaGVtYSwgRGF0YWJyaWNrc0F1dGhPcHRpb25zU2NoZW1hLCBBVVRIX0RFRkFVTFRTLCBERUZBVUxUX0NMSUVOVF9JRCwgREVGQVVMVF9DT05GSUdfRklMRSwgREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSLCBXT1JLU1BBQ0VfSURfSEVBREVSIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBBdXRoT3B0aW9ucywgRGF0YWJyaWNrc0F1dGhPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBMaXN0UHJvZmlsZXNPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3Byb2ZpbGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgRGF0YWJyaWNrc1J1bnRpbWVBdXRoQ2xpZW50IH0gZnJvbSBcIi4vc3JjL3J1bnRpbWUtYXV0aC50c1wiO1xuIl19
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQztBQUNwRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsMkJBQTJCLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLDJCQUEyQixFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2F1dGhcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS42MFwiO1xuZXhwb3J0ICogYXMgYmluZGluZ3MgZnJvbSBcIi4vc3JjL2JpbmRpbmdzLnRzXCI7XG5leHBvcnQgKiBhcyBjbGllbnQgZnJvbSBcIi4vc3JjL2NsaWVudC50c1wiO1xuZXhwb3J0ICogYXMgY29uZmlnIGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCAqIGFzIHByb2ZpbGUgZnJvbSBcIi4vc3JjL3Byb2ZpbGUudHNcIjtcbmV4cG9ydCAqIGFzIHJ1bnRpbWVBdXRoIGZyb20gXCIuL3NyYy9ydW50aW1lLWF1dGgudHNcIjtcbmV4cG9ydCB0eXBlIHsgQWNjZXNzVG9rZW4sIFRva2VuT3B0aW9ucywgQXV0aENsaWVudCwgRGF0YWJyaWNrc0F1dGhEZXBlbmRlbmNpZXMgfSBmcm9tIFwiLi9zcmMvY2xpZW50LnRzXCI7XG5leHBvcnQgeyBBdXRoT3B0aW9uc1NjaGVtYSwgRGF0YWJyaWNrc0F1dGhPcHRpb25zU2NoZW1hLCBBVVRIX0RFRkFVTFRTLCBERUZBVUxUX0NMSUVOVF9JRCwgREVGQVVMVF9DT05GSUdfRklMRSwgREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSLCBXT1JLU1BBQ0VfSURfSEVBREVSIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBBdXRoT3B0aW9ucywgRGF0YWJyaWNrc0F1dGhPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBMaXN0UHJvZmlsZXNPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3Byb2ZpbGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgRGF0YWJyaWNrc1J1bnRpbWVBdXRoQ2xpZW50IH0gZnJvbSBcIi4vc3JjL3J1bnRpbWUtYXV0aC50c1wiO1xuIl19
@@ -310,16 +310,22 @@ export function listDatabricksProfiles(configFile, refresh = false, environment
310
310
  /** Resolve options, environment, request headers, and configuration into credentials. */
311
311
  export function resolveDatabricksProfile(options, environment = process.env) {
312
312
  const inApp = environmentUtils.isDatabricksAppEnv({ ...environment });
313
- const environmentProfile = stringUtils.trimToUndefined(environment.DATABRICKS_CONFIG_PROFILE);
314
- const explicitProfile = Boolean(stringUtils.trimToUndefined(options.profile) ?? environmentProfile);
315
- const requestToken = requestOboToken(options.requestHeaders, options.accessTokenHeader);
316
- const explicitAuthType = options.authType ??
317
- (!inApp && !explicitProfile ? parseAuthType(environment.DATABRICKS_AUTH_TYPE) : undefined);
313
+ const configPath = resolveConfigFile(options.configFile, environment);
314
+ const config = loadConfig(options.configFile, false, environment);
315
+ const optionProfile = stringUtils.trimToUndefined(options.profile);
316
+ const configuredEnvironmentProfile = stringUtils.trimToUndefined(environment.DATABRICKS_CONFIG_PROFILE);
317
+ const environmentProfile = configuredEnvironmentProfile && config?.has(configuredEnvironmentProfile)
318
+ ? configuredEnvironmentProfile
319
+ : undefined;
318
320
  const appServicePrincipal = [
319
321
  environment.DATABRICKS_HOST,
320
322
  environment.DATABRICKS_CLIENT_ID,
321
323
  environment.DATABRICKS_CLIENT_SECRET,
322
324
  ].every((value) => Boolean(stringUtils.trimToUndefined(value)));
325
+ const explicitProfile = Boolean(optionProfile ?? environmentProfile);
326
+ const requestToken = requestOboToken(options.requestHeaders, options.accessTokenHeader);
327
+ const explicitAuthType = options.authType ??
328
+ (!inApp && !explicitProfile ? parseAuthType(environment.DATABRICKS_AUTH_TYPE) : undefined);
323
329
  const selectedAuthType = !inApp || explicitProfile || explicitAuthType
324
330
  ? explicitAuthType
325
331
  : requestToken
@@ -330,9 +336,7 @@ export function resolveDatabricksProfile(options, environment = process.env) {
330
336
  const appAuth = selectedAuthType === AuthType.AppOnBehalfOf ||
331
337
  selectedAuthType === AuthType.AppServicePrincipal;
332
338
  const ignoreAmbientCredentials = explicitProfile && !appAuth;
333
- const configPath = resolveConfigFile(options.configFile, environment);
334
- const config = loadConfig(options.configFile, false, environment);
335
- const requestedName = stringUtils.trimToUndefined(options.profile) ?? environmentProfile;
339
+ const requestedName = optionProfile ?? environmentProfile;
336
340
  const profileName = resolveProfileName(requestedName, explicitProfile, config, options.preferUserToMachine ?? true);
337
341
  const ambientCredentials = [
338
342
  options.accessToken,
@@ -343,9 +347,10 @@ export function resolveDatabricksProfile(options, environment = process.env) {
343
347
  environment.DATABRICKS_CLIENT_SECRET,
344
348
  ].some((value) => Boolean(stringUtils.trimToUndefined(value)));
345
349
  const selectedProfile = explicitProfile || (!ambientCredentials && config?.has(profileName)) ? profileName : undefined;
346
- const configured = loadRawProfile(config, profileName);
350
+ const configured = selectedProfile ? loadRawProfile(config, profileName) : {};
351
+ const credentialName = selectedProfile ?? "ambient";
347
352
  const ambient = (name) => ignoreAmbientCredentials ? undefined : stringUtils.trimToUndefined(environment[name]);
348
- const host = normalizeHost(options.host ?? ambient("DATABRICKS_HOST") ?? configured.host, profileName);
353
+ const host = normalizeHost(options.host ?? ambient("DATABRICKS_HOST") ?? configured.host, credentialName);
349
354
  const accountId = stringUtils.trimToUndefined(options.accountId) ??
350
355
  ambient("DATABRICKS_ACCOUNT_ID") ??
351
356
  stringUtils.trimToUndefined(configured.accountId);
@@ -370,7 +375,7 @@ export function resolveDatabricksProfile(options, environment = process.env) {
370
375
  const clientId = authType === AuthType.DatabricksCli
371
376
  ? (clientIdValue ?? DEFAULT_CLIENT_ID)
372
377
  : authType === AuthType.OAuthM2M || authType === AuthType.AppServicePrincipal
373
- ? (clientIdValue ?? missing(profileName, "client_id"))
378
+ ? (clientIdValue ?? missing(credentialName, "client_id"))
374
379
  : (clientIdValue ?? "");
375
380
  const scopes = options.scopes?.length
376
381
  ? stringUtils.parseList(options.scopes)
@@ -381,9 +386,9 @@ export function resolveDatabricksProfile(options, environment = process.env) {
381
386
  stringUtils.trimToUndefined(configured.groupId);
382
387
  const principal = authType === AuthType.OAuthM2M || authType === AuthType.AppServicePrincipal
383
388
  ? clientId
384
- : profileName;
389
+ : credentialName;
385
390
  const cacheKey = credentialCacheKey({
386
- name: profileName,
391
+ name: credentialName,
387
392
  host,
388
393
  accountId,
389
394
  workspaceId,
@@ -394,7 +399,7 @@ export function resolveDatabricksProfile(options, environment = process.env) {
394
399
  accessToken,
395
400
  });
396
401
  logger.debug("resolved Databricks profile", {
397
- profile: profileName,
402
+ profile: credentialName,
398
403
  host,
399
404
  authType,
400
405
  target,
@@ -408,7 +413,7 @@ export function resolveDatabricksProfile(options, environment = process.env) {
408
413
  configPath,
409
414
  });
410
415
  return {
411
- name: profileName,
416
+ name: credentialName,
412
417
  ...(selectedProfile ? { selectedProfile } : {}),
413
418
  host,
414
419
  ...(accountId ? { accountId } : {}),
@@ -450,4 +455,4 @@ function credentialCacheKey(profile) {
450
455
  const digest = createHash("sha256").update(identity).digest("hex");
451
456
  return `${profile.name}-${profile.authType === AuthType.AppServicePrincipal ? "app-sp" : "oauth-m2m"}-${digest}`;
452
457
  }
453
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3Byb2ZpbGUtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL19wcm9maWxlLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVyRSxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sMENBQTBDLENBQUM7QUFDN0UsT0FBTyxLQUFLLE1BQU0sTUFBTSwrQkFBK0IsQ0FBQztBQUN4RCxPQUFPLEtBQUssV0FBVyxNQUFNLHFDQUFxQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsS0FBSyxJQUFJLFFBQVEsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUVMLDJCQUEyQixFQUMzQixpQkFBaUIsRUFDakIsbUJBQW1CLEdBQ3BCLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUF5QyxDQUFDO0FBRXJFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLGNBQWMsQ0FBQztBQWlCL0MsMERBQTBEO0FBQzFELE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsUUFB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QUM7S0FDeEMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDYixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuRSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksTUFBTSxFQUFFLENBQUM7QUFDbkgsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGlzQWJzb2x1dGUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IEF1dGhUeXBlLCBUYXJnZXRLaW5kIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWF1dGgvY29uZmlnXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFicmlja3NQcm9maWxlU3VtbWFyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1hdXRoL3Byb2ZpbGVcIjtcbmltcG9ydCAqIGFzIGVudmlyb25tZW50VXRpbHMgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvZW52aXJvbm1lbnQtdXRpbHNcIjtcbmltcG9ydCAqIGFzIG9iamVjdCBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9vYmplY3RcIjtcbmltcG9ydCAqIGFzIHN0cmluZ1V0aWxzIGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL3N0cmluZy11dGlsc1wiO1xuaW1wb3J0IHsgdHJpbVRvVW5kZWZpbmVkIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvc3RyaW5nLXV0aWxzXCI7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZUluaSB9IGZyb20gXCJpbmlcIjtcblxuaW1wb3J0IHsgQXV0aEVycm9yIH0gZnJvbSBcIi4vX2Vycm9ycy50c1wiO1xuaW1wb3J0IHsgYXV0aExvZ2dlciB9IGZyb20gXCIuL19sb2dnaW5nLnRzXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFicmlja3NQcm9maWxlIH0gZnJvbSBcIi4vX3R5cGVzLnRzXCI7XG5pbXBvcnQge1xuICB0eXBlIERhdGFicmlja3NBdXRoT3B0aW9ucyxcbiAgREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSLFxuICBERUZBVUxUX0NMSUVOVF9JRCxcbiAgREVGQVVMVF9DT05GSUdfRklMRSxcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGF1dGhMb2dnZXIoXCJwcm9maWxlLXNlbGVjdGlvblwiKTtcbmNvbnN0IGNvbmZpZ0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIEluaUNvbmZpZyB8IEVycm9yIHwgdW5kZWZpbmVkPigpO1xuXG5leHBvcnQgY29uc3QgU0VUVElOR1NfU0VDVElPTiA9IFwiX19zZXR0aW5nc19fXCI7XG5cbmV4cG9ydCB0eXBlIEVudmlyb25tZW50ID0gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj47XG5leHBvcnQgdHlwZSBJbmlDb25maWcgPSBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcblxuZXhwb3J0IGludGVyZmFjZSBSYXdQcm9maWxlIHtcbiAgaG9zdD86IHN0cmluZztcbiAgYWNjb3VudElkPzogc3RyaW5nO1xuICB3b3Jrc3BhY2VJZD86IHN0cmluZztcbiAgY2xpZW50SWQ/OiBzdHJpbmc7XG4gIGNsaWVudFNlY3JldD86IHN0cmluZztcbiAgYWNjZXNzVG9rZW4/OiBzdHJpbmc7XG4gIGdyb3VwSWQ/OiBzdHJpbmc7XG4gIHNjb3Blcz86IHN0cmluZztcbiAgYXV0aFR5cGU/OiBzdHJpbmc7XG59XG5cbi8qKiBSZXNvbHZlIHRoZSBzZWxlY3RlZCBEYXRhYnJpY2tzIGNvbmZpZ3VyYXRpb24gcGF0aC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQ29uZmlnRmlsZShcbiAgZXhwbGljaXQ/OiBzdHJpbmcsXG4gIGVudmlyb25tZW50OiBFbnZpcm9ubWVudCA9IHByb2Nlc3MuZW52LFxuKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VsZWN0ZWQgPVxuICAgIHRyaW1Ub1VuZGVmaW5lZChleHBsaWNpdCkgPz9cbiAgICB0cmltVG9VbmRlZmluZWQoZW52aXJvbm1lbnQuREFUQUJSSUNLU19DT05GSUdfRklMRSkgPz9cbiAgICBERUZBVUxUX0NPTkZJR19GSUxFO1xuICBjb25zdCBleHBhbmRlZCA9XG4gICAgc2VsZWN0ZWQgPT09IFwiflwiXG4gICAgICA/IGhvbWVkaXIoKVxuICAgICAgOiBzZWxlY3RlZC5zdGFydHNXaXRoKFwifi9cIilcbiAgICAgICAgPyByZXNvbHZlKGhvbWVkaXIoKSwgc2VsZWN0ZWQuc2xpY2UoMikpXG4gICAgICAgIDogc2VsZWN0ZWQ7XG4gIHJldHVybiBpc0Fic29sdXRlKGV4cGFuZGVkKSA/IGV4cGFuZGVkIDogcmVzb2x2ZShleHBhbmRlZCk7XG59XG5cbi8qKiBMb2FkIGFuZCBjYWNoZSB0aGUgc2VsZWN0ZWQgRGF0YWJyaWNrcyBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRDb25maWcoXG4gIGNvbmZpZ0ZpbGU/OiBzdHJpbmcsXG4gIHJlZnJlc2ggPSBmYWxzZSxcbiAgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50ID0gcHJvY2Vzcy5lbnYsXG4pOiBJbmlDb25maWcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXRoID0gcmVzb2x2ZUNvbmZpZ0ZpbGUoY29uZmlnRmlsZSwgZW52aXJvbm1lbnQpO1xuICBpZiAocmVmcmVzaCkgY29uZmlnQ2FjaGUuZGVsZXRlKHBhdGgpO1xuICBpZiAoY29uZmlnQ2FjaGUuaGFzKHBhdGgpKSB7XG4gICAgY29uc3QgY2FjaGVkID0gY29uZmlnQ2FjaGUuZ2V0KHBhdGgpO1xuICAgIGlmIChjYWNoZWQgaW5zdGFuY2VvZiBFcnJvcikgdGhyb3cgY2FjaGVkO1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgaWYgKCFleGlzdHNTeW5jKHBhdGgpKSB7XG4gICAgY29uZmlnQ2FjaGUuc2V0KHBhdGgsIHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHBhcnNlRGF0YWJyaWNrc0NvbmZpZyhyZWFkRmlsZVN5bmMocGF0aCwgXCJ1dGY4XCIpKTtcbiAgICBjb25maWdDYWNoZS5zZXQocGF0aCwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9IGNhdGNoIChjYXVzZSkge1xuICAgIGNvbnN0IGVycm9yID1cbiAgICAgIGNhdXNlIGluc3RhbmNlb2YgRXJyb3IgPyBjYXVzZSA6IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgYENvdWxkIG5vdCByZWFkICR7cGF0aH1gLCB7IGNhdXNlIH0pO1xuICAgIGNvbmZpZ0NhY2hlLnNldChwYXRoLCBlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqIEludmFsaWRhdGUgY2FjaGVkIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgYW4gZXh0ZXJuYWwgd3JpdGUuICovXG5leHBvcnQgZnVuY3Rpb24gaW52YWxpZGF0ZUNvbmZpZ0ZpbGUoY29uZmlnRmlsZT86IHN0cmluZyk6IHZvaWQge1xuICBjb25maWdDYWNoZS5kZWxldGUocmVzb2x2ZUNvbmZpZ0ZpbGUoY29uZmlnRmlsZSkpO1xufVxuXG4vKiogUGFyc2UgRGF0YWJyaWNrcyBJTkkgdGV4dCB0aHJvdWdoIHRoZSBtYWludGFpbmVkIGBpbmlgIHBhY2thZ2UuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEYXRhYnJpY2tzQ29uZmlnKHNvdXJjZTogc3RyaW5nKTogSW5pQ29uZmlnIHtcbiAgbGV0IHBhcnNlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHRyeSB7XG4gICAgcGFyc2VkID0gcGFyc2VJbmkoc291cmNlKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwiRGF0YWJyaWNrcyBjb25maWd1cmF0aW9uIGlzIG5vdCB2YWxpZCBJTklcIiwgeyBjYXVzZSB9KTtcbiAgfVxuICBjb25zdCBjb25maWc6IEluaUNvbmZpZyA9IG5ldyBNYXAoKTtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICBpZiAoIW5hbWUudHJpbSgpIHx8ICFvYmplY3QuaXNSZWNvcmQodmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwiRGF0YWJyaWNrcyBjb25maWd1cmF0aW9uIHZhbHVlcyBtdXN0IGJlbG9uZyB0byBhIHByb2ZpbGVcIik7XG4gICAgfVxuICAgIF9hcHBlbmRDb25maWdTZWN0aW9ucyhjb25maWcsIFtuYW1lLnRyaW0oKV0sIHZhbHVlKTtcbiAgfVxuICByZXR1cm4gY29uZmlnO1xufVxuXG5mdW5jdGlvbiBfYXBwZW5kQ29uZmlnU2VjdGlvbnMoXG4gIGNvbmZpZzogSW5pQ29uZmlnLFxuICBwYXRoOiByZWFkb25seSBzdHJpbmdbXSxcbiAgdmFsdWU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogdm9pZCB7XG4gIGNvbnN0IHNlY3Rpb24gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBsZXQgbmVzdGVkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgIGlmIChvYmplY3QuaXNSZWNvcmQoZW50cnkpKSB7XG4gICAgICBuZXN0ZWQgPSB0cnVlO1xuICAgICAgX2FwcGVuZENvbmZpZ1NlY3Rpb25zKGNvbmZpZywgWy4uLnBhdGgsIGtleV0sIGVudHJ5KTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQgJiYgZW50cnkgIT09IG51bGwpIHtcbiAgICAgIHNlY3Rpb24uc2V0KGtleS50cmltKCkudG9Mb3dlckNhc2UoKSwgU3RyaW5nKGVudHJ5KS50cmltKCkpO1xuICAgIH1cbiAgfVxuICBpZiAoc2VjdGlvbi5zaXplIHx8ICFuZXN0ZWQpIHtcbiAgICBjb25maWcuc2V0KHBhdGguam9pbihcIi5cIiksIHNlY3Rpb24pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkUmF3UHJvZmlsZShjb25maWc6IEluaUNvbmZpZyB8IHVuZGVmaW5lZCwgbmFtZTogc3RyaW5nKTogUmF3UHJvZmlsZSB7XG4gIGNvbnN0IHNlY3Rpb24gPSBjb25maWc/LmdldChuYW1lKTtcbiAgcmV0dXJuIHtcbiAgICBob3N0OiBzZWN0aW9uPy5nZXQoXCJob3N0XCIpLFxuICAgIGFjY291bnRJZDogc2VjdGlvbj8uZ2V0KFwiYWNjb3VudF9pZFwiKSxcbiAgICB3b3Jrc3BhY2VJZDogc2VjdGlvbj8uZ2V0KFwid29ya3NwYWNlX2lkXCIpLFxuICAgIGNsaWVudElkOiBzZWN0aW9uPy5nZXQoXCJjbGllbnRfaWRcIiksXG4gICAgY2xpZW50U2VjcmV0OiBzZWN0aW9uPy5nZXQoXCJjbGllbnRfc2VjcmV0XCIpLFxuICAgIGFjY2Vzc1Rva2VuOiBzZWN0aW9uPy5nZXQoXCJ0b2tlblwiKSxcbiAgICBncm91cElkOiBzZWN0aW9uPy5nZXQoXCJncm91cF9pZFwiKSxcbiAgICBzY29wZXM6IHNlY3Rpb24/LmdldChcInNjb3Blc1wiKSxcbiAgICBhdXRoVHlwZTogdHJpbVRvVW5kZWZpbmVkKHNlY3Rpb24/LmdldChcImF1dGhfdHlwZVwiKSk/LnRvTG93ZXJDYXNlKCksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUHJvZmlsZU5hbWUoXG4gIHJlcXVlc3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBleHBsaWNpdDogYm9vbGVhbixcbiAgY29uZmlnOiBJbmlDb25maWcgfCB1bmRlZmluZWQsXG4gIHByZWZlclVzZXJUb01hY2hpbmU6IGJvb2xlYW4sXG4pOiBzdHJpbmcge1xuICBsZXQgc2VsZWN0ZWQgPSByZXF1ZXN0ZWQ7XG4gIGxldCBzb3VyY2UgPSByZXF1ZXN0ZWQgPyBcInJlcXVlc3RlZFwiIDogdW5kZWZpbmVkO1xuICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgc2VsZWN0ZWQgPSB0cmltVG9VbmRlZmluZWQoY29uZmlnPy5nZXQoU0VUVElOR1NfU0VDVElPTik/LmdldChcImRlZmF1bHRfcHJvZmlsZVwiKSk7XG4gICAgaWYgKHNlbGVjdGVkKSBzb3VyY2UgPSBcInNldHRpbmdzLWRlZmF1bHRcIjtcbiAgfVxuICBpZiAoIXNlbGVjdGVkICYmIGNvbmZpZz8uaGFzKFwiREVGQVVMVFwiKSkge1xuICAgIHNlbGVjdGVkID0gXCJERUZBVUxUXCI7XG4gICAgc291cmNlID0gXCJkZWZhdWx0LXNlY3Rpb25cIjtcbiAgfVxuICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgY29uc3QgcHJvZmlsZXMgPSBbLi4uKGNvbmZpZz8ua2V5cygpID8/IFtdKV0uZmlsdGVyKChuYW1lKSA9PiBuYW1lICE9PSBTRVRUSU5HU19TRUNUSU9OKTtcbiAgICBpZiAocHJvZmlsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBzZWxlY3RlZCA9IHByb2ZpbGVzWzBdO1xuICAgICAgc291cmNlID0gXCJzb2xlLXByb2ZpbGVcIjtcbiAgICB9XG4gIH1cbiAgaWYgKCFzZWxlY3RlZCkge1xuICAgIHNlbGVjdGVkID0gXCJERUZBVUxUXCI7XG4gICAgc291cmNlID0gXCJmYWxsYmFja1wiO1xuICB9XG4gIGlmIChzZWxlY3RlZCA9PT0gU0VUVElOR1NfU0VDVElPTikge1xuICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgYCR7U0VUVElOR1NfU0VDVElPTn0gaXMgcmVzZXJ2ZWRgKTtcbiAgfVxuICBpZiAoZXhwbGljaXQgfHwgIXByZWZlclVzZXJUb01hY2hpbmUgfHwgIWNvbmZpZykge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInNlbGVjdGVkIERhdGFicmlja3MgcHJvZmlsZVwiLCB7XG4gICAgICBwcm9maWxlOiBzZWxlY3RlZCxcbiAgICAgIHNvdXJjZSxcbiAgICAgIGV4cGxpY2l0LFxuICAgICAgcHJlZmVyVXNlclRvTWFjaGluZSxcbiAgICB9KTtcbiAgICByZXR1cm4gc2VsZWN0ZWQ7XG4gIH1cbiAgY29uc3QgY3VycmVudCA9IGxvYWRSYXdQcm9maWxlKGNvbmZpZywgc2VsZWN0ZWQpO1xuICBpZiAoIWlzTTJtUHJvZmlsZShjdXJyZW50KSB8fCAhY3VycmVudC5ob3N0KSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwic2VsZWN0ZWQgRGF0YWJyaWNrcyBwcm9maWxlXCIsIHtcbiAgICAgIHByb2ZpbGU6IHNlbGVjdGVkLFxuICAgICAgc291cmNlLFxuICAgICAgZXhwbGljaXQsXG4gICAgICBwcmVmZXJVc2VyVG9NYWNoaW5lLFxuICAgIH0pO1xuICAgIHJldHVybiBzZWxlY3RlZDtcbiAgfVxuICBjb25zdCBtYXRjaGVzID0gWy4uLmNvbmZpZy5rZXlzKCldLmZpbHRlcigobmFtZSkgPT4ge1xuICAgIGlmIChuYW1lID09PSBzZWxlY3RlZCB8fCBuYW1lID09PSBTRVRUSU5HU19TRUNUSU9OKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gbG9hZFJhd1Byb2ZpbGUoY29uZmlnLCBuYW1lKTtcbiAgICByZXR1cm4gY2FuZGlkYXRlLmF1dGhUeXBlID09PSBcImRhdGFicmlja3MtY2xpXCIgJiYgc2FtZVRhcmdldChjdXJyZW50LCBjYW5kaWRhdGUpO1xuICB9KTtcbiAgY29uc3QgcHJlZmVycmVkID0gbWF0Y2hlcy5sZW5ndGggPT09IDEgPyBtYXRjaGVzWzBdISA6IHNlbGVjdGVkO1xuICBsb2dnZXIuZGVidWcoXCJzZWxlY3RlZCBEYXRhYnJpY2tzIHByb2ZpbGVcIiwge1xuICAgIHByb2ZpbGU6IHByZWZlcnJlZCxcbiAgICBzb3VyY2U6IHByZWZlcnJlZCA9PT0gc2VsZWN0ZWQgPyBzb3VyY2UgOiBcIm1hdGNoaW5nLWNsaS1wcm9maWxlXCIsXG4gICAgb3JpZ2luYWxQcm9maWxlOiBwcmVmZXJyZWQgPT09IHNlbGVjdGVkID8gdW5kZWZpbmVkIDogc2VsZWN0ZWQsXG4gICAgZXhwbGljaXQsXG4gICAgcHJlZmVyVXNlclRvTWFjaGluZSxcbiAgICBtYXRjaGluZ0NsaVByb2ZpbGVzOiBtYXRjaGVzLmxlbmd0aCxcbiAgfSk7XG4gIHJldHVybiBwcmVmZXJyZWQ7XG59XG5cbi8qKiBOb3JtYWxpemUgRGF0YWJyaWNrcyBob3N0cyBhbmQgcmVxdWlyZSBUTFMgb3V0c2lkZSBsb29wYmFjayBkZXZlbG9wbWVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVIb3N0KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHByb2ZpbGUgPSBcIkRFRkFVTFRcIik6IHN0cmluZyB7XG4gIGNvbnN0IHNlbGVjdGVkID0gdHJpbVRvVW5kZWZpbmVkKHZhbHVlKTtcbiAgaWYgKCFzZWxlY3RlZCkgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNvbmZpZ1wiLCBgUHJvZmlsZSAke3Byb2ZpbGV9IGhhcyBubyBob3N0YCk7XG4gIGNvbnN0IHdpdGhTY2hlbWUgPSAvXmh0dHBzPzpcXC9cXC8vaS50ZXN0KHNlbGVjdGVkKSA/IHNlbGVjdGVkIDogYGh0dHBzOi8vJHtzZWxlY3RlZH1gO1xuICBsZXQgdXJsOiBVUkw7XG4gIHRyeSB7XG4gICAgdXJsID0gbmV3IFVSTCh3aXRoU2NoZW1lKTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIGBQcm9maWxlICR7cHJvZmlsZX0gaGFzIGFuIGludmFsaWQgaG9zdGAsIHsgY2F1c2UgfSk7XG4gIH1cbiAgaWYgKHVybC5wcm90b2NvbCAhPT0gXCJodHRwczpcIiAmJiB1cmwuaG9zdG5hbWUgIT09IFwibG9jYWxob3N0XCIgJiYgdXJsLmhvc3RuYW1lICE9PSBcIjEyNy4wLjAuMVwiKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNvbmZpZ1wiLCBcIkRhdGFicmlja3MgaG9zdCBtdXN0IHVzZSBIVFRQU1wiKTtcbiAgfVxuICByZXR1cm4gdXJsLnRvU3RyaW5nKCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUF1dGhUeXBlKFxuICBhdXRoVHlwZTogQXV0aFR5cGUgfCB1bmRlZmluZWQsXG4gIGNsaWVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGNsaWVudFNlY3JldDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBhY2Nlc3NUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogQXV0aFR5cGUge1xuICBzd2l0Y2ggKGF1dGhUeXBlKSB7XG4gICAgY2FzZSBBdXRoVHlwZS5EYXRhYnJpY2tzQ2xpOlxuICAgICAgcmV0dXJuIEF1dGhUeXBlLkRhdGFicmlja3NDbGk7XG4gICAgY2FzZSBBdXRoVHlwZS5PQXV0aE0yTTpcbiAgICAgIGlmICghY2xpZW50SWQgfHwgIWNsaWVudFNlY3JldCkge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwib2F1dGgtbTJtIHJlcXVpcmVzIGNsaWVudF9pZCBhbmQgY2xpZW50X3NlY3JldFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBBdXRoVHlwZS5PQXV0aE0yTTtcbiAgICBjYXNlIEF1dGhUeXBlLlBlcnNvbmFsQWNjZXNzVG9rZW46XG4gICAgICBpZiAoIWFjY2Vzc1Rva2VuKSB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwicGF0IHJlcXVpcmVzIHRva2VuXCIpO1xuICAgICAgcmV0dXJuIEF1dGhUeXBlLlBlcnNvbmFsQWNjZXNzVG9rZW47XG4gICAgY2FzZSBBdXRoVHlwZS5BcHBPbkJlaGFsZk9mOlxuICAgICAgaWYgKCFhY2Nlc3NUb2tlbikge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwiYXBwX29ibyByZXF1aXJlcyB0aGUgY29uZmlndXJlZCBhY2Nlc3MgdG9rZW4gaGVhZGVyXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEF1dGhUeXBlLkFwcE9uQmVoYWxmT2Y7XG4gICAgY2FzZSBBdXRoVHlwZS5BcHBTZXJ2aWNlUHJpbmNpcGFsOlxuICAgICAgaWYgKCFjbGllbnRJZCB8fCAhY2xpZW50U2VjcmV0KSB7XG4gICAgICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgXCJhcHBfc3AgcmVxdWlyZXMgY2xpZW50IGlkIGFuZCBzZWNyZXRcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gQXV0aFR5cGUuQXBwU2VydmljZVByaW5jaXBhbDtcbiAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIGlmIChjbGllbnRJZCAmJiBjbGllbnRTZWNyZXQpIHJldHVybiBBdXRoVHlwZS5PQXV0aE0yTTtcbiAgICAgIGlmIChjbGllbnRTZWNyZXQpIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgXCJvYXV0aC1tMm0gY2xpZW50X3NlY3JldCByZXF1aXJlcyBjbGllbnRfaWRcIik7XG4gICAgICByZXR1cm4gYWNjZXNzVG9rZW4gPyBBdXRoVHlwZS5QZXJzb25hbEFjY2Vzc1Rva2VuIDogQXV0aFR5cGUuRGF0YWJyaWNrc0NsaTtcbiAgfVxufVxuXG4vKiogUGFyc2Ugb25lIGV4dGVybmFsIGF1dGgtdHlwZSB2YWx1ZSBpbnRvIHRoZSBjYW5vbmljYWwgZW51bS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUF1dGhUeXBlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBBdXRoVHlwZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlbGVjdGVkID0gdHJpbVRvVW5kZWZpbmVkKHZhbHVlKT8udG9Mb3dlckNhc2UoKTtcbiAgaWYgKHNlbGVjdGVkID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChPYmplY3QudmFsdWVzKEF1dGhUeXBlKS5pbmNsdWRlcyhzZWxlY3RlZCBhcyBBdXRoVHlwZSkpIHJldHVybiBzZWxlY3RlZCBhcyBBdXRoVHlwZTtcbiAgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNvbmZpZ1wiLCBgQXV0aGVudGljYXRpb24gdHlwZSAke3NlbGVjdGVkfSBpcyBub3Qgc3VwcG9ydGVkYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0T2JvVG9rZW4oXG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBoZWFkZXJOYW1lID0gREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZW50cnkgPSBPYmplY3QuZW50cmllcyhoZWFkZXJzID8/IHt9KS5maW5kKFxuICAgIChbbmFtZV0pID0+IG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gaGVhZGVyTmFtZS50b0xvd2VyQ2FzZSgpLFxuICApO1xuICBjb25zdCB2YWx1ZSA9IHRyaW1Ub1VuZGVmaW5lZChlbnRyeT8uWzFdKTtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGhlYWRlck5hbWUudG9Mb3dlckNhc2UoKSAhPT0gREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSKSByZXR1cm4gdmFsdWU7XG4gIGNvbnN0IFtzY2hlbWUsIC4uLnBhcnRzXSA9IHZhbHVlLnNwbGl0KC9cXHMrLyk7XG4gIHJldHVybiBzY2hlbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiYmVhcmVyXCIgPyB0cmltVG9VbmRlZmluZWQocGFydHMuam9pbihcIiBcIikpIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5mZXJUYXJnZXQoaG9zdDogc3RyaW5nIHwgdW5kZWZpbmVkLCBhY2NvdW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFRhcmdldEtpbmQge1xuICBpZiAoYWNjb3VudElkICYmIGhvc3QpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKG5ldyBVUkwobm9ybWFsaXplSG9zdChob3N0KSkuaG9zdG5hbWUgPT09IFwiYWNjb3VudHMuY2xvdWQuZGF0YWJyaWNrcy5jb21cIikge1xuICAgICAgICByZXR1cm4gVGFyZ2V0S2luZC5BY2NvdW50O1xuICAgICAgfVxuICAgIH0gY2F0Y2gge31cbiAgfVxuICByZXR1cm4gVGFyZ2V0S2luZC5Xb3Jrc3BhY2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRhcmdldCh2YWx1ZTogc3RyaW5nKTogVGFyZ2V0S2luZCB7XG4gIHN3aXRjaCAodmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlIFRhcmdldEtpbmQuV29ya3NwYWNlOlxuICAgICAgcmV0dXJuIFRhcmdldEtpbmQuV29ya3NwYWNlO1xuICAgIGNhc2UgVGFyZ2V0S2luZC5BY2NvdW50OlxuICAgICAgcmV0dXJuIFRhcmdldEtpbmQuQWNjb3VudDtcbiAgICBjYXNlIFRhcmdldEtpbmQuVW5pZmllZDpcbiAgICAgIHJldHVybiBUYXJnZXRLaW5kLlVuaWZpZWQ7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgXCJUYXJnZXQgbXVzdCBiZSB3b3Jrc3BhY2UsIGFjY291bnQsIG9yIHVuaWZpZWRcIik7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pc3NpbmcocHJvZmlsZTogc3RyaW5nLCBmaWVsZDogc3RyaW5nKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIGBQcm9maWxlICR7cHJvZmlsZX0gcmVxdWlyZXMgJHtmaWVsZH1gKTtcbn1cblxuZnVuY3Rpb24gc2FtZVRhcmdldChsZWZ0OiBSYXdQcm9maWxlLCByaWdodDogUmF3UHJvZmlsZSk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGlmIChub3JtYWxpemVIb3N0KGxlZnQuaG9zdCkgIT09IG5vcm1hbGl6ZUhvc3QocmlnaHQuaG9zdCkpIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAoXG4gICAgKCFsZWZ0LmFjY291bnRJZCB8fCBsZWZ0LmFjY291bnRJZCA9PT0gcmlnaHQuYWNjb3VudElkKSAmJlxuICAgICghbGVmdC53b3Jrc3BhY2VJZCB8fCBsZWZ0LndvcmtzcGFjZUlkID09PSByaWdodC53b3Jrc3BhY2VJZClcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNNMm1Qcm9maWxlKHByb2ZpbGU6IFJhd1Byb2ZpbGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBwcm9maWxlLmF1dGhUeXBlID09PSBBdXRoVHlwZS5PQXV0aE0yTSB8fFxuICAgICghcHJvZmlsZS5hdXRoVHlwZSAmJiBCb29sZWFuKHByb2ZpbGUuY2xpZW50SWQgJiYgcHJvZmlsZS5jbGllbnRTZWNyZXQpKVxuICApO1xufVxuXG4vKiogRW51bWVyYXRlIHNlY3JldC1mcmVlIHByb2ZpbGUgbWV0YWRhdGEgZnJvbSBjYWNoZWQgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0RGF0YWJyaWNrc1Byb2ZpbGVzKFxuICBjb25maWdGaWxlPzogc3RyaW5nLFxuICByZWZyZXNoID0gZmFsc2UsXG4gIGVudmlyb25tZW50OiBFbnZpcm9ubWVudCA9IHByb2Nlc3MuZW52LFxuKTogRGF0YWJyaWNrc1Byb2ZpbGVTdW1tYXJ5W10ge1xuICBjb25zdCBwYXRoID0gcmVzb2x2ZUNvbmZpZ0ZpbGUoY29uZmlnRmlsZSwgZW52aXJvbm1lbnQpO1xuICBjb25zdCBjb25maWcgPSBsb2FkQ29uZmlnKGNvbmZpZ0ZpbGUsIHJlZnJlc2gsIGVudmlyb25tZW50KTtcbiAgaWYgKCFjb25maWcpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0ZWQgRGF0YWJyaWNrcyBwcm9maWxlc1wiLCB7IHBhdGgsIHJlZnJlc2gsIGNvdW50OiAwIH0pO1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBwcm9maWxlcyA9IFsuLi5jb25maWcua2V5cygpXVxuICAgIC5maWx0ZXIoKG5hbWUpID0+IG5hbWUgIT09IFNFVFRJTkdTX1NFQ1RJT04pXG4gICAgLm1hcCgobmFtZSkgPT4ge1xuICAgICAgY29uc3QgcHJvZmlsZSA9IGxvYWRSYXdQcm9maWxlKGNvbmZpZywgbmFtZSk7XG4gICAgICBjb25zdCBob3N0ID0gc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHByb2ZpbGUuaG9zdCk7XG4gICAgICBjb25zdCBhY2NvdW50SWQgPSBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocHJvZmlsZS5hY2NvdW50SWQpO1xuICAgICAgY29uc3Qgd29ya3NwYWNlSWQgPSBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocHJvZmlsZS53b3Jrc3BhY2VJZCk7XG4gICAgICBjb25zdCBhdXRoVHlwZSA9IHJlc29sdmVBdXRoVHlwZShcbiAgICAgICAgcGFyc2VBdXRoVHlwZShwcm9maWxlLmF1dGhUeXBlKSxcbiAgICAgICAgcHJvZmlsZS5jbGllbnRJZCxcbiAgICAgICAgcHJvZmlsZS5jbGllbnRTZWNyZXQsXG4gICAgICAgIHByb2ZpbGUuYWNjZXNzVG9rZW4sXG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgLi4uKGhvc3QgPyB7IGhvc3QgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFjY291bnRJZCA/IHsgYWNjb3VudElkIH0gOiB7fSksXG4gICAgICAgIC4uLih3b3Jrc3BhY2VJZCA/IHsgd29ya3NwYWNlSWQgfSA6IHt9KSxcbiAgICAgICAgdGFyZ2V0OiBpbmZlclRhcmdldChob3N0LCBhY2NvdW50SWQpLFxuICAgICAgICBhdXRoVHlwZSxcbiAgICAgICAgcHJpbmNpcGFsOlxuICAgICAgICAgIGF1dGhUeXBlID09PSBBdXRoVHlwZS5PQXV0aE0yTSB8fCBhdXRoVHlwZSA9PT0gQXV0aFR5cGUuQXBwU2VydmljZVByaW5jaXBhbFxuICAgICAgICAgICAgPyAoc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHByb2ZpbGUuY2xpZW50SWQpID8/IG5hbWUpXG4gICAgICAgICAgICA6IG5hbWUsXG4gICAgICB9O1xuICAgIH0pXG4gICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0Lm5hbWUubG9jYWxlQ29tcGFyZShyaWdodC5uYW1lKSk7XG4gIGxvZ2dlci5kZWJ1ZyhcImxpc3RlZCBEYXRhYnJpY2tzIHByb2ZpbGVzXCIsIHsgcGF0aCwgcmVmcmVzaCwgY291bnQ6IHByb2ZpbGVzLmxlbmd0aCB9KTtcbiAgcmV0dXJuIHByb2ZpbGVzO1xufVxuXG4vKiogUmVzb2x2ZSBvcHRpb25zLCBlbnZpcm9ubWVudCwgcmVxdWVzdCBoZWFkZXJzLCBhbmQgY29uZmlndXJhdGlvbiBpbnRvIGNyZWRlbnRpYWxzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEYXRhYnJpY2tzUHJvZmlsZShcbiAgb3B0aW9uczogRGF0YWJyaWNrc0F1dGhPcHRpb25zLFxuICBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQgPSBwcm9jZXNzLmVudixcbik6IERhdGFicmlja3NQcm9maWxlIHtcbiAgY29uc3QgaW5BcHAgPSBlbnZpcm9ubWVudFV0aWxzLmlzRGF0YWJyaWNrc0FwcEVudih7IC4uLmVudmlyb25tZW50IH0pO1xuICBjb25zdCBlbnZpcm9ubWVudFByb2ZpbGUgPSBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQoZW52aXJvbm1lbnQuREFUQUJSSUNLU19DT05GSUdfUFJPRklMRSk7XG4gIGNvbnN0IGV4cGxpY2l0UHJvZmlsZSA9IEJvb2xlYW4oXG4gICAgc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKG9wdGlvbnMucHJvZmlsZSkgPz8gZW52aXJvbm1lbnRQcm9maWxlLFxuICApO1xuICBjb25zdCByZXF1ZXN0VG9rZW4gPSByZXF1ZXN0T2JvVG9rZW4ob3B0aW9ucy5yZXF1ZXN0SGVhZGVycywgb3B0aW9ucy5hY2Nlc3NUb2tlbkhlYWRlcik7XG4gIGNvbnN0IGV4cGxpY2l0QXV0aFR5cGUgPVxuICAgIG9wdGlvbnMuYXV0aFR5cGUgPz9cbiAgICAoIWluQXBwICYmICFleHBsaWNpdFByb2ZpbGUgPyBwYXJzZUF1dGhUeXBlKGVudmlyb25tZW50LkRBVEFCUklDS1NfQVVUSF9UWVBFKSA6IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGFwcFNlcnZpY2VQcmluY2lwYWwgPSBbXG4gICAgZW52aXJvbm1lbnQuREFUQUJSSUNLU19IT1NULFxuICAgIGVudmlyb25tZW50LkRBVEFCUklDS1NfQ0xJRU5UX0lELFxuICAgIGVudmlyb25tZW50LkRBVEFCUklDS1NfQ0xJRU5UX1NFQ1JFVCxcbiAgXS5ldmVyeSgodmFsdWUpID0+IEJvb2xlYW4oc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHZhbHVlKSkpO1xuICBjb25zdCBzZWxlY3RlZEF1dGhUeXBlID1cbiAgICAhaW5BcHAgfHwgZXhwbGljaXRQcm9maWxlIHx8IGV4cGxpY2l0QXV0aFR5cGVcbiAgICAgID8gZXhwbGljaXRBdXRoVHlwZVxuICAgICAgOiByZXF1ZXN0VG9rZW5cbiAgICAgICAgPyBBdXRoVHlwZS5BcHBPbkJlaGFsZk9mXG4gICAgICAgIDogYXBwU2VydmljZVByaW5jaXBhbFxuICAgICAgICAgID8gQXV0aFR5cGUuQXBwU2VydmljZVByaW5jaXBhbFxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBhcHBBdXRoID1cbiAgICBzZWxlY3RlZEF1dGhUeXBlID09PSBBdXRoVHlwZS5BcHBPbkJlaGFsZk9mIHx8XG4gICAgc2VsZWN0ZWRBdXRoVHlwZSA9PT0gQXV0aFR5cGUuQXBwU2VydmljZVByaW5jaXBhbDtcbiAgY29uc3QgaWdub3JlQW1iaWVudENyZWRlbnRpYWxzID0gZXhwbGljaXRQcm9maWxlICYmICFhcHBBdXRoO1xuICBjb25zdCBjb25maWdQYXRoID0gcmVzb2x2ZUNvbmZpZ0ZpbGUob3B0aW9ucy5jb25maWdGaWxlLCBlbnZpcm9ubWVudCk7XG4gIGNvbnN0IGNvbmZpZyA9IGxvYWRDb25maWcob3B0aW9ucy5jb25maWdGaWxlLCBmYWxzZSwgZW52aXJvbm1lbnQpO1xuICBjb25zdCByZXF1ZXN0ZWROYW1lID0gc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKG9wdGlvbnMucHJvZmlsZSkgPz8gZW52aXJvbm1lbnRQcm9maWxlO1xuICBjb25zdCBwcm9maWxlTmFtZSA9IHJlc29sdmVQcm9maWxlTmFtZShcbiAgICByZXF1ZXN0ZWROYW1lLFxuICAgIGV4cGxpY2l0UHJvZmlsZSxcbiAgICBjb25maWcsXG4gICAgb3B0aW9ucy5wcmVmZXJVc2VyVG9NYWNoaW5lID8/IHRydWUsXG4gICk7XG4gIGNvbnN0IGFtYmllbnRDcmVkZW50aWFscyA9IFtcbiAgICBvcHRpb25zLmFjY2Vzc1Rva2VuLFxuICAgIG9wdGlvbnMuY2xpZW50SWQsXG4gICAgb3B0aW9ucy5jbGllbnRTZWNyZXQsXG4gICAgZW52aXJvbm1lbnQuREFUQUJSSUNLU19UT0tFTixcbiAgICBlbnZpcm9ubWVudC5EQVRBQlJJQ0tTX0NMSUVOVF9JRCxcbiAgICBlbnZpcm9ubWVudC5EQVRBQlJJQ0tTX0NMSUVOVF9TRUNSRVQsXG4gIF0uc29tZSgodmFsdWUpID0+IEJvb2xlYW4oc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHZhbHVlKSkpO1xuICBjb25zdCBzZWxlY3RlZFByb2ZpbGUgPVxuICAgIGV4cGxpY2l0UHJvZmlsZSB8fCAoIWFtYmllbnRDcmVkZW50aWFscyAmJiBjb25maWc/Lmhhcyhwcm9maWxlTmFtZSkpID8gcHJvZmlsZU5hbWUgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBsb2FkUmF3UHJvZmlsZShjb25maWcsIHByb2ZpbGVOYW1lKTtcbiAgY29uc3QgYW1iaWVudCA9IChuYW1lOiBrZXlvZiBOb2RlSlMuUHJvY2Vzc0Vudik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PlxuICAgIGlnbm9yZUFtYmllbnRDcmVkZW50aWFscyA/IHVuZGVmaW5lZCA6IHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChlbnZpcm9ubWVudFtuYW1lXSk7XG4gIGNvbnN0IGhvc3QgPSBub3JtYWxpemVIb3N0KFxuICAgIG9wdGlvbnMuaG9zdCA/PyBhbWJpZW50KFwiREFUQUJSSUNLU19IT1NUXCIpID8/IGNvbmZpZ3VyZWQuaG9zdCxcbiAgICBwcm9maWxlTmFtZSxcbiAgKTtcbiAgY29uc3QgYWNjb3VudElkID1cbiAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQob3B0aW9ucy5hY2NvdW50SWQpID8/XG4gICAgYW1iaWVudChcIkRBVEFCUklDS1NfQUNDT1VOVF9JRFwiKSA/P1xuICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChjb25maWd1cmVkLmFjY291bnRJZCk7XG4gIGNvbnN0IHdvcmtzcGFjZUlkID1cbiAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQob3B0aW9ucy53b3Jrc3BhY2VJZCkgPz9cbiAgICBhbWJpZW50KFwiREFUQUJSSUNLU19XT1JLU1BBQ0VfSURcIikgPz9cbiAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQoY29uZmlndXJlZC53b3Jrc3BhY2VJZCk7XG4gIGNvbnN0IGNsaWVudElkVmFsdWUgPVxuICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChvcHRpb25zLmNsaWVudElkKSA/P1xuICAgIGFtYmllbnQoXCJEQVRBQlJJQ0tTX0NMSUVOVF9JRFwiKSA/P1xuICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChjb25maWd1cmVkLmNsaWVudElkKTtcbiAgY29uc3QgY2xpZW50U2VjcmV0ID1cbiAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQob3B0aW9ucy5jbGllbnRTZWNyZXQpID8/XG4gICAgYW1iaWVudChcIkRBVEFCUklDS1NfQ0xJRU5UX1NFQ1JFVFwiKSA/P1xuICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChjb25maWd1cmVkLmNsaWVudFNlY3JldCk7XG4gIGNvbnN0IGFjY2Vzc1Rva2VuID1cbiAgICBzZWxlY3RlZEF1dGhUeXBlID09PSBBdXRoVHlwZS5BcHBPbkJlaGFsZk9mXG4gICAgICA/IHJlcXVlc3RUb2tlblxuICAgICAgOiAoc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKG9wdGlvbnMuYWNjZXNzVG9rZW4pID8/XG4gICAgICAgIGFtYmllbnQoXCJEQVRBQlJJQ0tTX1RPS0VOXCIpID8/XG4gICAgICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChjb25maWd1cmVkLmFjY2Vzc1Rva2VuKSk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRBdXRoVHlwZSA9XG4gICAgc2VsZWN0ZWRBdXRoVHlwZSA/P1xuICAgIHBhcnNlQXV0aFR5cGUoYW1iaWVudChcIkRBVEFCUklDS1NfQVVUSF9UWVBFXCIpKSA/P1xuICAgIHBhcnNlQXV0aFR5cGUoY29uZmlndXJlZC5hdXRoVHlwZSk7XG4gIGNvbnN0IGF1dGhUeXBlID0gcmVzb2x2ZUF1dGhUeXBlKGNvbmZpZ3VyZWRBdXRoVHlwZSwgY2xpZW50SWRWYWx1ZSwgY2xpZW50U2VjcmV0LCBhY2Nlc3NUb2tlbik7XG4gIGNvbnN0IGNsaWVudElkID1cbiAgICBhdXRoVHlwZSA9PT0gQXV0aFR5cGUuRGF0YWJyaWNrc0NsaVxuICAgICAgPyAoY2xpZW50SWRWYWx1ZSA/PyBERUZBVUxUX0NMSUVOVF9JRClcbiAgICAgIDogYXV0aFR5cGUgPT09IEF1dGhUeXBlLk9BdXRoTTJNIHx8IGF1dGhUeXBlID09PSBBdXRoVHlwZS5BcHBTZXJ2aWNlUHJpbmNpcGFsXG4gICAgICAgID8gKGNsaWVudElkVmFsdWUgPz8gbWlzc2luZyhwcm9maWxlTmFtZSwgXCJjbGllbnRfaWRcIikpXG4gICAgICAgIDogKGNsaWVudElkVmFsdWUgPz8gXCJcIik7XG4gIGNvbnN0IHNjb3BlcyA9IG9wdGlvbnMuc2NvcGVzPy5sZW5ndGhcbiAgICA/IHN0cmluZ1V0aWxzLnBhcnNlTGlzdChvcHRpb25zLnNjb3BlcylcbiAgICA6IHN0cmluZ1V0aWxzLnBhcnNlTGlzdChjb25maWd1cmVkLnNjb3Blcz8uc3BsaXQoXCIsXCIpID8/IFtcImFsbC1hcGlzXCJdKTtcbiAgY29uc3QgdGFyZ2V0ID0gb3B0aW9ucy50YXJnZXQgPyBwYXJzZVRhcmdldChvcHRpb25zLnRhcmdldCkgOiBpbmZlclRhcmdldChob3N0LCBhY2NvdW50SWQpO1xuICBjb25zdCBncm91cElkID1cbiAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQob3B0aW9ucy5ncm91cElkKSA/P1xuICAgIGFtYmllbnQoXCJEQVRBQlJJQ0tTX0dST1VQX0lEXCIpID8/XG4gICAgc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKGNvbmZpZ3VyZWQuZ3JvdXBJZCk7XG4gIGNvbnN0IHByaW5jaXBhbCA9XG4gICAgYXV0aFR5cGUgPT09IEF1dGhUeXBlLk9BdXRoTTJNIHx8IGF1dGhUeXBlID09PSBBdXRoVHlwZS5BcHBTZXJ2aWNlUHJpbmNpcGFsXG4gICAgICA/IGNsaWVudElkXG4gICAgICA6IHByb2ZpbGVOYW1lO1xuICBjb25zdCBjYWNoZUtleSA9IGNyZWRlbnRpYWxDYWNoZUtleSh7XG4gICAgbmFtZTogcHJvZmlsZU5hbWUsXG4gICAgaG9zdCxcbiAgICBhY2NvdW50SWQsXG4gICAgd29ya3NwYWNlSWQsXG4gICAgY2xpZW50SWQsXG4gICAgZ3JvdXBJZCxcbiAgICBzY29wZXMsXG4gICAgYXV0aFR5cGUsXG4gICAgYWNjZXNzVG9rZW4sXG4gIH0pO1xuICBsb2dnZXIuZGVidWcoXCJyZXNvbHZlZCBEYXRhYnJpY2tzIHByb2ZpbGVcIiwge1xuICAgIHByb2ZpbGU6IHByb2ZpbGVOYW1lLFxuICAgIGhvc3QsXG4gICAgYXV0aFR5cGUsXG4gICAgdGFyZ2V0LFxuICAgIGluQXBwLFxuICAgIGV4cGxpY2l0UHJvZmlsZSxcbiAgICBjb25maWd1cmVkQXV0aFR5cGU6IGNvbmZpZ3VyZWRBdXRoVHlwZSA/PyBcImF1dG9tYXRpY1wiLFxuICAgIGhhc0FjY291bnRJZDogQm9vbGVhbihhY2NvdW50SWQpLFxuICAgIGhhc1dvcmtzcGFjZUlkOiBCb29sZWFuKHdvcmtzcGFjZUlkKSxcbiAgICBoYXNHcm91cElkOiBCb29sZWFuKGdyb3VwSWQpLFxuICAgIHNjb3BlQ291bnQ6IHNjb3Blcy5sZW5ndGgsXG4gICAgY29uZmlnUGF0aCxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgbmFtZTogcHJvZmlsZU5hbWUsXG4gICAgLi4uKHNlbGVjdGVkUHJvZmlsZSA/IHsgc2VsZWN0ZWRQcm9maWxlIH0gOiB7fSksXG4gICAgaG9zdCxcbiAgICAuLi4oYWNjb3VudElkID8geyBhY2NvdW50SWQgfSA6IHt9KSxcbiAgICAuLi4od29ya3NwYWNlSWQgPyB7IHdvcmtzcGFjZUlkIH0gOiB7fSksXG4gICAgY2xpZW50SWQsXG4gICAgLi4uKGdyb3VwSWQgPyB7IGdyb3VwSWQgfSA6IHt9KSxcbiAgICBzY29wZXMsXG4gICAgdGFyZ2V0LFxuICAgIGF1dGhUeXBlLFxuICAgIC4uLihjbGllbnRTZWNyZXQgPyB7IGNsaWVudFNlY3JldCB9IDoge30pLFxuICAgIC4uLihhY2Nlc3NUb2tlbiA/IHsgYWNjZXNzVG9rZW4gfSA6IHt9KSxcbiAgICBjYWNoZUtleSxcbiAgICBwcmluY2lwYWwsXG4gIH07XG59XG5cbi8qKiBOb3JtYWxpemUgT0F1dGggc2NvcGVzIGZvciBtYWNoaW5lIGNyZWRlbnRpYWxzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hY2hpbmVTY29wZXMoc2NvcGVzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnBhcnNlTGlzdChzY29wZXMubGVuZ3RoID8gc2NvcGVzIDogW1wiYWxsLWFwaXNcIl0pLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gY3JlZGVudGlhbENhY2hlS2V5KFxuICBwcm9maWxlOiBQaWNrPFxuICAgIERhdGFicmlja3NQcm9maWxlLFxuICAgIHwgXCJuYW1lXCJcbiAgICB8IFwiaG9zdFwiXG4gICAgfCBcImFjY291bnRJZFwiXG4gICAgfCBcIndvcmtzcGFjZUlkXCJcbiAgICB8IFwiY2xpZW50SWRcIlxuICAgIHwgXCJncm91cElkXCJcbiAgICB8IFwic2NvcGVzXCJcbiAgICB8IFwiYXV0aFR5cGVcIlxuICAgIHwgXCJhY2Nlc3NUb2tlblwiXG4gID4sXG4pOiBzdHJpbmcge1xuICBpZiAocHJvZmlsZS5hdXRoVHlwZSA9PT0gQXV0aFR5cGUuRGF0YWJyaWNrc0NsaSkgcmV0dXJuIHByb2ZpbGUubmFtZTtcbiAgaWYgKHByb2ZpbGUuYXV0aFR5cGUgPT09IEF1dGhUeXBlLlBlcnNvbmFsQWNjZXNzVG9rZW4pIHtcbiAgICBjb25zdCBkaWdlc3QgPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgICAudXBkYXRlKHByb2ZpbGUuYWNjZXNzVG9rZW4gPz8gXCJcIilcbiAgICAgIC5kaWdlc3QoXCJoZXhcIik7XG4gICAgcmV0dXJuIGAke3Byb2ZpbGUubmFtZX0tcGF0LSR7ZGlnZXN0fWA7XG4gIH1cbiAgaWYgKHByb2ZpbGUuYXV0aFR5cGUgPT09IEF1dGhUeXBlLkFwcE9uQmVoYWxmT2YpIHJldHVybiBgJHtwcm9maWxlLm5hbWV9LWFwcC1vYm9gO1xuICBjb25zdCBpZGVudGl0eSA9IFtcbiAgICBwcm9maWxlLmhvc3QsXG4gICAgcHJvZmlsZS5hY2NvdW50SWQgPz8gXCJcIixcbiAgICBwcm9maWxlLndvcmtzcGFjZUlkID8/IFwiXCIsXG4gICAgcHJvZmlsZS5jbGllbnRJZCxcbiAgICBwcm9maWxlLmdyb3VwSWQgPz8gXCJcIixcbiAgICBtYWNoaW5lU2NvcGVzKHByb2ZpbGUuc2NvcGVzKS5qb2luKFwiIFwiKSxcbiAgXS5qb2luKFwiXFwwXCIpO1xuICBjb25zdCBkaWdlc3QgPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShpZGVudGl0eSkuZGlnZXN0KFwiaGV4XCIpO1xuICByZXR1cm4gYCR7cHJvZmlsZS5uYW1lfS0ke3Byb2ZpbGUuYXV0aFR5cGUgPT09IEF1dGhUeXBlLkFwcFNlcnZpY2VQcmluY2lwYWwgPyBcImFwcC1zcFwiIDogXCJvYXV0aC1tMm1cIn0tJHtkaWdlc3R9YDtcbn1cbiJdfQ==
458
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3Byb2ZpbGUtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL19wcm9maWxlLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVyRSxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sMENBQTBDLENBQUM7QUFDN0UsT0FBTyxLQUFLLE1BQU0sTUFBTSwrQkFBK0IsQ0FBQztBQUN4RCxPQUFPLEtBQUssV0FBVyxNQUFNLHFDQUFxQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsS0FBSyxJQUFJLFFBQVEsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUVMLDJCQUEyQixFQUMzQixpQkFBaUIsRUFDakIsbUJBQW1CLEdBQ3BCLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUF5QyxDQUFDO0FBRXJFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLGNBQWMsQ0FBQztBQWlCL0MsMERBQTBEO0FBQzFELE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsUUFB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QUc7UUFDZixPQUFPLENBQUMsSUFBSTtRQUNaLE9BQU8sQ0FBQyxTQUFTLElBQUksRUFBRTtRQUN2QixPQUFPLENBQUMsV0FBVyxJQUFJLEVBQUU7UUFDekIsT0FBTyxDQUFDLFFBQVE7UUFDaEIsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFO1FBQ3JCLGFBQWEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztLQUN4QyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNiLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25FLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxNQUFNLEVBQUUsQ0FBQztBQUNuSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgaXNBYnNvbHV0ZSwgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcblxuaW1wb3J0IHsgQXV0aFR5cGUsIFRhcmdldEtpbmQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtYXV0aC9jb25maWdcIjtcbmltcG9ydCB0eXBlIHsgRGF0YWJyaWNrc1Byb2ZpbGVTdW1tYXJ5IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWF1dGgvcHJvZmlsZVwiO1xuaW1wb3J0ICogYXMgZW52aXJvbm1lbnRVdGlscyBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9lbnZpcm9ubWVudC11dGlsc1wiO1xuaW1wb3J0ICogYXMgb2JqZWN0IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL29iamVjdFwiO1xuaW1wb3J0ICogYXMgc3RyaW5nVXRpbHMgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvc3RyaW5nLXV0aWxzXCI7XG5pbXBvcnQgeyB0cmltVG9VbmRlZmluZWQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9zdHJpbmctdXRpbHNcIjtcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlSW5pIH0gZnJvbSBcImluaVwiO1xuXG5pbXBvcnQgeyBBdXRoRXJyb3IgfSBmcm9tIFwiLi9fZXJyb3JzLnRzXCI7XG5pbXBvcnQgeyBhdXRoTG9nZ2VyIH0gZnJvbSBcIi4vX2xvZ2dpbmcudHNcIjtcbmltcG9ydCB0eXBlIHsgRGF0YWJyaWNrc1Byb2ZpbGUgfSBmcm9tIFwiLi9fdHlwZXMudHNcIjtcbmltcG9ydCB7XG4gIHR5cGUgRGF0YWJyaWNrc0F1dGhPcHRpb25zLFxuICBERUZBVUxUX0FDQ0VTU19UT0tFTl9IRUFERVIsXG4gIERFRkFVTFRfQ0xJRU5UX0lELFxuICBERUZBVUxUX0NPTkZJR19GSUxFLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gYXV0aExvZ2dlcihcInByb2ZpbGUtc2VsZWN0aW9uXCIpO1xuY29uc3QgY29uZmlnQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgSW5pQ29uZmlnIHwgRXJyb3IgfCB1bmRlZmluZWQ+KCk7XG5cbmV4cG9ydCBjb25zdCBTRVRUSU5HU19TRUNUSU9OID0gXCJfX3NldHRpbmdzX19cIjtcblxuZXhwb3J0IHR5cGUgRW52aXJvbm1lbnQgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+PjtcbmV4cG9ydCB0eXBlIEluaUNvbmZpZyA9IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJhd1Byb2ZpbGUge1xuICBob3N0Pzogc3RyaW5nO1xuICBhY2NvdW50SWQ/OiBzdHJpbmc7XG4gIHdvcmtzcGFjZUlkPzogc3RyaW5nO1xuICBjbGllbnRJZD86IHN0cmluZztcbiAgY2xpZW50U2VjcmV0Pzogc3RyaW5nO1xuICBhY2Nlc3NUb2tlbj86IHN0cmluZztcbiAgZ3JvdXBJZD86IHN0cmluZztcbiAgc2NvcGVzPzogc3RyaW5nO1xuICBhdXRoVHlwZT86IHN0cmluZztcbn1cblxuLyoqIFJlc29sdmUgdGhlIHNlbGVjdGVkIERhdGFicmlja3MgY29uZmlndXJhdGlvbiBwYXRoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDb25maWdGaWxlKFxuICBleHBsaWNpdD86IHN0cmluZyxcbiAgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50ID0gcHJvY2Vzcy5lbnYsXG4pOiBzdHJpbmcge1xuICBjb25zdCBzZWxlY3RlZCA9XG4gICAgdHJpbVRvVW5kZWZpbmVkKGV4cGxpY2l0KSA/P1xuICAgIHRyaW1Ub1VuZGVmaW5lZChlbnZpcm9ubWVudC5EQVRBQlJJQ0tTX0NPTkZJR19GSUxFKSA/P1xuICAgIERFRkFVTFRfQ09ORklHX0ZJTEU7XG4gIGNvbnN0IGV4cGFuZGVkID1cbiAgICBzZWxlY3RlZCA9PT0gXCJ+XCJcbiAgICAgID8gaG9tZWRpcigpXG4gICAgICA6IHNlbGVjdGVkLnN0YXJ0c1dpdGgoXCJ+L1wiKVxuICAgICAgICA/IHJlc29sdmUoaG9tZWRpcigpLCBzZWxlY3RlZC5zbGljZSgyKSlcbiAgICAgICAgOiBzZWxlY3RlZDtcbiAgcmV0dXJuIGlzQWJzb2x1dGUoZXhwYW5kZWQpID8gZXhwYW5kZWQgOiByZXNvbHZlKGV4cGFuZGVkKTtcbn1cblxuLyoqIExvYWQgYW5kIGNhY2hlIHRoZSBzZWxlY3RlZCBEYXRhYnJpY2tzIGNvbmZpZ3VyYXRpb24uICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZENvbmZpZyhcbiAgY29uZmlnRmlsZT86IHN0cmluZyxcbiAgcmVmcmVzaCA9IGZhbHNlLFxuICBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQgPSBwcm9jZXNzLmVudixcbik6IEluaUNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhdGggPSByZXNvbHZlQ29uZmlnRmlsZShjb25maWdGaWxlLCBlbnZpcm9ubWVudCk7XG4gIGlmIChyZWZyZXNoKSBjb25maWdDYWNoZS5kZWxldGUocGF0aCk7XG4gIGlmIChjb25maWdDYWNoZS5oYXMocGF0aCkpIHtcbiAgICBjb25zdCBjYWNoZWQgPSBjb25maWdDYWNoZS5nZXQocGF0aCk7XG4gICAgaWYgKGNhY2hlZCBpbnN0YW5jZW9mIEVycm9yKSB0aHJvdyBjYWNoZWQ7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBpZiAoIWV4aXN0c1N5bmMocGF0aCkpIHtcbiAgICBjb25maWdDYWNoZS5zZXQocGF0aCwgdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgY29uZmlnID0gcGFyc2VEYXRhYnJpY2tzQ29uZmlnKHJlYWRGaWxlU3luYyhwYXRoLCBcInV0ZjhcIikpO1xuICAgIGNvbmZpZ0NhY2hlLnNldChwYXRoLCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgY29uc3QgZXJyb3IgPVxuICAgICAgY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlIDogbmV3IEF1dGhFcnJvcihcImNvbmZpZ1wiLCBgQ291bGQgbm90IHJlYWQgJHtwYXRofWAsIHsgY2F1c2UgfSk7XG4gICAgY29uZmlnQ2FjaGUuc2V0KHBhdGgsIGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKiogSW52YWxpZGF0ZSBjYWNoZWQgY29uZmlndXJhdGlvbiBhZnRlciBhbiBleHRlcm5hbCB3cml0ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZhbGlkYXRlQ29uZmlnRmlsZShjb25maWdGaWxlPzogc3RyaW5nKTogdm9pZCB7XG4gIGNvbmZpZ0NhY2hlLmRlbGV0ZShyZXNvbHZlQ29uZmlnRmlsZShjb25maWdGaWxlKSk7XG59XG5cbi8qKiBQYXJzZSBEYXRhYnJpY2tzIElOSSB0ZXh0IHRocm91Z2ggdGhlIG1haW50YWluZWQgYGluaWAgcGFja2FnZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURhdGFicmlja3NDb25maWcoc291cmNlOiBzdHJpbmcpOiBJbmlDb25maWcge1xuICBsZXQgcGFyc2VkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBwYXJzZUluaShzb3VyY2UpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9IGNhdGNoIChjYXVzZSkge1xuICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgXCJEYXRhYnJpY2tzIGNvbmZpZ3VyYXRpb24gaXMgbm90IHZhbGlkIElOSVwiLCB7IGNhdXNlIH0pO1xuICB9XG4gIGNvbnN0IGNvbmZpZzogSW5pQ29uZmlnID0gbmV3IE1hcCgpO1xuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkKSkge1xuICAgIGlmICghbmFtZS50cmltKCkgfHwgIW9iamVjdC5pc1JlY29yZCh2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgXCJEYXRhYnJpY2tzIGNvbmZpZ3VyYXRpb24gdmFsdWVzIG11c3QgYmVsb25nIHRvIGEgcHJvZmlsZVwiKTtcbiAgICB9XG4gICAgX2FwcGVuZENvbmZpZ1NlY3Rpb25zKGNvbmZpZywgW25hbWUudHJpbSgpXSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiBjb25maWc7XG59XG5cbmZ1bmN0aW9uIF9hcHBlbmRDb25maWdTZWN0aW9ucyhcbiAgY29uZmlnOiBJbmlDb25maWcsXG4gIHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICB2YWx1ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiB2b2lkIHtcbiAgY29uc3Qgc2VjdGlvbiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGxldCBuZXN0ZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgaWYgKG9iamVjdC5pc1JlY29yZChlbnRyeSkpIHtcbiAgICAgIG5lc3RlZCA9IHRydWU7XG4gICAgICBfYXBwZW5kQ29uZmlnU2VjdGlvbnMoY29uZmlnLCBbLi4ucGF0aCwga2V5XSwgZW50cnkpO1xuICAgIH0gZWxzZSBpZiAoZW50cnkgIT09IHVuZGVmaW5lZCAmJiBlbnRyeSAhPT0gbnVsbCkge1xuICAgICAgc2VjdGlvbi5zZXQoa2V5LnRyaW0oKS50b0xvd2VyQ2FzZSgpLCBTdHJpbmcoZW50cnkpLnRyaW0oKSk7XG4gICAgfVxuICB9XG4gIGlmIChzZWN0aW9uLnNpemUgfHwgIW5lc3RlZCkge1xuICAgIGNvbmZpZy5zZXQocGF0aC5qb2luKFwiLlwiKSwgc2VjdGlvbik7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRSYXdQcm9maWxlKGNvbmZpZzogSW5pQ29uZmlnIHwgdW5kZWZpbmVkLCBuYW1lOiBzdHJpbmcpOiBSYXdQcm9maWxlIHtcbiAgY29uc3Qgc2VjdGlvbiA9IGNvbmZpZz8uZ2V0KG5hbWUpO1xuICByZXR1cm4ge1xuICAgIGhvc3Q6IHNlY3Rpb24/LmdldChcImhvc3RcIiksXG4gICAgYWNjb3VudElkOiBzZWN0aW9uPy5nZXQoXCJhY2NvdW50X2lkXCIpLFxuICAgIHdvcmtzcGFjZUlkOiBzZWN0aW9uPy5nZXQoXCJ3b3Jrc3BhY2VfaWRcIiksXG4gICAgY2xpZW50SWQ6IHNlY3Rpb24/LmdldChcImNsaWVudF9pZFwiKSxcbiAgICBjbGllbnRTZWNyZXQ6IHNlY3Rpb24/LmdldChcImNsaWVudF9zZWNyZXRcIiksXG4gICAgYWNjZXNzVG9rZW46IHNlY3Rpb24/LmdldChcInRva2VuXCIpLFxuICAgIGdyb3VwSWQ6IHNlY3Rpb24/LmdldChcImdyb3VwX2lkXCIpLFxuICAgIHNjb3Blczogc2VjdGlvbj8uZ2V0KFwic2NvcGVzXCIpLFxuICAgIGF1dGhUeXBlOiB0cmltVG9VbmRlZmluZWQoc2VjdGlvbj8uZ2V0KFwiYXV0aF90eXBlXCIpKT8udG9Mb3dlckNhc2UoKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQcm9maWxlTmFtZShcbiAgcmVxdWVzdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGV4cGxpY2l0OiBib29sZWFuLFxuICBjb25maWc6IEluaUNvbmZpZyB8IHVuZGVmaW5lZCxcbiAgcHJlZmVyVXNlclRvTWFjaGluZTogYm9vbGVhbixcbik6IHN0cmluZyB7XG4gIGxldCBzZWxlY3RlZCA9IHJlcXVlc3RlZDtcbiAgbGV0IHNvdXJjZSA9IHJlcXVlc3RlZCA/IFwicmVxdWVzdGVkXCIgOiB1bmRlZmluZWQ7XG4gIGlmICghc2VsZWN0ZWQpIHtcbiAgICBzZWxlY3RlZCA9IHRyaW1Ub1VuZGVmaW5lZChjb25maWc/LmdldChTRVRUSU5HU19TRUNUSU9OKT8uZ2V0KFwiZGVmYXVsdF9wcm9maWxlXCIpKTtcbiAgICBpZiAoc2VsZWN0ZWQpIHNvdXJjZSA9IFwic2V0dGluZ3MtZGVmYXVsdFwiO1xuICB9XG4gIGlmICghc2VsZWN0ZWQgJiYgY29uZmlnPy5oYXMoXCJERUZBVUxUXCIpKSB7XG4gICAgc2VsZWN0ZWQgPSBcIkRFRkFVTFRcIjtcbiAgICBzb3VyY2UgPSBcImRlZmF1bHQtc2VjdGlvblwiO1xuICB9XG4gIGlmICghc2VsZWN0ZWQpIHtcbiAgICBjb25zdCBwcm9maWxlcyA9IFsuLi4oY29uZmlnPy5rZXlzKCkgPz8gW10pXS5maWx0ZXIoKG5hbWUpID0+IG5hbWUgIT09IFNFVFRJTkdTX1NFQ1RJT04pO1xuICAgIGlmIChwcm9maWxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHNlbGVjdGVkID0gcHJvZmlsZXNbMF07XG4gICAgICBzb3VyY2UgPSBcInNvbGUtcHJvZmlsZVwiO1xuICAgIH1cbiAgfVxuICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgc2VsZWN0ZWQgPSBcIkRFRkFVTFRcIjtcbiAgICBzb3VyY2UgPSBcImZhbGxiYWNrXCI7XG4gIH1cbiAgaWYgKHNlbGVjdGVkID09PSBTRVRUSU5HU19TRUNUSU9OKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNvbmZpZ1wiLCBgJHtTRVRUSU5HU19TRUNUSU9OfSBpcyByZXNlcnZlZGApO1xuICB9XG4gIGlmIChleHBsaWNpdCB8fCAhcHJlZmVyVXNlclRvTWFjaGluZSB8fCAhY29uZmlnKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwic2VsZWN0ZWQgRGF0YWJyaWNrcyBwcm9maWxlXCIsIHtcbiAgICAgIHByb2ZpbGU6IHNlbGVjdGVkLFxuICAgICAgc291cmNlLFxuICAgICAgZXhwbGljaXQsXG4gICAgICBwcmVmZXJVc2VyVG9NYWNoaW5lLFxuICAgIH0pO1xuICAgIHJldHVybiBzZWxlY3RlZDtcbiAgfVxuICBjb25zdCBjdXJyZW50ID0gbG9hZFJhd1Byb2ZpbGUoY29uZmlnLCBzZWxlY3RlZCk7XG4gIGlmICghaXNNMm1Qcm9maWxlKGN1cnJlbnQpIHx8ICFjdXJyZW50Lmhvc3QpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJzZWxlY3RlZCBEYXRhYnJpY2tzIHByb2ZpbGVcIiwge1xuICAgICAgcHJvZmlsZTogc2VsZWN0ZWQsXG4gICAgICBzb3VyY2UsXG4gICAgICBleHBsaWNpdCxcbiAgICAgIHByZWZlclVzZXJUb01hY2hpbmUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHNlbGVjdGVkO1xuICB9XG4gIGNvbnN0IG1hdGNoZXMgPSBbLi4uY29uZmlnLmtleXMoKV0uZmlsdGVyKChuYW1lKSA9PiB7XG4gICAgaWYgKG5hbWUgPT09IHNlbGVjdGVkIHx8IG5hbWUgPT09IFNFVFRJTkdTX1NFQ1RJT04pIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBsb2FkUmF3UHJvZmlsZShjb25maWcsIG5hbWUpO1xuICAgIHJldHVybiBjYW5kaWRhdGUuYXV0aFR5cGUgPT09IFwiZGF0YWJyaWNrcy1jbGlcIiAmJiBzYW1lVGFyZ2V0KGN1cnJlbnQsIGNhbmRpZGF0ZSk7XG4gIH0pO1xuICBjb25zdCBwcmVmZXJyZWQgPSBtYXRjaGVzLmxlbmd0aCA9PT0gMSA/IG1hdGNoZXNbMF0hIDogc2VsZWN0ZWQ7XG4gIGxvZ2dlci5kZWJ1ZyhcInNlbGVjdGVkIERhdGFicmlja3MgcHJvZmlsZVwiLCB7XG4gICAgcHJvZmlsZTogcHJlZmVycmVkLFxuICAgIHNvdXJjZTogcHJlZmVycmVkID09PSBzZWxlY3RlZCA/IHNvdXJjZSA6IFwibWF0Y2hpbmctY2xpLXByb2ZpbGVcIixcbiAgICBvcmlnaW5hbFByb2ZpbGU6IHByZWZlcnJlZCA9PT0gc2VsZWN0ZWQgPyB1bmRlZmluZWQgOiBzZWxlY3RlZCxcbiAgICBleHBsaWNpdCxcbiAgICBwcmVmZXJVc2VyVG9NYWNoaW5lLFxuICAgIG1hdGNoaW5nQ2xpUHJvZmlsZXM6IG1hdGNoZXMubGVuZ3RoLFxuICB9KTtcbiAgcmV0dXJuIHByZWZlcnJlZDtcbn1cblxuLyoqIE5vcm1hbGl6ZSBEYXRhYnJpY2tzIGhvc3RzIGFuZCByZXF1aXJlIFRMUyBvdXRzaWRlIGxvb3BiYWNrIGRldmVsb3BtZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUhvc3QodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgcHJvZmlsZSA9IFwiREVGQVVMVFwiKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VsZWN0ZWQgPSB0cmltVG9VbmRlZmluZWQodmFsdWUpO1xuICBpZiAoIXNlbGVjdGVkKSB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIGBQcm9maWxlICR7cHJvZmlsZX0gaGFzIG5vIGhvc3RgKTtcbiAgY29uc3Qgd2l0aFNjaGVtZSA9IC9eaHR0cHM/OlxcL1xcLy9pLnRlc3Qoc2VsZWN0ZWQpID8gc2VsZWN0ZWQgOiBgaHR0cHM6Ly8ke3NlbGVjdGVkfWA7XG4gIGxldCB1cmw6IFVSTDtcbiAgdHJ5IHtcbiAgICB1cmwgPSBuZXcgVVJMKHdpdGhTY2hlbWUpO1xuICB9IGNhdGNoIChjYXVzZSkge1xuICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgYFByb2ZpbGUgJHtwcm9maWxlfSBoYXMgYW4gaW52YWxpZCBob3N0YCwgeyBjYXVzZSB9KTtcbiAgfVxuICBpZiAodXJsLnByb3RvY29sICE9PSBcImh0dHBzOlwiICYmIHVybC5ob3N0bmFtZSAhPT0gXCJsb2NhbGhvc3RcIiAmJiB1cmwuaG9zdG5hbWUgIT09IFwiMTI3LjAuMC4xXCIpIHtcbiAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwiRGF0YWJyaWNrcyBob3N0IG11c3QgdXNlIEhUVFBTXCIpO1xuICB9XG4gIHJldHVybiB1cmwudG9TdHJpbmcoKS5yZXBsYWNlKC9cXC8kLywgXCJcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQXV0aFR5cGUoXG4gIGF1dGhUeXBlOiBBdXRoVHlwZSB8IHVuZGVmaW5lZCxcbiAgY2xpZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY2xpZW50U2VjcmV0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBBdXRoVHlwZSB7XG4gIHN3aXRjaCAoYXV0aFR5cGUpIHtcbiAgICBjYXNlIEF1dGhUeXBlLkRhdGFicmlja3NDbGk6XG4gICAgICByZXR1cm4gQXV0aFR5cGUuRGF0YWJyaWNrc0NsaTtcbiAgICBjYXNlIEF1dGhUeXBlLk9BdXRoTTJNOlxuICAgICAgaWYgKCFjbGllbnRJZCB8fCAhY2xpZW50U2VjcmV0KSB7XG4gICAgICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgXCJvYXV0aC1tMm0gcmVxdWlyZXMgY2xpZW50X2lkIGFuZCBjbGllbnRfc2VjcmV0XCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEF1dGhUeXBlLk9BdXRoTTJNO1xuICAgIGNhc2UgQXV0aFR5cGUuUGVyc29uYWxBY2Nlc3NUb2tlbjpcbiAgICAgIGlmICghYWNjZXNzVG9rZW4pIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgXCJwYXQgcmVxdWlyZXMgdG9rZW5cIik7XG4gICAgICByZXR1cm4gQXV0aFR5cGUuUGVyc29uYWxBY2Nlc3NUb2tlbjtcbiAgICBjYXNlIEF1dGhUeXBlLkFwcE9uQmVoYWxmT2Y6XG4gICAgICBpZiAoIWFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgXCJhcHBfb2JvIHJlcXVpcmVzIHRoZSBjb25maWd1cmVkIGFjY2VzcyB0b2tlbiBoZWFkZXJcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gQXV0aFR5cGUuQXBwT25CZWhhbGZPZjtcbiAgICBjYXNlIEF1dGhUeXBlLkFwcFNlcnZpY2VQcmluY2lwYWw6XG4gICAgICBpZiAoIWNsaWVudElkIHx8ICFjbGllbnRTZWNyZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNvbmZpZ1wiLCBcImFwcF9zcCByZXF1aXJlcyBjbGllbnQgaWQgYW5kIHNlY3JldFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBBdXRoVHlwZS5BcHBTZXJ2aWNlUHJpbmNpcGFsO1xuICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgaWYgKGNsaWVudElkICYmIGNsaWVudFNlY3JldCkgcmV0dXJuIEF1dGhUeXBlLk9BdXRoTTJNO1xuICAgICAgaWYgKGNsaWVudFNlY3JldCkgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNvbmZpZ1wiLCBcIm9hdXRoLW0ybSBjbGllbnRfc2VjcmV0IHJlcXVpcmVzIGNsaWVudF9pZFwiKTtcbiAgICAgIHJldHVybiBhY2Nlc3NUb2tlbiA/IEF1dGhUeXBlLlBlcnNvbmFsQWNjZXNzVG9rZW4gOiBBdXRoVHlwZS5EYXRhYnJpY2tzQ2xpO1xuICB9XG59XG5cbi8qKiBQYXJzZSBvbmUgZXh0ZXJuYWwgYXV0aC10eXBlIHZhbHVlIGludG8gdGhlIGNhbm9uaWNhbCBlbnVtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQXV0aFR5cGUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IEF1dGhUeXBlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2VsZWN0ZWQgPSB0cmltVG9VbmRlZmluZWQodmFsdWUpPy50b0xvd2VyQ2FzZSgpO1xuICBpZiAoc2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKE9iamVjdC52YWx1ZXMoQXV0aFR5cGUpLmluY2x1ZGVzKHNlbGVjdGVkIGFzIEF1dGhUeXBlKSkgcmV0dXJuIHNlbGVjdGVkIGFzIEF1dGhUeXBlO1xuICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIGBBdXRoZW50aWNhdGlvbiB0eXBlICR7c2VsZWN0ZWR9IGlzIG5vdCBzdXBwb3J0ZWRgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3RPYm9Ub2tlbihcbiAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGhlYWRlck5hbWUgPSBERUZBVUxUX0FDQ0VTU19UT0tFTl9IRUFERVIsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBlbnRyeSA9IE9iamVjdC5lbnRyaWVzKGhlYWRlcnMgPz8ge30pLmZpbmQoXG4gICAgKFtuYW1lXSkgPT4gbmFtZS50b0xvd2VyQ2FzZSgpID09PSBoZWFkZXJOYW1lLnRvTG93ZXJDYXNlKCksXG4gICk7XG4gIGNvbnN0IHZhbHVlID0gdHJpbVRvVW5kZWZpbmVkKGVudHJ5Py5bMV0pO1xuICBpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoaGVhZGVyTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBERUZBVUxUX0FDQ0VTU19UT0tFTl9IRUFERVIpIHJldHVybiB2YWx1ZTtcbiAgY29uc3QgW3NjaGVtZSwgLi4ucGFydHNdID0gdmFsdWUuc3BsaXQoL1xccysvKTtcbiAgcmV0dXJuIHNjaGVtZT8udG9Mb3dlckNhc2UoKSA9PT0gXCJiZWFyZXJcIiA/IHRyaW1Ub1VuZGVmaW5lZChwYXJ0cy5qb2luKFwiIFwiKSkgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmZlclRhcmdldChob3N0OiBzdHJpbmcgfCB1bmRlZmluZWQsIGFjY291bnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogVGFyZ2V0S2luZCB7XG4gIGlmIChhY2NvdW50SWQgJiYgaG9zdCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAobmV3IFVSTChub3JtYWxpemVIb3N0KGhvc3QpKS5ob3N0bmFtZSA9PT0gXCJhY2NvdW50cy5jbG91ZC5kYXRhYnJpY2tzLmNvbVwiKSB7XG4gICAgICAgIHJldHVybiBUYXJnZXRLaW5kLkFjY291bnQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7fVxuICB9XG4gIHJldHVybiBUYXJnZXRLaW5kLldvcmtzcGFjZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVGFyZ2V0KHZhbHVlOiBzdHJpbmcpOiBUYXJnZXRLaW5kIHtcbiAgc3dpdGNoICh2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgVGFyZ2V0S2luZC5Xb3Jrc3BhY2U6XG4gICAgICByZXR1cm4gVGFyZ2V0S2luZC5Xb3Jrc3BhY2U7XG4gICAgY2FzZSBUYXJnZXRLaW5kLkFjY291bnQ6XG4gICAgICByZXR1cm4gVGFyZ2V0S2luZC5BY2NvdW50O1xuICAgIGNhc2UgVGFyZ2V0S2luZC5VbmlmaWVkOlxuICAgICAgcmV0dXJuIFRhcmdldEtpbmQuVW5pZmllZDtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNvbmZpZ1wiLCBcIlRhcmdldCBtdXN0IGJlIHdvcmtzcGFjZSwgYWNjb3VudCwgb3IgdW5pZmllZFwiKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWlzc2luZyhwcm9maWxlOiBzdHJpbmcsIGZpZWxkOiBzdHJpbmcpOiBuZXZlciB7XG4gIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgYFByb2ZpbGUgJHtwcm9maWxlfSByZXF1aXJlcyAke2ZpZWxkfWApO1xufVxuXG5mdW5jdGlvbiBzYW1lVGFyZ2V0KGxlZnQ6IFJhd1Byb2ZpbGUsIHJpZ2h0OiBSYXdQcm9maWxlKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgaWYgKG5vcm1hbGl6ZUhvc3QobGVmdC5ob3N0KSAhPT0gbm9ybWFsaXplSG9zdChyaWdodC5ob3N0KSkgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIChcbiAgICAoIWxlZnQuYWNjb3VudElkIHx8IGxlZnQuYWNjb3VudElkID09PSByaWdodC5hY2NvdW50SWQpICYmXG4gICAgKCFsZWZ0LndvcmtzcGFjZUlkIHx8IGxlZnQud29ya3NwYWNlSWQgPT09IHJpZ2h0LndvcmtzcGFjZUlkKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc00ybVByb2ZpbGUocHJvZmlsZTogUmF3UHJvZmlsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHByb2ZpbGUuYXV0aFR5cGUgPT09IEF1dGhUeXBlLk9BdXRoTTJNIHx8XG4gICAgKCFwcm9maWxlLmF1dGhUeXBlICYmIEJvb2xlYW4ocHJvZmlsZS5jbGllbnRJZCAmJiBwcm9maWxlLmNsaWVudFNlY3JldCkpXG4gICk7XG59XG5cbi8qKiBFbnVtZXJhdGUgc2VjcmV0LWZyZWUgcHJvZmlsZSBtZXRhZGF0YSBmcm9tIGNhY2hlZCBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3REYXRhYnJpY2tzUHJvZmlsZXMoXG4gIGNvbmZpZ0ZpbGU/OiBzdHJpbmcsXG4gIHJlZnJlc2ggPSBmYWxzZSxcbiAgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50ID0gcHJvY2Vzcy5lbnYsXG4pOiBEYXRhYnJpY2tzUHJvZmlsZVN1bW1hcnlbXSB7XG4gIGNvbnN0IHBhdGggPSByZXNvbHZlQ29uZmlnRmlsZShjb25maWdGaWxlLCBlbnZpcm9ubWVudCk7XG4gIGNvbnN0IGNvbmZpZyA9IGxvYWRDb25maWcoY29uZmlnRmlsZSwgcmVmcmVzaCwgZW52aXJvbm1lbnQpO1xuICBpZiAoIWNvbmZpZykge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImxpc3RlZCBEYXRhYnJpY2tzIHByb2ZpbGVzXCIsIHsgcGF0aCwgcmVmcmVzaCwgY291bnQ6IDAgfSk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IHByb2ZpbGVzID0gWy4uLmNvbmZpZy5rZXlzKCldXG4gICAgLmZpbHRlcigobmFtZSkgPT4gbmFtZSAhPT0gU0VUVElOR1NfU0VDVElPTilcbiAgICAubWFwKChuYW1lKSA9PiB7XG4gICAgICBjb25zdCBwcm9maWxlID0gbG9hZFJhd1Byb2ZpbGUoY29uZmlnLCBuYW1lKTtcbiAgICAgIGNvbnN0IGhvc3QgPSBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocHJvZmlsZS5ob3N0KTtcbiAgICAgIGNvbnN0IGFjY291bnRJZCA9IHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChwcm9maWxlLmFjY291bnRJZCk7XG4gICAgICBjb25zdCB3b3Jrc3BhY2VJZCA9IHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChwcm9maWxlLndvcmtzcGFjZUlkKTtcbiAgICAgIGNvbnN0IGF1dGhUeXBlID0gcmVzb2x2ZUF1dGhUeXBlKFxuICAgICAgICBwYXJzZUF1dGhUeXBlKHByb2ZpbGUuYXV0aFR5cGUpLFxuICAgICAgICBwcm9maWxlLmNsaWVudElkLFxuICAgICAgICBwcm9maWxlLmNsaWVudFNlY3JldCxcbiAgICAgICAgcHJvZmlsZS5hY2Nlc3NUb2tlbixcbiAgICAgICk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lLFxuICAgICAgICAuLi4oaG9zdCA/IHsgaG9zdCB9IDoge30pLFxuICAgICAgICAuLi4oYWNjb3VudElkID8geyBhY2NvdW50SWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHdvcmtzcGFjZUlkID8geyB3b3Jrc3BhY2VJZCB9IDoge30pLFxuICAgICAgICB0YXJnZXQ6IGluZmVyVGFyZ2V0KGhvc3QsIGFjY291bnRJZCksXG4gICAgICAgIGF1dGhUeXBlLFxuICAgICAgICBwcmluY2lwYWw6XG4gICAgICAgICAgYXV0aFR5cGUgPT09IEF1dGhUeXBlLk9BdXRoTTJNIHx8IGF1dGhUeXBlID09PSBBdXRoVHlwZS5BcHBTZXJ2aWNlUHJpbmNpcGFsXG4gICAgICAgICAgICA/IChzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocHJvZmlsZS5jbGllbnRJZCkgPz8gbmFtZSlcbiAgICAgICAgICAgIDogbmFtZSxcbiAgICAgIH07XG4gICAgfSlcbiAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IGxlZnQubmFtZS5sb2NhbGVDb21wYXJlKHJpZ2h0Lm5hbWUpKTtcbiAgbG9nZ2VyLmRlYnVnKFwibGlzdGVkIERhdGFicmlja3MgcHJvZmlsZXNcIiwgeyBwYXRoLCByZWZyZXNoLCBjb3VudDogcHJvZmlsZXMubGVuZ3RoIH0pO1xuICByZXR1cm4gcHJvZmlsZXM7XG59XG5cbi8qKiBSZXNvbHZlIG9wdGlvbnMsIGVudmlyb25tZW50LCByZXF1ZXN0IGhlYWRlcnMsIGFuZCBjb25maWd1cmF0aW9uIGludG8gY3JlZGVudGlhbHMuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURhdGFicmlja3NQcm9maWxlKFxuICBvcHRpb25zOiBEYXRhYnJpY2tzQXV0aE9wdGlvbnMsXG4gIGVudmlyb25tZW50OiBFbnZpcm9ubWVudCA9IHByb2Nlc3MuZW52LFxuKTogRGF0YWJyaWNrc1Byb2ZpbGUge1xuICBjb25zdCBpbkFwcCA9IGVudmlyb25tZW50VXRpbHMuaXNEYXRhYnJpY2tzQXBwRW52KHsgLi4uZW52aXJvbm1lbnQgfSk7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSByZXNvbHZlQ29uZmlnRmlsZShvcHRpb25zLmNvbmZpZ0ZpbGUsIGVudmlyb25tZW50KTtcbiAgY29uc3QgY29uZmlnID0gbG9hZENvbmZpZyhvcHRpb25zLmNvbmZpZ0ZpbGUsIGZhbHNlLCBlbnZpcm9ubWVudCk7XG4gIGNvbnN0IG9wdGlvblByb2ZpbGUgPSBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQob3B0aW9ucy5wcm9maWxlKTtcbiAgY29uc3QgY29uZmlndXJlZEVudmlyb25tZW50UHJvZmlsZSA9IHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChcbiAgICBlbnZpcm9ubWVudC5EQVRBQlJJQ0tTX0NPTkZJR19QUk9GSUxFLFxuICApO1xuICBjb25zdCBlbnZpcm9ubWVudFByb2ZpbGUgPVxuICAgIGNvbmZpZ3VyZWRFbnZpcm9ubWVudFByb2ZpbGUgJiYgY29uZmlnPy5oYXMoY29uZmlndXJlZEVudmlyb25tZW50UHJvZmlsZSlcbiAgICAgID8gY29uZmlndXJlZEVudmlyb25tZW50UHJvZmlsZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGFwcFNlcnZpY2VQcmluY2lwYWwgPSBbXG4gICAgZW52aXJvbm1lbnQuREFUQUJSSUNLU19IT1NULFxuICAgIGVudmlyb25tZW50LkRBVEFCUklDS1NfQ0xJRU5UX0lELFxuICAgIGVudmlyb25tZW50LkRBVEFCUklDS1NfQ0xJRU5UX1NFQ1JFVCxcbiAgXS5ldmVyeSgodmFsdWUpID0+IEJvb2xlYW4oc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHZhbHVlKSkpO1xuICBjb25zdCBleHBsaWNpdFByb2ZpbGUgPSBCb29sZWFuKG9wdGlvblByb2ZpbGUgPz8gZW52aXJvbm1lbnRQcm9maWxlKTtcbiAgY29uc3QgcmVxdWVzdFRva2VuID0gcmVxdWVzdE9ib1Rva2VuKG9wdGlvbnMucmVxdWVzdEhlYWRlcnMsIG9wdGlvbnMuYWNjZXNzVG9rZW5IZWFkZXIpO1xuICBjb25zdCBleHBsaWNpdEF1dGhUeXBlID1cbiAgICBvcHRpb25zLmF1dGhUeXBlID8/XG4gICAgKCFpbkFwcCAmJiAhZXhwbGljaXRQcm9maWxlID8gcGFyc2VBdXRoVHlwZShlbnZpcm9ubWVudC5EQVRBQlJJQ0tTX0FVVEhfVFlQRSkgOiB1bmRlZmluZWQpO1xuICBjb25zdCBzZWxlY3RlZEF1dGhUeXBlID1cbiAgICAhaW5BcHAgfHwgZXhwbGljaXRQcm9maWxlIHx8IGV4cGxpY2l0QXV0aFR5cGVcbiAgICAgID8gZXhwbGljaXRBdXRoVHlwZVxuICAgICAgOiByZXF1ZXN0VG9rZW5cbiAgICAgICAgPyBBdXRoVHlwZS5BcHBPbkJlaGFsZk9mXG4gICAgICAgIDogYXBwU2VydmljZVByaW5jaXBhbFxuICAgICAgICAgID8gQXV0aFR5cGUuQXBwU2VydmljZVByaW5jaXBhbFxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBhcHBBdXRoID1cbiAgICBzZWxlY3RlZEF1dGhUeXBlID09PSBBdXRoVHlwZS5BcHBPbkJlaGFsZk9mIHx8XG4gICAgc2VsZWN0ZWRBdXRoVHlwZSA9PT0gQXV0aFR5cGUuQXBwU2VydmljZVByaW5jaXBhbDtcbiAgY29uc3QgaWdub3JlQW1iaWVudENyZWRlbnRpYWxzID0gZXhwbGljaXRQcm9maWxlICYmICFhcHBBdXRoO1xuICBjb25zdCByZXF1ZXN0ZWROYW1lID0gb3B0aW9uUHJvZmlsZSA/PyBlbnZpcm9ubWVudFByb2ZpbGU7XG4gIGNvbnN0IHByb2ZpbGVOYW1lID0gcmVzb2x2ZVByb2ZpbGVOYW1lKFxuICAgIHJlcXVlc3RlZE5hbWUsXG4gICAgZXhwbGljaXRQcm9maWxlLFxuICAgIGNvbmZpZyxcbiAgICBvcHRpb25zLnByZWZlclVzZXJUb01hY2hpbmUgPz8gdHJ1ZSxcbiAgKTtcbiAgY29uc3QgYW1iaWVudENyZWRlbnRpYWxzID0gW1xuICAgIG9wdGlvbnMuYWNjZXNzVG9rZW4sXG4gICAgb3B0aW9ucy5jbGllbnRJZCxcbiAgICBvcHRpb25zLmNsaWVudFNlY3JldCxcbiAgICBlbnZpcm9ubWVudC5EQVRBQlJJQ0tTX1RPS0VOLFxuICAgIGVudmlyb25tZW50LkRBVEFCUklDS1NfQ0xJRU5UX0lELFxuICAgIGVudmlyb25tZW50LkRBVEFCUklDS1NfQ0xJRU5UX1NFQ1JFVCxcbiAgXS5zb21lKCh2YWx1ZSkgPT4gQm9vbGVhbihzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQodmFsdWUpKSk7XG4gIGNvbnN0IHNlbGVjdGVkUHJvZmlsZSA9XG4gICAgZXhwbGljaXRQcm9maWxlIHx8ICghYW1iaWVudENyZWRlbnRpYWxzICYmIGNvbmZpZz8uaGFzKHByb2ZpbGVOYW1lKSkgPyBwcm9maWxlTmFtZSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY29uZmlndXJlZCA9IHNlbGVjdGVkUHJvZmlsZSA/IGxvYWRSYXdQcm9maWxlKGNvbmZpZywgcHJvZmlsZU5hbWUpIDoge307XG4gIGNvbnN0IGNyZWRlbnRpYWxOYW1lID0gc2VsZWN0ZWRQcm9maWxlID8/IFwiYW1iaWVudFwiO1xuICBjb25zdCBhbWJpZW50ID0gKG5hbWU6IGtleW9mIE5vZGVKUy5Qcm9jZXNzRW52KTogc3RyaW5nIHwgdW5kZWZpbmVkID0+XG4gICAgaWdub3JlQW1iaWVudENyZWRlbnRpYWxzID8gdW5kZWZpbmVkIDogc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKGVudmlyb25tZW50W25hbWVdKTtcbiAgY29uc3QgaG9zdCA9IG5vcm1hbGl6ZUhvc3QoXG4gICAgb3B0aW9ucy5ob3N0ID8/IGFtYmllbnQoXCJEQVRBQlJJQ0tTX0hPU1RcIikgPz8gY29uZmlndXJlZC5ob3N0LFxuICAgIGNyZWRlbnRpYWxOYW1lLFxuICApO1xuICBjb25zdCBhY2NvdW50SWQgPVxuICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChvcHRpb25zLmFjY291bnRJZCkgPz9cbiAgICBhbWJpZW50KFwiREFUQUJSSUNLU19BQ0NPVU5UX0lEXCIpID8/XG4gICAgc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKGNvbmZpZ3VyZWQuYWNjb3VudElkKTtcbiAgY29uc3Qgd29ya3NwYWNlSWQgPVxuICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChvcHRpb25zLndvcmtzcGFjZUlkKSA/P1xuICAgIGFtYmllbnQoXCJEQVRBQlJJQ0tTX1dPUktTUEFDRV9JRFwiKSA/P1xuICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChjb25maWd1cmVkLndvcmtzcGFjZUlkKTtcbiAgY29uc3QgY2xpZW50SWRWYWx1ZSA9XG4gICAgc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKG9wdGlvbnMuY2xpZW50SWQpID8/XG4gICAgYW1iaWVudChcIkRBVEFCUklDS1NfQ0xJRU5UX0lEXCIpID8/XG4gICAgc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKGNvbmZpZ3VyZWQuY2xpZW50SWQpO1xuICBjb25zdCBjbGllbnRTZWNyZXQgPVxuICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChvcHRpb25zLmNsaWVudFNlY3JldCkgPz9cbiAgICBhbWJpZW50KFwiREFUQUJSSUNLU19DTElFTlRfU0VDUkVUXCIpID8/XG4gICAgc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKGNvbmZpZ3VyZWQuY2xpZW50U2VjcmV0KTtcbiAgY29uc3QgYWNjZXNzVG9rZW4gPVxuICAgIHNlbGVjdGVkQXV0aFR5cGUgPT09IEF1dGhUeXBlLkFwcE9uQmVoYWxmT2ZcbiAgICAgID8gcmVxdWVzdFRva2VuXG4gICAgICA6IChzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQob3B0aW9ucy5hY2Nlc3NUb2tlbikgPz9cbiAgICAgICAgYW1iaWVudChcIkRBVEFCUklDS1NfVE9LRU5cIikgPz9cbiAgICAgICAgc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKGNvbmZpZ3VyZWQuYWNjZXNzVG9rZW4pKTtcbiAgY29uc3QgY29uZmlndXJlZEF1dGhUeXBlID1cbiAgICBzZWxlY3RlZEF1dGhUeXBlID8/XG4gICAgcGFyc2VBdXRoVHlwZShhbWJpZW50KFwiREFUQUJSSUNLU19BVVRIX1RZUEVcIikpID8/XG4gICAgcGFyc2VBdXRoVHlwZShjb25maWd1cmVkLmF1dGhUeXBlKTtcbiAgY29uc3QgYXV0aFR5cGUgPSByZXNvbHZlQXV0aFR5cGUoY29uZmlndXJlZEF1dGhUeXBlLCBjbGllbnRJZFZhbHVlLCBjbGllbnRTZWNyZXQsIGFjY2Vzc1Rva2VuKTtcbiAgY29uc3QgY2xpZW50SWQgPVxuICAgIGF1dGhUeXBlID09PSBBdXRoVHlwZS5EYXRhYnJpY2tzQ2xpXG4gICAgICA/IChjbGllbnRJZFZhbHVlID8/IERFRkFVTFRfQ0xJRU5UX0lEKVxuICAgICAgOiBhdXRoVHlwZSA9PT0gQXV0aFR5cGUuT0F1dGhNMk0gfHwgYXV0aFR5cGUgPT09IEF1dGhUeXBlLkFwcFNlcnZpY2VQcmluY2lwYWxcbiAgICAgICAgPyAoY2xpZW50SWRWYWx1ZSA/PyBtaXNzaW5nKGNyZWRlbnRpYWxOYW1lLCBcImNsaWVudF9pZFwiKSlcbiAgICAgICAgOiAoY2xpZW50SWRWYWx1ZSA/PyBcIlwiKTtcbiAgY29uc3Qgc2NvcGVzID0gb3B0aW9ucy5zY29wZXM/Lmxlbmd0aFxuICAgID8gc3RyaW5nVXRpbHMucGFyc2VMaXN0KG9wdGlvbnMuc2NvcGVzKVxuICAgIDogc3RyaW5nVXRpbHMucGFyc2VMaXN0KGNvbmZpZ3VyZWQuc2NvcGVzPy5zcGxpdChcIixcIikgPz8gW1wiYWxsLWFwaXNcIl0pO1xuICBjb25zdCB0YXJnZXQgPSBvcHRpb25zLnRhcmdldCA/IHBhcnNlVGFyZ2V0KG9wdGlvbnMudGFyZ2V0KSA6IGluZmVyVGFyZ2V0KGhvc3QsIGFjY291bnRJZCk7XG4gIGNvbnN0IGdyb3VwSWQgPVxuICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChvcHRpb25zLmdyb3VwSWQpID8/XG4gICAgYW1iaWVudChcIkRBVEFCUklDS1NfR1JPVVBfSURcIikgPz9cbiAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQoY29uZmlndXJlZC5ncm91cElkKTtcbiAgY29uc3QgcHJpbmNpcGFsID1cbiAgICBhdXRoVHlwZSA9PT0gQXV0aFR5cGUuT0F1dGhNMk0gfHwgYXV0aFR5cGUgPT09IEF1dGhUeXBlLkFwcFNlcnZpY2VQcmluY2lwYWxcbiAgICAgID8gY2xpZW50SWRcbiAgICAgIDogY3JlZGVudGlhbE5hbWU7XG4gIGNvbnN0IGNhY2hlS2V5ID0gY3JlZGVudGlhbENhY2hlS2V5KHtcbiAgICBuYW1lOiBjcmVkZW50aWFsTmFtZSxcbiAgICBob3N0LFxuICAgIGFjY291bnRJZCxcbiAgICB3b3Jrc3BhY2VJZCxcbiAgICBjbGllbnRJZCxcbiAgICBncm91cElkLFxuICAgIHNjb3BlcyxcbiAgICBhdXRoVHlwZSxcbiAgICBhY2Nlc3NUb2tlbixcbiAgfSk7XG4gIGxvZ2dlci5kZWJ1ZyhcInJlc29sdmVkIERhdGFicmlja3MgcHJvZmlsZVwiLCB7XG4gICAgcHJvZmlsZTogY3JlZGVudGlhbE5hbWUsXG4gICAgaG9zdCxcbiAgICBhdXRoVHlwZSxcbiAgICB0YXJnZXQsXG4gICAgaW5BcHAsXG4gICAgZXhwbGljaXRQcm9maWxlLFxuICAgIGNvbmZpZ3VyZWRBdXRoVHlwZTogY29uZmlndXJlZEF1dGhUeXBlID8/IFwiYXV0b21hdGljXCIsXG4gICAgaGFzQWNjb3VudElkOiBCb29sZWFuKGFjY291bnRJZCksXG4gICAgaGFzV29ya3NwYWNlSWQ6IEJvb2xlYW4od29ya3NwYWNlSWQpLFxuICAgIGhhc0dyb3VwSWQ6IEJvb2xlYW4oZ3JvdXBJZCksXG4gICAgc2NvcGVDb3VudDogc2NvcGVzLmxlbmd0aCxcbiAgICBjb25maWdQYXRoLFxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBjcmVkZW50aWFsTmFtZSxcbiAgICAuLi4oc2VsZWN0ZWRQcm9maWxlID8geyBzZWxlY3RlZFByb2ZpbGUgfSA6IHt9KSxcbiAgICBob3N0LFxuICAgIC4uLihhY2NvdW50SWQgPyB7IGFjY291bnRJZCB9IDoge30pLFxuICAgIC4uLih3b3Jrc3BhY2VJZCA/IHsgd29ya3NwYWNlSWQgfSA6IHt9KSxcbiAgICBjbGllbnRJZCxcbiAgICAuLi4oZ3JvdXBJZCA/IHsgZ3JvdXBJZCB9IDoge30pLFxuICAgIHNjb3BlcyxcbiAgICB0YXJnZXQsXG4gICAgYXV0aFR5cGUsXG4gICAgLi4uKGNsaWVudFNlY3JldCA/IHsgY2xpZW50U2VjcmV0IH0gOiB7fSksXG4gICAgLi4uKGFjY2Vzc1Rva2VuID8geyBhY2Nlc3NUb2tlbiB9IDoge30pLFxuICAgIGNhY2hlS2V5LFxuICAgIHByaW5jaXBhbCxcbiAgfTtcbn1cblxuLyoqIE5vcm1hbGl6ZSBPQXV0aCBzY29wZXMgZm9yIG1hY2hpbmUgY3JlZGVudGlhbHMuICovXG5leHBvcnQgZnVuY3Rpb24gbWFjaGluZVNjb3BlcyhzY29wZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gc3RyaW5nVXRpbHMucGFyc2VMaXN0KHNjb3Blcy5sZW5ndGggPyBzY29wZXMgOiBbXCJhbGwtYXBpc1wiXSkuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBjcmVkZW50aWFsQ2FjaGVLZXkoXG4gIHByb2ZpbGU6IFBpY2s8XG4gICAgRGF0YWJyaWNrc1Byb2ZpbGUsXG4gICAgfCBcIm5hbWVcIlxuICAgIHwgXCJob3N0XCJcbiAgICB8IFwiYWNjb3VudElkXCJcbiAgICB8IFwid29ya3NwYWNlSWRcIlxuICAgIHwgXCJjbGllbnRJZFwiXG4gICAgfCBcImdyb3VwSWRcIlxuICAgIHwgXCJzY29wZXNcIlxuICAgIHwgXCJhdXRoVHlwZVwiXG4gICAgfCBcImFjY2Vzc1Rva2VuXCJcbiAgPixcbik6IHN0cmluZyB7XG4gIGlmIChwcm9maWxlLmF1dGhUeXBlID09PSBBdXRoVHlwZS5EYXRhYnJpY2tzQ2xpKSByZXR1cm4gcHJvZmlsZS5uYW1lO1xuICBpZiAocHJvZmlsZS5hdXRoVHlwZSA9PT0gQXV0aFR5cGUuUGVyc29uYWxBY2Nlc3NUb2tlbikge1xuICAgIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAgIC51cGRhdGUocHJvZmlsZS5hY2Nlc3NUb2tlbiA/PyBcIlwiKVxuICAgICAgLmRpZ2VzdChcImhleFwiKTtcbiAgICByZXR1cm4gYCR7cHJvZmlsZS5uYW1lfS1wYXQtJHtkaWdlc3R9YDtcbiAgfVxuICBpZiAocHJvZmlsZS5hdXRoVHlwZSA9PT0gQXV0aFR5cGUuQXBwT25CZWhhbGZPZikgcmV0dXJuIGAke3Byb2ZpbGUubmFtZX0tYXBwLW9ib2A7XG4gIGNvbnN0IGlkZW50aXR5ID0gW1xuICAgIHByb2ZpbGUuaG9zdCxcbiAgICBwcm9maWxlLmFjY291bnRJZCA/PyBcIlwiLFxuICAgIHByb2ZpbGUud29ya3NwYWNlSWQgPz8gXCJcIixcbiAgICBwcm9maWxlLmNsaWVudElkLFxuICAgIHByb2ZpbGUuZ3JvdXBJZCA/PyBcIlwiLFxuICAgIG1hY2hpbmVTY29wZXMocHJvZmlsZS5zY29wZXMpLmpvaW4oXCIgXCIpLFxuICBdLmpvaW4oXCJcXDBcIik7XG4gIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKGlkZW50aXR5KS5kaWdlc3QoXCJoZXhcIik7XG4gIHJldHVybiBgJHtwcm9maWxlLm5hbWV9LSR7cHJvZmlsZS5hdXRoVHlwZSA9PT0gQXV0aFR5cGUuQXBwU2VydmljZVByaW5jaXBhbCA/IFwiYXBwLXNwXCIgOiBcIm9hdXRoLW0ybVwifS0ke2RpZ2VzdH1gO1xufVxuIl19
@@ -5,7 +5,7 @@ export interface ListProfilesOptions {
5
5
  configFile?: string;
6
6
  refresh?: boolean;
7
7
  }
8
- /** Resolve one selected profile without exposing credentials. */
9
- export declare function resolveProfile(options?: DatabricksAuthOptions): DatabricksProfileSummary;
8
+ /** Resolve one configured profile without exposing credentials, or `null` when none exists. */
9
+ export declare function resolveProfile(options?: DatabricksAuthOptions): DatabricksProfileSummary | null;
10
10
  /** List configured profiles without exposing credentials. */
11
11
  export declare function listProfiles(options?: ListProfilesOptions): DatabricksProfileSummary[];
@@ -1,7 +1,26 @@
1
+ import { AuthError } from "./_errors.js";
1
2
  import { listDatabricksProfiles, resolveDatabricksProfile } from "./_profile-config.js";
2
- /** Resolve one selected profile without exposing credentials. */
3
+ /** Resolve one configured profile without exposing credentials, or `null` when none exists. */
3
4
  export function resolveProfile(options = {}) {
4
- return toProfileSummary(resolveDatabricksProfile(options));
5
+ const configured = listDatabricksProfiles(options.configFile);
6
+ if (configured.length === 0)
7
+ return null;
8
+ const environment = options.configFile
9
+ ? { DATABRICKS_CONFIG_FILE: options.configFile }
10
+ : process.env;
11
+ try {
12
+ const resolved = resolveDatabricksProfile(options, environment);
13
+ if (!resolved.selectedProfile ||
14
+ !configured.some(({ name }) => name === resolved.selectedProfile)) {
15
+ return null;
16
+ }
17
+ return toProfileSummary(resolved);
18
+ }
19
+ catch (error) {
20
+ if (error instanceof AuthError && error.kind === "config")
21
+ return null;
22
+ throw error;
23
+ }
5
24
  }
6
25
  /** List configured profiles without exposing credentials. */
7
26
  export function listProfiles(options = {}) {
@@ -18,4 +37,4 @@ function toProfileSummary(profile) {
18
37
  principal: profile.principal,
19
38
  };
20
39
  }
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBVXhGLGlFQUFpRTtBQUNqRSxNQUFNLFVBQVUsY0FBYyxDQUFDLFVBQWlDLEVBQUU7SUFDaEUsT0FBTyxnQkFBZ0IsQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQzdELENBQUM7QUFFRCw2REFBNkQ7QUFDN0QsTUFBTSxVQUFVLFlBQVksQ0FBQyxVQUErQixFQUFFO0lBQzVELE9BQU8sc0JBQXNCLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsT0FBMEI7SUFDbEQsT0FBTztRQUNMLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNsQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDbEIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlELEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDdEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1FBQzFCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztLQUM3QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRGF0YWJyaWNrc1Byb2ZpbGVTdW1tYXJ5IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWF1dGgvcHJvZmlsZVwiO1xuXG5pbXBvcnQgeyBsaXN0RGF0YWJyaWNrc1Byb2ZpbGVzLCByZXNvbHZlRGF0YWJyaWNrc1Byb2ZpbGUgfSBmcm9tIFwiLi9fcHJvZmlsZS1jb25maWcudHNcIjtcbmltcG9ydCB0eXBlIHsgRGF0YWJyaWNrc1Byb2ZpbGUgfSBmcm9tIFwiLi9fdHlwZXMudHNcIjtcbmltcG9ydCB0eXBlIHsgRGF0YWJyaWNrc0F1dGhPcHRpb25zIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5cbi8qKiBQcm9maWxlLWxpc3RpbmcgY29udHJvbHMuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RQcm9maWxlc09wdGlvbnMge1xuICBjb25maWdGaWxlPzogc3RyaW5nO1xuICByZWZyZXNoPzogYm9vbGVhbjtcbn1cblxuLyoqIFJlc29sdmUgb25lIHNlbGVjdGVkIHByb2ZpbGUgd2l0aG91dCBleHBvc2luZyBjcmVkZW50aWFscy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUHJvZmlsZShvcHRpb25zOiBEYXRhYnJpY2tzQXV0aE9wdGlvbnMgPSB7fSk6IERhdGFicmlja3NQcm9maWxlU3VtbWFyeSB7XG4gIHJldHVybiB0b1Byb2ZpbGVTdW1tYXJ5KHJlc29sdmVEYXRhYnJpY2tzUHJvZmlsZShvcHRpb25zKSk7XG59XG5cbi8qKiBMaXN0IGNvbmZpZ3VyZWQgcHJvZmlsZXMgd2l0aG91dCBleHBvc2luZyBjcmVkZW50aWFscy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0UHJvZmlsZXMob3B0aW9uczogTGlzdFByb2ZpbGVzT3B0aW9ucyA9IHt9KTogRGF0YWJyaWNrc1Byb2ZpbGVTdW1tYXJ5W10ge1xuICByZXR1cm4gbGlzdERhdGFicmlja3NQcm9maWxlcyhvcHRpb25zLmNvbmZpZ0ZpbGUsIG9wdGlvbnMucmVmcmVzaCk7XG59XG5cbmZ1bmN0aW9uIHRvUHJvZmlsZVN1bW1hcnkocHJvZmlsZTogRGF0YWJyaWNrc1Byb2ZpbGUpOiBEYXRhYnJpY2tzUHJvZmlsZVN1bW1hcnkge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IHByb2ZpbGUubmFtZSxcbiAgICBob3N0OiBwcm9maWxlLmhvc3QsXG4gICAgLi4uKHByb2ZpbGUuYWNjb3VudElkID8geyBhY2NvdW50SWQ6IHByb2ZpbGUuYWNjb3VudElkIH0gOiB7fSksXG4gICAgLi4uKHByb2ZpbGUud29ya3NwYWNlSWQgPyB7IHdvcmtzcGFjZUlkOiBwcm9maWxlLndvcmtzcGFjZUlkIH0gOiB7fSksXG4gICAgdGFyZ2V0OiBwcm9maWxlLnRhcmdldCxcbiAgICBhdXRoVHlwZTogcHJvZmlsZS5hdXRoVHlwZSxcbiAgICBwcmluY2lwYWw6IHByb2ZpbGUucHJpbmNpcGFsLFxuICB9O1xufVxuIl19
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFVeEYsK0ZBQStGO0FBQy9GLE1BQU0sVUFBVSxjQUFjLENBQzVCLFVBQWlDLEVBQUU7SUFFbkMsTUFBTSxVQUFVLEdBQUcsc0JBQXNCLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlELElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDekMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFVBQVU7UUFDcEMsQ0FBQyxDQUFDLEVBQUUsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRTtRQUNoRCxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUNoQixJQUFJLENBQUM7UUFDSCxNQUFNLFFBQVEsR0FBRyx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDaEUsSUFDRSxDQUFDLFFBQVEsQ0FBQyxlQUFlO1lBQ3pCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQ2pFLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxLQUFLLFlBQVksU0FBUyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3ZFLE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUM7QUFFRCw2REFBNkQ7QUFDN0QsTUFBTSxVQUFVLFlBQVksQ0FBQyxVQUErQixFQUFFO0lBQzVELE9BQU8sc0JBQXNCLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsT0FBMEI7SUFDbEQsT0FBTztRQUNMLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNsQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDbEIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlELEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDdEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1FBQzFCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztLQUM3QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRGF0YWJyaWNrc1Byb2ZpbGVTdW1tYXJ5IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWF1dGgvcHJvZmlsZVwiO1xuXG5pbXBvcnQgeyBBdXRoRXJyb3IgfSBmcm9tIFwiLi9fZXJyb3JzLnRzXCI7XG5pbXBvcnQgeyBsaXN0RGF0YWJyaWNrc1Byb2ZpbGVzLCByZXNvbHZlRGF0YWJyaWNrc1Byb2ZpbGUgfSBmcm9tIFwiLi9fcHJvZmlsZS1jb25maWcudHNcIjtcbmltcG9ydCB0eXBlIHsgRGF0YWJyaWNrc1Byb2ZpbGUgfSBmcm9tIFwiLi9fdHlwZXMudHNcIjtcbmltcG9ydCB0eXBlIHsgRGF0YWJyaWNrc0F1dGhPcHRpb25zIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5cbi8qKiBQcm9maWxlLWxpc3RpbmcgY29udHJvbHMuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RQcm9maWxlc09wdGlvbnMge1xuICBjb25maWdGaWxlPzogc3RyaW5nO1xuICByZWZyZXNoPzogYm9vbGVhbjtcbn1cblxuLyoqIFJlc29sdmUgb25lIGNvbmZpZ3VyZWQgcHJvZmlsZSB3aXRob3V0IGV4cG9zaW5nIGNyZWRlbnRpYWxzLCBvciBgbnVsbGAgd2hlbiBub25lIGV4aXN0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUHJvZmlsZShcbiAgb3B0aW9uczogRGF0YWJyaWNrc0F1dGhPcHRpb25zID0ge30sXG4pOiBEYXRhYnJpY2tzUHJvZmlsZVN1bW1hcnkgfCBudWxsIHtcbiAgY29uc3QgY29uZmlndXJlZCA9IGxpc3REYXRhYnJpY2tzUHJvZmlsZXMob3B0aW9ucy5jb25maWdGaWxlKTtcbiAgaWYgKGNvbmZpZ3VyZWQubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgZW52aXJvbm1lbnQgPSBvcHRpb25zLmNvbmZpZ0ZpbGVcbiAgICA/IHsgREFUQUJSSUNLU19DT05GSUdfRklMRTogb3B0aW9ucy5jb25maWdGaWxlIH1cbiAgICA6IHByb2Nlc3MuZW52O1xuICB0cnkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZURhdGFicmlja3NQcm9maWxlKG9wdGlvbnMsIGVudmlyb25tZW50KTtcbiAgICBpZiAoXG4gICAgICAhcmVzb2x2ZWQuc2VsZWN0ZWRQcm9maWxlIHx8XG4gICAgICAhY29uZmlndXJlZC5zb21lKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gcmVzb2x2ZWQuc2VsZWN0ZWRQcm9maWxlKVxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0b1Byb2ZpbGVTdW1tYXJ5KHJlc29sdmVkKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBdXRoRXJyb3IgJiYgZXJyb3Iua2luZCA9PT0gXCJjb25maWdcIikgcmV0dXJuIG51bGw7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqIExpc3QgY29uZmlndXJlZCBwcm9maWxlcyB3aXRob3V0IGV4cG9zaW5nIGNyZWRlbnRpYWxzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RQcm9maWxlcyhvcHRpb25zOiBMaXN0UHJvZmlsZXNPcHRpb25zID0ge30pOiBEYXRhYnJpY2tzUHJvZmlsZVN1bW1hcnlbXSB7XG4gIHJldHVybiBsaXN0RGF0YWJyaWNrc1Byb2ZpbGVzKG9wdGlvbnMuY29uZmlnRmlsZSwgb3B0aW9ucy5yZWZyZXNoKTtcbn1cblxuZnVuY3Rpb24gdG9Qcm9maWxlU3VtbWFyeShwcm9maWxlOiBEYXRhYnJpY2tzUHJvZmlsZSk6IERhdGFicmlja3NQcm9maWxlU3VtbWFyeSB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogcHJvZmlsZS5uYW1lLFxuICAgIGhvc3Q6IHByb2ZpbGUuaG9zdCxcbiAgICAuLi4ocHJvZmlsZS5hY2NvdW50SWQgPyB7IGFjY291bnRJZDogcHJvZmlsZS5hY2NvdW50SWQgfSA6IHt9KSxcbiAgICAuLi4ocHJvZmlsZS53b3Jrc3BhY2VJZCA/IHsgd29ya3NwYWNlSWQ6IHByb2ZpbGUud29ya3NwYWNlSWQgfSA6IHt9KSxcbiAgICB0YXJnZXQ6IHByb2ZpbGUudGFyZ2V0LFxuICAgIGF1dGhUeXBlOiBwcm9maWxlLmF1dGhUeXBlLFxuICAgIHByaW5jaXBhbDogcHJvZmlsZS5wcmluY2lwYWwsXG4gIH07XG59XG4iXX0=
package/package.json CHANGED
@@ -24,9 +24,9 @@
24
24
  "typescript": "^5.9.3"
25
25
  },
26
26
  "dependencies": {
27
- "@dbx-tools/core": "^0.9.54",
28
- "@dbx-tools/shared-auth": "^0.9.54",
29
- "@dbx-tools/shared-core": "^0.9.54",
27
+ "@dbx-tools/core": "^0.9.60",
28
+ "@dbx-tools/shared-auth": "^0.9.60",
29
+ "@dbx-tools/shared-core": "^0.9.60",
30
30
  "ini": "^6.0.0",
31
31
  "oauth4webapi": "^3.8.8",
32
32
  "zod": "4.3.6"
@@ -65,7 +65,7 @@
65
65
  "./package.json": "./package.json"
66
66
  }
67
67
  },
68
- "version": "0.9.54",
68
+ "version": "0.9.60",
69
69
  "types": "./lib/index.d.ts",
70
70
  "dbxToolsConfig": {
71
71
  "tags": [
@@ -381,19 +381,26 @@ export function resolveDatabricksProfile(
381
381
  environment: Environment = process.env,
382
382
  ): DatabricksProfile {
383
383
  const inApp = environmentUtils.isDatabricksAppEnv({ ...environment });
384
- const environmentProfile = stringUtils.trimToUndefined(environment.DATABRICKS_CONFIG_PROFILE);
385
- const explicitProfile = Boolean(
386
- stringUtils.trimToUndefined(options.profile) ?? environmentProfile,
384
+ const configPath = resolveConfigFile(options.configFile, environment);
385
+ const config = loadConfig(options.configFile, false, environment);
386
+ const optionProfile = stringUtils.trimToUndefined(options.profile);
387
+ const configuredEnvironmentProfile = stringUtils.trimToUndefined(
388
+ environment.DATABRICKS_CONFIG_PROFILE,
387
389
  );
388
- const requestToken = requestOboToken(options.requestHeaders, options.accessTokenHeader);
389
- const explicitAuthType =
390
- options.authType ??
391
- (!inApp && !explicitProfile ? parseAuthType(environment.DATABRICKS_AUTH_TYPE) : undefined);
390
+ const environmentProfile =
391
+ configuredEnvironmentProfile && config?.has(configuredEnvironmentProfile)
392
+ ? configuredEnvironmentProfile
393
+ : undefined;
392
394
  const appServicePrincipal = [
393
395
  environment.DATABRICKS_HOST,
394
396
  environment.DATABRICKS_CLIENT_ID,
395
397
  environment.DATABRICKS_CLIENT_SECRET,
396
398
  ].every((value) => Boolean(stringUtils.trimToUndefined(value)));
399
+ const explicitProfile = Boolean(optionProfile ?? environmentProfile);
400
+ const requestToken = requestOboToken(options.requestHeaders, options.accessTokenHeader);
401
+ const explicitAuthType =
402
+ options.authType ??
403
+ (!inApp && !explicitProfile ? parseAuthType(environment.DATABRICKS_AUTH_TYPE) : undefined);
397
404
  const selectedAuthType =
398
405
  !inApp || explicitProfile || explicitAuthType
399
406
  ? explicitAuthType
@@ -406,9 +413,7 @@ export function resolveDatabricksProfile(
406
413
  selectedAuthType === AuthType.AppOnBehalfOf ||
407
414
  selectedAuthType === AuthType.AppServicePrincipal;
408
415
  const ignoreAmbientCredentials = explicitProfile && !appAuth;
409
- const configPath = resolveConfigFile(options.configFile, environment);
410
- const config = loadConfig(options.configFile, false, environment);
411
- const requestedName = stringUtils.trimToUndefined(options.profile) ?? environmentProfile;
416
+ const requestedName = optionProfile ?? environmentProfile;
412
417
  const profileName = resolveProfileName(
413
418
  requestedName,
414
419
  explicitProfile,
@@ -425,12 +430,13 @@ export function resolveDatabricksProfile(
425
430
  ].some((value) => Boolean(stringUtils.trimToUndefined(value)));
426
431
  const selectedProfile =
427
432
  explicitProfile || (!ambientCredentials && config?.has(profileName)) ? profileName : undefined;
428
- const configured = loadRawProfile(config, profileName);
433
+ const configured = selectedProfile ? loadRawProfile(config, profileName) : {};
434
+ const credentialName = selectedProfile ?? "ambient";
429
435
  const ambient = (name: keyof NodeJS.ProcessEnv): string | undefined =>
430
436
  ignoreAmbientCredentials ? undefined : stringUtils.trimToUndefined(environment[name]);
431
437
  const host = normalizeHost(
432
438
  options.host ?? ambient("DATABRICKS_HOST") ?? configured.host,
433
- profileName,
439
+ credentialName,
434
440
  );
435
441
  const accountId =
436
442
  stringUtils.trimToUndefined(options.accountId) ??
@@ -463,7 +469,7 @@ export function resolveDatabricksProfile(
463
469
  authType === AuthType.DatabricksCli
464
470
  ? (clientIdValue ?? DEFAULT_CLIENT_ID)
465
471
  : authType === AuthType.OAuthM2M || authType === AuthType.AppServicePrincipal
466
- ? (clientIdValue ?? missing(profileName, "client_id"))
472
+ ? (clientIdValue ?? missing(credentialName, "client_id"))
467
473
  : (clientIdValue ?? "");
468
474
  const scopes = options.scopes?.length
469
475
  ? stringUtils.parseList(options.scopes)
@@ -476,9 +482,9 @@ export function resolveDatabricksProfile(
476
482
  const principal =
477
483
  authType === AuthType.OAuthM2M || authType === AuthType.AppServicePrincipal
478
484
  ? clientId
479
- : profileName;
485
+ : credentialName;
480
486
  const cacheKey = credentialCacheKey({
481
- name: profileName,
487
+ name: credentialName,
482
488
  host,
483
489
  accountId,
484
490
  workspaceId,
@@ -489,7 +495,7 @@ export function resolveDatabricksProfile(
489
495
  accessToken,
490
496
  });
491
497
  logger.debug("resolved Databricks profile", {
492
- profile: profileName,
498
+ profile: credentialName,
493
499
  host,
494
500
  authType,
495
501
  target,
@@ -503,7 +509,7 @@ export function resolveDatabricksProfile(
503
509
  configPath,
504
510
  });
505
511
  return {
506
- name: profileName,
512
+ name: credentialName,
507
513
  ...(selectedProfile ? { selectedProfile } : {}),
508
514
  host,
509
515
  ...(accountId ? { accountId } : {}),
package/src/profile.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { DatabricksProfileSummary } from "@dbx-tools/shared-auth/profile";
2
2
 
3
+ import { AuthError } from "./_errors.ts";
3
4
  import { listDatabricksProfiles, resolveDatabricksProfile } from "./_profile-config.ts";
4
5
  import type { DatabricksProfile } from "./_types.ts";
5
6
  import type { DatabricksAuthOptions } from "./config.ts";
@@ -10,9 +11,28 @@ export interface ListProfilesOptions {
10
11
  refresh?: boolean;
11
12
  }
12
13
 
13
- /** Resolve one selected profile without exposing credentials. */
14
- export function resolveProfile(options: DatabricksAuthOptions = {}): DatabricksProfileSummary {
15
- return toProfileSummary(resolveDatabricksProfile(options));
14
+ /** Resolve one configured profile without exposing credentials, or `null` when none exists. */
15
+ export function resolveProfile(
16
+ options: DatabricksAuthOptions = {},
17
+ ): DatabricksProfileSummary | null {
18
+ const configured = listDatabricksProfiles(options.configFile);
19
+ if (configured.length === 0) return null;
20
+ const environment = options.configFile
21
+ ? { DATABRICKS_CONFIG_FILE: options.configFile }
22
+ : process.env;
23
+ try {
24
+ const resolved = resolveDatabricksProfile(options, environment);
25
+ if (
26
+ !resolved.selectedProfile ||
27
+ !configured.some(({ name }) => name === resolved.selectedProfile)
28
+ ) {
29
+ return null;
30
+ }
31
+ return toProfileSummary(resolved);
32
+ } catch (error) {
33
+ if (error instanceof AuthError && error.kind === "config") return null;
34
+ throw error;
35
+ }
16
36
  }
17
37
 
18
38
  /** List configured profiles without exposing credentials. */