@dbx-tools/appkit 0.9.144 → 0.9.145

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -356,10 +356,10 @@ behavior depends entirely on `NODE_ENV`:
356
356
  That throw is right for an app behind the front door, where a missing token means
357
357
  something is broken. It is fatal for an app whose traffic legitimately arrives
358
358
  without one - a public tunnel where callers authenticate by email code
359
- ([@dbx-tools/tunnel](../../node/tunnel)), or a bot channel that validates its
360
- own inbound JWT (`POST /api/teams/messages`). Those apps must not run with
361
- `NODE_ENV=development` only to get the fallback, because that flag also relaxes
362
- secure cookies and unlocks other dev-only escape hatches.
359
+ ([@dbx-tools/tunnel](../../node/tunnel)), or an authenticated webhook or bot
360
+ channel. Those apps must not run with `NODE_ENV=development` only to get the
361
+ fallback, because that flag also relaxes secure cookies and unlocks other
362
+ dev-only escape hatches.
363
363
 
364
364
  `identity` is that decision, made explicit:
365
365
 
@@ -390,7 +390,10 @@ Running as the service principal does not change which user owns the request. Th
390
390
  caller still arrives on `x-forwarded-user` / `x-forwarded-email` (read them with
391
391
  `identity.requestUserId()` / `requestUserEmail()`), so memory threads, cache
392
392
  namespaces, and trace attribution stay per-user - only the Databricks credential
393
- is shared. `@dbx-tools/appkit-mastra` exposes this as its `genieIdentity` option.
393
+ is shared. `appkit.createApp()` stamps the forwarded email, or user id when no
394
+ email is present, onto every native HTTP request root as OpenTelemetry
395
+ `user.id`. `@dbx-tools/appkit-mastra` exposes the credential choice as its
396
+ `genieIdentity` option.
394
397
 
395
398
  ## Modules
396
399
 
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/appkit";
6
- export const PACKAGE_VERSION = "0.9.144";
6
+ export const PACKAGE_VERSION = "0.9.145";
7
7
  export * as appkit from "./src/appkit.ts";
8
8
  export * as brandContext from "./src/brand-context.ts";
9
9
  export * as bundle from "./src/bundle.ts";
@@ -44,6 +44,7 @@ export type { SslMode, ParsedAddress, LakebaseConnectionInputs } from "./src/pga
44
44
  export type { RunPluginExecutionOptions } from "./src/plugin-execution.ts";
45
45
  export type { PluginContextLike } from "./src/plugin-registry.ts";
46
46
  export type { RequestTagValue } from "./src/request-tags.ts";
47
+ export { USER_TRACE_ATTRIBUTE } from "./src/telemetry.ts";
47
48
  export type { NativeHttpTelemetryOptions } from "./src/telemetry.ts";
48
49
  export type { AppKitToolMeta, AppKitOperationSchemaMeta, AppKitOperation } from "./src/tool-operations.ts";
49
50
  export { ToolRegistryPlugin } from "./src/tool-provider.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit";
2
- export declare const PACKAGE_VERSION = "0.9.144";
2
+ export declare const PACKAGE_VERSION = "0.9.145";
3
3
  export * as appkit from "./src/appkit.ts";
4
4
  export * as brandContext from "./src/brand-context.ts";
5
5
  export * as bundle from "./src/bundle.ts";
@@ -40,6 +40,7 @@ export type { SslMode, ParsedAddress, LakebaseConnectionInputs } from "./src/pga
40
40
  export type { RunPluginExecutionOptions } from "./src/plugin-execution.ts";
41
41
  export type { PluginContextLike } from "./src/plugin-registry.ts";
42
42
  export type { RequestTagValue } from "./src/request-tags.ts";
43
+ export { USER_TRACE_ATTRIBUTE } from "./src/telemetry.ts";
43
44
  export type { NativeHttpTelemetryOptions } from "./src/telemetry.ts";
44
45
  export type { AppKitToolMeta, AppKitOperationSchemaMeta, AppKitOperation } from "./src/tool-operations.ts";
45
46
  export { ToolRegistryPlugin } from "./src/tool-provider.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
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/appkit";
5
- export const PACKAGE_VERSION = "0.9.144";
5
+ export const PACKAGE_VERSION = "0.9.145";
6
6
  export * as appkit from "./src/appkit.js";
7
7
  export * as brandContext from "./src/brand-context.js";
8
8
  export * as bundle from "./src/bundle.js";
@@ -29,5 +29,6 @@ export { FilesCacheManager, FilesCachePlugin } from "./src/files-cache.js";
29
29
  export { ACCESS_TOKEN_HEADER, USER_ID_HEADER, USER_EMAIL_HEADER, IDENTITY_MODES, DEFAULT_IDENTITY_MODE } from "./src/identity.js";
30
30
  export { LifecycleBridgePlugin, lifecycleBridge } from "./src/interceptor.js";
31
31
  export { SSL_MODES } from "./src/pgaddress.js";
32
+ export { USER_TRACE_ATTRIBUTE } from "./src/telemetry.js";
32
33
  export { ToolRegistryPlugin } from "./src/tool-provider.js";
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUN0RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssVUFBVSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxLQUFLLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLGVBQWUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEtBQUssY0FBYyxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssY0FBYyxNQUFNLDBCQUEwQixDQUFDO0FBRTNELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0csT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVsSSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFLOUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBTy9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9hcHBraXRcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xNDRcIjtcbmV4cG9ydCAqIGFzIGFwcGtpdCBmcm9tIFwiLi9zcmMvYXBwa2l0LnRzXCI7XG5leHBvcnQgKiBhcyBicmFuZENvbnRleHQgZnJvbSBcIi4vc3JjL2JyYW5kLWNvbnRleHQudHNcIjtcbmV4cG9ydCAqIGFzIGJ1bmRsZSBmcm9tIFwiLi9zcmMvYnVuZGxlLnRzXCI7XG5leHBvcnQgKiBhcyBjYWNoZVN0b3JhZ2UgZnJvbSBcIi4vc3JjL2NhY2hlLXN0b3JhZ2UudHNcIjtcbmV4cG9ydCAqIGFzIGRhdGFicmlja3MgZnJvbSBcIi4vc3JjL2RhdGFicmlja3MudHNcIjtcbmV4cG9ydCAqIGFzIGZpbGVzQ2FjaGUgZnJvbSBcIi4vc3JjL2ZpbGVzLWNhY2hlLnRzXCI7XG5leHBvcnQgKiBhcyBpZGVudGl0eSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCAqIGFzIGludGVyY2VwdG9yIGZyb20gXCIuL3NyYy9pbnRlcmNlcHRvci50c1wiO1xuZXhwb3J0ICogYXMgbGFrZWJhc2VSZXNvbHZlciBmcm9tIFwiLi9zcmMvbGFrZWJhc2UtcmVzb2x2ZXIudHNcIjtcbmV4cG9ydCAqIGFzIG1pZ3JhdGlvbiBmcm9tIFwiLi9zcmMvbWlncmF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyBvcGVuYXBpVG9vbCBmcm9tIFwiLi9zcmMvb3BlbmFwaS10b29sLnRzXCI7XG5leHBvcnQgKiBhcyBwZ2FkZHJlc3MgZnJvbSBcIi4vc3JjL3BnYWRkcmVzcy50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luRXhlY3V0aW9uIGZyb20gXCIuL3NyYy9wbHVnaW4tZXhlY3V0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyBwbHVnaW5SZWdpc3RyeSBmcm9tIFwiLi9zcmMvcGx1Z2luLXJlZ2lzdHJ5LnRzXCI7XG5leHBvcnQgKiBhcyBwcm92aXNpb24gZnJvbSBcIi4vc3JjL3Byb3Zpc2lvbi50c1wiO1xuZXhwb3J0ICogYXMgcmVxdWVzdFRhZ3MgZnJvbSBcIi4vc3JjL3JlcXVlc3QtdGFncy50c1wiO1xuZXhwb3J0ICogYXMgdGVsZW1ldHJ5IGZyb20gXCIuL3NyYy90ZWxlbWV0cnkudHNcIjtcbmV4cG9ydCAqIGFzIHRvb2xPcGVyYXRpb25zIGZyb20gXCIuL3NyYy90b29sLW9wZXJhdGlvbnMudHNcIjtcbmV4cG9ydCAqIGFzIHRvb2xQcm92aWRlciBmcm9tIFwiLi9zcmMvdG9vbC1wcm92aWRlci50c1wiO1xuZXhwb3J0ICogYXMgdG9vbGtpdEVudHJpZXMgZnJvbSBcIi4vc3JjL3Rvb2xraXQtZW50cmllcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBBdXRvQ29uZmlndXJlTW9kZSwgQ3JlYXRlQXBwQ29uZmlnLCBFeGVjdXRpb25Db250ZXh0TGlrZSwgV29ya3NwYWNlQ2xpZW50TGlrZSB9IGZyb20gXCIuL3NyYy9hcHBraXQudHNcIjtcbmV4cG9ydCB7IGJ1bmRsZUFwcFJlc291cmNlU2NoZW1hLCBmbGF0dGVuQXBwWWFtbEVudiwgZmxhdHRlbkFwcEVudiwgZ2V0QnVuZGxlUGF0aCB9IGZyb20gXCIuL3NyYy9idW5kbGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgQnVuZGxlVmFsaWRhdGVKc29uLCBDb25maWdGaWxlLCBDb25maWdNYXBWYWx1ZSwgQ29uZmlnU291cmNlLCBSZXNvbHZlQ29uZmlnVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2J1bmRsZS50c1wiO1xuZXhwb3J0IHsgQXBwS2l0Q2FjaGVTdG9yYWdlIH0gZnJvbSBcIi4vc3JjL2NhY2hlLXN0b3JhZ2UudHNcIjtcbmV4cG9ydCB0eXBlIHsgQXBwS2l0Q2FjaGVTdG9yYWdlT3B0aW9ucywgUGVyc2lzdGVudFN0b3JhZ2VCYXNlIH0gZnJvbSBcIi4vc3JjL2NhY2hlLXN0b3JhZ2UudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ29udGV4dExpa2UgfSBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy50c1wiO1xuZXhwb3J0IHsgRmlsZXNDYWNoZU1hbmFnZXIsIEZpbGVzQ2FjaGVQbHVnaW4gfSBmcm9tIFwiLi9zcmMvZmlsZXMtY2FjaGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgRmlsZXNDYWNoZVBsdWdpbkNvbmZpZywgRmlsZXNDYWNoZVNjb3BlLCBGaWxlc0NhY2hlU291cmNlSWRlbnRpdHksIEZpbGVzQ2FjaGVFeHBvcnRzIH0gZnJvbSBcIi4vc3JjL2ZpbGVzLWNhY2hlLnRzXCI7XG5leHBvcnQgeyBBQ0NFU1NfVE9LRU5fSEVBREVSLCBVU0VSX0lEX0hFQURFUiwgVVNFUl9FTUFJTF9IRUFERVIsIElERU5USVRZX01PREVTLCBERUZBVUxUX0lERU5USVRZX01PREUgfSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCB0eXBlIHsgSWRlbnRpdHlNb2RlLCBIZWFkZXJCZWFyaW5nIH0gZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgeyBMaWZlY3ljbGVCcmlkZ2VQbHVnaW4sIGxpZmVjeWNsZUJyaWRnZSB9IGZyb20gXCIuL3NyYy9pbnRlcmNlcHRvci50c1wiO1xuZXhwb3J0IHR5cGUgeyBMaWZlY3ljbGVFdmVudCwgTGlmZWN5Y2xlSGFuZGxlciwgUmVzb2x2ZWRBcHBFbnYsIEludGVyY2VwdG9yQ29udGV4dCwgSW50ZXJjZXB0b3IsIEludGVyY2VwdG9yUnVudGltZSB9IGZyb20gXCIuL3NyYy9pbnRlcmNlcHRvci50c1wiO1xuZXhwb3J0IHR5cGUgeyBMYWtlYmFzZVJlc29sdmVySW5wdXRzLCBMYWtlYmFzZUNvbm5lY3Rpb24gfSBmcm9tIFwiLi9zcmMvbGFrZWJhc2UtcmVzb2x2ZXIudHNcIjtcbmV4cG9ydCB0eXBlIHsgT3duZXJzaGlwTWlncmF0aW9uRXJyb3JPcHRpb25zIH0gZnJvbSBcIi4vc3JjL21pZ3JhdGlvbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBPcGVuQXBpSHR0cE1ldGhvZCwgT3BlbkFwaVRvb2wsIE9wZW5BcGlUb29sc09wdGlvbnMgfSBmcm9tIFwiLi9zcmMvb3BlbmFwaS10b29sLnRzXCI7XG5leHBvcnQgeyBTU0xfTU9ERVMgfSBmcm9tIFwiLi9zcmMvcGdhZGRyZXNzLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNzbE1vZGUsIFBhcnNlZEFkZHJlc3MsIExha2ViYXNlQ29ubmVjdGlvbklucHV0cyB9IGZyb20gXCIuL3NyYy9wZ2FkZHJlc3MudHNcIjtcbmV4cG9ydCB0eXBlIHsgUnVuUGx1Z2luRXhlY3V0aW9uT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9wbHVnaW4tZXhlY3V0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IFBsdWdpbkNvbnRleHRMaWtlIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi1yZWdpc3RyeS50c1wiO1xuZXhwb3J0IHR5cGUgeyBSZXF1ZXN0VGFnVmFsdWUgfSBmcm9tIFwiLi9zcmMvcmVxdWVzdC10YWdzLnRzXCI7XG5leHBvcnQgdHlwZSB7IE5hdGl2ZUh0dHBUZWxlbWV0cnlPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3RlbGVtZXRyeS50c1wiO1xuZXhwb3J0IHR5cGUgeyBBcHBLaXRUb29sTWV0YSwgQXBwS2l0T3BlcmF0aW9uU2NoZW1hTWV0YSwgQXBwS2l0T3BlcmF0aW9uIH0gZnJvbSBcIi4vc3JjL3Rvb2wtb3BlcmF0aW9ucy50c1wiO1xuZXhwb3J0IHsgVG9vbFJlZ2lzdHJ5UGx1Z2luIH0gZnJvbSBcIi4vc3JjL3Rvb2wtcHJvdmlkZXIudHNcIjtcbmV4cG9ydCB0eXBlIHsgQWdlbnRUb29sUHJvZ3Jlc3NPcHRpb25zLCBBZ2VudFRvb2xFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vc3JjL3Rvb2wtcHJvdmlkZXIudHNcIjtcbiJdfQ==
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUN0RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssVUFBVSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxLQUFLLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLGVBQWUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEtBQUssY0FBYyxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssY0FBYyxNQUFNLDBCQUEwQixDQUFDO0FBRTNELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0csT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVsSSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFLOUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSy9DLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRzFELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9hcHBraXRcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xNDVcIjtcbmV4cG9ydCAqIGFzIGFwcGtpdCBmcm9tIFwiLi9zcmMvYXBwa2l0LnRzXCI7XG5leHBvcnQgKiBhcyBicmFuZENvbnRleHQgZnJvbSBcIi4vc3JjL2JyYW5kLWNvbnRleHQudHNcIjtcbmV4cG9ydCAqIGFzIGJ1bmRsZSBmcm9tIFwiLi9zcmMvYnVuZGxlLnRzXCI7XG5leHBvcnQgKiBhcyBjYWNoZVN0b3JhZ2UgZnJvbSBcIi4vc3JjL2NhY2hlLXN0b3JhZ2UudHNcIjtcbmV4cG9ydCAqIGFzIGRhdGFicmlja3MgZnJvbSBcIi4vc3JjL2RhdGFicmlja3MudHNcIjtcbmV4cG9ydCAqIGFzIGZpbGVzQ2FjaGUgZnJvbSBcIi4vc3JjL2ZpbGVzLWNhY2hlLnRzXCI7XG5leHBvcnQgKiBhcyBpZGVudGl0eSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCAqIGFzIGludGVyY2VwdG9yIGZyb20gXCIuL3NyYy9pbnRlcmNlcHRvci50c1wiO1xuZXhwb3J0ICogYXMgbGFrZWJhc2VSZXNvbHZlciBmcm9tIFwiLi9zcmMvbGFrZWJhc2UtcmVzb2x2ZXIudHNcIjtcbmV4cG9ydCAqIGFzIG1pZ3JhdGlvbiBmcm9tIFwiLi9zcmMvbWlncmF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyBvcGVuYXBpVG9vbCBmcm9tIFwiLi9zcmMvb3BlbmFwaS10b29sLnRzXCI7XG5leHBvcnQgKiBhcyBwZ2FkZHJlc3MgZnJvbSBcIi4vc3JjL3BnYWRkcmVzcy50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luRXhlY3V0aW9uIGZyb20gXCIuL3NyYy9wbHVnaW4tZXhlY3V0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyBwbHVnaW5SZWdpc3RyeSBmcm9tIFwiLi9zcmMvcGx1Z2luLXJlZ2lzdHJ5LnRzXCI7XG5leHBvcnQgKiBhcyBwcm92aXNpb24gZnJvbSBcIi4vc3JjL3Byb3Zpc2lvbi50c1wiO1xuZXhwb3J0ICogYXMgcmVxdWVzdFRhZ3MgZnJvbSBcIi4vc3JjL3JlcXVlc3QtdGFncy50c1wiO1xuZXhwb3J0ICogYXMgdGVsZW1ldHJ5IGZyb20gXCIuL3NyYy90ZWxlbWV0cnkudHNcIjtcbmV4cG9ydCAqIGFzIHRvb2xPcGVyYXRpb25zIGZyb20gXCIuL3NyYy90b29sLW9wZXJhdGlvbnMudHNcIjtcbmV4cG9ydCAqIGFzIHRvb2xQcm92aWRlciBmcm9tIFwiLi9zcmMvdG9vbC1wcm92aWRlci50c1wiO1xuZXhwb3J0ICogYXMgdG9vbGtpdEVudHJpZXMgZnJvbSBcIi4vc3JjL3Rvb2xraXQtZW50cmllcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBBdXRvQ29uZmlndXJlTW9kZSwgQ3JlYXRlQXBwQ29uZmlnLCBFeGVjdXRpb25Db250ZXh0TGlrZSwgV29ya3NwYWNlQ2xpZW50TGlrZSB9IGZyb20gXCIuL3NyYy9hcHBraXQudHNcIjtcbmV4cG9ydCB7IGJ1bmRsZUFwcFJlc291cmNlU2NoZW1hLCBmbGF0dGVuQXBwWWFtbEVudiwgZmxhdHRlbkFwcEVudiwgZ2V0QnVuZGxlUGF0aCB9IGZyb20gXCIuL3NyYy9idW5kbGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgQnVuZGxlVmFsaWRhdGVKc29uLCBDb25maWdGaWxlLCBDb25maWdNYXBWYWx1ZSwgQ29uZmlnU291cmNlLCBSZXNvbHZlQ29uZmlnVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2J1bmRsZS50c1wiO1xuZXhwb3J0IHsgQXBwS2l0Q2FjaGVTdG9yYWdlIH0gZnJvbSBcIi4vc3JjL2NhY2hlLXN0b3JhZ2UudHNcIjtcbmV4cG9ydCB0eXBlIHsgQXBwS2l0Q2FjaGVTdG9yYWdlT3B0aW9ucywgUGVyc2lzdGVudFN0b3JhZ2VCYXNlIH0gZnJvbSBcIi4vc3JjL2NhY2hlLXN0b3JhZ2UudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ29udGV4dExpa2UgfSBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy50c1wiO1xuZXhwb3J0IHsgRmlsZXNDYWNoZU1hbmFnZXIsIEZpbGVzQ2FjaGVQbHVnaW4gfSBmcm9tIFwiLi9zcmMvZmlsZXMtY2FjaGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgRmlsZXNDYWNoZVBsdWdpbkNvbmZpZywgRmlsZXNDYWNoZVNjb3BlLCBGaWxlc0NhY2hlU291cmNlSWRlbnRpdHksIEZpbGVzQ2FjaGVFeHBvcnRzIH0gZnJvbSBcIi4vc3JjL2ZpbGVzLWNhY2hlLnRzXCI7XG5leHBvcnQgeyBBQ0NFU1NfVE9LRU5fSEVBREVSLCBVU0VSX0lEX0hFQURFUiwgVVNFUl9FTUFJTF9IRUFERVIsIElERU5USVRZX01PREVTLCBERUZBVUxUX0lERU5USVRZX01PREUgfSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCB0eXBlIHsgSWRlbnRpdHlNb2RlLCBIZWFkZXJCZWFyaW5nIH0gZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgeyBMaWZlY3ljbGVCcmlkZ2VQbHVnaW4sIGxpZmVjeWNsZUJyaWRnZSB9IGZyb20gXCIuL3NyYy9pbnRlcmNlcHRvci50c1wiO1xuZXhwb3J0IHR5cGUgeyBMaWZlY3ljbGVFdmVudCwgTGlmZWN5Y2xlSGFuZGxlciwgUmVzb2x2ZWRBcHBFbnYsIEludGVyY2VwdG9yQ29udGV4dCwgSW50ZXJjZXB0b3IsIEludGVyY2VwdG9yUnVudGltZSB9IGZyb20gXCIuL3NyYy9pbnRlcmNlcHRvci50c1wiO1xuZXhwb3J0IHR5cGUgeyBMYWtlYmFzZVJlc29sdmVySW5wdXRzLCBMYWtlYmFzZUNvbm5lY3Rpb24gfSBmcm9tIFwiLi9zcmMvbGFrZWJhc2UtcmVzb2x2ZXIudHNcIjtcbmV4cG9ydCB0eXBlIHsgT3duZXJzaGlwTWlncmF0aW9uRXJyb3JPcHRpb25zIH0gZnJvbSBcIi4vc3JjL21pZ3JhdGlvbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBPcGVuQXBpSHR0cE1ldGhvZCwgT3BlbkFwaVRvb2wsIE9wZW5BcGlUb29sc09wdGlvbnMgfSBmcm9tIFwiLi9zcmMvb3BlbmFwaS10b29sLnRzXCI7XG5leHBvcnQgeyBTU0xfTU9ERVMgfSBmcm9tIFwiLi9zcmMvcGdhZGRyZXNzLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNzbE1vZGUsIFBhcnNlZEFkZHJlc3MsIExha2ViYXNlQ29ubmVjdGlvbklucHV0cyB9IGZyb20gXCIuL3NyYy9wZ2FkZHJlc3MudHNcIjtcbmV4cG9ydCB0eXBlIHsgUnVuUGx1Z2luRXhlY3V0aW9uT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9wbHVnaW4tZXhlY3V0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IFBsdWdpbkNvbnRleHRMaWtlIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi1yZWdpc3RyeS50c1wiO1xuZXhwb3J0IHR5cGUgeyBSZXF1ZXN0VGFnVmFsdWUgfSBmcm9tIFwiLi9zcmMvcmVxdWVzdC10YWdzLnRzXCI7XG5leHBvcnQgeyBVU0VSX1RSQUNFX0FUVFJJQlVURSB9IGZyb20gXCIuL3NyYy90ZWxlbWV0cnkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTmF0aXZlSHR0cFRlbGVtZXRyeU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvdGVsZW1ldHJ5LnRzXCI7XG5leHBvcnQgdHlwZSB7IEFwcEtpdFRvb2xNZXRhLCBBcHBLaXRPcGVyYXRpb25TY2hlbWFNZXRhLCBBcHBLaXRPcGVyYXRpb24gfSBmcm9tIFwiLi9zcmMvdG9vbC1vcGVyYXRpb25zLnRzXCI7XG5leHBvcnQgeyBUb29sUmVnaXN0cnlQbHVnaW4gfSBmcm9tIFwiLi9zcmMvdG9vbC1wcm92aWRlci50c1wiO1xuZXhwb3J0IHR5cGUgeyBBZ2VudFRvb2xQcm9ncmVzc09wdGlvbnMsIEFnZW50VG9vbEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9zcmMvdG9vbC1wcm92aWRlci50c1wiO1xuIl19
package/lib/src/appkit.js CHANGED
@@ -36,7 +36,7 @@ import { installAsUserDevelopmentPatch } from "./identity.js";
36
36
  import { createInterceptorContext, lifecycleBridge, } from "./interceptor.js";
37
37
  import { applyLakebaseEnv } from "./lakebase-resolver.js";
38
38
  import { provisionCacheSchema } from "./provision.js";
39
- import { bindNativeTelemetryProvider } from "./telemetry.js";
39
+ import { bindNativeTelemetryProvider, configureNativeHttpTelemetry, stampHttpTraceUser, } from "./telemetry.js";
40
40
  const logger = log.logger("appkit");
41
41
  const LAKEBASE_PLUGIN = "lakebase";
42
42
  /**
@@ -206,6 +206,7 @@ function interceptorList(interceptor) {
206
206
  */
207
207
  export async function createApp(config) {
208
208
  installAsUserDevelopmentPatch();
209
+ await configureNativeHttpTelemetry({ spanHook: stampHttpTraceUser });
209
210
  const plugins = pluginNames(config);
210
211
  const interceptors = interceptorList(config?.interceptor);
211
212
  logger.debug("createApp: start", {
@@ -324,4 +325,4 @@ export async function ensureInitialized() {
324
325
  await createApp({ plugins: [], autoConfigure: false });
325
326
  logger.debug("ensureInitialized: bare AppKit initialization complete");
326
327
  }
327
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwa2l0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcGtpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBRUgsT0FBTyxFQUNMLFNBQVMsSUFBSSxlQUFlLEVBQzVCLG1CQUFtQixFQUNuQixtQkFBbUIsR0FDcEIsTUFBTSxvQkFBb0IsQ0FBQztBQUk1QixPQUFPLEVBQUUsT0FBTyxJQUFJLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFekQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUQsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFDTCx3QkFBd0IsRUFHeEIsZUFBZSxHQUVoQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBMkIsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3RCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBOENwQyxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUM7QUFFbkM7Ozs7OztHQU1HO0FBQ0gsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDO0FBRTlDLFNBQVMsVUFBVSxDQUNqQixNQUFzQyxFQUN0QyxJQUFZO0lBRVosT0FBTyxPQUFPLENB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Q0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksbUJBQW1CLENBQUMsRUFBRSxDQUFDO1lBQzVDLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQjtJQUNyQyxJQUFJLHNCQUFzQixFQUFFLEVBQUUsQ0FBQztRQUM3QixNQUFNLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7UUFDdkQsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFDM0QsTUFBTSxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sQ0FBQyxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztBQUN6RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcHBLaXQgcnVudGltZSBnbHVlOiB0aGUgYXV0by1jb25maWd1cmluZyBgY3JlYXRlQXBwYCBkcm9wLWluLCBwbHVzIHRoZVxuICogcGVyLXJlcXVlc3QgZXhlY3V0aW9uIGNvbnRleHQgaGVscGVycyBhbmQgdHlwZXMgZGVyaXZlZCBmcm9tIGl0LlxuICpcbiAqIGBjcmVhdGVBcHBgIHJ1bnMgZGJ4LXRvb2xzIGF1dG8tY29uZmlndXJhdGlvbiwgdGhlbiBkZWxlZ2F0ZXMgdG8gQXBwS2l0J3Mgb3duXG4gKiBgY3JlYXRlQXBwYCB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cyBhbmQgdGhlIHNhbWUgdHlwZWQgcGx1Z2luLWV4cG9ydCBtYXAuXG4gKiBEcm9wIGl0IGluIGFzIGEgb25lLWZvci1vbmUgcmVwbGFjZW1lbnQ6XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IGxha2ViYXNlLCBzZXJ2ZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbiAqXG4gKiBhd2FpdCBhcHBraXQuY3JlYXRlQXBwKHsgcGx1Z2luczogW3NlcnZlcigpLCBsYWtlYmFzZSgpXSB9KTtcbiAqIGBgYFxuICpcbiAqIEF1dG8tY29uZmlndXJhdGlvbiBydW5zIEJFRk9SRSBkZWxlZ2F0aW5nIHNvIHBsdWdpbnMgc2VlIGEgZnVsbHkgcG9wdWxhdGVkXG4gKiBgcHJvY2Vzcy5lbnZgIGR1cmluZyB0aGVpciBzeW5jaHJvbm91cyBgc2V0dXAoKWAuIExha2ViYXNlIFBvc3RncmVzIHJlc29sdXRpb25cbiAqIHJ1bnMgd2hlbiBhIG5hdGl2ZSBgbGFrZWJhc2VgIG9yIGBkYXRhYmFzZWAgcGx1Z2luIGlzIHByZXNlbnQsIG9yIHdoZW5cbiAqIHtAbGluayBBdXRvQ29uZmlndXJlTW9kZX0gaXMgc2V0IGV4cGxpY2l0bHkgb24gdGhlIGNvbmZpZyBvYmplY3QuXG4gKlxuICogYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgaXMgQXBwS2l0J3Mgb3duIGFjY2Vzc29yIGZvciB0aGUgT0JPLXNjb3BlZCB3b3Jrc3BhY2VcbiAqIGNsaWVudCArIHJlcXVlc3QgbWV0YWRhdGE7IHRoZSB3cmFwcGVycyBoZXJlIG1ha2UgaXQgc2FmZSB0byBjYWxsIG91dHNpZGUgYVxuICogcmVxdWVzdCBzY29wZSAoe0BsaW5rIHRyeUdldEV4ZWN1dGlvbkNvbnRleHR9KSBhbmQgdG8gbGF6aWx5IGJvb3QgYSBiYXJlIGFwcFxuICogKHtAbGluayBlbnN1cmVJbml0aWFsaXplZH0pLCBhbmQgcmUtZXhwb3J0IHRoZSBkZXJpdmVkIHR5cGVzIHNvIGFkZC1vblxuICogcGFja2FnZXMgY2FuIHR5cGUgYSBjb250ZXh0IC8gY2xpZW50IHdpdGhvdXQgcmUtZGVyaXZpbmcgdGhlbSBpbmxpbmUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIGNyZWF0ZUFwcCBhcyBhcHBraXRDcmVhdGVBcHAsXG4gIGdldEV4ZWN1dGlvbkNvbnRleHQsXG4gIEluaXRpYWxpemF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbi8vIEFwcEtpdCdzIHJvb3QgYmFycmVsIHJlLWV4cG9ydHMgYFBsdWdpbkRhdGFgIGJ1dCBub3QgYFBsdWdpbk1hcGA7IHRoZSBwYWNrYWdlXG4vLyBwdWJsaXNoZXMgdGhpcyBzdWJwYXRoIGZvciBleGFjdGx5IHRoYXQgdHlwZS5cbmltcG9ydCB0eXBlIHsgUGx1Z2luTWFwIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9kaXN0L3NoYXJlZC9zcmMvcGx1Z2luXCI7XG5pbXBvcnQgeyBwcm9maWxlIGFzIGF1dGhQcm9maWxlIH0gZnJvbSBcIkBkYngtdG9vbHMvYXV0aFwiO1xuaW1wb3J0IHsgYXN5bmNVdGlscywgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuaW1wb3J0IHsgcmVzb2x2ZUF1dG9Db25maWd1cmVQb2xpY3kgfSBmcm9tIFwiLi9fYXV0by1jb25maWd1cmUudHNcIjtcbmltcG9ydCB7IGxvYWRCcmFuZENvbnRleHQgfSBmcm9tIFwiLi9icmFuZC1jb250ZXh0LnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVBcHBLaXRDYWNoZVN0b3JhZ2UgfSBmcm9tIFwiLi9jYWNoZS1zdG9yYWdlLnRzXCI7XG5pbXBvcnQgeyBpbnN0YWxsQXNVc2VyRGV2ZWxvcG1lbnRQYXRjaCB9IGZyb20gXCIuL2lkZW50aXR5LnRzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVJbnRlcmNlcHRvckNvbnRleHQsXG4gIHR5cGUgSW50ZXJjZXB0b3IsXG4gIHR5cGUgSW50ZXJjZXB0b3JSdW50aW1lLFxuICBsaWZlY3ljbGVCcmlkZ2UsXG4gIHR5cGUgUmVzb2x2ZWRBcHBFbnYsXG59IGZyb20gXCIuL2ludGVyY2VwdG9yLnRzXCI7XG5pbXBvcnQgeyBhcHBseUxha2ViYXNlRW52LCB0eXBlIExha2ViYXNlQ29ubmVjdGlvbiB9IGZyb20gXCIuL2xha2ViYXNlLXJlc29sdmVyLnRzXCI7XG5pbXBvcnQgeyBwcm92aXNpb25DYWNoZVNjaGVtYSB9IGZyb20gXCIuL3Byb3Zpc2lvbi50c1wiO1xuaW1wb3J0IHsgYmluZE5hdGl2ZVRlbGVtZXRyeVByb3ZpZGVyIH0gZnJvbSBcIi4vdGVsZW1ldHJ5LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXRcIik7XG5cbnR5cGUgQXBwS2l0Q3JlYXRlQXBwQ29uZmlnID0gTm9uTnVsbGFibGU8UGFyYW1ldGVyczx0eXBlb2YgYXBwa2l0Q3JlYXRlQXBwPlswXT47XG50eXBlIEFwcEtpdFBsdWdpbnMgPSBOb25OdWxsYWJsZTxBcHBLaXRDcmVhdGVBcHBDb25maWdbXCJwbHVnaW5zXCJdPjtcblxuLyoqXG4gKiBXaGF0IGF1dG8tY29uZmlndXJhdGlvbiBkb2VzIGJlZm9yZSBBcHBLaXQgYm9vdHMuXG4gKlxuICogLSBgXCJwcm92aXNpb25cImA6IHJlc29sdmUgdGhlIExha2ViYXNlIGNvbm5lY3Rpb24gaW50byBgcHJvY2Vzcy5lbnZgLCB0aGVuXG4gKiAgIGdyYW50IHRoZSBBcHBLaXQgY2FjaGUgc2NoZW1hIHRvIHRoZSBjb25uZWN0aW5nIHJvbGUuXG4gKiAtIGBcImVudlwiYDogcmVzb2x2ZSB0aGUgTGFrZWJhc2UgY29ubmVjdGlvbiBpbnRvIGBwcm9jZXNzLmVudmAgb25seS5cbiAqXG4gKiBPbWl0IGl0IHRvIHJlc29sdmUgZGF0YWJhc2UgZW52aXJvbm1lbnQgd2hlbiBhIG5hdGl2ZSBgbGFrZWJhc2VgIG9yXG4gKiBgZGF0YWJhc2VgIHBsdWdpbiBpcyByZWdpc3RlcmVkLiBJbXBsaWNpdCBjYWNoZS1zY2hlbWEgZ3JhbnRzIHJlbWFpbiBnYXRlZCBvblxuICogYGxha2ViYXNlYDsgYGRhdGFiYXNlYCBvd25zIGl0cyBvd24gcG9vbCBhbmQgZG9lcyBub3QgYnJvYWRlbiBncmFudHMuIFNldCB0aGVcbiAqIG1vZGUgZXhwbGljaXRseSB0byBydW4gcmVnYXJkbGVzcyBvZiB0aGUgcGx1Z2luIGxpc3QsIG9yIHBhc3MgYGZhbHNlYCB0byBza2lwXG4gKiBhdXRvLWNvbmZpZ3VyYXRpb24gZW50aXJlbHkuXG4gKlxuICogU2V0IGl0IEVYUExJQ0lUTFkgb24gYW4gYXBwIHRoYXQgaGFzIG5vIGBsYWtlYmFzZSgpYCBwbHVnaW4gYnV0IHN0aWxsIHdhbnRzXG4gKiBBcHBLaXQncyBQRVJTSVNURU5UIGNhY2hlLiBBcHBLaXQgcGlja3MgTGFrZWJhc2UgZm9yIGBDYWNoZU1hbmFnZXJgIG9ubHkgd2hlblxuICogYGNyZWF0ZUxha2ViYXNlUG9vbCgpYCBjYW4gYnVpbGQgYSBwb29sLCBhbmQgdGhhdCByZWFkcyBgTEFLRUJBU0VfRU5EUE9JTlRgIC9cbiAqIGBQR0hPU1RgIC8gYFBHREFUQUJBU0VgIHN0cmFpZ2h0IGZyb20gYHByb2Nlc3MuZW52YCAtIHNvIHdpdGhvdXQgdGhpcyBzdGVwIHRoZVxuICogY2FjaGUgc2lsZW50bHkgZmFsbHMgYmFjayB0byBpbi1tZW1vcnksIGFuZCBhbnl0aGluZyBpdCBob2xkcyAoYSBzZXNzaW9uXG4gKiBzaWduaW5nIGtleSwgYSBvbmUtdGltZSBjb2RlKSBpcyBsb3N0IG9uIHJlc3RhcnQuIGBcImVudlwiYCBpcyB0aGUgcmlnaHQgbW9kZVxuICogdGhlcmU6IHRoZSBhcHAgU1AgY2Fubm90IGdyYW50IG9uIHRoZSBjYWNoZSBzY2hlbWEgYW55d2F5LlxuICovXG5leHBvcnQgdHlwZSBBdXRvQ29uZmlndXJlTW9kZSA9IFwiZW52XCIgfCBcInByb3Zpc2lvblwiO1xuXG4vKiogQXBwS2l0J3MgYGNyZWF0ZUFwcGAgY29uZmlnIHBsdXMgdGhlIGRieC10b29scyBhdXRvLWNvbmZpZ3VyYXRpb24gc3dpdGNoLiAqL1xuZXhwb3J0IHR5cGUgQ3JlYXRlQXBwQ29uZmlnPFQgZXh0ZW5kcyBBcHBLaXRQbHVnaW5zID0gQXBwS2l0UGx1Z2lucz4gPSBPbWl0PFxuICBBcHBLaXRDcmVhdGVBcHBDb25maWcsXG4gIFwicGx1Z2luc1wiIHwgXCJvblBsdWdpbnNSZWFkeVwiXG4+ICYge1xuICBwbHVnaW5zPzogVDtcbiAgb25QbHVnaW5zUmVhZHk/OiAoYXBwa2l0OiBQbHVnaW5NYXA8VD4pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAvKiogQXV0by1jb25maWd1cmF0aW9uIHRvIHJ1biBiZWZvcmUgQXBwS2l0IGJvb3RzLiBEZWZhdWx0cyB0byBgXCJwcm92aXNpb25cImAuICovXG4gIGF1dG9Db25maWd1cmU/OiBBdXRvQ29uZmlndXJlTW9kZSB8IGZhbHNlO1xuICAvKipcbiAgICogT25lIG9yIG1hbnkge0BsaW5rIEludGVyY2VwdG9yfXMgaGFuZGVkIGFuIHtAbGluayBJbnRlcmNlcHRvckNvbnRleHR9IG9uY2VcbiAgICogYXV0by1jb25maWd1cmF0aW9uIGhhcyBjb21wdXRlZCB0aGUgZW52LiBFYWNoIHJlY2VpdmVzIHRoZSByZXNvbHZlZCBlbnYsIGFuXG4gICAqIEFwcEtpdCBsaWZlY3ljbGUgaG9vay4gU2VlIGAuL2ludGVyY2VwdG9yYC4gVGhlIHR1bm5lbCBpcyB0aGUgcHJpbWFyeVxuICAgKiBjb25zdW1lci5cbiAgICovXG4gIGludGVyY2VwdG9yPzogSW50ZXJjZXB0b3IgfCBJbnRlcmNlcHRvcltdO1xufTtcblxuY29uc3QgTEFLRUJBU0VfUExVR0lOID0gXCJsYWtlYmFzZVwiO1xuXG4vKipcbiAqIFVwcGVyIGJvdW5kIG9uIGJvb3QtdGltZSBhdXRvLWNvbmZpZ3VyYXRpb24uIEl0IHJ1bnMgYXMgdGhlIHNlcnZpY2UgcHJpbmNpcGFsXG4gKiBiZWZvcmUgYW55IHBsdWdpbiBpcyBjb25zdHJ1Y3RlZCwgc28gaXQgc2l0cyBvdXRzaWRlIEFwcEtpdCdzIGludGVyY2VwdG9yXG4gKiBjaGFpbiBhbmQgaW5oZXJpdHMgbm8gdGltZW91dCwgcmV0cnksIG9yIHRlbGVtZXRyeSBmcm9tIGl0LiBUaGUgYnVkZ2V0IGNvdmVyc1xuICogdGhlIHJlc29sdmVyJ3Mgb3duIHdvcnN0IGNhc2UgKGNyZWF0ZSBhIHByb2plY3QsIHRoZW4gd2FpdCBmb3IgaXRzIGVuZHBvaW50KVxuICogcGx1cyB0aGUgY2FjaGUtc2NoZW1hIGdyYW50cy5cbiAqL1xuY29uc3QgQVVUT19DT05GSUdVUkVfVElNRU9VVF9NUyA9IDExICogNjBfMDAwO1xuXG5mdW5jdGlvbiB1c2VzUGx1Z2luPFQgZXh0ZW5kcyBBcHBLaXRQbHVnaW5zPihcbiAgY29uZmlnOiBDcmVhdGVBcHBDb25maWc8VD4gfCB1bmRlZmluZWQsXG4gIG5hbWU6IHN0cmluZyxcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gQm9vbGVhbihjb25maWc/LnBsdWdpbnM/LnNvbWUoKGVudHJ5KSA9PiBlbnRyeS5uYW1lID09PSBuYW1lKSk7XG59XG5cbi8qKiBQbHVnaW4gbmFtZXMgZm9yIGJvb3QgbG9ncyAob3JkZXIgcHJlc2VydmVkKS4gKi9cbmZ1bmN0aW9uIHBsdWdpbk5hbWVzKGNvbmZpZzogQ3JlYXRlQXBwQ29uZmlnIHwgdW5kZWZpbmVkKTogc3RyaW5nW10ge1xuICByZXR1cm4gKGNvbmZpZz8ucGx1Z2lucyA/PyBbXSkubWFwKChlbnRyeSkgPT4gZW50cnkubmFtZSk7XG59XG5cbi8qKlxuICogUnVuIGVuYWJsZWQgYXV0by1jb25maWd1cmF0aW9uIHN0ZXBzIHdpdGhvdXQgY2FsbGluZyBBcHBLaXQncyBgY3JlYXRlQXBwYC5cbiAqXG4gKiBMYWtlYmFzZSBQb3N0Z3JlcyByZXNvbHZlcyB3aGVuIHtAbGluayBDcmVhdGVBcHBDb25maWcuYXV0b0NvbmZpZ3VyZX0gaXMgc2V0XG4gKiBleHBsaWNpdGx5IG9yIGEgbmF0aXZlIGBsYWtlYmFzZWAvYGRhdGFiYXNlYCBwbHVnaW4gaXMgbGlzdGVkIGluXG4gKiBgY29uZmlnLnBsdWdpbnNgLiBgc2lnbmFsYCBjYW5jZWxzIHRoZSByZXNvbHV0aW9uOyBpdCBpcyBjb21iaW5lZCB3aXRoIGFuXG4gKiBpbnRlcm5hbCBib290IHRpbWVvdXQgZWl0aGVyIHdheS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogLy8gUG9wdWxhdGUgUEdIT1NUIC8gUEdEQVRBQkFTRSAvIExBS0VCQVNFX0VORFBPSU5UIHdpdGhvdXQgYm9vdGluZyBBcHBLaXQuXG4gKiBhd2FpdCBhcHBraXQuYXV0b0NvbmZpZ3VyZSh7IGF1dG9Db25maWd1cmU6IFwiZW52XCIgfSk7XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhdXRvQ29uZmlndXJlPFQgZXh0ZW5kcyBBcHBLaXRQbHVnaW5zPihcbiAgY29uZmlnPzogQ3JlYXRlQXBwQ29uZmlnPFQ+LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8TGFrZWJhc2VDb25uZWN0aW9uIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGJ1bmRsZVByb2ZpbGUgPSBhcHBseURlZmF1bHRQcm9maWxlKCk7XG4gIGNvbnN0IHBsdWdpbnMgPSBwbHVnaW5OYW1lcyhjb25maWcpO1xuICBjb25zdCBwb2xpY3kgPSByZXNvbHZlQXV0b0NvbmZpZ3VyZVBvbGljeShwbHVnaW5zLCBjb25maWc/LmF1dG9Db25maWd1cmUpO1xuICBsb2dnZXIuZGVidWcoXCJhdXRvQ29uZmlndXJlOiBzdGFydFwiLCB7XG4gICAgLi4ucG9saWN5LFxuICAgIHBsdWdpbnMsXG4gICAgdGltZW91dE1zOiBBVVRPX0NPTkZJR1VSRV9USU1FT1VUX01TLFxuICAgIGNhbGxlclNpZ25hbDogQm9vbGVhbihzaWduYWwpLFxuICB9KTtcblxuICBpZiAoIXBvbGljeS5zaG91bGRSZXNvbHZlKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b0NvbmZpZ3VyZTogc2tpcFwiLCB7IC4uLnBvbGljeSwgcGx1Z2lucyB9KTtcbiAgICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICAgIGF1dG9Db25maWd1cmU6IHBvbGljeS5tb2RlLFxuICAgICAgbGFrZWJhc2VQbHVnaW5QcmVzZW50OiBwb2xpY3kubGFrZWJhc2VQbHVnaW5QcmVzZW50LFxuICAgICAgZGF0YWJhc2VQbHVnaW5QcmVzZW50OiBwb2xpY3kuZGF0YWJhc2VQbHVnaW5QcmVzZW50LFxuICAgICAgcHJvdmlzaW9uZWQ6IGZhbHNlLFxuICAgICAgc2tpcHBlZFJlYXNvbjogcG9saWN5LnNraXBwZWRSZWFzb24sXG4gICAgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGFzeW5jVXRpbHMudGllQWJvcnRTaWduYWwoY29udHJvbGxlciwgc2lnbmFsKTtcbiAgYXN5bmNVdGlscy50aWVBYm9ydFNpZ25hbChjb250cm9sbGVyLCBBYm9ydFNpZ25hbC50aW1lb3V0KEFVVE9fQ09ORklHVVJFX1RJTUVPVVRfTVMpKTtcblxuICBsb2dnZXIuZGVidWcoXCJhdXRvQ29uZmlndXJlOiByZXNvbHZlIGxha2ViYXNlXCIsIHtcbiAgICBwcm92aXNpb246IHBvbGljeS5wcm92aXNpb24sXG4gICAgbW9kZTogcG9saWN5Lm1vZGUsXG4gIH0pO1xuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGF1dG9Db25maWd1cmVMYWtlYmFzZShwb2xpY3kucHJvdmlzaW9uLCBjb250cm9sbGVyLnNpZ25hbCwgYnVuZGxlUHJvZmlsZSk7XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9Db25maWd1cmU6IGRvbmVcIiwge1xuICAgIG1vZGU6IHBvbGljeS5tb2RlLFxuICAgIGxha2ViYXNlUGx1Z2luUHJlc2VudDogcG9saWN5Lmxha2ViYXNlUGx1Z2luUHJlc2VudCxcbiAgICBkYXRhYmFzZVBsdWdpblByZXNlbnQ6IHBvbGljeS5kYXRhYmFzZVBsdWdpblByZXNlbnQsXG4gICAgcHJvdmlzaW9uZWQ6IHBvbGljeS5wcm92aXNpb24sXG4gICAgLi4ucmVkYWN0TGFrZWJhc2VDb25uZWN0aW9uKHJlc29sdmVkKSxcbiAgfSk7XG4gIGxvZ2dlci5pbmZvKFwicmVhZHlcIiwge1xuICAgIGF1dG9Db25maWd1cmU6IHBvbGljeS5tb2RlLFxuICAgIGxha2ViYXNlUGx1Z2luUHJlc2VudDogcG9saWN5Lmxha2ViYXNlUGx1Z2luUHJlc2VudCxcbiAgICBkYXRhYmFzZVBsdWdpblByZXNlbnQ6IHBvbGljeS5kYXRhYmFzZVBsdWdpblByZXNlbnQsXG4gICAgcHJvdmlzaW9uZWQ6IHBvbGljeS5wcm92aXNpb24sXG4gIH0pO1xuICByZXR1cm4gcmVzb2x2ZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBMYWtlYmFzZSBQb3N0Z3JlcyBjb25uZWN0aW9uIGluZm8sIHdyaXRlIHRoZSByZXNvbHZlZCB2YWx1ZXMgdG9cbiAqIGBwcm9jZXNzLmVudmAsIGFuZCByZXR1cm4gdGhlIHJlY29yZC4gVXNlZCBieSB7QGxpbmsgYXV0b0NvbmZpZ3VyZX07IGNhbGxcbiAqIHtAbGluayBhcHBseUxha2ViYXNlRW52fSBkaXJlY3RseSB3aGVuIGZpbmVyIGNvbnRyb2wgaXMgbmVlZGVkIChhIGRpZmZlcmVudFxuICogYGF1dG9DcmVhdGVgIHBvbGljeSwgb3IgYSBjYWxsZXIgdGhhdCB3YW50cyB0aGUgZW52IHdpdGhvdXQgYm9vdGluZyBBcHBLaXQpLlxuICovXG5hc3luYyBmdW5jdGlvbiBhdXRvQ29uZmlndXJlTGFrZWJhc2UoXG4gIHByb3Zpc2lvbjogYm9vbGVhbixcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgYnVuZGxlUHJvZmlsZT86IHN0cmluZyxcbik6IFByb21pc2U8TGFrZWJhc2VDb25uZWN0aW9uPiB7XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9Db25maWd1cmVMYWtlYmFzZTogYXBwbHlMYWtlYmFzZUVudlwiKTtcbiAgY29uc3QgeyByZXNvbHZlZCwgdXNlciB9ID0gYXdhaXQgYXBwbHlMYWtlYmFzZUVudih7IGJ1bmRsZVByb2ZpbGUgfSwgc2lnbmFsKTtcbiAgbG9nZ2VyLmRlYnVnKFwiYXV0b0NvbmZpZ3VyZUxha2ViYXNlOiBlbnYgYXBwbGllZFwiLCB7XG4gICAgLi4ucmVkYWN0TGFrZWJhc2VDb25uZWN0aW9uKHJlc29sdmVkKSxcbiAgICB1c2VyLFxuICAgIGVudjoge1xuICAgICAgTEFLRUJBU0VfRU5EUE9JTlQ6IHByb2Nlc3MuZW52LkxBS0VCQVNFX0VORFBPSU5ULFxuICAgICAgUEdIT1NUOiBwcm9jZXNzLmVudi5QR0hPU1QsXG4gICAgICBQR1BPUlQ6IHByb2Nlc3MuZW52LlBHUE9SVCxcbiAgICAgIFBHREFUQUJBU0U6IHByb2Nlc3MuZW52LlBHREFUQUJBU0UsXG4gICAgICBQR1VTRVI6IHByb2Nlc3MuZW52LlBHVVNFUixcbiAgICAgIFBHU1NMTU9ERTogcHJvY2Vzcy5lbnYuUEdTU0xNT0RFLFxuICAgIH0sXG4gIH0pO1xuICBsb2dnZXIuaW5mbyhcImVudiB1cGRhdGVkXCIsIHsgLi4ucmVkYWN0TGFrZWJhc2VDb25uZWN0aW9uKHJlc29sdmVkKSwgdXNlciB9KTtcbiAgaWYgKHByb3Zpc2lvbikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9Db25maWd1cmVMYWtlYmFzZTogcHJvdmlzaW9uQ2FjaGVTY2hlbWFcIiwgeyB1c2VyIH0pO1xuICAgIGF3YWl0IHByb3Zpc2lvbkNhY2hlU2NoZW1hKHVzZXIsIGxvZ2dlcik7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b0NvbmZpZ3VyZUxha2ViYXNlOiBwcm92aXNpb25DYWNoZVNjaGVtYSBkb25lXCIpO1xuICB9IGVsc2Uge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9Db25maWd1cmVMYWtlYmFzZTogc2tpcCBwcm92aXNpb24gKG1vZGU9ZW52KVwiKTtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZWQ7XG59XG5cbmZ1bmN0aW9uIGFwcGx5RGVmYXVsdFByb2ZpbGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29uZmlndXJlZCA9IHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQ09ORklHX1BST0ZJTEU/LnRyaW0oKTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBhdXRoUHJvZmlsZS5yZXNvbHZlUHJvZmlsZShjb25maWd1cmVkID8geyBwcm9maWxlOiBjb25maWd1cmVkIH0gOiB7fSk7XG4gIGlmICghcmVzb2x2ZWQpIHtcbiAgICBkZWxldGUgcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19DT05GSUdfUFJPRklMRTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQ09ORklHX1BST0ZJTEUgPSByZXNvbHZlZC5uYW1lO1xuICByZXR1cm4gcmVzb2x2ZWQubmFtZTtcbn1cblxuLyoqIFdoZXRoZXIgYGNyZWF0ZUFwcGAgc2hvdWxkIGluamVjdCB0aGUgZGVmYXVsdCBtZW1vcnktZmlyc3QgY2FjaGUgc3RvcmFnZS4gKi9cbmZ1bmN0aW9uIHNob3VsZEluamVjdENhY2hlU3RvcmFnZShjb25maWc6IENyZWF0ZUFwcENvbmZpZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBjb25zdCBjYWNoZSA9IGNvbmZpZz8uY2FjaGU7XG4gIGlmIChjYWNoZT8uZW5hYmxlZCA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgaWYgKGNhY2hlPy5zdG9yYWdlKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZWRhY3RMYWtlYmFzZUNvbm5lY3Rpb24ocmVzb2x2ZWQ6IExha2ViYXNlQ29ubmVjdGlvbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHtcbiAgICBwcm9qZWN0OiByZXNvbHZlZC5wcm9qZWN0LFxuICAgIGJyYW5jaDogcmVzb2x2ZWQuYnJhbmNoLFxuICAgIGVuZHBvaW50OiByZXNvbHZlZC5lbmRwb2ludCxcbiAgICBkYXRhYmFzZTogcmVzb2x2ZWQuZGF0YWJhc2UsXG4gICAgaG9zdDogcmVzb2x2ZWQuaG9zdCxcbiAgICBwb3J0OiByZXNvbHZlZC5wb3J0LFxuICAgIHNzbE1vZGU6IHJlc29sdmVkLnNzbE1vZGUsXG4gIH07XG59XG5cbi8qKiBCdWlsZCB0aGUge0BsaW5rIFJlc29sdmVkQXBwRW52fSBpbnRlcmNlcHRvcnMgcmVhZCwgZnJvbSB0aGUgYXV0by1jb25maWcgcmVzdWx0LiAqL1xuZnVuY3Rpb24gcmVzb2x2ZWRBcHBFbnYobGFrZWJhc2U6IExha2ViYXNlQ29ubmVjdGlvbiB8IHVuZGVmaW5lZCk6IFJlc29sdmVkQXBwRW52IHtcbiAgcmV0dXJuIHtcbiAgICAuLi4obGFrZWJhc2UgPyB7IGxha2ViYXNlIH0gOiB7fSksXG4gICAgLi4uKHByb2Nlc3MuZW52LkRBVEFCUklDS1NfSE9TVCA/IHsgZGF0YWJyaWNrc0hvc3Q6IHByb2Nlc3MuZW52LkRBVEFCUklDS1NfSE9TVCB9IDoge30pLFxuICB9O1xufVxuXG4vKiogTm9ybWFsaXplIHRoZSBgaW50ZXJjZXB0b3I/OiBJbnRlcmNlcHRvciB8IEludGVyY2VwdG9yW11gIG9wdGlvbiB0byBhbiBhcnJheS4gKi9cbmZ1bmN0aW9uIGludGVyY2VwdG9yTGlzdChpbnRlcmNlcHRvcjogQ3JlYXRlQXBwQ29uZmlnW1wiaW50ZXJjZXB0b3JcIl0pOiBJbnRlcmNlcHRvcltdIHtcbiAgaWYgKCFpbnRlcmNlcHRvcikgcmV0dXJuIFtdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShpbnRlcmNlcHRvcikgPyBpbnRlcmNlcHRvciA6IFtpbnRlcmNlcHRvcl07XG59XG5cbi8qKlxuICogQXV0by1jb25maWd1cmluZyBkcm9wLWluIGZvciBBcHBLaXQncyBgY3JlYXRlQXBwYDogc2FtZSBjb25maWcsIHNhbWUgdHlwZWRcbiAqIHBsdWdpbi1leHBvcnQgbWFwLCB3aXRoIHtAbGluayBhdXRvQ29uZmlndXJlfSBydW4gZmlyc3QuXG4gKlxuICogV2hlbiB7QGxpbmsgQ3JlYXRlQXBwQ29uZmlnLmludGVyY2VwdG9yfXMgYXJlIGdpdmVuLCBlYWNoIGlzIGludm9rZWQgd2l0aCBhblxuICoge0BsaW5rIEludGVyY2VwdG9yQ29udGV4dH0gQUZURVIgYXV0by1jb25maWd1cmF0aW9uIGNvbXB1dGVzIHRoZSBlbnYgYW5kIEJFRk9SRVxuICogQXBwS2l0IGJvb3RzIC0gc28gYW4gaW50ZXJjZXB0b3IgY2FuIHJlYWQgdGhlIHJlc29sdmVkIGNvbm5lY3Rpb24sIHJlZ2lzdGVyXG4gKiBsaWZlY3ljbGUgaGFuZGxlcnMsIGFuZCBzdGFydCBhdXhpbGlhcnkgd29yay4gQSBoaWRkZW4ge0BsaW5rIGxpZmVjeWNsZUJyaWRnZX1cbiAqIHBsdWdpbiBpcyBpbmplY3RlZCBzbyB0aG9zZSBgb25MaWZlY3ljbGVgIGhhbmRsZXJzIGZpcmUgb24gdGhlIGdlbnVpbmUgQXBwS2l0XG4gKiBldmVudHM7IGl0IGhhcyBubyBleHBvcnRzLCBzbyB0aGUgcmV0dXJuZWQge0BsaW5rIFBsdWdpbk1hcH0gaXMgdW5jaGFuZ2VkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBsYWtlYmFzZSwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogY29uc3QgYXBwID0gYXdhaXQgYXBwa2l0LmNyZWF0ZUFwcCh7IHBsdWdpbnM6IFtzZXJ2ZXIoKSwgbGFrZWJhc2UoKV0gfSk7XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVBcHA8VCBleHRlbmRzIEFwcEtpdFBsdWdpbnM+KFxuICBjb25maWc/OiBDcmVhdGVBcHBDb25maWc8VD4sXG4pOiBQcm9taXNlPFBsdWdpbk1hcDxUPj4ge1xuICBpbnN0YWxsQXNVc2VyRGV2ZWxvcG1lbnRQYXRjaCgpO1xuICBjb25zdCBwbHVnaW5zID0gcGx1Z2luTmFtZXMoY29uZmlnKTtcbiAgY29uc3QgaW50ZXJjZXB0b3JzID0gaW50ZXJjZXB0b3JMaXN0KGNvbmZpZz8uaW50ZXJjZXB0b3IpO1xuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IHN0YXJ0XCIsIHtcbiAgICBwbHVnaW5zLFxuICAgIHBsdWdpbkNvdW50OiBwbHVnaW5zLmxlbmd0aCxcbiAgICBpbnRlcmNlcHRvckNvdW50OiBpbnRlcmNlcHRvcnMubGVuZ3RoLFxuICAgIGF1dG9Db25maWd1cmU6IGNvbmZpZz8uYXV0b0NvbmZpZ3VyZSA/PyBcIihkZWZhdWx0KVwiLFxuICAgIGhhc09uUGx1Z2luc1JlYWR5OiB0eXBlb2YgY29uZmlnPy5vblBsdWdpbnNSZWFkeSA9PT0gXCJmdW5jdGlvblwiLFxuICB9KTtcblxuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IGF1dG9Db25maWd1cmVcIik7XG4gIGNvbnN0IGJyYW5kQ29udGV4dCA9IGF3YWl0IGxvYWRCcmFuZENvbnRleHQoKTtcbiAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBicmFuZCBjb250ZXh0IGxvYWRlZFwiLCB7IG5hbWU6IGJyYW5kQ29udGV4dC5uYW1lIH0pO1xuICBjb25zdCBsYWtlYmFzZSA9IGF3YWl0IGF1dG9Db25maWd1cmUoY29uZmlnKTtcbiAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBhdXRvQ29uZmlndXJlIHJldHVybmVkXCIsIHtcbiAgICBsYWtlYmFzZTogbGFrZWJhc2UgPyByZWRhY3RMYWtlYmFzZUNvbm5lY3Rpb24obGFrZWJhc2UpIDogdW5kZWZpbmVkLFxuICB9KTtcblxuICBjb25zdCBhcHBDb25maWcgPSB7IC4uLmNvbmZpZyB9O1xuICBkZWxldGUgYXBwQ29uZmlnLmF1dG9Db25maWd1cmU7XG4gIGRlbGV0ZSBhcHBDb25maWcuaW50ZXJjZXB0b3I7XG4gIGNvbnN0IG9uUGx1Z2luc1JlYWR5ID0gYXBwQ29uZmlnLm9uUGx1Z2luc1JlYWR5O1xuICBhcHBDb25maWcub25QbHVnaW5zUmVhZHkgPSBhc3luYyAoYXBwKSA9PiB7XG4gICAgY29uc3QgYm91bmQgPSBhd2FpdCBiaW5kTmF0aXZlVGVsZW1ldHJ5UHJvdmlkZXIoKTtcbiAgICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IG5hdGl2ZSB0ZWxlbWV0cnkgcHJvdmlkZXIgYmluZGluZ1wiLCB7IGJvdW5kIH0pO1xuICAgIGF3YWl0IG9uUGx1Z2luc1JlYWR5Py4oYXBwKTtcbiAgfTtcblxuICBpZiAoc2hvdWxkSW5qZWN0Q2FjaGVTdG9yYWdlKGNvbmZpZykpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IGluamVjdCBtZW1vcnktZmlyc3QgY2FjaGUgc3RvcmFnZVwiKTtcbiAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgY3JlYXRlQXBwS2l0Q2FjaGVTdG9yYWdlKHtcbiAgICAgIGNhY2hlOiBjb25maWc/LmNhY2hlLFxuICAgICAgcHJlZmVyTGFrZWJhc2U6IEJvb2xlYW4obGFrZWJhc2UpIHx8IHVzZXNQbHVnaW4oY29uZmlnLCBMQUtFQkFTRV9QTFVHSU4pLFxuICAgIH0pO1xuICAgIGFwcENvbmZpZy5jYWNoZSA9IHsgLi4uY29uZmlnPy5jYWNoZSwgc3RvcmFnZSB9O1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogbWVtb3J5LWZpcnN0IGNhY2hlIHN0b3JhZ2UgcmVhZHlcIiwge1xuICAgICAgcGVyc2lzdGVudDogc3RvcmFnZS5pc1BlcnNpc3RlbnQoKSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChpbnRlcmNlcHRvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBubyBpbnRlcmNlcHRvcnM7IGRlbGVnYXRpbmcgdG8gQXBwS2l0IGNyZWF0ZUFwcFwiLCB7XG4gICAgICBwbHVnaW5zOiBwbHVnaW5OYW1lcyhhcHBDb25maWcpLFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwcGtpdENyZWF0ZUFwcDxUPihhcHBDb25maWcpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogQXBwS2l0IGNyZWF0ZUFwcCByZXR1cm5lZFwiLCB7XG4gICAgICBleHBvcnRLZXlzOiBPYmplY3Qua2V5cyhyZXN1bHQgPz8ge30pLFxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBCdWlsZCB0aGUgY29udGV4dCBmcm9tIHRoZSBjb21wdXRlZCBlbnYsIHJ1biBlYWNoIGludGVyY2VwdG9yICh0aGV5IHJlZ2lzdGVyXG4gIC8vIGxpZmVjeWNsZSBoYW5kbGVycyArIGJpbmQgcHJvY2Vzc2VzKSwgdGhlbiBpbmplY3QgdGhlIGJyaWRnZSB0aGF0IHJlbGF5cyB0aGVcbiAgLy8gUkVBTCBBcHBLaXQgbGlmZWN5Y2xlIGludG8gYHJ1bnRpbWUuZW1pdExpZmVjeWNsZWAgZHVyaW5nIGl0cyBgc2V0dXAoKWAuXG4gIGNvbnN0IGVudiA9IHJlc29sdmVkQXBwRW52KGxha2ViYXNlKTtcbiAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBpbnRlcmNlcHRvciBjb250ZXh0XCIsIHtcbiAgICBoYXNMYWtlYmFzZTogQm9vbGVhbihlbnYubGFrZWJhc2UpLFxuICAgIGRhdGFicmlja3NIb3N0OiBlbnYuZGF0YWJyaWNrc0hvc3QsXG4gICAgaW50ZXJjZXB0b3JDb3VudDogaW50ZXJjZXB0b3JzLmxlbmd0aCxcbiAgfSk7XG4gIGNvbnN0IHJ1bnRpbWU6IEludGVyY2VwdG9yUnVudGltZSA9IGNyZWF0ZUludGVyY2VwdG9yQ29udGV4dChlbnYpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVyY2VwdG9ycy5sZW5ndGg7IGkrKykge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogcnVuIGludGVyY2VwdG9yXCIsIHsgaW5kZXg6IGksIG9mOiBpbnRlcmNlcHRvcnMubGVuZ3RoIH0pO1xuICAgIGF3YWl0IGludGVyY2VwdG9yc1tpXSEocnVudGltZS5jb250ZXh0KTtcbiAgICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IGludGVyY2VwdG9yIGRvbmVcIiwgeyBpbmRleDogaSB9KTtcbiAgfVxuICAvLyBBcHBlbmQgdGhlIGJyaWRnZSB0byB0aGUgcGx1Z2lucyB0dXBsZS4gSXQgaXMgaGlkZGVuIGFuZCBleHBvcnRzIG5vdGhpbmcsIHNvXG4gIC8vIHRoZSByZXR1cm5lZCBtYXAgc3RpbGwgbWF0Y2hlcyBgUGx1Z2luTWFwPFQ+YDsgdGhlIGNhc3QgKHRocm91Z2ggYHVua25vd25gKSBpc1xuICAvLyBvbmx5IGJlY2F1c2UgYXBwZW5kaW5nIHdpZGVucyB0aGUgdHVwbGUgdHlwZSBiZXlvbmQgYFRgLlxuICBhcHBDb25maWcucGx1Z2lucyA9IFsuLi4oYXBwQ29uZmlnLnBsdWdpbnMgPz8gW10pLCBsaWZlY3ljbGVCcmlkZ2UoeyBydW50aW1lIH0pXSBhcyB1bmtub3duIGFzIFQ7XG4gIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogbGlmZWN5Y2xlIGJyaWRnZSBpbmplY3RlZDsgZGVsZWdhdGluZyB0byBBcHBLaXQgY3JlYXRlQXBwXCIsIHtcbiAgICBwbHVnaW5zOiBwbHVnaW5OYW1lcyhhcHBDb25maWcpLFxuICB9KTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBwa2l0Q3JlYXRlQXBwPFQ+KGFwcENvbmZpZyk7XG4gIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogQXBwS2l0IGNyZWF0ZUFwcCByZXR1cm5lZFwiLCB7XG4gICAgZXhwb3J0S2V5czogT2JqZWN0LmtleXMocmVzdWx0ID8/IHt9KSxcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogVGhlIEFwcEtpdCBwZXItcmVxdWVzdCBleGVjdXRpb24gY29udGV4dCByZXR1cm5lZCBieSBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYFxuICogLSB0aGUgT0JPLXNjb3BlZCB3b3Jrc3BhY2UgY2xpZW50IHBsdXMgdGhlIHN1cnJvdW5kaW5nIHJlcXVlc3QgbWV0YWRhdGEuXG4gKiBEZXJpdmVkIGZyb20gQXBwS2l0J3Mgb3duIHJldHVybiB0eXBlIHNvIGl0IHRyYWNrcyB0aGUgaW5zdGFsbGVkIHZlcnNpb24sIGFuZFxuICogcmUtZXhwb3J0ZWQgaGVyZSBzbyBhZGQtb24gcGFja2FnZXMgY2FuIHR5cGUgYSBjb250ZXh0IHBhcmFtZXRlciB3aXRob3V0IGVhY2hcbiAqIHJlLWRlcml2aW5nIHRoZSBzYW1lIGBSZXR1cm5UeXBlPHR5cGVvZiBnZXRFeGVjdXRpb25Db250ZXh0PmAgaW5saW5lLlxuICovXG5leHBvcnQgdHlwZSBFeGVjdXRpb25Db250ZXh0TGlrZSA9IFJldHVyblR5cGU8dHlwZW9mIGdldEV4ZWN1dGlvbkNvbnRleHQ+O1xuXG4vKipcbiAqIFRoZSBhdXRoLXNjb3BlZCBEYXRhYnJpY2tzIHdvcmtzcGFjZSBjbGllbnQgY2FycmllZCBvbiBhblxuICogYEV4ZWN1dGlvbkNvbnRleHRMaWtlYCAoYGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnRgKS4gVHlwZWQgc3RydWN0dXJhbGx5XG4gKiBvZmYgQXBwS2l0IHNvIGNvbnN1bWVycyBkb24ndCB0YWtlIGEgZGlyZWN0IGBAZGF0YWJyaWNrcy9zZGstZXhwZXJpbWVudGFsYFxuICogZGVwZW5kZW5jeSAtIHRoZSBkZXAgZmxvd3MgaW4gdHJhbnNpdGl2ZWx5IHRocm91Z2ggYEBkYXRhYnJpY2tzL2FwcGtpdGAuXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZUNsaWVudExpa2UgPSBFeGVjdXRpb25Db250ZXh0TGlrZVtcImNsaWVudFwiXTtcblxuLyoqXG4gKiBUaGUgY3VycmVudCBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQsIG9yIGB1bmRlZmluZWRgIHdoZW4gQXBwS2l0IGlzbid0XG4gKiBpbml0aWFsaXplZCAob3V0c2lkZSBhIHJlcXVlc3Qgc2NvcGUpLiBTd2FsbG93cyBBcHBLaXQnc1xuICoge0BsaW5rIEluaXRpYWxpemF0aW9uRXJyb3J9OyBhbnkgb3RoZXIgZXJyb3IgcHJvcGFnYXRlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBjcmVhdGVXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKlxuICogLy8gT0JPLXNjb3BlZCBpbnNpZGUgYSByZXF1ZXN0LCBzZXJ2aWNlIHByaW5jaXBhbCBmcm9tIGEgQ0xJIG9yIHNjcmlwdC5cbiAqIGNvbnN0IGNsaWVudCA9IGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCk/LmNsaWVudCA/PyBjcmVhdGVXb3Jrc3BhY2VDbGllbnQoKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKTogRXhlY3V0aW9uQ29udGV4dExpa2UgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IGN0eCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgICBpZiAoY3R4Py5jbGllbnQpIHtcbiAgICAgIHJldHVybiBjdHg7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgSW5pdGlhbGl6YXRpb25FcnJvcikpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgYSBiYXJlIEFwcEtpdCBhcHAgKG5vIHBsdWdpbnMpIHdoZW4gbm9uZSBpcyBydW5uaW5nIHlldC5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogYXdhaXQgYXBwa2l0LmVuc3VyZUluaXRpYWxpemVkKCk7XG4gKiBjb25zdCBjbGllbnQgPSBhcHBraXQudHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpPy5jbGllbnQ7XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVJbml0aWFsaXplZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImVuc3VyZUluaXRpYWxpemVkOiBhbHJlYWR5IGluaXRpYWxpemVkXCIpO1xuICAgIHJldHVybjtcbiAgfVxuICBsb2dnZXIuZGVidWcoXCJlbnN1cmVJbml0aWFsaXplZDogYm9vdGluZyBiYXJlIEFwcEtpdCBhcHBcIik7XG4gIGF3YWl0IGNyZWF0ZUFwcCh7IHBsdWdpbnM6IFtdLCBhdXRvQ29uZmlndXJlOiBmYWxzZSB9KTtcbiAgbG9nZ2VyLmRlYnVnKFwiZW5zdXJlSW5pdGlhbGl6ZWQ6IGJhcmUgQXBwS2l0IGluaXRpYWxpemF0aW9uIGNvbXBsZXRlXCIpO1xufVxuIl19
328
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwa2l0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcGtpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBRUgsT0FBTyxFQUNMLFNBQVMsSUFBSSxlQUFlLEVBQzVCLG1CQUFtQixFQUNuQixtQkFBbUIsR0FDcEIsTUFBTSxvQkFBb0IsQ0FBQztBQUk1QixPQUFPLEVBQUUsT0FBTyxJQUFJLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFekQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUQsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFDTCx3QkFBd0IsRUFHeEIsZUFBZSxHQUVoQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBMkIsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLDRCQUE0QixFQUM1QixrQkFBa0IsR0FDbkIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBOENwQyxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUM7QUFFbkM7Ozs7OztHQU1HO0FBQ0gsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDO0FBRTlDLFNBQVMsVUFBVSxDQUNqQixNQUFzQyxF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QUFtQixFQUFFLENBQUM7UUFDbEMsSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDaEIsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO0lBQ0gsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksbUJBQW1CLENBQUMsRUFBRSxDQUFDO1lBQzVDLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQjtJQUNyQyxJQUFJLHNCQUFzQixFQUFFLEVBQUUsQ0FBQztRQUM3QixNQUFNLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7UUFDdkQsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFDM0QsTUFBTSxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sQ0FBQyxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztBQUN6RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcHBLaXQgcnVudGltZSBnbHVlOiB0aGUgYXV0by1jb25maWd1cmluZyBgY3JlYXRlQXBwYCBkcm9wLWluLCBwbHVzIHRoZVxuICogcGVyLXJlcXVlc3QgZXhlY3V0aW9uIGNvbnRleHQgaGVscGVycyBhbmQgdHlwZXMgZGVyaXZlZCBmcm9tIGl0LlxuICpcbiAqIGBjcmVhdGVBcHBgIHJ1bnMgZGJ4LXRvb2xzIGF1dG8tY29uZmlndXJhdGlvbiwgdGhlbiBkZWxlZ2F0ZXMgdG8gQXBwS2l0J3Mgb3duXG4gKiBgY3JlYXRlQXBwYCB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cyBhbmQgdGhlIHNhbWUgdHlwZWQgcGx1Z2luLWV4cG9ydCBtYXAuXG4gKiBEcm9wIGl0IGluIGFzIGEgb25lLWZvci1vbmUgcmVwbGFjZW1lbnQ6XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IGxha2ViYXNlLCBzZXJ2ZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbiAqXG4gKiBhd2FpdCBhcHBraXQuY3JlYXRlQXBwKHsgcGx1Z2luczogW3NlcnZlcigpLCBsYWtlYmFzZSgpXSB9KTtcbiAqIGBgYFxuICpcbiAqIEF1dG8tY29uZmlndXJhdGlvbiBydW5zIEJFRk9SRSBkZWxlZ2F0aW5nIHNvIHBsdWdpbnMgc2VlIGEgZnVsbHkgcG9wdWxhdGVkXG4gKiBgcHJvY2Vzcy5lbnZgIGR1cmluZyB0aGVpciBzeW5jaHJvbm91cyBgc2V0dXAoKWAuIExha2ViYXNlIFBvc3RncmVzIHJlc29sdXRpb25cbiAqIHJ1bnMgd2hlbiBhIG5hdGl2ZSBgbGFrZWJhc2VgIG9yIGBkYXRhYmFzZWAgcGx1Z2luIGlzIHByZXNlbnQsIG9yIHdoZW5cbiAqIHtAbGluayBBdXRvQ29uZmlndXJlTW9kZX0gaXMgc2V0IGV4cGxpY2l0bHkgb24gdGhlIGNvbmZpZyBvYmplY3QuXG4gKlxuICogYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgaXMgQXBwS2l0J3Mgb3duIGFjY2Vzc29yIGZvciB0aGUgT0JPLXNjb3BlZCB3b3Jrc3BhY2VcbiAqIGNsaWVudCArIHJlcXVlc3QgbWV0YWRhdGE7IHRoZSB3cmFwcGVycyBoZXJlIG1ha2UgaXQgc2FmZSB0byBjYWxsIG91dHNpZGUgYVxuICogcmVxdWVzdCBzY29wZSAoe0BsaW5rIHRyeUdldEV4ZWN1dGlvbkNvbnRleHR9KSBhbmQgdG8gbGF6aWx5IGJvb3QgYSBiYXJlIGFwcFxuICogKHtAbGluayBlbnN1cmVJbml0aWFsaXplZH0pLCBhbmQgcmUtZXhwb3J0IHRoZSBkZXJpdmVkIHR5cGVzIHNvIGFkZC1vblxuICogcGFja2FnZXMgY2FuIHR5cGUgYSBjb250ZXh0IC8gY2xpZW50IHdpdGhvdXQgcmUtZGVyaXZpbmcgdGhlbSBpbmxpbmUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIGNyZWF0ZUFwcCBhcyBhcHBraXRDcmVhdGVBcHAsXG4gIGdldEV4ZWN1dGlvbkNvbnRleHQsXG4gIEluaXRpYWxpemF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbi8vIEFwcEtpdCdzIHJvb3QgYmFycmVsIHJlLWV4cG9ydHMgYFBsdWdpbkRhdGFgIGJ1dCBub3QgYFBsdWdpbk1hcGA7IHRoZSBwYWNrYWdlXG4vLyBwdWJsaXNoZXMgdGhpcyBzdWJwYXRoIGZvciBleGFjdGx5IHRoYXQgdHlwZS5cbmltcG9ydCB0eXBlIHsgUGx1Z2luTWFwIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9kaXN0L3NoYXJlZC9zcmMvcGx1Z2luXCI7XG5pbXBvcnQgeyBwcm9maWxlIGFzIGF1dGhQcm9maWxlIH0gZnJvbSBcIkBkYngtdG9vbHMvYXV0aFwiO1xuaW1wb3J0IHsgYXN5bmNVdGlscywgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuaW1wb3J0IHsgcmVzb2x2ZUF1dG9Db25maWd1cmVQb2xpY3kgfSBmcm9tIFwiLi9fYXV0by1jb25maWd1cmUudHNcIjtcbmltcG9ydCB7IGxvYWRCcmFuZENvbnRleHQgfSBmcm9tIFwiLi9icmFuZC1jb250ZXh0LnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVBcHBLaXRDYWNoZVN0b3JhZ2UgfSBmcm9tIFwiLi9jYWNoZS1zdG9yYWdlLnRzXCI7XG5pbXBvcnQgeyBpbnN0YWxsQXNVc2VyRGV2ZWxvcG1lbnRQYXRjaCB9IGZyb20gXCIuL2lkZW50aXR5LnRzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVJbnRlcmNlcHRvckNvbnRleHQsXG4gIHR5cGUgSW50ZXJjZXB0b3IsXG4gIHR5cGUgSW50ZXJjZXB0b3JSdW50aW1lLFxuICBsaWZlY3ljbGVCcmlkZ2UsXG4gIHR5cGUgUmVzb2x2ZWRBcHBFbnYsXG59IGZyb20gXCIuL2ludGVyY2VwdG9yLnRzXCI7XG5pbXBvcnQgeyBhcHBseUxha2ViYXNlRW52LCB0eXBlIExha2ViYXNlQ29ubmVjdGlvbiB9IGZyb20gXCIuL2xha2ViYXNlLXJlc29sdmVyLnRzXCI7XG5pbXBvcnQgeyBwcm92aXNpb25DYWNoZVNjaGVtYSB9IGZyb20gXCIuL3Byb3Zpc2lvbi50c1wiO1xuaW1wb3J0IHtcbiAgYmluZE5hdGl2ZVRlbGVtZXRyeVByb3ZpZGVyLFxuICBjb25maWd1cmVOYXRpdmVIdHRwVGVsZW1ldHJ5LFxuICBzdGFtcEh0dHBUcmFjZVVzZXIsXG59IGZyb20gXCIuL3RlbGVtZXRyeS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiYXBwa2l0XCIpO1xuXG50eXBlIEFwcEtpdENyZWF0ZUFwcENvbmZpZyA9IE5vbk51bGxhYmxlPFBhcmFtZXRlcnM8dHlwZW9mIGFwcGtpdENyZWF0ZUFwcD5bMF0+O1xudHlwZSBBcHBLaXRQbHVnaW5zID0gTm9uTnVsbGFibGU8QXBwS2l0Q3JlYXRlQXBwQ29uZmlnW1wicGx1Z2luc1wiXT47XG5cbi8qKlxuICogV2hhdCBhdXRvLWNvbmZpZ3VyYXRpb24gZG9lcyBiZWZvcmUgQXBwS2l0IGJvb3RzLlxuICpcbiAqIC0gYFwicHJvdmlzaW9uXCJgOiByZXNvbHZlIHRoZSBMYWtlYmFzZSBjb25uZWN0aW9uIGludG8gYHByb2Nlc3MuZW52YCwgdGhlblxuICogICBncmFudCB0aGUgQXBwS2l0IGNhY2hlIHNjaGVtYSB0byB0aGUgY29ubmVjdGluZyByb2xlLlxuICogLSBgXCJlbnZcImA6IHJlc29sdmUgdGhlIExha2ViYXNlIGNvbm5lY3Rpb24gaW50byBgcHJvY2Vzcy5lbnZgIG9ubHkuXG4gKlxuICogT21pdCBpdCB0byByZXNvbHZlIGRhdGFiYXNlIGVudmlyb25tZW50IHdoZW4gYSBuYXRpdmUgYGxha2ViYXNlYCBvclxuICogYGRhdGFiYXNlYCBwbHVnaW4gaXMgcmVnaXN0ZXJlZC4gSW1wbGljaXQgY2FjaGUtc2NoZW1hIGdyYW50cyByZW1haW4gZ2F0ZWQgb25cbiAqIGBsYWtlYmFzZWA7IGBkYXRhYmFzZWAgb3ducyBpdHMgb3duIHBvb2wgYW5kIGRvZXMgbm90IGJyb2FkZW4gZ3JhbnRzLiBTZXQgdGhlXG4gKiBtb2RlIGV4cGxpY2l0bHkgdG8gcnVuIHJlZ2FyZGxlc3Mgb2YgdGhlIHBsdWdpbiBsaXN0LCBvciBwYXNzIGBmYWxzZWAgdG8gc2tpcFxuICogYXV0by1jb25maWd1cmF0aW9uIGVudGlyZWx5LlxuICpcbiAqIFNldCBpdCBFWFBMSUNJVExZIG9uIGFuIGFwcCB0aGF0IGhhcyBubyBgbGFrZWJhc2UoKWAgcGx1Z2luIGJ1dCBzdGlsbCB3YW50c1xuICogQXBwS2l0J3MgUEVSU0lTVEVOVCBjYWNoZS4gQXBwS2l0IHBpY2tzIExha2ViYXNlIGZvciBgQ2FjaGVNYW5hZ2VyYCBvbmx5IHdoZW5cbiAqIGBjcmVhdGVMYWtlYmFzZVBvb2woKWAgY2FuIGJ1aWxkIGEgcG9vbCwgYW5kIHRoYXQgcmVhZHMgYExBS0VCQVNFX0VORFBPSU5UYCAvXG4gKiBgUEdIT1NUYCAvIGBQR0RBVEFCQVNFYCBzdHJhaWdodCBmcm9tIGBwcm9jZXNzLmVudmAgLSBzbyB3aXRob3V0IHRoaXMgc3RlcCB0aGVcbiAqIGNhY2hlIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gaW4tbWVtb3J5LCBhbmQgYW55dGhpbmcgaXQgaG9sZHMgKGEgc2Vzc2lvblxuICogc2lnbmluZyBrZXksIGEgb25lLXRpbWUgY29kZSkgaXMgbG9zdCBvbiByZXN0YXJ0LiBgXCJlbnZcImAgaXMgdGhlIHJpZ2h0IG1vZGVcbiAqIHRoZXJlOiB0aGUgYXBwIFNQIGNhbm5vdCBncmFudCBvbiB0aGUgY2FjaGUgc2NoZW1hIGFueXdheS5cbiAqL1xuZXhwb3J0IHR5cGUgQXV0b0NvbmZpZ3VyZU1vZGUgPSBcImVudlwiIHwgXCJwcm92aXNpb25cIjtcblxuLyoqIEFwcEtpdCdzIGBjcmVhdGVBcHBgIGNvbmZpZyBwbHVzIHRoZSBkYngtdG9vbHMgYXV0by1jb25maWd1cmF0aW9uIHN3aXRjaC4gKi9cbmV4cG9ydCB0eXBlIENyZWF0ZUFwcENvbmZpZzxUIGV4dGVuZHMgQXBwS2l0UGx1Z2lucyA9IEFwcEtpdFBsdWdpbnM+ID0gT21pdDxcbiAgQXBwS2l0Q3JlYXRlQXBwQ29uZmlnLFxuICBcInBsdWdpbnNcIiB8IFwib25QbHVnaW5zUmVhZHlcIlxuPiAmIHtcbiAgcGx1Z2lucz86IFQ7XG4gIG9uUGx1Z2luc1JlYWR5PzogKGFwcGtpdDogUGx1Z2luTWFwPFQ+KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgLyoqIEF1dG8tY29uZmlndXJhdGlvbiB0byBydW4gYmVmb3JlIEFwcEtpdCBib290cy4gRGVmYXVsdHMgdG8gYFwicHJvdmlzaW9uXCJgLiAqL1xuICBhdXRvQ29uZmlndXJlPzogQXV0b0NvbmZpZ3VyZU1vZGUgfCBmYWxzZTtcbiAgLyoqXG4gICAqIE9uZSBvciBtYW55IHtAbGluayBJbnRlcmNlcHRvcn1zIGhhbmRlZCBhbiB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0fSBvbmNlXG4gICAqIGF1dG8tY29uZmlndXJhdGlvbiBoYXMgY29tcHV0ZWQgdGhlIGVudi4gRWFjaCByZWNlaXZlcyB0aGUgcmVzb2x2ZWQgZW52LCBhblxuICAgKiBBcHBLaXQgbGlmZWN5Y2xlIGhvb2suIFNlZSBgLi9pbnRlcmNlcHRvcmAuIFRoZSB0dW5uZWwgaXMgdGhlIHByaW1hcnlcbiAgICogY29uc3VtZXIuXG4gICAqL1xuICBpbnRlcmNlcHRvcj86IEludGVyY2VwdG9yIHwgSW50ZXJjZXB0b3JbXTtcbn07XG5cbmNvbnN0IExBS0VCQVNFX1BMVUdJTiA9IFwibGFrZWJhc2VcIjtcblxuLyoqXG4gKiBVcHBlciBib3VuZCBvbiBib290LXRpbWUgYXV0by1jb25maWd1cmF0aW9uLiBJdCBydW5zIGFzIHRoZSBzZXJ2aWNlIHByaW5jaXBhbFxuICogYmVmb3JlIGFueSBwbHVnaW4gaXMgY29uc3RydWN0ZWQsIHNvIGl0IHNpdHMgb3V0c2lkZSBBcHBLaXQncyBpbnRlcmNlcHRvclxuICogY2hhaW4gYW5kIGluaGVyaXRzIG5vIHRpbWVvdXQsIHJldHJ5LCBvciB0ZWxlbWV0cnkgZnJvbSBpdC4gVGhlIGJ1ZGdldCBjb3ZlcnNcbiAqIHRoZSByZXNvbHZlcidzIG93biB3b3JzdCBjYXNlIChjcmVhdGUgYSBwcm9qZWN0LCB0aGVuIHdhaXQgZm9yIGl0cyBlbmRwb2ludClcbiAqIHBsdXMgdGhlIGNhY2hlLXNjaGVtYSBncmFudHMuXG4gKi9cbmNvbnN0IEFVVE9fQ09ORklHVVJFX1RJTUVPVVRfTVMgPSAxMSAqIDYwXzAwMDtcblxuZnVuY3Rpb24gdXNlc1BsdWdpbjxUIGV4dGVuZHMgQXBwS2l0UGx1Z2lucz4oXG4gIGNvbmZpZzogQ3JlYXRlQXBwQ29uZmlnPFQ+IHwgdW5kZWZpbmVkLFxuICBuYW1lOiBzdHJpbmcsXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIEJvb2xlYW4oY29uZmlnPy5wbHVnaW5zPy5zb21lKChlbnRyeSkgPT4gZW50cnkubmFtZSA9PT0gbmFtZSkpO1xufVxuXG4vKiogUGx1Z2luIG5hbWVzIGZvciBib290IGxvZ3MgKG9yZGVyIHByZXNlcnZlZCkuICovXG5mdW5jdGlvbiBwbHVnaW5OYW1lcyhjb25maWc6IENyZWF0ZUFwcENvbmZpZyB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIChjb25maWc/LnBsdWdpbnMgPz8gW10pLm1hcCgoZW50cnkpID0+IGVudHJ5Lm5hbWUpO1xufVxuXG4vKipcbiAqIFJ1biBlbmFibGVkIGF1dG8tY29uZmlndXJhdGlvbiBzdGVwcyB3aXRob3V0IGNhbGxpbmcgQXBwS2l0J3MgYGNyZWF0ZUFwcGAuXG4gKlxuICogTGFrZWJhc2UgUG9zdGdyZXMgcmVzb2x2ZXMgd2hlbiB7QGxpbmsgQ3JlYXRlQXBwQ29uZmlnLmF1dG9Db25maWd1cmV9IGlzIHNldFxuICogZXhwbGljaXRseSBvciBhIG5hdGl2ZSBgbGFrZWJhc2VgL2BkYXRhYmFzZWAgcGx1Z2luIGlzIGxpc3RlZCBpblxuICogYGNvbmZpZy5wbHVnaW5zYC4gYHNpZ25hbGAgY2FuY2VscyB0aGUgcmVzb2x1dGlvbjsgaXQgaXMgY29tYmluZWQgd2l0aCBhblxuICogaW50ZXJuYWwgYm9vdCB0aW1lb3V0IGVpdGhlciB3YXkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICpcbiAqIC8vIFBvcHVsYXRlIFBHSE9TVCAvIFBHREFUQUJBU0UgLyBMQUtFQkFTRV9FTkRQT0lOVCB3aXRob3V0IGJvb3RpbmcgQXBwS2l0LlxuICogYXdhaXQgYXBwa2l0LmF1dG9Db25maWd1cmUoeyBhdXRvQ29uZmlndXJlOiBcImVudlwiIH0pO1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXV0b0NvbmZpZ3VyZTxUIGV4dGVuZHMgQXBwS2l0UGx1Z2lucz4oXG4gIGNvbmZpZz86IENyZWF0ZUFwcENvbmZpZzxUPixcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPExha2ViYXNlQ29ubmVjdGlvbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBidW5kbGVQcm9maWxlID0gYXBwbHlEZWZhdWx0UHJvZmlsZSgpO1xuICBjb25zdCBwbHVnaW5zID0gcGx1Z2luTmFtZXMoY29uZmlnKTtcbiAgY29uc3QgcG9saWN5ID0gcmVzb2x2ZUF1dG9Db25maWd1cmVQb2xpY3kocGx1Z2lucywgY29uZmlnPy5hdXRvQ29uZmlndXJlKTtcbiAgbG9nZ2VyLmRlYnVnKFwiYXV0b0NvbmZpZ3VyZTogc3RhcnRcIiwge1xuICAgIC4uLnBvbGljeSxcbiAgICBwbHVnaW5zLFxuICAgIHRpbWVvdXRNczogQVVUT19DT05GSUdVUkVfVElNRU9VVF9NUyxcbiAgICBjYWxsZXJTaWduYWw6IEJvb2xlYW4oc2lnbmFsKSxcbiAgfSk7XG5cbiAgaWYgKCFwb2xpY3kuc2hvdWxkUmVzb2x2ZSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9Db25maWd1cmU6IHNraXBcIiwgeyAuLi5wb2xpY3ksIHBsdWdpbnMgfSk7XG4gICAgbG9nZ2VyLmluZm8oXCJyZWFkeVwiLCB7XG4gICAgICBhdXRvQ29uZmlndXJlOiBwb2xpY3kubW9kZSxcbiAgICAgIGxha2ViYXNlUGx1Z2luUHJlc2VudDogcG9saWN5Lmxha2ViYXNlUGx1Z2luUHJlc2VudCxcbiAgICAgIGRhdGFiYXNlUGx1Z2luUHJlc2VudDogcG9saWN5LmRhdGFiYXNlUGx1Z2luUHJlc2VudCxcbiAgICAgIHByb3Zpc2lvbmVkOiBmYWxzZSxcbiAgICAgIHNraXBwZWRSZWFzb246IHBvbGljeS5za2lwcGVkUmVhc29uLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBhc3luY1V0aWxzLnRpZUFib3J0U2lnbmFsKGNvbnRyb2xsZXIsIHNpZ25hbCk7XG4gIGFzeW5jVXRpbHMudGllQWJvcnRTaWduYWwoY29udHJvbGxlciwgQWJvcnRTaWduYWwudGltZW91dChBVVRPX0NPTkZJR1VSRV9USU1FT1VUX01TKSk7XG5cbiAgbG9nZ2VyLmRlYnVnKFwiYXV0b0NvbmZpZ3VyZTogcmVzb2x2ZSBsYWtlYmFzZVwiLCB7XG4gICAgcHJvdmlzaW9uOiBwb2xpY3kucHJvdmlzaW9uLFxuICAgIG1vZGU6IHBvbGljeS5tb2RlLFxuICB9KTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBhdXRvQ29uZmlndXJlTGFrZWJhc2UocG9saWN5LnByb3Zpc2lvbiwgY29udHJvbGxlci5zaWduYWwsIGJ1bmRsZVByb2ZpbGUpO1xuICBsb2dnZXIuZGVidWcoXCJhdXRvQ29uZmlndXJlOiBkb25lXCIsIHtcbiAgICBtb2RlOiBwb2xpY3kubW9kZSxcbiAgICBsYWtlYmFzZVBsdWdpblByZXNlbnQ6IHBvbGljeS5sYWtlYmFzZVBsdWdpblByZXNlbnQsXG4gICAgZGF0YWJhc2VQbHVnaW5QcmVzZW50OiBwb2xpY3kuZGF0YWJhc2VQbHVnaW5QcmVzZW50LFxuICAgIHByb3Zpc2lvbmVkOiBwb2xpY3kucHJvdmlzaW9uLFxuICAgIC4uLnJlZGFjdExha2ViYXNlQ29ubmVjdGlvbihyZXNvbHZlZCksXG4gIH0pO1xuICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICBhdXRvQ29uZmlndXJlOiBwb2xpY3kubW9kZSxcbiAgICBsYWtlYmFzZVBsdWdpblByZXNlbnQ6IHBvbGljeS5sYWtlYmFzZVBsdWdpblByZXNlbnQsXG4gICAgZGF0YWJhc2VQbHVnaW5QcmVzZW50OiBwb2xpY3kuZGF0YWJhc2VQbHVnaW5QcmVzZW50LFxuICAgIHByb3Zpc2lvbmVkOiBwb2xpY3kucHJvdmlzaW9uLFxuICB9KTtcbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG4vKipcbiAqIFJlc29sdmUgTGFrZWJhc2UgUG9zdGdyZXMgY29ubmVjdGlvbiBpbmZvLCB3cml0ZSB0aGUgcmVzb2x2ZWQgdmFsdWVzIHRvXG4gKiBgcHJvY2Vzcy5lbnZgLCBhbmQgcmV0dXJuIHRoZSByZWNvcmQuIFVzZWQgYnkge0BsaW5rIGF1dG9Db25maWd1cmV9OyBjYWxsXG4gKiB7QGxpbmsgYXBwbHlMYWtlYmFzZUVudn0gZGlyZWN0bHkgd2hlbiBmaW5lciBjb250cm9sIGlzIG5lZWRlZCAoYSBkaWZmZXJlbnRcbiAqIGBhdXRvQ3JlYXRlYCBwb2xpY3ksIG9yIGEgY2FsbGVyIHRoYXQgd2FudHMgdGhlIGVudiB3aXRob3V0IGJvb3RpbmcgQXBwS2l0KS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXV0b0NvbmZpZ3VyZUxha2ViYXNlKFxuICBwcm92aXNpb246IGJvb2xlYW4sXG4gIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gIGJ1bmRsZVByb2ZpbGU/OiBzdHJpbmcsXG4pOiBQcm9taXNlPExha2ViYXNlQ29ubmVjdGlvbj4ge1xuICBsb2dnZXIuZGVidWcoXCJhdXRvQ29uZmlndXJlTGFrZWJhc2U6IGFwcGx5TGFrZWJhc2VFbnZcIik7XG4gIGNvbnN0IHsgcmVzb2x2ZWQsIHVzZXIgfSA9IGF3YWl0IGFwcGx5TGFrZWJhc2VFbnYoeyBidW5kbGVQcm9maWxlIH0sIHNpZ25hbCk7XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9Db25maWd1cmVMYWtlYmFzZTogZW52IGFwcGxpZWRcIiwge1xuICAgIC4uLnJlZGFjdExha2ViYXNlQ29ubmVjdGlvbihyZXNvbHZlZCksXG4gICAgdXNlcixcbiAgICBlbnY6IHtcbiAgICAgIExBS0VCQVNFX0VORFBPSU5UOiBwcm9jZXNzLmVudi5MQUtFQkFTRV9FTkRQT0lOVCxcbiAgICAgIFBHSE9TVDogcHJvY2Vzcy5lbnYuUEdIT1NULFxuICAgICAgUEdQT1JUOiBwcm9jZXNzLmVudi5QR1BPUlQsXG4gICAgICBQR0RBVEFCQVNFOiBwcm9jZXNzLmVudi5QR0RBVEFCQVNFLFxuICAgICAgUEdVU0VSOiBwcm9jZXNzLmVudi5QR1VTRVIsXG4gICAgICBQR1NTTE1PREU6IHByb2Nlc3MuZW52LlBHU1NMTU9ERSxcbiAgICB9LFxuICB9KTtcbiAgbG9nZ2VyLmluZm8oXCJlbnYgdXBkYXRlZFwiLCB7IC4uLnJlZGFjdExha2ViYXNlQ29ubmVjdGlvbihyZXNvbHZlZCksIHVzZXIgfSk7XG4gIGlmIChwcm92aXNpb24pIHtcbiAgICBsb2dnZXIuZGVidWcoXCJhdXRvQ29uZmlndXJlTGFrZWJhc2U6IHByb3Zpc2lvbkNhY2hlU2NoZW1hXCIsIHsgdXNlciB9KTtcbiAgICBhd2FpdCBwcm92aXNpb25DYWNoZVNjaGVtYSh1c2VyLCBsb2dnZXIpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9Db25maWd1cmVMYWtlYmFzZTogcHJvdmlzaW9uQ2FjaGVTY2hlbWEgZG9uZVwiKTtcbiAgfSBlbHNlIHtcbiAgICBsb2dnZXIuZGVidWcoXCJhdXRvQ29uZmlndXJlTGFrZWJhc2U6IHNraXAgcHJvdmlzaW9uIChtb2RlPWVudilcIik7XG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG5mdW5jdGlvbiBhcHBseURlZmF1bHRQcm9maWxlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0NPTkZJR19QUk9GSUxFPy50cmltKCk7XG4gIGNvbnN0IHJlc29sdmVkID0gYXV0aFByb2ZpbGUucmVzb2x2ZVByb2ZpbGUoY29uZmlndXJlZCA/IHsgcHJvZmlsZTogY29uZmlndXJlZCB9IDoge30pO1xuICBpZiAoIXJlc29sdmVkKSB7XG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQ09ORklHX1BST0ZJTEU7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0NPTkZJR19QUk9GSUxFID0gcmVzb2x2ZWQubmFtZTtcbiAgcmV0dXJuIHJlc29sdmVkLm5hbWU7XG59XG5cbi8qKiBXaGV0aGVyIGBjcmVhdGVBcHBgIHNob3VsZCBpbmplY3QgdGhlIGRlZmF1bHQgbWVtb3J5LWZpcnN0IGNhY2hlIHN0b3JhZ2UuICovXG5mdW5jdGlvbiBzaG91bGRJbmplY3RDYWNoZVN0b3JhZ2UoY29uZmlnOiBDcmVhdGVBcHBDb25maWcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgY29uc3QgY2FjaGUgPSBjb25maWc/LmNhY2hlO1xuICBpZiAoY2FjaGU/LmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gIGlmIChjYWNoZT8uc3RvcmFnZSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVkYWN0TGFrZWJhc2VDb25uZWN0aW9uKHJlc29sdmVkOiBMYWtlYmFzZUNvbm5lY3Rpb24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB7XG4gICAgcHJvamVjdDogcmVzb2x2ZWQucHJvamVjdCxcbiAgICBicmFuY2g6IHJlc29sdmVkLmJyYW5jaCxcbiAgICBlbmRwb2ludDogcmVzb2x2ZWQuZW5kcG9pbnQsXG4gICAgZGF0YWJhc2U6IHJlc29sdmVkLmRhdGFiYXNlLFxuICAgIGhvc3Q6IHJlc29sdmVkLmhvc3QsXG4gICAgcG9ydDogcmVzb2x2ZWQucG9ydCxcbiAgICBzc2xNb2RlOiByZXNvbHZlZC5zc2xNb2RlLFxuICB9O1xufVxuXG4vKiogQnVpbGQgdGhlIHtAbGluayBSZXNvbHZlZEFwcEVudn0gaW50ZXJjZXB0b3JzIHJlYWQsIGZyb20gdGhlIGF1dG8tY29uZmlnIHJlc3VsdC4gKi9cbmZ1bmN0aW9uIHJlc29sdmVkQXBwRW52KGxha2ViYXNlOiBMYWtlYmFzZUNvbm5lY3Rpb24gfCB1bmRlZmluZWQpOiBSZXNvbHZlZEFwcEVudiB7XG4gIHJldHVybiB7XG4gICAgLi4uKGxha2ViYXNlID8geyBsYWtlYmFzZSB9IDoge30pLFxuICAgIC4uLihwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0hPU1QgPyB7IGRhdGFicmlja3NIb3N0OiBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0hPU1QgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqIE5vcm1hbGl6ZSB0aGUgYGludGVyY2VwdG9yPzogSW50ZXJjZXB0b3IgfCBJbnRlcmNlcHRvcltdYCBvcHRpb24gdG8gYW4gYXJyYXkuICovXG5mdW5jdGlvbiBpbnRlcmNlcHRvckxpc3QoaW50ZXJjZXB0b3I6IENyZWF0ZUFwcENvbmZpZ1tcImludGVyY2VwdG9yXCJdKTogSW50ZXJjZXB0b3JbXSB7XG4gIGlmICghaW50ZXJjZXB0b3IpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaW50ZXJjZXB0b3IpID8gaW50ZXJjZXB0b3IgOiBbaW50ZXJjZXB0b3JdO1xufVxuXG4vKipcbiAqIEF1dG8tY29uZmlndXJpbmcgZHJvcC1pbiBmb3IgQXBwS2l0J3MgYGNyZWF0ZUFwcGA6IHNhbWUgY29uZmlnLCBzYW1lIHR5cGVkXG4gKiBwbHVnaW4tZXhwb3J0IG1hcCwgd2l0aCB7QGxpbmsgYXV0b0NvbmZpZ3VyZX0gcnVuIGZpcnN0LlxuICpcbiAqIFdoZW4ge0BsaW5rIENyZWF0ZUFwcENvbmZpZy5pbnRlcmNlcHRvcn1zIGFyZSBnaXZlbiwgZWFjaCBpcyBpbnZva2VkIHdpdGggYW5cbiAqIHtAbGluayBJbnRlcmNlcHRvckNvbnRleHR9IEFGVEVSIGF1dG8tY29uZmlndXJhdGlvbiBjb21wdXRlcyB0aGUgZW52IGFuZCBCRUZPUkVcbiAqIEFwcEtpdCBib290cyAtIHNvIGFuIGludGVyY2VwdG9yIGNhbiByZWFkIHRoZSByZXNvbHZlZCBjb25uZWN0aW9uLCByZWdpc3RlclxuICogbGlmZWN5Y2xlIGhhbmRsZXJzLCBhbmQgc3RhcnQgYXV4aWxpYXJ5IHdvcmsuIEEgaGlkZGVuIHtAbGluayBsaWZlY3ljbGVCcmlkZ2V9XG4gKiBwbHVnaW4gaXMgaW5qZWN0ZWQgc28gdGhvc2UgYG9uTGlmZWN5Y2xlYCBoYW5kbGVycyBmaXJlIG9uIHRoZSBnZW51aW5lIEFwcEtpdFxuICogZXZlbnRzOyBpdCBoYXMgbm8gZXhwb3J0cywgc28gdGhlIHJldHVybmVkIHtAbGluayBQbHVnaW5NYXB9IGlzIHVuY2hhbmdlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgbGFrZWJhc2UsIHNlcnZlciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICpcbiAqIGNvbnN0IGFwcCA9IGF3YWl0IGFwcGtpdC5jcmVhdGVBcHAoeyBwbHVnaW5zOiBbc2VydmVyKCksIGxha2ViYXNlKCldIH0pO1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXBwPFQgZXh0ZW5kcyBBcHBLaXRQbHVnaW5zPihcbiAgY29uZmlnPzogQ3JlYXRlQXBwQ29uZmlnPFQ+LFxuKTogUHJvbWlzZTxQbHVnaW5NYXA8VD4+IHtcbiAgaW5zdGFsbEFzVXNlckRldmVsb3BtZW50UGF0Y2goKTtcbiAgYXdhaXQgY29uZmlndXJlTmF0aXZlSHR0cFRlbGVtZXRyeSh7IHNwYW5Ib29rOiBzdGFtcEh0dHBUcmFjZVVzZXIgfSk7XG4gIGNvbnN0IHBsdWdpbnMgPSBwbHVnaW5OYW1lcyhjb25maWcpO1xuICBjb25zdCBpbnRlcmNlcHRvcnMgPSBpbnRlcmNlcHRvckxpc3QoY29uZmlnPy5pbnRlcmNlcHRvcik7XG4gIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogc3RhcnRcIiwge1xuICAgIHBsdWdpbnMsXG4gICAgcGx1Z2luQ291bnQ6IHBsdWdpbnMubGVuZ3RoLFxuICAgIGludGVyY2VwdG9yQ291bnQ6IGludGVyY2VwdG9ycy5sZW5ndGgsXG4gICAgYXV0b0NvbmZpZ3VyZTogY29uZmlnPy5hdXRvQ29uZmlndXJlID8/IFwiKGRlZmF1bHQpXCIsXG4gICAgaGFzT25QbHVnaW5zUmVhZHk6IHR5cGVvZiBjb25maWc/Lm9uUGx1Z2luc1JlYWR5ID09PSBcImZ1bmN0aW9uXCIsXG4gIH0pO1xuXG4gIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogYXV0b0NvbmZpZ3VyZVwiKTtcbiAgY29uc3QgYnJhbmRDb250ZXh0ID0gYXdhaXQgbG9hZEJyYW5kQ29udGV4dCgpO1xuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IGJyYW5kIGNvbnRleHQgbG9hZGVkXCIsIHsgbmFtZTogYnJhbmRDb250ZXh0Lm5hbWUgfSk7XG4gIGNvbnN0IGxha2ViYXNlID0gYXdhaXQgYXV0b0NvbmZpZ3VyZShjb25maWcpO1xuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IGF1dG9Db25maWd1cmUgcmV0dXJuZWRcIiwge1xuICAgIGxha2ViYXNlOiBsYWtlYmFzZSA/IHJlZGFjdExha2ViYXNlQ29ubmVjdGlvbihsYWtlYmFzZSkgOiB1bmRlZmluZWQsXG4gIH0pO1xuXG4gIGNvbnN0IGFwcENvbmZpZyA9IHsgLi4uY29uZmlnIH07XG4gIGRlbGV0ZSBhcHBDb25maWcuYXV0b0NvbmZpZ3VyZTtcbiAgZGVsZXRlIGFwcENvbmZpZy5pbnRlcmNlcHRvcjtcbiAgY29uc3Qgb25QbHVnaW5zUmVhZHkgPSBhcHBDb25maWcub25QbHVnaW5zUmVhZHk7XG4gIGFwcENvbmZpZy5vblBsdWdpbnNSZWFkeSA9IGFzeW5jIChhcHApID0+IHtcbiAgICBjb25zdCBib3VuZCA9IGF3YWl0IGJpbmROYXRpdmVUZWxlbWV0cnlQcm92aWRlcigpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogbmF0aXZlIHRlbGVtZXRyeSBwcm92aWRlciBiaW5kaW5nXCIsIHsgYm91bmQgfSk7XG4gICAgYXdhaXQgb25QbHVnaW5zUmVhZHk/LihhcHApO1xuICB9O1xuXG4gIGlmIChzaG91bGRJbmplY3RDYWNoZVN0b3JhZ2UoY29uZmlnKSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogaW5qZWN0IG1lbW9yeS1maXJzdCBjYWNoZSBzdG9yYWdlXCIpO1xuICAgIGNvbnN0IHN0b3JhZ2UgPSBhd2FpdCBjcmVhdGVBcHBLaXRDYWNoZVN0b3JhZ2Uoe1xuICAgICAgY2FjaGU6IGNvbmZpZz8uY2FjaGUsXG4gICAgICBwcmVmZXJMYWtlYmFzZTogQm9vbGVhbihsYWtlYmFzZSkgfHwgdXNlc1BsdWdpbihjb25maWcsIExBS0VCQVNFX1BMVUdJTiksXG4gICAgfSk7XG4gICAgYXBwQ29uZmlnLmNhY2hlID0geyAuLi5jb25maWc/LmNhY2hlLCBzdG9yYWdlIH07XG4gICAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBtZW1vcnktZmlyc3QgY2FjaGUgc3RvcmFnZSByZWFkeVwiLCB7XG4gICAgICBwZXJzaXN0ZW50OiBzdG9yYWdlLmlzUGVyc2lzdGVudCgpLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGludGVyY2VwdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IG5vIGludGVyY2VwdG9yczsgZGVsZWdhdGluZyB0byBBcHBLaXQgY3JlYXRlQXBwXCIsIHtcbiAgICAgIHBsdWdpbnM6IHBsdWdpbk5hbWVzKGFwcENvbmZpZyksXG4gICAgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBwa2l0Q3JlYXRlQXBwPFQ+KGFwcENvbmZpZyk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBBcHBLaXQgY3JlYXRlQXBwIHJldHVybmVkXCIsIHtcbiAgICAgIGV4cG9ydEtleXM6IE9iamVjdC5rZXlzKHJlc3VsdCA/PyB7fSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIEJ1aWxkIHRoZSBjb250ZXh0IGZyb20gdGhlIGNvbXB1dGVkIGVudiwgcnVuIGVhY2ggaW50ZXJjZXB0b3IgKHRoZXkgcmVnaXN0ZXJcbiAgLy8gbGlmZWN5Y2xlIGhhbmRsZXJzICsgYmluZCBwcm9jZXNzZXMpLCB0aGVuIGluamVjdCB0aGUgYnJpZGdlIHRoYXQgcmVsYXlzIHRoZVxuICAvLyBSRUFMIEFwcEtpdCBsaWZlY3ljbGUgaW50byBgcnVudGltZS5lbWl0TGlmZWN5Y2xlYCBkdXJpbmcgaXRzIGBzZXR1cCgpYC5cbiAgY29uc3QgZW52ID0gcmVzb2x2ZWRBcHBFbnYobGFrZWJhc2UpO1xuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IGludGVyY2VwdG9yIGNvbnRleHRcIiwge1xuICAgIGhhc0xha2ViYXNlOiBCb29sZWFuKGVudi5sYWtlYmFzZSksXG4gICAgZGF0YWJyaWNrc0hvc3Q6IGVudi5kYXRhYnJpY2tzSG9zdCxcbiAgICBpbnRlcmNlcHRvckNvdW50OiBpbnRlcmNlcHRvcnMubGVuZ3RoLFxuICB9KTtcbiAgY29uc3QgcnVudGltZTogSW50ZXJjZXB0b3JSdW50aW1lID0gY3JlYXRlSW50ZXJjZXB0b3JDb250ZXh0KGVudik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZXJjZXB0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBydW4gaW50ZXJjZXB0b3JcIiwgeyBpbmRleDogaSwgb2Y6IGludGVyY2VwdG9ycy5sZW5ndGggfSk7XG4gICAgYXdhaXQgaW50ZXJjZXB0b3JzW2ldIShydW50aW1lLmNvbnRleHQpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogaW50ZXJjZXB0b3IgZG9uZVwiLCB7IGluZGV4OiBpIH0pO1xuICB9XG4gIC8vIEFwcGVuZCB0aGUgYnJpZGdlIHRvIHRoZSBwbHVnaW5zIHR1cGxlLiBJdCBpcyBoaWRkZW4gYW5kIGV4cG9ydHMgbm90aGluZywgc29cbiAgLy8gdGhlIHJldHVybmVkIG1hcCBzdGlsbCBtYXRjaGVzIGBQbHVnaW5NYXA8VD5gOyB0aGUgY2FzdCAodGhyb3VnaCBgdW5rbm93bmApIGlzXG4gIC8vIG9ubHkgYmVjYXVzZSBhcHBlbmRpbmcgd2lkZW5zIHRoZSB0dXBsZSB0eXBlIGJleW9uZCBgVGAuXG4gIGFwcENvbmZpZy5wbHVnaW5zID0gWy4uLihhcHBDb25maWcucGx1Z2lucyA/PyBbXSksIGxpZmVjeWNsZUJyaWRnZSh7IHJ1bnRpbWUgfSldIGFzIHVua25vd24gYXMgVDtcbiAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBsaWZlY3ljbGUgYnJpZGdlIGluamVjdGVkOyBkZWxlZ2F0aW5nIHRvIEFwcEtpdCBjcmVhdGVBcHBcIiwge1xuICAgIHBsdWdpbnM6IHBsdWdpbk5hbWVzKGFwcENvbmZpZyksXG4gIH0pO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcHBraXRDcmVhdGVBcHA8VD4oYXBwQ29uZmlnKTtcbiAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBBcHBLaXQgY3JlYXRlQXBwIHJldHVybmVkXCIsIHtcbiAgICBleHBvcnRLZXlzOiBPYmplY3Qua2V5cyhyZXN1bHQgPz8ge30pLFxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgQXBwS2l0IHBlci1yZXF1ZXN0IGV4ZWN1dGlvbiBjb250ZXh0IHJldHVybmVkIGJ5IGBnZXRFeGVjdXRpb25Db250ZXh0KClgXG4gKiAtIHRoZSBPQk8tc2NvcGVkIHdvcmtzcGFjZSBjbGllbnQgcGx1cyB0aGUgc3Vycm91bmRpbmcgcmVxdWVzdCBtZXRhZGF0YS5cbiAqIERlcml2ZWQgZnJvbSBBcHBLaXQncyBvd24gcmV0dXJuIHR5cGUgc28gaXQgdHJhY2tzIHRoZSBpbnN0YWxsZWQgdmVyc2lvbiwgYW5kXG4gKiByZS1leHBvcnRlZCBoZXJlIHNvIGFkZC1vbiBwYWNrYWdlcyBjYW4gdHlwZSBhIGNvbnRleHQgcGFyYW1ldGVyIHdpdGhvdXQgZWFjaFxuICogcmUtZGVyaXZpbmcgdGhlIHNhbWUgYFJldHVyblR5cGU8dHlwZW9mIGdldEV4ZWN1dGlvbkNvbnRleHQ+YCBpbmxpbmUuXG4gKi9cbmV4cG9ydCB0eXBlIEV4ZWN1dGlvbkNvbnRleHRMaWtlID0gUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RXhlY3V0aW9uQ29udGV4dD47XG5cbi8qKlxuICogVGhlIGF1dGgtc2NvcGVkIERhdGFicmlja3Mgd29ya3NwYWNlIGNsaWVudCBjYXJyaWVkIG9uIGFuXG4gKiBgRXhlY3V0aW9uQ29udGV4dExpa2VgIChgZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudGApLiBUeXBlZCBzdHJ1Y3R1cmFsbHlcbiAqIG9mZiBBcHBLaXQgc28gY29uc3VtZXJzIGRvbid0IHRha2UgYSBkaXJlY3QgYEBkYXRhYnJpY2tzL3Nkay1leHBlcmltZW50YWxgXG4gKiBkZXBlbmRlbmN5IC0gdGhlIGRlcCBmbG93cyBpbiB0cmFuc2l0aXZlbHkgdGhyb3VnaCBgQGRhdGFicmlja3MvYXBwa2l0YC5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlQ2xpZW50TGlrZSA9IEV4ZWN1dGlvbkNvbnRleHRMaWtlW1wiY2xpZW50XCJdO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IEFwcEtpdCBleGVjdXRpb24gY29udGV4dCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBBcHBLaXQgaXNuJ3RcbiAqIGluaXRpYWxpemVkIChvdXRzaWRlIGEgcmVxdWVzdCBzY29wZSkuIFN3YWxsb3dzIEFwcEtpdCdzXG4gKiB7QGxpbmsgSW5pdGlhbGl6YXRpb25FcnJvcn07IGFueSBvdGhlciBlcnJvciBwcm9wYWdhdGVzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqXG4gKiAvLyBPQk8tc2NvcGVkIGluc2lkZSBhIHJlcXVlc3QsIHNlcnZpY2UgcHJpbmNpcGFsIGZyb20gYSBDTEkgb3Igc2NyaXB0LlxuICogY29uc3QgY2xpZW50ID0gYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKT8uY2xpZW50ID8/IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCgpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpOiBFeGVjdXRpb25Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgY3R4ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICAgIGlmIChjdHg/LmNsaWVudCkge1xuICAgICAgcmV0dXJuIGN0eDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBJbml0aWFsaXphdGlvbkVycm9yKSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIGJhcmUgQXBwS2l0IGFwcCAobm8gcGx1Z2lucykgd2hlbiBub25lIGlzIHJ1bm5pbmcgeWV0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbiAqXG4gKiBhd2FpdCBhcHBraXQuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAqIGNvbnN0IGNsaWVudCA9IGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCk/LmNsaWVudDtcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUluaXRpYWxpemVkKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAodHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiZW5zdXJlSW5pdGlhbGl6ZWQ6IGFscmVhZHkgaW5pdGlhbGl6ZWRcIik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImVuc3VyZUluaXRpYWxpemVkOiBib290aW5nIGJhcmUgQXBwS2l0IGFwcFwiKTtcbiAgYXdhaXQgY3JlYXRlQXBwKHsgcGx1Z2luczogW10sIGF1dG9Db25maWd1cmU6IGZhbHNlIH0pO1xuICBsb2dnZXIuZGVidWcoXCJlbnN1cmVJbml0aWFsaXplZDogYmFyZSBBcHBLaXQgaW5pdGlhbGl6YXRpb24gY29tcGxldGVcIik7XG59XG4iXX0=
@@ -23,8 +23,7 @@
23
23
  * - a public tunnel (`@dbx-tools/tunnel`), where callers authenticate by
24
24
  * email OTP and no OBO token exists to forward - the gate can prove WHO the
25
25
  * caller is, but it cannot mint a Databricks credential for them;
26
- * - any reverse proxy, webhook, or bot channel (`POST /api/teams/messages`)
27
- * that authenticates its own way.
26
+ * - any reverse proxy, webhook, or bot channel that authenticates its own way.
28
27
  *
29
28
  * Such an app must not run with `NODE_ENV=development` just to get the fallback:
30
29
  * that flag also relaxes secure cookies, AppKit's own dev affordances, and
@@ -23,8 +23,7 @@
23
23
  * - a public tunnel (`@dbx-tools/tunnel`), where callers authenticate by
24
24
  * email OTP and no OBO token exists to forward - the gate can prove WHO the
25
25
  * caller is, but it cannot mint a Databricks credential for them;
26
- * - any reverse proxy, webhook, or bot channel (`POST /api/teams/messages`)
27
- * that authenticates its own way.
26
+ * - any reverse proxy, webhook, or bot channel that authenticates its own way.
28
27
  *
29
28
  * Such an app must not run with `NODE_ENV=development` just to get the fallback:
30
29
  * that flag also relaxes secure cookies, AppKit's own dev affordances, and
@@ -202,4 +201,4 @@ function withAsUserSkipWarnSuppressed(req, fn) {
202
201
  console.warn = warn;
203
202
  }
204
203
  }
205
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaWRlbnRpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvREc7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU3RTs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQztBQUU3RCw4RUFBOEU7QUFDOUUsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7QUFFbkQsNEVBQTRFO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztBQUt6RCxvRkFBb0Y7QUFDcEYsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUE0QixDQUFDLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUU3Rjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBaUIsTUFBTSxDQUFDO0FBTzFEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxVQUE4QixFQUM5QixPQUFtQyxFQUNuQyxLQUFLLEdBQUcsVUFBVTtJQUVsQixNQUFNLEdBQUcsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzFFLElBQUksR0FBRyxLQUFLLFNBQVM7UUFBRSxPQUFPLHFCQUFx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QyxJQUFJLENBQUM7SUFDMUIsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBZSxFQUFFLEVBQUU7UUFDcEMsSUFDRSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDO1lBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFDcEYsQ0FBQztZQUNELE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBdUMsQ0FBQyxDQUFDO0lBQy9ELENBQUMsQ0FBQztJQUNGLElBQUksQ0FBQztRQUNILE9BQU8sRUFBRSxFQUFFLENBQUM7SUFDZCxDQUFDO1lBQVMsQ0FBQztRQUNULE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXaGljaCBEYXRhYnJpY2tzIGlkZW50aXR5IGEgcmVxdWVzdCdzIHdvcmtzcGFjZSBjYWxscyBydW4gYXMuXG4gKlxuICogQXBwS2l0IGdpdmVzIGEgcGx1Z2luIHR3byBpZGVudGl0aWVzOiB0aGUgYW1iaWVudCBTRVJWSUNFIGNvbnRleHQgKHRoZSBhcHAnc1xuICogb3duIHNlcnZpY2UgcHJpbmNpcGFsKSBhbmQgYSBwZXItcmVxdWVzdCBVU0VSIGNvbnRleHQgZW50ZXJlZCB3aXRoXG4gKiBgYXNVc2VyKHJlcSlgLCB3aGljaCBhdXRoZW50aWNhdGVzIGFzIHRoZSBjYWxsZXIgb24tYmVoYWxmLW9mIChPQk8pLiBUaGVcbiAqIGNob2ljZSBpcyBvbmUgY2FsbCwgc28gdGhlIHdob2xlIGRlY2lzaW9uIGlzIFwiZG8gd2UgZW50ZXIgYGFzVXNlcmAgZm9yIHRoaXNcbiAqIHJlcXVlc3RcIi5cbiAqXG4gKiBgYXNVc2VyKHJlcSlgIG5lZWRzIHRoZSBPQk8gdG9rZW4gdGhlIHBsYXRmb3JtIGZyb250IGRvb3IgZm9yd2FyZHMgb25cbiAqIHtAbGluayBBQ0NFU1NfVE9LRU5fSEVBREVSfS4gTWVhc3VyZWQgYWdhaW5zdCB0aGUgaW5zdGFsbGVkIEFwcEtpdCwgaXRzXG4gKiBiZWhhdmlvciB3aGVuIHRoYXQgaGVhZGVyIGlzIGFic2VudCBkZXBlbmRzIEVOVElSRUxZIG9uIGBOT0RFX0VOVmA6XG4gKlxuICogfCBgTk9ERV9FTlZgICAgIHwgbm8gYHgtZm9yd2FyZGVkLWFjY2Vzcy10b2tlbmAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbiAqIHwgYGRldmVsb3BtZW50YCB8IGxvZ3MgYSB3YXJuaW5nLCBzaWxlbnRseSBydW5zIGFzIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCB8XG4gKiB8IGFueXRoaW5nIGVsc2UgfCB0aHJvd3MgYEF1dGhlbnRpY2F0aW9uRXJyb3I6IE1pc3NpbmcgdXNlciB0b2tlbmAgICAgICB8XG4gKlxuICogVGhhdCBwcm9kdWN0aW9uIHRocm93IGlzIGNvcnJlY3QgZm9yIGFuIGFwcCBiZWhpbmQgdGhlIERhdGFicmlja3MgZnJvbnQgZG9vcixcbiAqIHdoZXJlIGEgbWlzc2luZyB0b2tlbiBtZWFucyBzb21ldGhpbmcgaXMgd3JvbmcuIEl0IGlzIGZhdGFsIGZvciBhbiBhcHAgd2hvc2VcbiAqIHRyYWZmaWMgbGVnaXRpbWF0ZWx5IGFycml2ZXMgV0lUSE9VVCBvbmU6XG4gKlxuICogICAtIGEgcHVibGljIHR1bm5lbCAoYEBkYngtdG9vbHMvdHVubmVsYCksIHdoZXJlIGNhbGxlcnMgYXV0aGVudGljYXRlIGJ5XG4gKiAgICAgZW1haWwgT1RQIGFuZCBubyBPQk8gdG9rZW4gZXhpc3RzIHRvIGZvcndhcmQgLSB0aGUgZ2F0ZSBjYW4gcHJvdmUgV0hPIHRoZVxuICogICAgIGNhbGxlciBpcywgYnV0IGl0IGNhbm5vdCBtaW50IGEgRGF0YWJyaWNrcyBjcmVkZW50aWFsIGZvciB0aGVtO1xuICogICAtIGFueSByZXZlcnNlIHByb3h5LCB3ZWJob29rLCBvciBib3QgY2hhbm5lbCAoYFBPU1QgL2FwaS90ZWFtcy9tZXNzYWdlc2ApXG4gKiAgICAgdGhhdCBhdXRoZW50aWNhdGVzIGl0cyBvd24gd2F5LlxuICpcbiAqIFN1Y2ggYW4gYXBwIG11c3Qgbm90IHJ1biB3aXRoIGBOT0RFX0VOVj1kZXZlbG9wbWVudGAganVzdCB0byBnZXQgdGhlIGZhbGxiYWNrOlxuICogdGhhdCBmbGFnIGFsc28gcmVsYXhlcyBzZWN1cmUgY29va2llcywgQXBwS2l0J3Mgb3duIGRldiBhZmZvcmRhbmNlcywgYW5kXG4gKiBgYWxsb3dVbmF1dGhlbnRpY2F0ZWRgIGVzY2FwZSBoYXRjaGVzLiBIZW5jZSB7QGxpbmsgSWRlbnRpdHlNb2RlfTpcbiAqXG4gKiAgIC0gYFwidXNlclwiYCAtIGFsd2F5cyBPQk8uIFBlci11c2VyIGF0dHJpYnV0aW9uIGFuZCBwZXItdXNlciBHZW5pZSAvIFVuaXR5XG4gKiAgICAgQ2F0YWxvZyByb3cgZmlsdGVycy4gQ29ycmVjdCB3aGVuIGV2ZXJ5IGNhbGxlciBpcyBhIHdvcmtzcGFjZSBtZW1iZXIuXG4gKiAgIC0gYFwic2VydmljZS1wcmluY2lwYWxcImAgLSBhbHdheXMgdGhlIGFwcCdzIG93biBpZGVudGl0eS4gTmVlZHMgbm8gT0JPXG4gKiAgICAgc2NvcGVzIGFuZCB3b3JrcyBmb3IgYW55IGNhbGxlciwgYXQgdGhlIGNvc3Qgb2YgcGVyLXVzZXIgZGF0YSBzY29waW5nLlxuICogICAtIGBcImF1dG9cImAgLSBPQk8gd2hlbiB0aGUgcmVxdWVzdCBhY3R1YWxseSBjYXJyaWVzIGEgdXNhYmxlIE9CTyB0b2tlbixcbiAqICAgICB0aGUgc2VydmljZSBwcmluY2lwYWwgb3RoZXJ3aXNlLiBPbmUgZGVwbG95bWVudCB0aGVuIHNlcnZlcyBCT1RIIGRvb3JzXG4gKiAgICAgY29ycmVjdGx5OiBmcm9udC1kb29yIHJlcXVlc3RzIGtlZXAgZnVsbCBwZXItdXNlciBzY29waW5nLCB3aGlsZSB0dW5uZWwgL1xuICogICAgIHdlYmhvb2sgcmVxdWVzdHMgZGVncmFkZSB0byB0aGUgc2VydmljZSBwcmluY2lwYWwgaW5zdGVhZCBvZiA1MDBpbmcuXG4gKlxuICogYFwiYXV0b1wiYCBkZWNpZGVzIHBlciBSRVFVRVNULCBub3QgcGVyIGJvb3QsIGJlY2F1c2UgYSBzaW5nbGUgY29udGFpbmVyIHNlcnZlc1xuICogYm90aCBkb29ycyBhdCBvbmNlIC0gdGhlIHR1bm5lbCBnYXRlIGFuZCB0aGUgcGxhdGZvcm0gZnJvbnQgZG9vciBzaGFyZSBhIHBvcnRcbiAqIChzZWUgYEBkYngtdG9vbHMvdHVubmVsYCkuIEEgYm9vdC10aW1lIGZsYWcgd291bGQgaGF2ZSB0byBiZSB3cm9uZyBmb3Igb25lXG4gKiBvZiB0aGVtLlxuICpcbiAqIFdoYXQgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIGRvZXMgTk9UIGNoYW5nZSBpcyBXSE8gdGhlIHJlcXVlc3QgYmVsb25ncyB0by4gVGhlXG4gKiBjYWxsZXIncyBpZGVudGl0eSBzdGlsbCBhcnJpdmVzIG9uIHtAbGluayBVU0VSX0lEX0hFQURFUn0gL1xuICoge0BsaW5rIFVTRVJfRU1BSUxfSEVBREVSfSwgc28gbWVtb3J5IHRocmVhZHMsIGNhY2hlIG5hbWVzcGFjZXMsIGFuZCB0cmFjZVxuICogYXR0cmlidXRpb24gc3RheSBwZXItdXNlci4gT25seSB0aGUgRGF0YWJyaWNrcyBjcmVkZW50aWFsIGlzIHNoYXJlZC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkVycm9yLCBQbHVnaW4gfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBjb25maWdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IGVycm9yVXRpbHMsIGxvZywgc3RyaW5nVXRpbHMsIHRva2VuIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuLyoqXG4gKiBIZWFkZXIgdGhlIERhdGFicmlja3MgQXBwcyBmcm9udCBkb29yIGZvcndhcmRzIHRoZSBjYWxsZXIncyBPQk8gdG9rZW4gb24uXG4gKiBJdHMgcHJlc2VuY2UgaXMgd2hhdCBtYWtlcyBgYXNVc2VyKHJlcSlgIHZpYWJsZSwgc28gaXQgaXMgdGhlIHNpZ25hbFxuICoge0BsaW5rIHVzZVNlcnZpY2VQcmluY2lwYWx9IHJlYWRzIGluIGBcImF1dG9cImAgbW9kZS5cbiAqXG4gKiBSZS1leHBvcnRlZCBmcm9tIGBAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlYCdzIGB0b2tlbmAgbW9kdWxlICh3aGljaCByZWFkcyB0aGVcbiAqIHNhbWUgaGVhZGVyIHRvIGRlY29kZSBPQXV0aCBzY29wZXMpIHJhdGhlciB0aGFuIHJlLXNwZWxsZWQsIHNvIHRoZSBuYW1lIGZvclxuICogdGhpcyB3aXJlIGNvbnRyYWN0IGV4aXN0cyBvbmNlLlxuICovXG5leHBvcnQgY29uc3QgQUNDRVNTX1RPS0VOX0hFQURFUiA9IHRva2VuLkFDQ0VTU19UT0tFTl9IRUFERVI7XG5cbi8qKiBIZWFkZXIgdGhlIERhdGFicmlja3MgQXBwcyBmcm9udCBkb29yIGZvcndhcmRzIHRoZSBjYWxsZXIncyB1c2VyIGlkIG9uLiAqL1xuZXhwb3J0IGNvbnN0IFVTRVJfSURfSEVBREVSID0gdG9rZW4uVVNFUl9JRF9IRUFERVI7XG5cbi8qKiBIZWFkZXIgdGhlIERhdGFicmlja3MgQXBwcyBmcm9udCBkb29yIGZvcndhcmRzIHRoZSBjYWxsZXIncyBlbWFpbCBvbi4gKi9cbmV4cG9ydCBjb25zdCBVU0VSX0VNQUlMX0hFQURFUiA9IHRva2VuLlVTRVJfRU1BSUxfSEVBREVSO1xuXG4vKiogSWRlbnRpdHkgYSByZXF1ZXN0J3MgRGF0YWJyaWNrcyBjYWxscyBydW4gYXMuIFNlZSB0aGUgbW9kdWxlIGRvY3MuICovXG5leHBvcnQgdHlwZSBJZGVudGl0eU1vZGUgPSBcInVzZXJcIiB8IFwic2VydmljZS1wcmluY2lwYWxcIiB8IFwiYXV0b1wiO1xuXG4vKiogRXZlcnkgYWNjZXB0ZWQge0BsaW5rIElkZW50aXR5TW9kZX0sIGluIHRoZSBvcmRlciBkb2NzIGFuZCBzY2hlbWFzIGxpc3QgdGhlbS4gKi9cbmV4cG9ydCBjb25zdCBJREVOVElUWV9NT0RFUzogcmVhZG9ubHkgSWRlbnRpdHlNb2RlW10gPSBbXCJ1c2VyXCIsIFwic2VydmljZS1wcmluY2lwYWxcIiwgXCJhdXRvXCJdO1xuXG4vKipcbiAqIERlZmF1bHQgbW9kZS4gYFwidXNlclwiYCBrZWVwcyBPQk8gdGhlIG9ubHkgaWRlbnRpdHkgdW5sZXNzIGFuIGFwcCBvcHRzIGluLCBzb1xuICogYWRvcHRpbmcgdGhpcyBvcHRpb24gY2FuIG5ldmVyIHNpbGVudGx5IHdpZGVuIGFuIGV4aXN0aW5nIGFwcCdzIGRhdGEgYWNjZXNzLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9JREVOVElUWV9NT0RFOiBJZGVudGl0eU1vZGUgPSBcInVzZXJcIjtcblxuLyoqIFRoZSBzdWJzZXQgb2YgYGV4cHJlc3MuUmVxdWVzdGAgdGhpcyBtb2R1bGUgcmVhZHMgLSBvbmUgaGVhZGVyIGxvb2t1cC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyQmVhcmluZyB7XG4gIGhlYWRlcihuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGNvbmZpZ3VyZWQgbW9kZTogZXhwbGljaXQgY29uZmlnIHZhbHVlLCB0aGVuIHRoZSBmaXJzdCBub24tZW1wdHlcbiAqIHZhcmlhYmxlIGFtb25nIGBlbnZLZXlzYCwgdGhlbiB7QGxpbmsgREVGQVVMVF9JREVOVElUWV9NT0RFfS5cbiAqXG4gKiBBbiB1bnJlY29nbml6ZWQgdmFsdWUgdGhyb3dzIHJhdGhlciB0aGFuIGZhbGxpbmcgYmFjay4gRmFsbGluZyBiYWNrIHdvdWxkXG4gKiBzaWxlbnRseSBrZWVwIHNlcnZpbmcgT0JPIC0gYW5kIHRoZSBwcm9kdWN0aW9uIGBBdXRoZW50aWNhdGlvbkVycm9yYCBpdFxuICogcHJvZHVjZXMgLSB0byBleGFjdGx5IHRoZSBjYWxsZXJzIHRoZSBvcHRpb24gd2FzIHNldCB0byBhY2NvbW1vZGF0ZSwgYW5kIGFcbiAqIHR5cG8gKGBcIm9ib1wiYCwgYFwic3BcImApIGlzIHRoZSBsaWtlbGllc3Qgd2F5IHRvIGdldCBvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlSWRlbnRpdHlNb2RlKFxuICBjb25maWd1cmVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGVudktleXM6IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBmaWVsZCA9IFwiaWRlbnRpdHlcIixcbik6IElkZW50aXR5TW9kZSB7XG4gIGNvbnN0IHJhdyA9IGNvbmZpZ1V0aWxzLnN0cmluZyhjb25maWd1cmVkLCBlbnZLZXlzLCBjb25maWdVdGlscy5FTlZfT05MWSk7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCkgcmV0dXJuIERFRkFVTFRfSURFTlRJVFlfTU9ERTtcbiAgY29uc3QgbW9kZSA9IHJhdy50b0xvd2VyQ2FzZSgpIGFzIElkZW50aXR5TW9kZTtcbiAgaWYgKCFJREVOVElUWV9NT0RFUy5pbmNsdWRlcyhtb2RlKSkge1xuICAgIGNvbnN0IG5hbWVzID0gdHlwZW9mIGVudktleXMgPT09IFwic3RyaW5nXCIgPyBlbnZLZXlzIDogZW52S2V5cy5qb2luKFwiIC8gXCIpO1xuICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgICBgJHtmaWVsZH0gbXVzdCBiZSBvbmUgb2YgJHtJREVOVElUWV9NT0RFUy5qb2luKFwiIHwgXCIpfSAoZW52OiAke25hbWVzfSlgLFxuICAgICAgeyBjb250ZXh0OiB7IGZpZWxkLCBlbnZWYXI6IG5hbWVzLCByZWNlaXZlZDogcmF3IH0gfSxcbiAgICApO1xuICB9XG4gIHJldHVybiBtb2RlO1xufVxuXG4vKipcbiAqIFRoZSBPQk8gdG9rZW4gb24gYHJlcWAsIG9yIGB1bmRlZmluZWRgLiBSZWFkIHRocm91Z2ggdGhlIHNhbWUgdHJpbSBhcyBldmVyeVxuICogb3RoZXIgaGVhZGVyLCBzbyBhIGhlYWRlciBwcmVzZW50LWJ1dC1ibGFuayAod2hpY2ggc29tZSBwcm94aWVzIGVtaXQgZm9yIGFuXG4gKiB1bnNldCB1cHN0cmVhbSB2YWx1ZSkgY291bnRzIGFzIGFic2VudCByYXRoZXIgdGhhbiBhcyBhIHRva2VuIHRoYXQgZmFpbHMgYXRcbiAqIHRoZSBmaXJzdCBEYXRhYnJpY2tzIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0QWNjZXNzVG9rZW4ocmVxOiBIZWFkZXJCZWFyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwocmVxPy5oZWFkZXIoQUNDRVNTX1RPS0VOX0hFQURFUikpID8/IHVuZGVmaW5lZDtcbn1cblxuLyoqIFRoZSBmb3J3YXJkZWQgdXNlciBpZCBvbiBgcmVxYCwgb3IgYHVuZGVmaW5lZGAuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWVzdFVzZXJJZChyZXE6IEhlYWRlckJlYXJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChyZXE/LmhlYWRlcihVU0VSX0lEX0hFQURFUikpID8/IHVuZGVmaW5lZDtcbn1cblxuLyoqIFRoZSBmb3J3YXJkZWQgdXNlciBlbWFpbCBvbiBgcmVxYCwgb3IgYHVuZGVmaW5lZGAuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWVzdFVzZXJFbWFpbChyZXE6IEhlYWRlckJlYXJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChyZXE/LmhlYWRlcihVU0VSX0VNQUlMX0hFQURFUikpID8/IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGByZXFgIHNob3VsZCBydW4gaXRzIERhdGFicmlja3MgY2FsbHMgYXMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbFxuICogcmF0aGVyIHRoYW4gT0JPLlxuICpcbiAqIC0gYFwic2VydmljZS1wcmluY2lwYWxcImAgLT4gYWx3YXlzIGB0cnVlYC5cbiAqIC0gYFwidXNlclwiYCAtPiBhbHdheXMgYGZhbHNlYCwgZXZlbiB3aXRoIG5vIHRva2VuLiBUaGUgbW9kZSBpcyBhbiBleHBsaWNpdFxuICogICBhc3NlcnRpb24gdGhhdCBldmVyeSBjYWxsZXIgaXMgT0JPLWNhcGFibGUsIHNvIGEgbWlzc2luZyB0b2tlbiBpcyBhIHJlYWxcbiAqICAgZXJyb3IgYW5kIG11c3Qgc3VyZmFjZSBhcyBBcHBLaXQncyBgQXV0aGVudGljYXRpb25FcnJvcmAgcmF0aGVyIHRoYW4gYmVpbmdcbiAqICAgcXVpZXRseSBkb3duZ3JhZGVkIHRvIHNoYXJlZCBkYXRhIGFjY2Vzcy5cbiAqIC0gYFwiYXV0b1wiYCAtPiBgdHJ1ZWAgb25seSB3aGVuIHRoZSByZXF1ZXN0IGNhcnJpZXMgbm8gdXNhYmxlIE9CTyB0b2tlbi5cbiAqXG4gKiBBIHJlcXVlc3QgQXBwS2l0IHdpbGwgbm90IGFjY2VwdCBmb3IgT0JPIGFueXdheSAobm8gdG9rZW4pIGNhbiBuZXZlciBiZVxuICogc2VydmVkIGJ5IGVudGVyaW5nIGBhc1VzZXJgLCBzbyBpbiBgXCJhdXRvXCJgIG1vZGUgdGhlIHRva2VuIGNoZWNrIGlzIHRoZSB3aG9sZVxuICogZGVjaXNpb246IGl0IGlzIHRoZSBzYW1lIGNvbmRpdGlvbiBBcHBLaXQgaXRzZWxmIGJyYW5jaGVzIG9uLCBqdXN0IHJlc29sdmVkXG4gKiBiZWZvcmUgaXQgY2FuIHRocm93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlU2VydmljZVByaW5jaXBhbChtb2RlOiBJZGVudGl0eU1vZGUsIHJlcT86IEhlYWRlckJlYXJpbmcpOiBib29sZWFuIHtcbiAgaWYgKG1vZGUgPT09IFwic2VydmljZS1wcmluY2lwYWxcIikgcmV0dXJuIHRydWU7XG4gIGlmIChtb2RlID09PSBcInVzZXJcIikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gcmVxdWVzdEFjY2Vzc1Rva2VuKHJlcSkgPT09IHVuZGVmaW5lZDtcbn1cblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImFwcGtpdFwiKTtcbmNvbnN0IHNraXBwZWRBc1VzZXIgPSBuZXcgU2V0PHN0cmluZz4oKTtcbmNvbnN0IEFTX1VTRVJfU0tJUF9XQVJOID0gXCJTa2lwcGluZyB1c2VyIGltcGVyc29uYXRpb25cIjtcbmNvbnN0IEFTX1VTRVJfUEFUQ0hFRCA9IFN5bWJvbC5mb3IoXCJkYngtdG9vbHMuYXBwa2l0LmFzVXNlckRldkxvZ1wiKTtcblxuLyoqXG4gKiBJbiBkZXZlbG9wbWVudCwga2VlcCBBcHBLaXQgYGFzVXNlcmAgYmVoYXZpb3IuIFRoZSBmaXJzdCBtaXNzaW5nLXRva2VuIHNraXBcbiAqIGZvciBhIGZvcndhcmRlZCBlbWFpbCBvciB1c2VyIGlkIHVzZXMgQXBwS2l0J3Mgb3duIHdhcm47IGxhdGVyIHNraXBzIGZvclxuICogdGhhdCB1c2VyLCBhbmQgZXZlcnkgc2tpcCB3aXRoIG5vIGZvcndhcmRlZCBpZGVudGl0eSwgYXJlIHNpbGVudC4gUmVxdWVzdFxuICogb2JqZWN0cyBhcmUgbm90IGEgc3RhYmxlIGtleTogZWFjaCBwbHVnaW4gY2FsbCB0eXBpY2FsbHkgaGFzIGl0cyBvd24gYHJlcWAuXG4gKlxuICogTm8tb3Agb3V0c2lkZSBkZXZlbG9wbWVudCwgd2hlbiBgUGx1Z2luLmFzVXNlcmAgaXMgbWlzc2luZyBvciBub3QgYVxuICogZnVuY3Rpb24sIG9yIGlmIHRoZSBwcm90b3R5cGUgY2Fubm90IGJlIHJld3JpdHRlbi4gRmFpbHVyZXMgbmV2ZXIgdGhyb3c6XG4gKiBBcHBLaXQga2VlcHMgaXRzIG9yaWdpbmFsIGBhc1VzZXJgLiBFeHRyYSBhcmd1bWVudHMgYXJlIGZvcndhcmRlZCBzbyBhXG4gKiBsYXRlciBzaWduYXR1cmUgY2hhbmdlIHN0aWxsIHJlYWNoZXMgdGhlIG9yaWdpbmFsIG1ldGhvZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGxBc1VzZXJEZXZlbG9wbWVudFBhdGNoKCk6IHZvaWQge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwiZGV2ZWxvcG1lbnRcIikgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHByb3RvID0gUGx1Z2luLnByb3RvdHlwZSBhcyB1bmtub3duIGFzIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj47XG4gICAgaWYgKHByb3RvW0FTX1VTRVJfUEFUQ0hFRF0gPT09IHRydWUpIHJldHVybjtcbiAgICBjb25zdCBvcmlnaW5hbCA9IHByb3RvLmFzVXNlcjtcbiAgICBpZiAodHlwZW9mIG9yaWdpbmFsICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybjtcbiAgICBwcm90b1tBU19VU0VSX1BBVENIRURdID0gdHJ1ZTtcbiAgICBwcm90by5hc1VzZXIgPSBmdW5jdGlvbiBwYXRjaGVkQXNVc2VyKHRoaXM6IHVua25vd24sIHJlcTogdW5rbm93biwgLi4ucmVzdDogdW5rbm93bltdKSB7XG4gICAgICBjb25zdCBoZWFkZXJzID0gYXNIZWFkZXJCZWFyaW5nKHJlcSk7XG4gICAgICBjb25zdCBhcmdzID0gW3JlcSwgLi4ucmVzdF07XG4gICAgICBpZiAoIWhlYWRlcnMgfHwgcmVxdWVzdEFjY2Vzc1Rva2VuKGhlYWRlcnMpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKG9yaWdpbmFsLCB0aGlzLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3aXRoQXNVc2VyU2tpcFdhcm5TdXBwcmVzc2VkKGhlYWRlcnMsICgpID0+XG4gICAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKG9yaWdpbmFsLCB0aGlzLCBhcmdzKSxcbiAgICAgICk7XG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJhc1VzZXIgZGV2ZWxvcG1lbnQgcGF0Y2ggc2tpcHBlZFwiLCB7IGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyb3IpIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFzSGVhZGVyQmVhcmluZyhyZXE6IHVua25vd24pOiBIZWFkZXJCZWFyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJlcSA9PT0gbnVsbCB8fCB0eXBlb2YgcmVxICE9PSBcIm9iamVjdFwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIChyZXEgYXMgSGVhZGVyQmVhcmluZykuaGVhZGVyICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiByZXEgYXMgSGVhZGVyQmVhcmluZztcbn1cblxuZnVuY3Rpb24gd2l0aEFzVXNlclNraXBXYXJuU3VwcHJlc3NlZDxUPihyZXE6IEhlYWRlckJlYXJpbmcsIGZuOiAoKSA9PiBUKTogVCB7XG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0VXNlckVtYWlsKHJlcSkgPz8gcmVxdWVzdFVzZXJJZChyZXEpO1xuICBpZiAodXNlciAmJiAhc2tpcHBlZEFzVXNlci5oYXModXNlcikpIHtcbiAgICBza2lwcGVkQXNVc2VyLmFkZCh1c2VyKTtcbiAgICByZXR1cm4gZm4oKTtcbiAgfVxuICBjb25zdCB3YXJuID0gY29uc29sZS53YXJuO1xuICBjb25zb2xlLndhcm4gPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgaWYgKFxuICAgICAgIWxvZy5pc0xldmVsRW5hYmxlZChcImRlYnVnXCIpICYmXG4gICAgICBhcmdzLnNvbWUoKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUuaW5jbHVkZXMoQVNfVVNFUl9TS0lQX1dBUk4pKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3YXJuLmFwcGx5KGNvbnNvbGUsIGFyZ3MgYXMgUGFyYW1ldGVyczx0eXBlb2YgY29uc29sZS53YXJuPik7XG4gIH07XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgY29uc29sZS53YXJuID0gd2FybjtcbiAgfVxufVxuIl19
204
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaWRlbnRpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1ERztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTdFOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFDO0FBRTdELDhFQUE4RTtBQUM5RSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQztBQUVuRCw0RUFBNEU7QUFDNUUsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDO0FBS3pELG9GQUFvRjtBQUNwRixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQTRCLENBQUMsTUFBTSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRTdGOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFpQixNQUFNLENBQUM7QUFPMUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLFVBQThCLEVBQzlCLE9BQW1DLEVBQ25DLEtBQUssR0FBRyxVQUFVO0lBRWxCLE1BQU0sR0FBRyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUUsSUFBSSxHQUFHLEtBQUssU0FBUztRQUFFLE9BQU8scUJBQXFCLENBQUM7SUFDcEQsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBa0IsQ0FBQztJQUMvQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sS0FBSyxHQUFHLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFFLE1BQU0sSUFBSSxrQkFBa0IsQ0FDMUIsR0FBRyxLQUFLLG1CQUFtQixjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEtBQUssR0FBRyxFQUN2RSxFQUFFLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUNyRCxDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEdBQThCO0lBQy9ELE9BQU8sV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUMsSUFBSSxTQUFTLENBQUM7QUFDL0UsQ0FBQztBQUVELHNEQUFzRDtBQUN0RCxNQUFNLFVBQVUsYUFBYSxDQUFDLEdBQThCO0lBQzFELE9BQU8sV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDO0FBQzFFLENBQUM7QUFFRCx5REFBeUQ7QUFDekQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEdBQThCO0lBQzdELE9BQU8sV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxTQUFTLENBQUM7QUFDN0UsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxJQUFrQixFQUFFLEdBQW1CO0lBQ3pFLElBQUksSUFBSSxLQUFLLG1CQUFtQjtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzlDLElBQUksSUFBSSxLQUFLLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNsQyxPQUFPLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNwQyxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0FBQ3hDLE1BQU0saUJBQWlCLEdBQUcsNkJBQTZCLENBQUM7QUFDeEQsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0FBRXBFOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsNkJBQTZCO0lBQzNDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssYUFBYTtRQUFFLE9BQU87SUFDbkQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFNBQW9ELENBQUM7UUFDMUUsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQUssSUFBSTtZQUFFLE9BQU87UUFDNUMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUM5QixJQUFJLE9BQU8sUUFBUSxLQUFLLFVBQVU7WUFBRSxPQUFPO1FBQzNDLEtBQUssQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDOUIsS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLGFBQWEsQ0FBZ0IsR0FBWSxFQUFFLEdBQUcsSUFBZTtZQUNuRixNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsT0FBTyxJQUFJLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMxRCxPQUFPLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzdELENBQUM7WUFDRCxPQUFPLDRCQUE0QixDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FDaEQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQ3BELENBQUM7UUFDSixDQUFDLENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEVBQUUsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDekYsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxHQUFZO0lBQ25DLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDOUQsSUFBSSxPQUFRLEdBQXFCLENBQUMsTUFBTSxLQUFLLFVBQVU7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMxRSxPQUFPLEdBQW9CLENBQUM7QUFDOUIsQ0FBQztBQUVELFNBQVMsNEJBQTRCLENBQUksR0FBa0IsRUFBRSxFQUFXO0lBQ3RFLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6RCxJQUFJLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNyQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLE9BQU8sRUFBRSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztJQUMxQixPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFlLEVBQUUsRUFBRTtRQUNwQyxJQUNFLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7WUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUNwRixDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUF1QyxDQUFDLENBQUM7SUFDL0QsQ0FBQyxDQUFDO0lBQ0YsSUFBSSxDQUFDO1FBQ0gsT0FBTyxFQUFFLEVBQUUsQ0FBQztJQUNkLENBQUM7WUFBUyxDQUFDO1FBQ1QsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDdEIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdoaWNoIERhdGFicmlja3MgaWRlbnRpdHkgYSByZXF1ZXN0J3Mgd29ya3NwYWNlIGNhbGxzIHJ1biBhcy5cbiAqXG4gKiBBcHBLaXQgZ2l2ZXMgYSBwbHVnaW4gdHdvIGlkZW50aXRpZXM6IHRoZSBhbWJpZW50IFNFUlZJQ0UgY29udGV4dCAodGhlIGFwcCdzXG4gKiBvd24gc2VydmljZSBwcmluY2lwYWwpIGFuZCBhIHBlci1yZXF1ZXN0IFVTRVIgY29udGV4dCBlbnRlcmVkIHdpdGhcbiAqIGBhc1VzZXIocmVxKWAsIHdoaWNoIGF1dGhlbnRpY2F0ZXMgYXMgdGhlIGNhbGxlciBvbi1iZWhhbGYtb2YgKE9CTykuIFRoZVxuICogY2hvaWNlIGlzIG9uZSBjYWxsLCBzbyB0aGUgd2hvbGUgZGVjaXNpb24gaXMgXCJkbyB3ZSBlbnRlciBgYXNVc2VyYCBmb3IgdGhpc1xuICogcmVxdWVzdFwiLlxuICpcbiAqIGBhc1VzZXIocmVxKWAgbmVlZHMgdGhlIE9CTyB0b2tlbiB0aGUgcGxhdGZvcm0gZnJvbnQgZG9vciBmb3J3YXJkcyBvblxuICoge0BsaW5rIEFDQ0VTU19UT0tFTl9IRUFERVJ9LiBNZWFzdXJlZCBhZ2FpbnN0IHRoZSBpbnN0YWxsZWQgQXBwS2l0LCBpdHNcbiAqIGJlaGF2aW9yIHdoZW4gdGhhdCBoZWFkZXIgaXMgYWJzZW50IGRlcGVuZHMgRU5USVJFTFkgb24gYE5PREVfRU5WYDpcbiAqXG4gKiB8IGBOT0RFX0VOVmAgICAgfCBubyBgeC1mb3J3YXJkZWQtYWNjZXNzLXRva2VuYCAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxuICogfCBgZGV2ZWxvcG1lbnRgIHwgbG9ncyBhIHdhcm5pbmcsIHNpbGVudGx5IHJ1bnMgYXMgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIHxcbiAqIHwgYW55dGhpbmcgZWxzZSB8IHRocm93cyBgQXV0aGVudGljYXRpb25FcnJvcjogTWlzc2luZyB1c2VyIHRva2VuYCAgICAgIHxcbiAqXG4gKiBUaGF0IHByb2R1Y3Rpb24gdGhyb3cgaXMgY29ycmVjdCBmb3IgYW4gYXBwIGJlaGluZCB0aGUgRGF0YWJyaWNrcyBmcm9udCBkb29yLFxuICogd2hlcmUgYSBtaXNzaW5nIHRva2VuIG1lYW5zIHNvbWV0aGluZyBpcyB3cm9uZy4gSXQgaXMgZmF0YWwgZm9yIGFuIGFwcCB3aG9zZVxuICogdHJhZmZpYyBsZWdpdGltYXRlbHkgYXJyaXZlcyBXSVRIT1VUIG9uZTpcbiAqXG4gKiAgIC0gYSBwdWJsaWMgdHVubmVsIChgQGRieC10b29scy90dW5uZWxgKSwgd2hlcmUgY2FsbGVycyBhdXRoZW50aWNhdGUgYnlcbiAqICAgICBlbWFpbCBPVFAgYW5kIG5vIE9CTyB0b2tlbiBleGlzdHMgdG8gZm9yd2FyZCAtIHRoZSBnYXRlIGNhbiBwcm92ZSBXSE8gdGhlXG4gKiAgICAgY2FsbGVyIGlzLCBidXQgaXQgY2Fubm90IG1pbnQgYSBEYXRhYnJpY2tzIGNyZWRlbnRpYWwgZm9yIHRoZW07XG4gKiAgIC0gYW55IHJldmVyc2UgcHJveHksIHdlYmhvb2ssIG9yIGJvdCBjaGFubmVsIHRoYXQgYXV0aGVudGljYXRlcyBpdHMgb3duIHdheS5cbiAqXG4gKiBTdWNoIGFuIGFwcCBtdXN0IG5vdCBydW4gd2l0aCBgTk9ERV9FTlY9ZGV2ZWxvcG1lbnRgIGp1c3QgdG8gZ2V0IHRoZSBmYWxsYmFjazpcbiAqIHRoYXQgZmxhZyBhbHNvIHJlbGF4ZXMgc2VjdXJlIGNvb2tpZXMsIEFwcEtpdCdzIG93biBkZXYgYWZmb3JkYW5jZXMsIGFuZFxuICogYGFsbG93VW5hdXRoZW50aWNhdGVkYCBlc2NhcGUgaGF0Y2hlcy4gSGVuY2Uge0BsaW5rIElkZW50aXR5TW9kZX06XG4gKlxuICogICAtIGBcInVzZXJcImAgLSBhbHdheXMgT0JPLiBQZXItdXNlciBhdHRyaWJ1dGlvbiBhbmQgcGVyLXVzZXIgR2VuaWUgLyBVbml0eVxuICogICAgIENhdGFsb2cgcm93IGZpbHRlcnMuIENvcnJlY3Qgd2hlbiBldmVyeSBjYWxsZXIgaXMgYSB3b3Jrc3BhY2UgbWVtYmVyLlxuICogICAtIGBcInNlcnZpY2UtcHJpbmNpcGFsXCJgIC0gYWx3YXlzIHRoZSBhcHAncyBvd24gaWRlbnRpdHkuIE5lZWRzIG5vIE9CT1xuICogICAgIHNjb3BlcyBhbmQgd29ya3MgZm9yIGFueSBjYWxsZXIsIGF0IHRoZSBjb3N0IG9mIHBlci11c2VyIGRhdGEgc2NvcGluZy5cbiAqICAgLSBgXCJhdXRvXCJgIC0gT0JPIHdoZW4gdGhlIHJlcXVlc3QgYWN0dWFsbHkgY2FycmllcyBhIHVzYWJsZSBPQk8gdG9rZW4sXG4gKiAgICAgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIG90aGVyd2lzZS4gT25lIGRlcGxveW1lbnQgdGhlbiBzZXJ2ZXMgQk9USCBkb29yc1xuICogICAgIGNvcnJlY3RseTogZnJvbnQtZG9vciByZXF1ZXN0cyBrZWVwIGZ1bGwgcGVyLXVzZXIgc2NvcGluZywgd2hpbGUgdHVubmVsIC9cbiAqICAgICB3ZWJob29rIHJlcXVlc3RzIGRlZ3JhZGUgdG8gdGhlIHNlcnZpY2UgcHJpbmNpcGFsIGluc3RlYWQgb2YgNTAwaW5nLlxuICpcbiAqIGBcImF1dG9cImAgZGVjaWRlcyBwZXIgUkVRVUVTVCwgbm90IHBlciBib290LCBiZWNhdXNlIGEgc2luZ2xlIGNvbnRhaW5lciBzZXJ2ZXNcbiAqIGJvdGggZG9vcnMgYXQgb25jZSAtIHRoZSB0dW5uZWwgZ2F0ZSBhbmQgdGhlIHBsYXRmb3JtIGZyb250IGRvb3Igc2hhcmUgYSBwb3J0XG4gKiAoc2VlIGBAZGJ4LXRvb2xzL3R1bm5lbGApLiBBIGJvb3QtdGltZSBmbGFnIHdvdWxkIGhhdmUgdG8gYmUgd3JvbmcgZm9yIG9uZVxuICogb2YgdGhlbS5cbiAqXG4gKiBXaGF0IHRoZSBzZXJ2aWNlIHByaW5jaXBhbCBkb2VzIE5PVCBjaGFuZ2UgaXMgV0hPIHRoZSByZXF1ZXN0IGJlbG9uZ3MgdG8uIFRoZVxuICogY2FsbGVyJ3MgaWRlbnRpdHkgc3RpbGwgYXJyaXZlcyBvbiB7QGxpbmsgVVNFUl9JRF9IRUFERVJ9IC9cbiAqIHtAbGluayBVU0VSX0VNQUlMX0hFQURFUn0sIHNvIG1lbW9yeSB0aHJlYWRzLCBjYWNoZSBuYW1lc3BhY2VzLCBhbmQgdHJhY2VcbiAqIGF0dHJpYnV0aW9uIHN0YXkgcGVyLXVzZXIuIE9ubHkgdGhlIERhdGFicmlja3MgY3JlZGVudGlhbCBpcyBzaGFyZWQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciwgUGx1Z2luIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY29uZmlnVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2csIHN0cmluZ1V0aWxzLCB0b2tlbiB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbi8qKlxuICogSGVhZGVyIHRoZSBEYXRhYnJpY2tzIEFwcHMgZnJvbnQgZG9vciBmb3J3YXJkcyB0aGUgY2FsbGVyJ3MgT0JPIHRva2VuIG9uLlxuICogSXRzIHByZXNlbmNlIGlzIHdoYXQgbWFrZXMgYGFzVXNlcihyZXEpYCB2aWFibGUsIHNvIGl0IGlzIHRoZSBzaWduYWxcbiAqIHtAbGluayB1c2VTZXJ2aWNlUHJpbmNpcGFsfSByZWFkcyBpbiBgXCJhdXRvXCJgIG1vZGUuXG4gKlxuICogUmUtZXhwb3J0ZWQgZnJvbSBgQGRieC10b29scy9zaGFyZWQtY29yZWAncyBgdG9rZW5gIG1vZHVsZSAod2hpY2ggcmVhZHMgdGhlXG4gKiBzYW1lIGhlYWRlciB0byBkZWNvZGUgT0F1dGggc2NvcGVzKSByYXRoZXIgdGhhbiByZS1zcGVsbGVkLCBzbyB0aGUgbmFtZSBmb3JcbiAqIHRoaXMgd2lyZSBjb250cmFjdCBleGlzdHMgb25jZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFDQ0VTU19UT0tFTl9IRUFERVIgPSB0b2tlbi5BQ0NFU1NfVE9LRU5fSEVBREVSO1xuXG4vKiogSGVhZGVyIHRoZSBEYXRhYnJpY2tzIEFwcHMgZnJvbnQgZG9vciBmb3J3YXJkcyB0aGUgY2FsbGVyJ3MgdXNlciBpZCBvbi4gKi9cbmV4cG9ydCBjb25zdCBVU0VSX0lEX0hFQURFUiA9IHRva2VuLlVTRVJfSURfSEVBREVSO1xuXG4vKiogSGVhZGVyIHRoZSBEYXRhYnJpY2tzIEFwcHMgZnJvbnQgZG9vciBmb3J3YXJkcyB0aGUgY2FsbGVyJ3MgZW1haWwgb24uICovXG5leHBvcnQgY29uc3QgVVNFUl9FTUFJTF9IRUFERVIgPSB0b2tlbi5VU0VSX0VNQUlMX0hFQURFUjtcblxuLyoqIElkZW50aXR5IGEgcmVxdWVzdCdzIERhdGFicmlja3MgY2FsbHMgcnVuIGFzLiBTZWUgdGhlIG1vZHVsZSBkb2NzLiAqL1xuZXhwb3J0IHR5cGUgSWRlbnRpdHlNb2RlID0gXCJ1c2VyXCIgfCBcInNlcnZpY2UtcHJpbmNpcGFsXCIgfCBcImF1dG9cIjtcblxuLyoqIEV2ZXJ5IGFjY2VwdGVkIHtAbGluayBJZGVudGl0eU1vZGV9LCBpbiB0aGUgb3JkZXIgZG9jcyBhbmQgc2NoZW1hcyBsaXN0IHRoZW0uICovXG5leHBvcnQgY29uc3QgSURFTlRJVFlfTU9ERVM6IHJlYWRvbmx5IElkZW50aXR5TW9kZVtdID0gW1widXNlclwiLCBcInNlcnZpY2UtcHJpbmNpcGFsXCIsIFwiYXV0b1wiXTtcblxuLyoqXG4gKiBEZWZhdWx0IG1vZGUuIGBcInVzZXJcImAga2VlcHMgT0JPIHRoZSBvbmx5IGlkZW50aXR5IHVubGVzcyBhbiBhcHAgb3B0cyBpbiwgc29cbiAqIGFkb3B0aW5nIHRoaXMgb3B0aW9uIGNhbiBuZXZlciBzaWxlbnRseSB3aWRlbiBhbiBleGlzdGluZyBhcHAncyBkYXRhIGFjY2Vzcy5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSURFTlRJVFlfTU9ERTogSWRlbnRpdHlNb2RlID0gXCJ1c2VyXCI7XG5cbi8qKiBUaGUgc3Vic2V0IG9mIGBleHByZXNzLlJlcXVlc3RgIHRoaXMgbW9kdWxlIHJlYWRzIC0gb25lIGhlYWRlciBsb29rdXAuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWRlckJlYXJpbmcge1xuICBoZWFkZXIobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBjb25maWd1cmVkIG1vZGU6IGV4cGxpY2l0IGNvbmZpZyB2YWx1ZSwgdGhlbiB0aGUgZmlyc3Qgbm9uLWVtcHR5XG4gKiB2YXJpYWJsZSBhbW9uZyBgZW52S2V5c2AsIHRoZW4ge0BsaW5rIERFRkFVTFRfSURFTlRJVFlfTU9ERX0uXG4gKlxuICogQW4gdW5yZWNvZ25pemVkIHZhbHVlIHRocm93cyByYXRoZXIgdGhhbiBmYWxsaW5nIGJhY2suIEZhbGxpbmcgYmFjayB3b3VsZFxuICogc2lsZW50bHkga2VlcCBzZXJ2aW5nIE9CTyAtIGFuZCB0aGUgcHJvZHVjdGlvbiBgQXV0aGVudGljYXRpb25FcnJvcmAgaXRcbiAqIHByb2R1Y2VzIC0gdG8gZXhhY3RseSB0aGUgY2FsbGVycyB0aGUgb3B0aW9uIHdhcyBzZXQgdG8gYWNjb21tb2RhdGUsIGFuZCBhXG4gKiB0eXBvIChgXCJvYm9cImAsIGBcInNwXCJgKSBpcyB0aGUgbGlrZWxpZXN0IHdheSB0byBnZXQgb25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUlkZW50aXR5TW9kZShcbiAgY29uZmlndXJlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBlbnZLZXlzOiBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXSxcbiAgZmllbGQgPSBcImlkZW50aXR5XCIsXG4pOiBJZGVudGl0eU1vZGUge1xuICBjb25zdCByYXcgPSBjb25maWdVdGlscy5zdHJpbmcoY29uZmlndXJlZCwgZW52S2V5cywgY29uZmlnVXRpbHMuRU5WX09OTFkpO1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQpIHJldHVybiBERUZBVUxUX0lERU5USVRZX01PREU7XG4gIGNvbnN0IG1vZGUgPSByYXcudG9Mb3dlckNhc2UoKSBhcyBJZGVudGl0eU1vZGU7XG4gIGlmICghSURFTlRJVFlfTU9ERVMuaW5jbHVkZXMobW9kZSkpIHtcbiAgICBjb25zdCBuYW1lcyA9IHR5cGVvZiBlbnZLZXlzID09PSBcInN0cmluZ1wiID8gZW52S2V5cyA6IGVudktleXMuam9pbihcIiAvIFwiKTtcbiAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgICAgYCR7ZmllbGR9IG11c3QgYmUgb25lIG9mICR7SURFTlRJVFlfTU9ERVMuam9pbihcIiB8IFwiKX0gKGVudjogJHtuYW1lc30pYCxcbiAgICAgIHsgY29udGV4dDogeyBmaWVsZCwgZW52VmFyOiBuYW1lcywgcmVjZWl2ZWQ6IHJhdyB9IH0sXG4gICAgKTtcbiAgfVxuICByZXR1cm4gbW9kZTtcbn1cblxuLyoqXG4gKiBUaGUgT0JPIHRva2VuIG9uIGByZXFgLCBvciBgdW5kZWZpbmVkYC4gUmVhZCB0aHJvdWdoIHRoZSBzYW1lIHRyaW0gYXMgZXZlcnlcbiAqIG90aGVyIGhlYWRlciwgc28gYSBoZWFkZXIgcHJlc2VudC1idXQtYmxhbmsgKHdoaWNoIHNvbWUgcHJveGllcyBlbWl0IGZvciBhblxuICogdW5zZXQgdXBzdHJlYW0gdmFsdWUpIGNvdW50cyBhcyBhYnNlbnQgcmF0aGVyIHRoYW4gYXMgYSB0b2tlbiB0aGF0IGZhaWxzIGF0XG4gKiB0aGUgZmlyc3QgRGF0YWJyaWNrcyBjYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWVzdEFjY2Vzc1Rva2VuKHJlcTogSGVhZGVyQmVhcmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBzdHJpbmdVdGlscy50cmltVG9OdWxsKHJlcT8uaGVhZGVyKEFDQ0VTU19UT0tFTl9IRUFERVIpKSA/PyB1bmRlZmluZWQ7XG59XG5cbi8qKiBUaGUgZm9yd2FyZGVkIHVzZXIgaWQgb24gYHJlcWAsIG9yIGB1bmRlZmluZWRgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3RVc2VySWQocmVxOiBIZWFkZXJCZWFyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwocmVxPy5oZWFkZXIoVVNFUl9JRF9IRUFERVIpKSA/PyB1bmRlZmluZWQ7XG59XG5cbi8qKiBUaGUgZm9yd2FyZGVkIHVzZXIgZW1haWwgb24gYHJlcWAsIG9yIGB1bmRlZmluZWRgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3RVc2VyRW1haWwocmVxOiBIZWFkZXJCZWFyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwocmVxPy5oZWFkZXIoVVNFUl9FTUFJTF9IRUFERVIpKSA/PyB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogV2hldGhlciBgcmVxYCBzaG91bGQgcnVuIGl0cyBEYXRhYnJpY2tzIGNhbGxzIGFzIHRoZSBhcHAgc2VydmljZSBwcmluY2lwYWxcbiAqIHJhdGhlciB0aGFuIE9CTy5cbiAqXG4gKiAtIGBcInNlcnZpY2UtcHJpbmNpcGFsXCJgIC0+IGFsd2F5cyBgdHJ1ZWAuXG4gKiAtIGBcInVzZXJcImAgLT4gYWx3YXlzIGBmYWxzZWAsIGV2ZW4gd2l0aCBubyB0b2tlbi4gVGhlIG1vZGUgaXMgYW4gZXhwbGljaXRcbiAqICAgYXNzZXJ0aW9uIHRoYXQgZXZlcnkgY2FsbGVyIGlzIE9CTy1jYXBhYmxlLCBzbyBhIG1pc3NpbmcgdG9rZW4gaXMgYSByZWFsXG4gKiAgIGVycm9yIGFuZCBtdXN0IHN1cmZhY2UgYXMgQXBwS2l0J3MgYEF1dGhlbnRpY2F0aW9uRXJyb3JgIHJhdGhlciB0aGFuIGJlaW5nXG4gKiAgIHF1aWV0bHkgZG93bmdyYWRlZCB0byBzaGFyZWQgZGF0YSBhY2Nlc3MuXG4gKiAtIGBcImF1dG9cImAgLT4gYHRydWVgIG9ubHkgd2hlbiB0aGUgcmVxdWVzdCBjYXJyaWVzIG5vIHVzYWJsZSBPQk8gdG9rZW4uXG4gKlxuICogQSByZXF1ZXN0IEFwcEtpdCB3aWxsIG5vdCBhY2NlcHQgZm9yIE9CTyBhbnl3YXkgKG5vIHRva2VuKSBjYW4gbmV2ZXIgYmVcbiAqIHNlcnZlZCBieSBlbnRlcmluZyBgYXNVc2VyYCwgc28gaW4gYFwiYXV0b1wiYCBtb2RlIHRoZSB0b2tlbiBjaGVjayBpcyB0aGUgd2hvbGVcbiAqIGRlY2lzaW9uOiBpdCBpcyB0aGUgc2FtZSBjb25kaXRpb24gQXBwS2l0IGl0c2VsZiBicmFuY2hlcyBvbiwganVzdCByZXNvbHZlZFxuICogYmVmb3JlIGl0IGNhbiB0aHJvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVNlcnZpY2VQcmluY2lwYWwobW9kZTogSWRlbnRpdHlNb2RlLCByZXE/OiBIZWFkZXJCZWFyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChtb2RlID09PSBcInNlcnZpY2UtcHJpbmNpcGFsXCIpIHJldHVybiB0cnVlO1xuICBpZiAobW9kZSA9PT0gXCJ1c2VyXCIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHJlcXVlc3RBY2Nlc3NUb2tlbihyZXEpID09PSB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXRcIik7XG5jb25zdCBza2lwcGVkQXNVc2VyID0gbmV3IFNldDxzdHJpbmc+KCk7XG5jb25zdCBBU19VU0VSX1NLSVBfV0FSTiA9IFwiU2tpcHBpbmcgdXNlciBpbXBlcnNvbmF0aW9uXCI7XG5jb25zdCBBU19VU0VSX1BBVENIRUQgPSBTeW1ib2wuZm9yKFwiZGJ4LXRvb2xzLmFwcGtpdC5hc1VzZXJEZXZMb2dcIik7XG5cbi8qKlxuICogSW4gZGV2ZWxvcG1lbnQsIGtlZXAgQXBwS2l0IGBhc1VzZXJgIGJlaGF2aW9yLiBUaGUgZmlyc3QgbWlzc2luZy10b2tlbiBza2lwXG4gKiBmb3IgYSBmb3J3YXJkZWQgZW1haWwgb3IgdXNlciBpZCB1c2VzIEFwcEtpdCdzIG93biB3YXJuOyBsYXRlciBza2lwcyBmb3JcbiAqIHRoYXQgdXNlciwgYW5kIGV2ZXJ5IHNraXAgd2l0aCBubyBmb3J3YXJkZWQgaWRlbnRpdHksIGFyZSBzaWxlbnQuIFJlcXVlc3RcbiAqIG9iamVjdHMgYXJlIG5vdCBhIHN0YWJsZSBrZXk6IGVhY2ggcGx1Z2luIGNhbGwgdHlwaWNhbGx5IGhhcyBpdHMgb3duIGByZXFgLlxuICpcbiAqIE5vLW9wIG91dHNpZGUgZGV2ZWxvcG1lbnQsIHdoZW4gYFBsdWdpbi5hc1VzZXJgIGlzIG1pc3Npbmcgb3Igbm90IGFcbiAqIGZ1bmN0aW9uLCBvciBpZiB0aGUgcHJvdG90eXBlIGNhbm5vdCBiZSByZXdyaXR0ZW4uIEZhaWx1cmVzIG5ldmVyIHRocm93OlxuICogQXBwS2l0IGtlZXBzIGl0cyBvcmlnaW5hbCBgYXNVc2VyYC4gRXh0cmEgYXJndW1lbnRzIGFyZSBmb3J3YXJkZWQgc28gYVxuICogbGF0ZXIgc2lnbmF0dXJlIGNoYW5nZSBzdGlsbCByZWFjaGVzIHRoZSBvcmlnaW5hbCBtZXRob2QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsQXNVc2VyRGV2ZWxvcG1lbnRQYXRjaCgpOiB2b2lkIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcImRldmVsb3BtZW50XCIpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBjb25zdCBwcm90byA9IFBsdWdpbi5wcm90b3R5cGUgYXMgdW5rbm93biBhcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+O1xuICAgIGlmIChwcm90b1tBU19VU0VSX1BBVENIRURdID09PSB0cnVlKSByZXR1cm47XG4gICAgY29uc3Qgb3JpZ2luYWwgPSBwcm90by5hc1VzZXI7XG4gICAgaWYgKHR5cGVvZiBvcmlnaW5hbCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm47XG4gICAgcHJvdG9bQVNfVVNFUl9QQVRDSEVEXSA9IHRydWU7XG4gICAgcHJvdG8uYXNVc2VyID0gZnVuY3Rpb24gcGF0Y2hlZEFzVXNlcih0aGlzOiB1bmtub3duLCByZXE6IHVua25vd24sIC4uLnJlc3Q6IHVua25vd25bXSkge1xuICAgICAgY29uc3QgaGVhZGVycyA9IGFzSGVhZGVyQmVhcmluZyhyZXEpO1xuICAgICAgY29uc3QgYXJncyA9IFtyZXEsIC4uLnJlc3RdO1xuICAgICAgaWYgKCFoZWFkZXJzIHx8IHJlcXVlc3RBY2Nlc3NUb2tlbihoZWFkZXJzKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChvcmlnaW5hbCwgdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd2l0aEFzVXNlclNraXBXYXJuU3VwcHJlc3NlZChoZWFkZXJzLCAoKSA9PlxuICAgICAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChvcmlnaW5hbCwgdGhpcywgYXJncyksXG4gICAgICApO1xuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXNVc2VyIGRldmVsb3BtZW50IHBhdGNoIHNraXBwZWRcIiwgeyBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGVycm9yKSB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc0hlYWRlckJlYXJpbmcocmVxOiB1bmtub3duKTogSGVhZGVyQmVhcmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChyZXEgPT09IG51bGwgfHwgdHlwZW9mIHJlcSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiAocmVxIGFzIEhlYWRlckJlYXJpbmcpLmhlYWRlciAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gcmVxIGFzIEhlYWRlckJlYXJpbmc7XG59XG5cbmZ1bmN0aW9uIHdpdGhBc1VzZXJTa2lwV2FyblN1cHByZXNzZWQ8VD4ocmVxOiBIZWFkZXJCZWFyaW5nLCBmbjogKCkgPT4gVCk6IFQge1xuICBjb25zdCB1c2VyID0gcmVxdWVzdFVzZXJFbWFpbChyZXEpID8/IHJlcXVlc3RVc2VySWQocmVxKTtcbiAgaWYgKHVzZXIgJiYgIXNraXBwZWRBc1VzZXIuaGFzKHVzZXIpKSB7XG4gICAgc2tpcHBlZEFzVXNlci5hZGQodXNlcik7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH1cbiAgY29uc3Qgd2FybiA9IGNvbnNvbGUud2FybjtcbiAgY29uc29sZS53YXJuID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgIGlmIChcbiAgICAgICFsb2cuaXNMZXZlbEVuYWJsZWQoXCJkZWJ1Z1wiKSAmJlxuICAgICAgYXJncy5zb21lKCh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLmluY2x1ZGVzKEFTX1VTRVJfU0tJUF9XQVJOKSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgd2Fybi5hcHBseShjb25zb2xlLCBhcmdzIGFzIFBhcmFtZXRlcnM8dHlwZW9mIGNvbnNvbGUud2Fybj4pO1xuICB9O1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGZpbmFsbHkge1xuICAgIGNvbnNvbGUud2FybiA9IHdhcm47XG4gIH1cbn1cbiJdfQ==
@@ -1,8 +1,12 @@
1
1
  /** AppKit telemetry compatibility helpers. */
2
2
  import type { IncomingMessage } from "node:http";
3
- import type { TracerProvider } from "@opentelemetry/api";
3
+ import { type Span, type TracerProvider } from "@opentelemetry/api";
4
4
  import type { SpanProcessor } from "@opentelemetry/sdk-trace-base";
5
5
  type IncomingRequestFilter = (request: IncomingMessage) => boolean;
6
+ type OutgoingRequestFilter = (request: unknown) => boolean;
7
+ type SpanAttributeHook = (span: Span, request: unknown) => void;
8
+ /** Root-span user attribute consumed by MLflow and OpenTelemetry backends. */
9
+ export declare const USER_TRACE_ATTRIBUTE = "user.id";
6
10
  /** Options for AppKit's native HTTP request tracing. */
7
11
  export interface NativeHttpTelemetryOptions {
8
12
  /**
@@ -12,9 +16,17 @@ export interface NativeHttpTelemetryOptions {
12
16
  readonly exclude?: readonly string[];
13
17
  /** Additional caller-owned request filter. Returning `true` excludes the request. */
14
18
  readonly filter?: IncomingRequestFilter;
19
+ /** Additional caller-owned outgoing request filter. Returning `true` excludes the request. */
20
+ readonly outgoingFilter?: OutgoingRequestFilter;
21
+ /** Additional caller-owned hook for attributes on native HTTP spans. */
22
+ readonly spanHook?: SpanAttributeHook;
15
23
  }
16
24
  /** Whether one request matches the default or configured HTTP telemetry exclusions. */
17
25
  export declare function excludeHttpTelemetryRequest(request: IncomingMessage, options?: NativeHttpTelemetryOptions): boolean;
26
+ /** Exclude outgoing HTTP spans that have no recording semantic parent. */
27
+ export declare function excludeUnparentedOutgoingHttpTelemetry(_request?: unknown, span?: Span | undefined): boolean;
28
+ /** Stamp the forwarded request identity onto a native AppKit HTTP span. */
29
+ export declare function stampHttpTraceUser(span: Span, request: unknown): void;
18
30
  /**
19
31
  * Extend AppKit's native HTTP request filter without registering a second HTTP
20
32
  * instrumentation. AppKit 0.81 owns the instrumentation but does not expose a
@@ -10,6 +10,10 @@ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExte
10
10
  import { createRequire } from "node:module";
11
11
  import path from "node:path";
12
12
  import { pathToFileURL } from "node:url";
13
+ import { stringUtils, token } from "@dbx-tools/shared-core";
14
+ import { trace, } from "@opentelemetry/api";
15
+ /** Root-span user attribute consumed by MLflow and OpenTelemetry backends. */
16
+ export const USER_TRACE_ATTRIBUTE = "user.id";
13
17
  /** Return the request pathname without its query string. */
14
18
  function requestPath(request) {
15
19
  return request.url?.split("?", 1)[0] ?? "";
@@ -30,6 +34,27 @@ export function excludeHttpTelemetryRequest(request, options = {}) {
30
34
  }
31
35
  return options.filter?.(request) ?? false;
32
36
  }
37
+ /** Exclude outgoing HTTP spans that have no recording semantic parent. */
38
+ export function excludeUnparentedOutgoingHttpTelemetry(_request, span = trace.getActiveSpan()) {
39
+ return !span?.isRecording();
40
+ }
41
+ /** Stamp the forwarded request identity onto a native AppKit HTTP span. */
42
+ export function stampHttpTraceUser(span, request) {
43
+ if (!request || typeof request !== "object")
44
+ return;
45
+ const headers = request.headers;
46
+ if (!headers || typeof headers !== "object" || Array.isArray(headers))
47
+ return;
48
+ const record = headers;
49
+ const first = (name) => {
50
+ const raw = record[name];
51
+ const value = Array.isArray(raw) ? raw[0] : raw;
52
+ return stringUtils.trimToNull(value) ?? undefined;
53
+ };
54
+ const user = first(token.USER_EMAIL_HEADER) ?? first(token.USER_ID_HEADER);
55
+ if (user)
56
+ span.setAttribute(USER_TRACE_ATTRIBUTE, user);
57
+ }
33
58
  function appKitInternalModuleUrl(relativePath) {
34
59
  const require = createRequire(import.meta.url);
35
60
  const packageRoot = path.dirname(require.resolve("@databricks/appkit/package.json"));
@@ -81,9 +106,16 @@ export async function configureNativeHttpTelemetry(options = {}) {
81
106
  const instrumentation = await nativeHttpInstrumentation();
82
107
  const config = instrumentation.getConfig();
83
108
  const appKitFilter = config.ignoreIncomingRequestHook;
109
+ const appKitOutgoingFilter = config.ignoreOutgoingRequestHook;
110
+ const appKitSpanHook = config.applyCustomAttributesOnSpan;
84
111
  instrumentation.setConfig({
85
112
  ...config,
86
113
  ignoreIncomingRequestHook: (request) => Boolean(appKitFilter?.(request)) || excludeHttpTelemetryRequest(request, options),
114
+ ignoreOutgoingRequestHook: (request) => Boolean(appKitOutgoingFilter?.(request)) || Boolean(options.outgoingFilter?.(request)),
115
+ applyCustomAttributesOnSpan: (span, request) => {
116
+ appKitSpanHook?.(span, request);
117
+ options.spanHook?.(span, request);
118
+ },
87
119
  });
88
120
  }
89
121
  /**
@@ -123,4 +155,4 @@ export async function deferredNativeTracerProvider() {
123
155
  },
124
156
  };
125
157
  }
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4Q0FBOEM7Ozs7Ozs7OztBQUc5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBMEN6Qyw0REFBNEQ7QUFDNUQsU0FBUyxXQUFXLENBQUMsT0FBd0I7SUFDM0MsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQzdDLENBQUM7QUFFRCx1RkFBdUY7QUFDdkYsTUFBTSxVQUFVLDJCQUEyQixDQUN6QyxPQUF3QixFQUN4QixVQUFzQyxFQUFFO0lBRXhDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxNQUFNO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0MsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLEtBQUssTUFBTSxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUM1QyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxQixJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQztRQUM3RCxDQUFDO2FBQU0sSUFBSSxRQUFRLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDaEMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJ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LEVBQUUsTUFBTSxDQUFZLENBQUM7b0JBQy9ELE9BQU8sT0FBTyxLQUFLLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQ2xFLENBQUM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQXBwS2l0IHRlbGVtZXRyeSBjb21wYXRpYmlsaXR5IGhlbHBlcnMuICovXG5cbmltcG9ydCB0eXBlIHsgSW5jb21pbmdNZXNzYWdlIH0gZnJvbSBcIm5vZGU6aHR0cFwiO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gXCJub2RlOnVybFwiO1xuXG5pbXBvcnQgdHlwZSB7IFRyYWNlciwgVHJhY2VyT3B0aW9ucywgVHJhY2VyUHJvdmlkZXIgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvYXBpXCI7XG5pbXBvcnQgdHlwZSB7IFNwYW5Qcm9jZXNzb3IgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvc2RrLXRyYWNlLWJhc2VcIjtcblxudHlwZSBJbmNvbWluZ1JlcXVlc3RGaWx0ZXIgPSAocmVxdWVzdDogSW5jb21pbmdNZXNzYWdlKSA9PiBib29sZWFuO1xuXG5pbnRlcmZhY2UgTmF0aXZlSHR0cEluc3RydW1lbnRhdGlvbkNvbmZpZyB7XG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuICByZWFkb25seSBpZ25vcmVJbmNvbWluZ1JlcXVlc3RIb29rPzogSW5jb21pbmdSZXF1ZXN0RmlsdGVyO1xuICByZWFkb25seSBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgTmF0aXZlSW5zdHJ1bWVudGF0aW9uIHtcbiAgc2V0VHJhY2VyUHJvdmlkZXI/KHByb3ZpZGVyOiBUcmFjZXJQcm92aWRlcik6IHZvaWQ7XG59XG5cbmludGVyZmFjZSBOYXRpdmVIdHRwSW5zdHJ1bWVudGF0aW9uIGV4dGVuZHMgTmF0aXZlSW5zdHJ1bWVudGF0aW9uIHtcbiAgZ2V0Q29uZmlnKCk6IE5hdGl2ZUh0dHBJbnN0cnVtZW50YXRpb25Db25maWc7XG4gIHNldENvbmZpZyhjb25maWc6IE5hdGl2ZUh0dHBJbnN0cnVtZW50YXRpb25Db25maWcpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgTmF0aXZlVGVsZW1ldHJ5TWFuYWdlciB7XG4gIHRyYWNlclByb3ZpZGVyPzogVHJhY2VyUHJvdmlkZXI7XG59XG5cbmludGVyZmFjZSBOYXRpdmVUZWxlbWV0cnlNYW5hZ2VyQ2xhc3Mge1xuICBnZXRJbnN0YW5jZSgpOiBOYXRpdmVUZWxlbWV0cnlNYW5hZ2VyO1xuICByZWdpc3RlclNwYW5Qcm9jZXNzb3IocHJvY2Vzc29yOiBTcGFuUHJvY2Vzc29yKTogdm9pZDtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIEFwcEtpdCdzIG5hdGl2ZSBIVFRQIHJlcXVlc3QgdHJhY2luZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmF0aXZlSHR0cFRlbGVtZXRyeU9wdGlvbnMge1xuICAvKipcbiAgICogUmVxdWVzdCBwYXRocyB0byBleGNsdWRlLiBBIHRyYWlsaW5nIGAqYCBtYXRjaGVzIGV2ZXJ5IHBhdGggd2l0aCB0aGF0XG4gICAqIHByZWZpeDsgb3RoZXIgdmFsdWVzIGFyZSBleGFjdCBwYXRoIG1hdGNoZXMuIFF1ZXJ5IHN0cmluZ3MgYXJlIGlnbm9yZWQuXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBBZGRpdGlvbmFsIGNhbGxlci1vd25lZCByZXF1ZXN0IGZpbHRlci4gUmV0dXJuaW5nIGB0cnVlYCBleGNsdWRlcyB0aGUgcmVxdWVzdC4gKi9cbiAgcmVhZG9ubHkgZmlsdGVyPzogSW5jb21pbmdSZXF1ZXN0RmlsdGVyO1xufVxuXG4vKiogUmV0dXJuIHRoZSByZXF1ZXN0IHBhdGhuYW1lIHdpdGhvdXQgaXRzIHF1ZXJ5IHN0cmluZy4gKi9cbmZ1bmN0aW9uIHJlcXVlc3RQYXRoKHJlcXVlc3Q6IEluY29taW5nTWVzc2FnZSk6IHN0cmluZyB7XG4gIHJldHVybiByZXF1ZXN0LnVybD8uc3BsaXQoXCI/XCIsIDEpWzBdID8/IFwiXCI7XG59XG5cbi8qKiBXaGV0aGVyIG9uZSByZXF1ZXN0IG1hdGNoZXMgdGhlIGRlZmF1bHQgb3IgY29uZmlndXJlZCBIVFRQIHRlbGVtZXRyeSBleGNsdXNpb25zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4Y2x1ZGVIdHRwVGVsZW1ldHJ5UmVxdWVzdChcbiAgcmVxdWVzdDogSW5jb21pbmdNZXNzYWdlLFxuICBvcHRpb25zOiBOYXRpdmVIdHRwVGVsZW1ldHJ5T3B0aW9ucyA9IHt9LFxuKTogYm9vbGVhbiB7XG4gIGlmIChyZXF1ZXN0Lm1ldGhvZCA9PT0gXCJIRUFEXCIpIHJldHVybiB0cnVlO1xuICBjb25zdCBwYXRobmFtZSA9IHJlcXVlc3RQYXRoKHJlcXVlc3QpO1xuICBmb3IgKGNvbnN0IHBhdHRlcm4gb2Ygb3B0aW9ucy5leGNsdWRlID8/IFtdKSB7XG4gICAgaWYgKHBhdHRlcm4uZW5kc1dpdGgoXCIqXCIpKSB7XG4gICAgICBpZiAocGF0aG5hbWUuc3RhcnRzV2l0aChwYXR0ZXJuLnNsaWNlKDAsIC0xKSkpIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAocGF0aG5hbWUgPT09IHBhdHRlcm4pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3B0aW9ucy5maWx0ZXI/LihyZXF1ZXN0KSA/PyBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYXBwS2l0SW50ZXJuYWxNb2R1bGVVcmwocmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuICBjb25zdCBwYWNrYWdlUm9vdCA9IHBhdGguZGlybmFtZShyZXF1aXJlLnJlc29sdmUoXCJAZGF0YWJyaWNrcy9hcHBraXQvcGFja2FnZS5qc29uXCIpKTtcbiAgcmV0dXJuIHBhdGhUb0ZpbGVVUkwocGF0aC5qb2luKHBhY2thZ2VSb290LCBcImRpc3RcIiwgLi4ucmVsYXRpdmVQYXRoLnNwbGl0KFwiL1wiKSkpLmhyZWY7XG59XG5cbmZ1bmN0aW9uIGlzTmF0aXZlSHR0cEluc3RydW1lbnRhdGlvbih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIE5hdGl2ZUh0dHBJbnN0cnVtZW50YXRpb24ge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZSBhcyBQYXJ0aWFsPE5hdGl2ZUh0dHBJbnN0cnVtZW50YXRpb24+O1xuICByZXR1cm4gdHlwZW9mIGNhbmRpZGF0ZS5nZXRDb25maWcgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgY2FuZGlkYXRlLnNldENvbmZpZyA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG5hc3luYyBmdW5jdGlvbiBuYXRpdmVJbnN0cnVtZW50YXRpb25zKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgTmF0aXZlSW5zdHJ1bWVudGF0aW9uPj4ge1xuICBjb25zdCBsb2FkZWQgPSAoYXdhaXQgaW1wb3J0KGFwcEtpdEludGVybmFsTW9kdWxlVXJsKFwidGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbnMuanNcIikpKSBhcyB7XG4gICAgaW5zdHJ1bWVudGF0aW9ucz86IFJlY29yZDxzdHJpbmcsIE5hdGl2ZUluc3RydW1lbnRhdGlvbj47XG4gIH07XG4gIGlmICghbG9hZGVkLmluc3RydW1lbnRhdGlvbnMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJAZGF0YWJyaWNrcy9hcHBraXQgbm8gbG9uZ2VyIGV4cG9zZXMgaXRzIG5hdGl2ZSBpbnN0cnVtZW50YXRpb25zXCIpO1xuICB9XG4gIHJldHVybiBsb2FkZWQuaW5zdHJ1bWVudGF0aW9ucztcbn1cblxuYXN5bmMgZnVuY3Rpb24gbmF0aXZlSHR0cEluc3RydW1lbnRhdGlvbigpOiBQcm9taXNlPE5hdGl2ZUh0dHBJbnN0cnVtZW50YXRpb24+IHtcbiAgY29uc3QgaW5zdHJ1bWVudGF0aW9uID0gKGF3YWl0IG5hdGl2ZUluc3RydW1lbnRhdGlvbnMoKSkuaHR0cDtcbiAgaWYgKCFpc05hdGl2ZUh0dHBJbnN0cnVtZW50YXRpb24oaW5zdHJ1bWVudGF0aW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQGRhdGFicmlja3MvYXBwa2l0IG5vIGxvbmdlciBleHBvc2VzIHRoZSBleHBlY3RlZCBuYXRpdmUgSFRUUCB0ZWxlbWV0cnkgaW5zdHJ1bWVudGF0aW9uXCIsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gaW5zdHJ1bWVudGF0aW9uO1xufVxuXG5hc3luYyBmdW5jdGlvbiBuYXRpdmVUZWxlbWV0cnlNYW5hZ2VyQ2xhc3MoKTogUHJvbWlzZTxOYXRpdmVUZWxlbWV0cnlNYW5hZ2VyQ2xhc3M+IHtcbiAgY29uc3QgbG9hZGVkID0gKGF3YWl0IGltcG9ydChhcHBLaXRJbnRlcm5hbE1vZHVsZVVybChcInRlbGVtZXRyeS90ZWxlbWV0cnktbWFuYWdlci5qc1wiKSkpIGFzIHtcbiAgICBUZWxlbWV0cnlNYW5hZ2VyPzogTmF0aXZlVGVsZW1ldHJ5TWFuYWdlckNsYXNzO1xuICB9O1xuICBpZiAoIWxvYWRlZC5UZWxlbWV0cnlNYW5hZ2VyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQGRhdGFicmlja3MvYXBwa2l0IG5vIGxvbmdlciBleHBvc2VzIGl0cyBuYXRpdmUgdGVsZW1ldHJ5IG1hbmFnZXJcIik7XG4gIH1cbiAgcmV0dXJuIGxvYWRlZC5UZWxlbWV0cnlNYW5hZ2VyO1xufVxuXG5hc3luYyBmdW5jdGlvbiBuYXRpdmVUZWxlbWV0cnlNYW5hZ2VyKCk6IFByb21pc2U8TmF0aXZlVGVsZW1ldHJ5TWFuYWdlcj4ge1xuICByZXR1cm4gKGF3YWl0IG5hdGl2ZVRlbGVtZXRyeU1hbmFnZXJDbGFzcygpKS5nZXRJbnN0YW5jZSgpO1xufVxuXG5mdW5jdGlvbiByZXF1aXJlTmF0aXZlVHJhY2VyUHJvdmlkZXIobWFuYWdlcjogTmF0aXZlVGVsZW1ldHJ5TWFuYWdlcik6IFRyYWNlclByb3ZpZGVyIHtcbiAgaWYgKCFtYW5hZ2VyLnRyYWNlclByb3ZpZGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQXBwS2l0J3MgbmF0aXZlIHRyYWNlciBwcm92aWRlciBoYXMgbm90IHN0YXJ0ZWRcIik7XG4gIH1cbiAgcmV0dXJuIG1hbmFnZXIudHJhY2VyUHJvdmlkZXI7XG59XG5cbi8qKlxuICogRXh0ZW5kIEFwcEtpdCdzIG5hdGl2ZSBIVFRQIHJlcXVlc3QgZmlsdGVyIHdpdGhvdXQgcmVnaXN0ZXJpbmcgYSBzZWNvbmQgSFRUUFxuICogaW5zdHJ1bWVudGF0aW9uLiBBcHBLaXQgMC44MSBvd25zIHRoZSBpbnN0cnVtZW50YXRpb24gYnV0IGRvZXMgbm90IGV4cG9zZSBhXG4gKiBwdWJsaWMgZmlsdGVyIG9wdGlvbiwgc28gdGhpcyBjb21wYXRpYmlsaXR5IGhvb2sgbXV0YXRlcyBpdHMgZXhpc3RpbmdcbiAqIHNpbmdsZXRvbiBiZWZvcmUgYGNyZWF0ZUFwcCgpYCByZWdpc3RlcnMgaXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25maWd1cmVOYXRpdmVIdHRwVGVsZW1ldHJ5KFxuICBvcHRpb25zOiBOYXRpdmVIdHRwVGVsZW1ldHJ5T3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGluc3RydW1lbnRhdGlvbiA9IGF3YWl0IG5hdGl2ZUh0dHBJbnN0cnVtZW50YXRpb24oKTtcbiAgY29uc3QgY29uZmlnID0gaW5zdHJ1bWVudGF0aW9uLmdldENvbmZpZygpO1xuICBjb25zdCBhcHBLaXRGaWx0ZXIgPSBjb25maWcuaWdub3JlSW5jb21pbmdSZXF1ZXN0SG9vaztcbiAgaW5zdHJ1bWVudGF0aW9uLnNldENvbmZpZyh7XG4gICAgLi4uY29uZmlnLFxuICAgIGlnbm9yZUluY29taW5nUmVxdWVzdEhvb2s6IChyZXF1ZXN0KSA9PlxuICAgICAgQm9vbGVhbihhcHBLaXRGaWx0ZXI/LihyZXF1ZXN0KSkgfHwgZXhjbHVkZUh0dHBUZWxlbWV0cnlSZXF1ZXN0KHJlcXVlc3QsIG9wdGlvbnMpLFxuICB9KTtcbn1cblxuLyoqXG4gKiBCaW5kIEFwcEtpdCdzIG5hdGl2ZSBpbnN0cnVtZW50YXRpb25zIHRvIHRoZSBwcm92aWRlciBBcHBLaXQgc3RhcnRlZC4gVGhpcyBpc1xuICogY2FsbGVkIGFmdGVyIEFwcEtpdCdzIGRlZmVycmVkIGBUZWxlbWV0cnlNYW5hZ2VyLnN0YXJ0KClgIHBoYXNlIHNvIGEgcnVudGltZVxuICogdGhhdCBhbHJlYWR5IG9jY3VwaWVkIHRoZSBnbG9iYWwgT1RlbCBzbG90IGNhbm5vdCBsZWF2ZSBuYXRpdmUgc3BhbnMgbm8tb3AuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBiaW5kTmF0aXZlVGVsZW1ldHJ5UHJvdmlkZXIoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IG1hbmFnZXIgPSBhd2FpdCBuYXRpdmVUZWxlbWV0cnlNYW5hZ2VyKCk7XG4gIGlmICghbWFuYWdlci50cmFjZXJQcm92aWRlcikgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGNvbnN0IGluc3RydW1lbnRhdGlvbiBvZiBPYmplY3QudmFsdWVzKGF3YWl0IG5hdGl2ZUluc3RydW1lbnRhdGlvbnMoKSkpIHtcbiAgICBpbnN0cnVtZW50YXRpb24uc2V0VHJhY2VyUHJvdmlkZXI/LihtYW5hZ2VyLnRyYWNlclByb3ZpZGVyKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIENvbnRyaWJ1dGUgYSBwcm9jZXNzb3IgYmVmb3JlIEFwcEtpdCBidWlsZHMgaXRzIG5hdGl2ZSB0cmFjZXIgcHJvdmlkZXIuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJOYXRpdmVTcGFuUHJvY2Vzc29yKHByb2Nlc3NvcjogU3BhblByb2Nlc3Nvcik6IFByb21pc2U8dm9pZD4ge1xuICAoYXdhaXQgbmF0aXZlVGVsZW1ldHJ5TWFuYWdlckNsYXNzKCkpLnJlZ2lzdGVyU3BhblByb2Nlc3Nvcihwcm9jZXNzb3IpO1xufVxuXG4vKipcbiAqIFJldHVybiBhIHRyYWNlciBwcm92aWRlciB0aGF0IHJlc29sdmVzIEFwcEtpdCdzIHByb3ZpZGVyIHdoZW4gYSB0cmFjZXIgbWV0aG9kXG4gKiBpcyBpbnZva2VkLiBBcHBLaXQgc3RhcnRzIGl0cyBwcm92aWRlciBhZnRlciBwbHVnaW4gc2V0dXAsIHdoaWxlIGNvbnN1bWVyc1xuICogc3VjaCBhcyBNYXN0cmEgY29uc3RydWN0IHRoZWlyIE9UZWwgYnJpZGdlIGR1cmluZyBzZXR1cC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlZmVycmVkTmF0aXZlVHJhY2VyUHJvdmlkZXIoKTogUHJvbWlzZTxUcmFjZXJQcm92aWRlcj4ge1xuICBjb25zdCBtYW5hZ2VyID0gYXdhaXQgbmF0aXZlVGVsZW1ldHJ5TWFuYWdlcigpO1xuICByZXR1cm4ge1xuICAgIGdldFRyYWNlcihuYW1lOiBzdHJpbmcsIHZlcnNpb24/OiBzdHJpbmcsIG9wdGlvbnM/OiBUcmFjZXJPcHRpb25zKTogVHJhY2VyIHtcbiAgICAgIHJldHVybiBuZXcgUHJveHkoe30gYXMgVHJhY2VyLCB7XG4gICAgICAgIGdldChfdGFyZ2V0LCBwcm9wZXJ0eSkge1xuICAgICAgICAgIGNvbnN0IHRyYWNlciA9IHJlcXVpcmVOYXRpdmVUcmFjZXJQcm92aWRlcihtYW5hZ2VyKS5nZXRUcmFjZXIobmFtZSwgdmVyc2lvbiwgb3B0aW9ucyk7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBSZWZsZWN0LmdldCh0cmFjZXIsIHByb3BlcnR5LCB0cmFjZXIpIGFzIHVua25vd247XG4gICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gdmFsdWUuYmluZCh0cmFjZXIpIDogdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9O1xufVxuIl19
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4Q0FBOEM7Ozs7Ozs7OztBQUc5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUNMLEtBQUssR0FLTixNQUFNLG9CQUFvQixDQUFDO0FBTzVCLDhFQUE4RTtBQUM5RSxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxTQUFTLENBQUM7QUEyQzlDLDREQUE0RDtBQUM1RCxTQUFTLFdBQVcsQ0FBQyxPQUF3QjtJQUMzQyxPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDN0MsQ0FBQztBQUVELHVGQUF1RjtBQUN2RixNQUFNLFVBQVUsMkJBQTJCLENBQ3pDLE9BQXdCLEVBQ3hCLFVBQXNDLEVBQUU7SUFFeEMsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQztJQUMzQyxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsS0FBSyxNQUFNLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzVDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFCLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dC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QUFFRCw4RUFBOEU7QUFDOUUsTUFBTSxDQUFDLEtBQUssVUFBVSwyQkFBMkIsQ0FBQyxTQUF3QjtJQUN4RSxDQUFDLE1BQU0sMkJBQTJCLEVBQUUsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSw0QkFBNEI7SUFDaEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxzQkFBc0IsRUFBRSxDQUFDO0lBQy9DLE9BQU87UUFDTCxTQUFTLENBQUMsSUFBWSxFQUFFLE9BQWdCLEVBQUUsT0FBdUI7WUFDL0QsT0FBTyxJQUFJLEtBQUssQ0FBQyxFQUFZLEVBQUU7Z0JBQzdCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsUUFBUTtvQkFDbkIsTUFBTSxNQUFNLEdBQUcsMkJBQTJCLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQ3RGLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQVksQ0FBQztvQkFDL0QsT0FBTyxPQUFPLEtBQUssS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDbEUsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBBcHBLaXQgdGVsZW1ldHJ5IGNvbXBhdGliaWxpdHkgaGVscGVycy4gKi9cblxuaW1wb3J0IHR5cGUgeyBJbmNvbWluZ01lc3NhZ2UgfSBmcm9tIFwibm9kZTpodHRwXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5cbmltcG9ydCB7IHN0cmluZ1V0aWxzLCB0b2tlbiB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICB0cmFjZSxcbiAgdHlwZSBTcGFuLFxuICB0eXBlIFRyYWNlcixcbiAgdHlwZSBUcmFjZXJPcHRpb25zLFxuICB0eXBlIFRyYWNlclByb3ZpZGVyLFxufSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvYXBpXCI7XG5pbXBvcnQgdHlwZSB7IFNwYW5Qcm9jZXNzb3IgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvc2RrLXRyYWNlLWJhc2VcIjtcblxudHlwZSBJbmNvbWluZ1JlcXVlc3RGaWx0ZXIgPSAocmVxdWVzdDogSW5jb21pbmdNZXNzYWdlKSA9PiBib29sZWFuO1xudHlwZSBPdXRnb2luZ1JlcXVlc3RGaWx0ZXIgPSAocmVxdWVzdDogdW5rbm93bikgPT4gYm9vbGVhbjtcbnR5cGUgU3BhbkF0dHJpYnV0ZUhvb2sgPSAoc3BhbjogU3BhbiwgcmVxdWVzdDogdW5rbm93bikgPT4gdm9pZDtcblxuLyoqIFJvb3Qtc3BhbiB1c2VyIGF0dHJpYnV0ZSBjb25zdW1lZCBieSBNTGZsb3cgYW5kIE9wZW5UZWxlbWV0cnkgYmFja2VuZHMuICovXG5leHBvcnQgY29uc3QgVVNFUl9UUkFDRV9BVFRSSUJVVEUgPSBcInVzZXIuaWRcIjtcblxuaW50ZXJmYWNlIE5hdGl2ZUh0dHBJbnN0cnVtZW50YXRpb25Db25maWcge1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgaWdub3JlSW5jb21pbmdSZXF1ZXN0SG9vaz86IEluY29taW5nUmVxdWVzdEZpbHRlcjtcbiAgcmVhZG9ubHkgaWdub3JlT3V0Z29pbmdSZXF1ZXN0SG9vaz86IE91dGdvaW5nUmVxdWVzdEZpbHRlcjtcbiAgcmVhZG9ubHkgYXBwbHlDdXN0b21BdHRyaWJ1dGVzT25TcGFuPzogU3BhbkF0dHJpYnV0ZUhvb2s7XG4gIHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmludGVyZmFjZSBOYXRpdmVJbnN0cnVtZW50YXRpb24ge1xuICBzZXRUcmFjZXJQcm92aWRlcj8ocHJvdmlkZXI6IFRyYWNlclByb3ZpZGVyKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIE5hdGl2ZUh0dHBJbnN0cnVtZW50YXRpb24gZXh0ZW5kcyBOYXRpdmVJbnN0cnVtZW50YXRpb24ge1xuICBnZXRDb25maWcoKTogTmF0aXZlSHR0cEluc3RydW1lbnRhdGlvbkNvbmZpZztcbiAgc2V0Q29uZmlnKGNvbmZpZzogTmF0aXZlSHR0cEluc3RydW1lbnRhdGlvbkNvbmZpZyk6IHZvaWQ7XG59XG5cbmludGVyZmFjZSBOYXRpdmVUZWxlbWV0cnlNYW5hZ2VyIHtcbiAgdHJhY2VyUHJvdmlkZXI/OiBUcmFjZXJQcm92aWRlcjtcbn1cblxuaW50ZXJmYWNlIE5hdGl2ZVRlbGVtZXRyeU1hbmFnZXJDbGFzcyB7XG4gIGdldEluc3RhbmNlKCk6IE5hdGl2ZVRlbGVtZXRyeU1hbmFnZXI7XG4gIHJlZ2lzdGVyU3BhblByb2Nlc3Nvcihwcm9jZXNzb3I6IFNwYW5Qcm9jZXNzb3IpOiB2b2lkO1xufVxuXG4vKiogT3B0aW9ucyBmb3IgQXBwS2l0J3MgbmF0aXZlIEhUVFAgcmVxdWVzdCB0cmFjaW5nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBOYXRpdmVIdHRwVGVsZW1ldHJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBSZXF1ZXN0IHBhdGhzIHRvIGV4Y2x1ZGUuIEEgdHJhaWxpbmcgYCpgIG1hdGNoZXMgZXZlcnkgcGF0aCB3aXRoIHRoYXRcbiAgICogcHJlZml4OyBvdGhlciB2YWx1ZXMgYXJlIGV4YWN0IHBhdGggbWF0Y2hlcy4gUXVlcnkgc3RyaW5ncyBhcmUgaWdub3JlZC5cbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGU/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIEFkZGl0aW9uYWwgY2FsbGVyLW93bmVkIHJlcXVlc3QgZmlsdGVyLiBSZXR1cm5pbmcgYHRydWVgIGV4Y2x1ZGVzIHRoZSByZXF1ZXN0LiAqL1xuICByZWFkb25seSBmaWx0ZXI/OiBJbmNvbWluZ1JlcXVlc3RGaWx0ZXI7XG4gIC8qKiBBZGRpdGlvbmFsIGNhbGxlci1vd25lZCBvdXRnb2luZyByZXF1ZXN0IGZpbHRlci4gUmV0dXJuaW5nIGB0cnVlYCBleGNsdWRlcyB0aGUgcmVxdWVzdC4gKi9cbiAgcmVhZG9ubHkgb3V0Z29pbmdGaWx0ZXI/OiBPdXRnb2luZ1JlcXVlc3RGaWx0ZXI7XG4gIC8qKiBBZGRpdGlvbmFsIGNhbGxlci1vd25lZCBob29rIGZvciBhdHRyaWJ1dGVzIG9uIG5hdGl2ZSBIVFRQIHNwYW5zLiAqL1xuICByZWFkb25seSBzcGFuSG9vaz86IFNwYW5BdHRyaWJ1dGVIb29rO1xufVxuXG4vKiogUmV0dXJuIHRoZSByZXF1ZXN0IHBhdGhuYW1lIHdpdGhvdXQgaXRzIHF1ZXJ5IHN0cmluZy4gKi9cbmZ1bmN0aW9uIHJlcXVlc3RQYXRoKHJlcXVlc3Q6IEluY29taW5nTWVzc2FnZSk6IHN0cmluZyB7XG4gIHJldHVybiByZXF1ZXN0LnVybD8uc3BsaXQoXCI/XCIsIDEpWzBdID8/IFwiXCI7XG59XG5cbi8qKiBXaGV0aGVyIG9uZSByZXF1ZXN0IG1hdGNoZXMgdGhlIGRlZmF1bHQgb3IgY29uZmlndXJlZCBIVFRQIHRlbGVtZXRyeSBleGNsdXNpb25zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4Y2x1ZGVIdHRwVGVsZW1ldHJ5UmVxdWVzdChcbiAgcmVxdWVzdDogSW5jb21pbmdNZXNzYWdlLFxuICBvcHRpb25zOiBOYXRpdmVIdHRwVGVsZW1ldHJ5T3B0aW9ucyA9IHt9LFxuKTogYm9vbGVhbiB7XG4gIGlmIChyZXF1ZXN0Lm1ldGhvZCA9PT0gXCJIRUFEXCIpIHJldHVybiB0cnVlO1xuICBjb25zdCBwYXRobmFtZSA9IHJlcXVlc3RQYXRoKHJlcXVlc3QpO1xuICBmb3IgKGNvbnN0IHBhdHRlcm4gb2Ygb3B0aW9ucy5leGNsdWRlID8/IFtdKSB7XG4gICAgaWYgKHBhdHRlcm4uZW5kc1dpdGgoXCIqXCIpKSB7XG4gICAgICBpZiAocGF0aG5hbWUuc3RhcnRzV2l0aChwYXR0ZXJuLnNsaWNlKDAsIC0xKSkpIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAocGF0aG5hbWUgPT09IHBhdHRlcm4pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3B0aW9ucy5maWx0ZXI/LihyZXF1ZXN0KSA/PyBmYWxzZTtcbn1cblxuLyoqIEV4Y2x1ZGUgb3V0Z29pbmcgSFRUUCBzcGFucyB0aGF0IGhhdmUgbm8gcmVjb3JkaW5nIHNlbWFudGljIHBhcmVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGNsdWRlVW5wYXJlbnRlZE91dGdvaW5nSHR0cFRlbGVtZXRyeShcbiAgX3JlcXVlc3Q/OiB1bmtub3duLFxuICBzcGFuOiBTcGFuIHwgdW5kZWZpbmVkID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpLFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiAhc3Bhbj8uaXNSZWNvcmRpbmcoKTtcbn1cblxuLyoqIFN0YW1wIHRoZSBmb3J3YXJkZWQgcmVxdWVzdCBpZGVudGl0eSBvbnRvIGEgbmF0aXZlIEFwcEtpdCBIVFRQIHNwYW4uICovXG5leHBvcnQgZnVuY3Rpb24gc3RhbXBIdHRwVHJhY2VVc2VyKHNwYW46IFNwYW4sIHJlcXVlc3Q6IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKCFyZXF1ZXN0IHx8IHR5cGVvZiByZXF1ZXN0ICE9PSBcIm9iamVjdFwiKSByZXR1cm47XG4gIGNvbnN0IGhlYWRlcnMgPSAocmVxdWVzdCBhcyB7IGhlYWRlcnM/OiB1bmtub3duIH0pLmhlYWRlcnM7XG4gIGlmICghaGVhZGVycyB8fCB0eXBlb2YgaGVhZGVycyAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGhlYWRlcnMpKSByZXR1cm47XG4gIGNvbnN0IHJlY29yZCA9IGhlYWRlcnMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+O1xuICBjb25zdCBmaXJzdCA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IHJhdyA9IHJlY29yZFtuYW1lXTtcbiAgICBjb25zdCB2YWx1ZSA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdztcbiAgICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvTnVsbCh2YWx1ZSkgPz8gdW5kZWZpbmVkO1xuICB9O1xuICBjb25zdCB1c2VyID0gZmlyc3QodG9rZW4uVVNFUl9FTUFJTF9IRUFERVIpID8/IGZpcnN0KHRva2VuLlVTRVJfSURfSEVBREVSKTtcbiAgaWYgKHVzZXIpIHNwYW4uc2V0QXR0cmlidXRlKFVTRVJfVFJBQ0VfQVRUUklCVVRFLCB1c2VyKTtcbn1cblxuZnVuY3Rpb24gYXBwS2l0SW50ZXJuYWxNb2R1bGVVcmwocmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuICBjb25zdCBwYWNrYWdlUm9vdCA9IHBhdGguZGlybmFtZShyZXF1aXJlLnJlc29sdmUoXCJAZGF0YWJyaWNrcy9hcHBraXQvcGFja2FnZS5qc29uXCIpKTtcbiAgcmV0dXJuIHBhdGhUb0ZpbGVVUkwocGF0aC5qb2luKHBhY2thZ2VSb290LCBcImRpc3RcIiwgLi4ucmVsYXRpdmVQYXRoLnNwbGl0KFwiL1wiKSkpLmhyZWY7XG59XG5cbmZ1bmN0aW9uIGlzTmF0aXZlSHR0cEluc3RydW1lbnRhdGlvbih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIE5hdGl2ZUh0dHBJbnN0cnVtZW50YXRpb24ge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZSBhcyBQYXJ0aWFsPE5hdGl2ZUh0dHBJbnN0cnVtZW50YXRpb24+O1xuICByZXR1cm4gdHlwZW9mIGNhbmRpZGF0ZS5nZXRDb25maWcgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgY2FuZGlkYXRlLnNldENvbmZpZyA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG5hc3luYyBmdW5jdGlvbiBuYXRpdmVJbnN0cnVtZW50YXRpb25zKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgTmF0aXZlSW5zdHJ1bWVudGF0aW9uPj4ge1xuICBjb25zdCBsb2FkZWQgPSAoYXdhaXQgaW1wb3J0KGFwcEtpdEludGVybmFsTW9kdWxlVXJsKFwidGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbnMuanNcIikpKSBhcyB7XG4gICAgaW5zdHJ1bWVudGF0aW9ucz86IFJlY29yZDxzdHJpbmcsIE5hdGl2ZUluc3RydW1lbnRhdGlvbj47XG4gIH07XG4gIGlmICghbG9hZGVkLmluc3RydW1lbnRhdGlvbnMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJAZGF0YWJyaWNrcy9hcHBraXQgbm8gbG9uZ2VyIGV4cG9zZXMgaXRzIG5hdGl2ZSBpbnN0cnVtZW50YXRpb25zXCIpO1xuICB9XG4gIHJldHVybiBsb2FkZWQuaW5zdHJ1bWVudGF0aW9ucztcbn1cblxuYXN5bmMgZnVuY3Rpb24gbmF0aXZlSHR0cEluc3RydW1lbnRhdGlvbigpOiBQcm9taXNlPE5hdGl2ZUh0dHBJbnN0cnVtZW50YXRpb24+IHtcbiAgY29uc3QgaW5zdHJ1bWVudGF0aW9uID0gKGF3YWl0IG5hdGl2ZUluc3RydW1lbnRhdGlvbnMoKSkuaHR0cDtcbiAgaWYgKCFpc05hdGl2ZUh0dHBJbnN0cnVtZW50YXRpb24oaW5zdHJ1bWVudGF0aW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQGRhdGFicmlja3MvYXBwa2l0IG5vIGxvbmdlciBleHBvc2VzIHRoZSBleHBlY3RlZCBuYXRpdmUgSFRUUCB0ZWxlbWV0cnkgaW5zdHJ1bWVudGF0aW9uXCIsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gaW5zdHJ1bWVudGF0aW9uO1xufVxuXG5hc3luYyBmdW5jdGlvbiBuYXRpdmVUZWxlbWV0cnlNYW5hZ2VyQ2xhc3MoKTogUHJvbWlzZTxOYXRpdmVUZWxlbWV0cnlNYW5hZ2VyQ2xhc3M+IHtcbiAgY29uc3QgbG9hZGVkID0gKGF3YWl0IGltcG9ydChhcHBLaXRJbnRlcm5hbE1vZHVsZVVybChcInRlbGVtZXRyeS90ZWxlbWV0cnktbWFuYWdlci5qc1wiKSkpIGFzIHtcbiAgICBUZWxlbWV0cnlNYW5hZ2VyPzogTmF0aXZlVGVsZW1ldHJ5TWFuYWdlckNsYXNzO1xuICB9O1xuICBpZiAoIWxvYWRlZC5UZWxlbWV0cnlNYW5hZ2VyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQGRhdGFicmlja3MvYXBwa2l0IG5vIGxvbmdlciBleHBvc2VzIGl0cyBuYXRpdmUgdGVsZW1ldHJ5IG1hbmFnZXJcIik7XG4gIH1cbiAgcmV0dXJuIGxvYWRlZC5UZWxlbWV0cnlNYW5hZ2VyO1xufVxuXG5hc3luYyBmdW5jdGlvbiBuYXRpdmVUZWxlbWV0cnlNYW5hZ2VyKCk6IFByb21pc2U8TmF0aXZlVGVsZW1ldHJ5TWFuYWdlcj4ge1xuICByZXR1cm4gKGF3YWl0IG5hdGl2ZVRlbGVtZXRyeU1hbmFnZXJDbGFzcygpKS5nZXRJbnN0YW5jZSgpO1xufVxuXG5mdW5jdGlvbiByZXF1aXJlTmF0aXZlVHJhY2VyUHJvdmlkZXIobWFuYWdlcjogTmF0aXZlVGVsZW1ldHJ5TWFuYWdlcik6IFRyYWNlclByb3ZpZGVyIHtcbiAgaWYgKCFtYW5hZ2VyLnRyYWNlclByb3ZpZGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQXBwS2l0J3MgbmF0aXZlIHRyYWNlciBwcm92aWRlciBoYXMgbm90IHN0YXJ0ZWRcIik7XG4gIH1cbiAgcmV0dXJuIG1hbmFnZXIudHJhY2VyUHJvdmlkZXI7XG59XG5cbi8qKlxuICogRXh0ZW5kIEFwcEtpdCdzIG5hdGl2ZSBIVFRQIHJlcXVlc3QgZmlsdGVyIHdpdGhvdXQgcmVnaXN0ZXJpbmcgYSBzZWNvbmQgSFRUUFxuICogaW5zdHJ1bWVudGF0aW9uLiBBcHBLaXQgMC44MSBvd25zIHRoZSBpbnN0cnVtZW50YXRpb24gYnV0IGRvZXMgbm90IGV4cG9zZSBhXG4gKiBwdWJsaWMgZmlsdGVyIG9wdGlvbiwgc28gdGhpcyBjb21wYXRpYmlsaXR5IGhvb2sgbXV0YXRlcyBpdHMgZXhpc3RpbmdcbiAqIHNpbmdsZXRvbiBiZWZvcmUgYGNyZWF0ZUFwcCgpYCByZWdpc3RlcnMgaXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25maWd1cmVOYXRpdmVIdHRwVGVsZW1ldHJ5KFxuICBvcHRpb25zOiBOYXRpdmVIdHRwVGVsZW1ldHJ5T3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGluc3RydW1lbnRhdGlvbiA9IGF3YWl0IG5hdGl2ZUh0dHBJbnN0cnVtZW50YXRpb24oKTtcbiAgY29uc3QgY29uZmlnID0gaW5zdHJ1bWVudGF0aW9uLmdldENvbmZpZygpO1xuICBjb25zdCBhcHBLaXRGaWx0ZXIgPSBjb25maWcuaWdub3JlSW5jb21pbmdSZXF1ZXN0SG9vaztcbiAgY29uc3QgYXBwS2l0T3V0Z29pbmdGaWx0ZXIgPSBjb25maWcuaWdub3JlT3V0Z29pbmdSZXF1ZXN0SG9vaztcbiAgY29uc3QgYXBwS2l0U3Bhbkhvb2sgPSBjb25maWcuYXBwbHlDdXN0b21BdHRyaWJ1dGVzT25TcGFuO1xuICBpbnN0cnVtZW50YXRpb24uc2V0Q29uZmlnKHtcbiAgICAuLi5jb25maWcsXG4gICAgaWdub3JlSW5jb21pbmdSZXF1ZXN0SG9vazogKHJlcXVlc3QpID0+XG4gICAgICBCb29sZWFuKGFwcEtpdEZpbHRlcj8uKHJlcXVlc3QpKSB8fCBleGNsdWRlSHR0cFRlbGVtZXRyeVJlcXVlc3QocmVxdWVzdCwgb3B0aW9ucyksXG4gICAgaWdub3JlT3V0Z29pbmdSZXF1ZXN0SG9vazogKHJlcXVlc3QpID0+XG4gICAgICBCb29sZWFuKGFwcEtpdE91dGdvaW5nRmlsdGVyPy4ocmVxdWVzdCkpIHx8IEJvb2xlYW4ob3B0aW9ucy5vdXRnb2luZ0ZpbHRlcj8uKHJlcXVlc3QpKSxcbiAgICBhcHBseUN1c3RvbUF0dHJpYnV0ZXNPblNwYW46IChzcGFuLCByZXF1ZXN0KSA9PiB7XG4gICAgICBhcHBLaXRTcGFuSG9vaz8uKHNwYW4sIHJlcXVlc3QpO1xuICAgICAgb3B0aW9ucy5zcGFuSG9vaz8uKHNwYW4sIHJlcXVlc3QpO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIEJpbmQgQXBwS2l0J3MgbmF0aXZlIGluc3RydW1lbnRhdGlvbnMgdG8gdGhlIHByb3ZpZGVyIEFwcEtpdCBzdGFydGVkLiBUaGlzIGlzXG4gKiBjYWxsZWQgYWZ0ZXIgQXBwS2l0J3MgZGVmZXJyZWQgYFRlbGVtZXRyeU1hbmFnZXIuc3RhcnQoKWAgcGhhc2Ugc28gYSBydW50aW1lXG4gKiB0aGF0IGFscmVhZHkgb2NjdXBpZWQgdGhlIGdsb2JhbCBPVGVsIHNsb3QgY2Fubm90IGxlYXZlIG5hdGl2ZSBzcGFucyBuby1vcC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJpbmROYXRpdmVUZWxlbWV0cnlQcm92aWRlcigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgbWFuYWdlciA9IGF3YWl0IG5hdGl2ZVRlbGVtZXRyeU1hbmFnZXIoKTtcbiAgaWYgKCFtYW5hZ2VyLnRyYWNlclByb3ZpZGVyKSByZXR1cm4gZmFsc2U7XG4gIGZvciAoY29uc3QgaW5zdHJ1bWVudGF0aW9uIG9mIE9iamVjdC52YWx1ZXMoYXdhaXQgbmF0aXZlSW5zdHJ1bWVudGF0aW9ucygpKSkge1xuICAgIGluc3RydW1lbnRhdGlvbi5zZXRUcmFjZXJQcm92aWRlcj8uKG1hbmFnZXIudHJhY2VyUHJvdmlkZXIpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogQ29udHJpYnV0ZSBhIHByb2Nlc3NvciBiZWZvcmUgQXBwS2l0IGJ1aWxkcyBpdHMgbmF0aXZlIHRyYWNlciBwcm92aWRlci4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWdpc3Rlck5hdGl2ZVNwYW5Qcm9jZXNzb3IocHJvY2Vzc29yOiBTcGFuUHJvY2Vzc29yKTogUHJvbWlzZTx2b2lkPiB7XG4gIChhd2FpdCBuYXRpdmVUZWxlbWV0cnlNYW5hZ2VyQ2xhc3MoKSkucmVnaXN0ZXJTcGFuUHJvY2Vzc29yKHByb2Nlc3Nvcik7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgdHJhY2VyIHByb3ZpZGVyIHRoYXQgcmVzb2x2ZXMgQXBwS2l0J3MgcHJvdmlkZXIgd2hlbiBhIHRyYWNlciBtZXRob2RcbiAqIGlzIGludm9rZWQuIEFwcEtpdCBzdGFydHMgaXRzIHByb3ZpZGVyIGFmdGVyIHBsdWdpbiBzZXR1cCwgd2hpbGUgY29uc3VtZXJzXG4gKiBzdWNoIGFzIE1hc3RyYSBjb25zdHJ1Y3QgdGhlaXIgT1RlbCBicmlkZ2UgZHVyaW5nIHNldHVwLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVmZXJyZWROYXRpdmVUcmFjZXJQcm92aWRlcigpOiBQcm9taXNlPFRyYWNlclByb3ZpZGVyPiB7XG4gIGNvbnN0IG1hbmFnZXIgPSBhd2FpdCBuYXRpdmVUZWxlbWV0cnlNYW5hZ2VyKCk7XG4gIHJldHVybiB7XG4gICAgZ2V0VHJhY2VyKG5hbWU6IHN0cmluZywgdmVyc2lvbj86IHN0cmluZywgb3B0aW9ucz86IFRyYWNlck9wdGlvbnMpOiBUcmFjZXIge1xuICAgICAgcmV0dXJuIG5ldyBQcm94eSh7fSBhcyBUcmFjZXIsIHtcbiAgICAgICAgZ2V0KF90YXJnZXQsIHByb3BlcnR5KSB7XG4gICAgICAgICAgY29uc3QgdHJhY2VyID0gcmVxdWlyZU5hdGl2ZVRyYWNlclByb3ZpZGVyKG1hbmFnZXIpLmdldFRyYWNlcihuYW1lLCB2ZXJzaW9uLCBvcHRpb25zKTtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IFJlZmxlY3QuZ2V0KHRyYWNlciwgcHJvcGVydHksIHRyYWNlcikgYXMgdW5rbm93bjtcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyB2YWx1ZS5iaW5kKHRyYWNlcikgOiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH07XG59XG4iXX0=
package/package.json CHANGED
@@ -20,7 +20,7 @@
20
20
  },
21
21
  "devDependencies": {
22
22
  "@databricks/appkit": "0.81.0",
23
- "@dbx-tools/projen": "^0.9.144",
23
+ "@dbx-tools/projen": "^0.9.145",
24
24
  "@types/json-schema": "^7",
25
25
  "@types/node": "^24.6.0",
26
26
  "typescript": "^5.9.3",
@@ -31,13 +31,13 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "@databricks/sdk-experimental": "^0.17.0",
34
- "@dbx-tools/auth": "^0.9.144",
35
- "@dbx-tools/cache": "^0.9.144",
36
- "@dbx-tools/core": "^0.9.144",
37
- "@dbx-tools/lakebase": "^0.9.144",
38
- "@dbx-tools/postgres": "^0.9.144",
39
- "@dbx-tools/shared-core": "^0.9.144",
40
- "@dbx-tools/shared-fs": "^0.9.144",
34
+ "@dbx-tools/auth": "^0.9.145",
35
+ "@dbx-tools/cache": "^0.9.145",
36
+ "@dbx-tools/core": "^0.9.145",
37
+ "@dbx-tools/lakebase": "^0.9.145",
38
+ "@dbx-tools/postgres": "^0.9.145",
39
+ "@dbx-tools/shared-core": "^0.9.145",
40
+ "@dbx-tools/shared-fs": "^0.9.145",
41
41
  "@opentelemetry/api": "^1.9.1",
42
42
  "@opentelemetry/sdk-trace-base": "2.8.0",
43
43
  "zod": "4.3.6"
@@ -140,7 +140,7 @@
140
140
  "./package.json": "./package.json"
141
141
  }
142
142
  },
143
- "version": "0.9.144",
143
+ "version": "0.9.145",
144
144
  "types": "./lib/index.d.ts",
145
145
  "dbxToolsConfig": {
146
146
  "tags": [
package/src/appkit.ts CHANGED
@@ -51,7 +51,11 @@ import {
51
51
  } from "./interceptor.ts";
52
52
  import { applyLakebaseEnv, type LakebaseConnection } from "./lakebase-resolver.ts";
53
53
  import { provisionCacheSchema } from "./provision.ts";
54
- import { bindNativeTelemetryProvider } from "./telemetry.ts";
54
+ import {
55
+ bindNativeTelemetryProvider,
56
+ configureNativeHttpTelemetry,
57
+ stampHttpTraceUser,
58
+ } from "./telemetry.ts";
55
59
 
56
60
  const logger = log.logger("appkit");
57
61
 
@@ -289,6 +293,7 @@ export async function createApp<T extends AppKitPlugins>(
289
293
  config?: CreateAppConfig<T>,
290
294
  ): Promise<PluginMap<T>> {
291
295
  installAsUserDevelopmentPatch();
296
+ await configureNativeHttpTelemetry({ spanHook: stampHttpTraceUser });
292
297
  const plugins = pluginNames(config);
293
298
  const interceptors = interceptorList(config?.interceptor);
294
299
  logger.debug("createApp: start", {
package/src/identity.ts CHANGED
@@ -23,8 +23,7 @@
23
23
  * - a public tunnel (`@dbx-tools/tunnel`), where callers authenticate by
24
24
  * email OTP and no OBO token exists to forward - the gate can prove WHO the
25
25
  * caller is, but it cannot mint a Databricks credential for them;
26
- * - any reverse proxy, webhook, or bot channel (`POST /api/teams/messages`)
27
- * that authenticates its own way.
26
+ * - any reverse proxy, webhook, or bot channel that authenticates its own way.
28
27
  *
29
28
  * Such an app must not run with `NODE_ENV=development` just to get the fallback:
30
29
  * that flag also relaxes secure cookies, AppKit's own dev affordances, and
package/src/telemetry.ts CHANGED
@@ -5,14 +5,28 @@ import { createRequire } from "node:module";
5
5
  import path from "node:path";
6
6
  import { pathToFileURL } from "node:url";
7
7
 
8
- import type { Tracer, TracerOptions, TracerProvider } from "@opentelemetry/api";
8
+ import { stringUtils, token } from "@dbx-tools/shared-core";
9
+ import {
10
+ trace,
11
+ type Span,
12
+ type Tracer,
13
+ type TracerOptions,
14
+ type TracerProvider,
15
+ } from "@opentelemetry/api";
9
16
  import type { SpanProcessor } from "@opentelemetry/sdk-trace-base";
10
17
 
11
18
  type IncomingRequestFilter = (request: IncomingMessage) => boolean;
19
+ type OutgoingRequestFilter = (request: unknown) => boolean;
20
+ type SpanAttributeHook = (span: Span, request: unknown) => void;
21
+
22
+ /** Root-span user attribute consumed by MLflow and OpenTelemetry backends. */
23
+ export const USER_TRACE_ATTRIBUTE = "user.id";
12
24
 
13
25
  interface NativeHttpInstrumentationConfig {
14
26
  readonly enabled?: boolean;
15
27
  readonly ignoreIncomingRequestHook?: IncomingRequestFilter;
28
+ readonly ignoreOutgoingRequestHook?: OutgoingRequestFilter;
29
+ readonly applyCustomAttributesOnSpan?: SpanAttributeHook;
16
30
  readonly [key: string]: unknown;
17
31
  }
18
32
 
@@ -43,6 +57,10 @@ export interface NativeHttpTelemetryOptions {
43
57
  readonly exclude?: readonly string[];
44
58
  /** Additional caller-owned request filter. Returning `true` excludes the request. */
45
59
  readonly filter?: IncomingRequestFilter;
60
+ /** Additional caller-owned outgoing request filter. Returning `true` excludes the request. */
61
+ readonly outgoingFilter?: OutgoingRequestFilter;
62
+ /** Additional caller-owned hook for attributes on native HTTP spans. */
63
+ readonly spanHook?: SpanAttributeHook;
46
64
  }
47
65
 
48
66
  /** Return the request pathname without its query string. */
@@ -67,6 +85,29 @@ export function excludeHttpTelemetryRequest(
67
85
  return options.filter?.(request) ?? false;
68
86
  }
69
87
 
88
+ /** Exclude outgoing HTTP spans that have no recording semantic parent. */
89
+ export function excludeUnparentedOutgoingHttpTelemetry(
90
+ _request?: unknown,
91
+ span: Span | undefined = trace.getActiveSpan(),
92
+ ): boolean {
93
+ return !span?.isRecording();
94
+ }
95
+
96
+ /** Stamp the forwarded request identity onto a native AppKit HTTP span. */
97
+ export function stampHttpTraceUser(span: Span, request: unknown): void {
98
+ if (!request || typeof request !== "object") return;
99
+ const headers = (request as { headers?: unknown }).headers;
100
+ if (!headers || typeof headers !== "object" || Array.isArray(headers)) return;
101
+ const record = headers as Record<string, string | string[] | undefined>;
102
+ const first = (name: string): string | undefined => {
103
+ const raw = record[name];
104
+ const value = Array.isArray(raw) ? raw[0] : raw;
105
+ return stringUtils.trimToNull(value) ?? undefined;
106
+ };
107
+ const user = first(token.USER_EMAIL_HEADER) ?? first(token.USER_ID_HEADER);
108
+ if (user) span.setAttribute(USER_TRACE_ATTRIBUTE, user);
109
+ }
110
+
70
111
  function appKitInternalModuleUrl(relativePath: string): string {
71
112
  const require = createRequire(import.meta.url);
72
113
  const packageRoot = path.dirname(require.resolve("@databricks/appkit/package.json"));
@@ -132,10 +173,18 @@ export async function configureNativeHttpTelemetry(
132
173
  const instrumentation = await nativeHttpInstrumentation();
133
174
  const config = instrumentation.getConfig();
134
175
  const appKitFilter = config.ignoreIncomingRequestHook;
176
+ const appKitOutgoingFilter = config.ignoreOutgoingRequestHook;
177
+ const appKitSpanHook = config.applyCustomAttributesOnSpan;
135
178
  instrumentation.setConfig({
136
179
  ...config,
137
180
  ignoreIncomingRequestHook: (request) =>
138
181
  Boolean(appKitFilter?.(request)) || excludeHttpTelemetryRequest(request, options),
182
+ ignoreOutgoingRequestHook: (request) =>
183
+ Boolean(appKitOutgoingFilter?.(request)) || Boolean(options.outgoingFilter?.(request)),
184
+ applyCustomAttributesOnSpan: (span, request) => {
185
+ appKitSpanHook?.(span, request);
186
+ options.spanHook?.(span, request);
187
+ },
139
188
  });
140
189
  }
141
190