@pipeline-builder/api-core 3.4.57 → 3.4.59

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
@@ -20,9 +20,10 @@ Core server-side utilities shared by every backend service in [Pipeline Builder]
20
20
  Tokens satisfy the standard `requireAuth` middleware unmodified (sub: `service:<name>`, role: `owner`, type: `access`). Use for inter-service HTTP calls (billing → message renewals, platform → billing on register, etc.).
21
21
 
22
22
  ### Request/Response Utilities
23
- - `sendSuccess`, `sendError`, `sendBadRequest`, `sendInternalError`, `sendPaginated`, `sendPaginatedNested`
23
+ - `sendSuccess`, `sendError`, `sendBadRequest`, `sendInternalError`, `sendQuotaExceeded`, `sendPaginated`, `sendPaginatedNested`
24
24
  - `extractDbError` — Extract database error details
25
25
  - `ErrorCode`, `getStatusForErrorCode` — Standard error codes
26
+ - `AppError`, `NotFoundError`, `ForbiddenError`, `ValidationError`, `ConflictError`, `UnauthorizedError` — Typed HTTP error classes
26
27
 
27
28
  ### Parameter Parsing
28
29
  - `getParam`, `getRequiredParam`, `getParams`, `getOrgId`, `getAuthHeader`
@@ -31,10 +32,12 @@ Tokens satisfy the standard `requireAuth` middleware unmodified (sub: `service:<
31
32
  ### Validation Schemas (Zod)
32
33
  - `AIGenerateBodySchema` — Validates AI generation requests (prompt, provider, model)
33
34
  - `AIGenerateFromUrlBodySchema` — Validates Git URL generation requests (gitUrl, provider, model, apiKey?, repoToken?)
35
+ - Plugin, pipeline, and message schemas (`PluginCreateSchema`, `PipelineFilterSchema`, `MessageCreateSchema`, etc.) plus shared building blocks (`PaginationSchema`, `UUIDSchema`, `AccessModifierSchema`)
34
36
 
35
37
  ### Internal HTTP Client
36
38
  - `InternalHttpClient`, `createSafeClient` — Service-to-service HTTP communication
37
39
  - `ServiceConfig`, `RequestOptions` — Client types
40
+ - `createComplianceClient` / `ComplianceClient` — Typed client for the compliance service, built on the safe HTTP client
38
41
 
39
42
  ### AI Provider Constants
40
43
  - `AI_PROVIDER_CATALOG` — Static provider/model catalog
@@ -44,10 +47,17 @@ Tokens satisfy the standard `requireAuth` middleware unmodified (sub: `service:<
44
47
  ### Logging
45
48
  - `createLogger` — Winston logger factory
46
49
 
50
+ ### Caching & Events
51
+ - `CacheService`, `createCacheService` — In-memory TTL cache with an optional Redis backend
52
+ - `entityEvents` — Process-local domain event pub/sub for entity changes
53
+
54
+ ### OpenAPI
55
+ - `registry`, `generateOpenApiSpec` — Shared schema registry and OpenAPI spec generation, so services expose consistent API documentation
56
+
47
57
  ### Quota Service
48
58
  - `QuotaService` (type), `createQuotaService` — Quota enforcement client
49
- - `QuotaType` — `'plugins' | 'pipelines' | 'apiCalls' | 'aiCalls'`
50
- - `QuotaCheckResult`, `QuotaTier`, `QUOTA_TIERS`, `getTierLimits` — Quota domain types and tier presets
59
+ - `QuotaType` — `'plugins' | 'pipelines' | 'apiCalls' | 'aiCalls' | 'storageBytes' | 'dashboards' | 'alertRules' | 'alertDestinations' | 'idpConfigs'`
60
+ - `QuotaCheckResult`, `QuotaTier` (`'developer' | 'pro' | 'unlimited'`), `QUOTA_TIERS`, `getTierLimits` — Quota domain types and tier presets
51
61
 
52
62
  ### Health Endpoints
53
63
  - `createHealthRouter({ serviceName, version?, checkDependencies? })` — registers `GET /health` (liveness; always 200 unless process is dead) and `GET /ready` (readiness; 503 when any dependency is `'disconnected'`). Use as Kubernetes/ECS liveness + readiness probes respectively.
@@ -2,3 +2,4 @@ export * from './crud-helpers';
2
2
  export * from './access-helpers';
3
3
  export * from './mask-helpers';
4
4
  export * from './sse-helpers';
5
+ export * from './org-hierarchy';
@@ -20,4 +20,5 @@ __exportStar(require("./crud-helpers"), exports);
20
20
  __exportStar(require("./access-helpers"), exports);
21
21
  __exportStar(require("./mask-helpers"), exports);
22
22
  __exportStar(require("./sse-helpers"), exports);
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGVscGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQzs7Ozs7Ozs7Ozs7Ozs7OztBQUV0QyxpREFBK0I7QUFDL0IsbURBQWlDO0FBQ2pDLGlEQUErQjtBQUMvQixnREFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuZXhwb3J0ICogZnJvbSAnLi9jcnVkLWhlbHBlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9hY2Nlc3MtaGVscGVycyc7XG5leHBvcnQgKiBmcm9tICcuL21hc2staGVscGVycyc7XG5leHBvcnQgKiBmcm9tICcuL3NzZS1oZWxwZXJzJztcbiJdfQ==
23
+ __exportStar(require("./org-hierarchy"), exports);
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGVscGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQzs7Ozs7Ozs7Ozs7Ozs7OztBQUV0QyxpREFBK0I7QUFDL0IsbURBQWlDO0FBQ2pDLGlEQUErQjtBQUMvQixnREFBOEI7QUFDOUIsa0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCAqIGZyb20gJy4vY3J1ZC1oZWxwZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzLWhlbHBlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9tYXNrLWhlbHBlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9zc2UtaGVscGVycyc7XG5leHBvcnQgKiBmcm9tICcuL29yZy1oaWVyYXJjaHknO1xuIl19
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Org → team hierarchy traversal (org-team-hierarchy proposal).
3
+ *
4
+ * A "team" is an organization whose `parentOrgId` points at another org; a root
5
+ * org has `parentOrgId = null`. These helpers walk that single self-referential
6
+ * column, but hold **no database dependency** of their own: each takes a query
7
+ * callback so every service (platform, quota, …) can share the cycle-safe,
8
+ * depth-capped traversal logic while reading its own Mongoose model with its own
9
+ * `_id` casting rules.
10
+ *
11
+ * - {@link resolveOrgLineageWith} — UP: direct parent + root of the chain.
12
+ * - {@link resolveRootOrgIdWith} — UP: just the root id.
13
+ * - {@link isAncestorOrgWith} — UP: is A an ancestor of B?
14
+ * - {@link expandOrgScopeWith} — DOWN: self + all descendant org ids.
15
+ *
16
+ * Every org is flat today (`parentOrgId` null on all rows), so lineage resolves
17
+ * to `{ rootOrgId: self }` and scope to `[self]` — i.e. these are no-ops until
18
+ * orgs get parents.
19
+ */
20
+ /** Hard ceiling on ancestry/descendant traversal — cycle + abuse guard. */
21
+ export declare const MAX_ORG_DEPTH = 16;
22
+ /** Fetch an org's direct `parentOrgId`, or undefined for a root/missing org. */
23
+ export type GetParentOrgId = (orgId: string) => Promise<string | undefined>;
24
+ /** Fetch the direct child org ids of every org in `frontier` (one round of BFS). */
25
+ export type GetChildOrgIds = (frontier: string[]) => Promise<string[]>;
26
+ /** Normalize a Mixed/ObjectId/string org id to a non-empty string, or undefined. */
27
+ export declare function toOrgIdString(v: unknown): string | undefined;
28
+ export interface OrgLineage {
29
+ /** The org's direct parent id, or `undefined` when it's a root org. */
30
+ parentOrgId?: string;
31
+ /** Top of the ancestry chain. Equals the input `orgId` for a root org. */
32
+ rootOrgId: string;
33
+ }
34
+ /**
35
+ * Walk `parentOrgId` from `orgId` up to the root. Returns the direct parent (if
36
+ * any) and the root org id (the input itself when the org has no parent). On a
37
+ * detected cycle, a missing org, or the depth cap, traversal stops and the last
38
+ * reached id is treated as the root.
39
+ */
40
+ export declare function resolveOrgLineageWith(orgId: string, getParent: GetParentOrgId): Promise<OrgLineage>;
41
+ /** Walk `parentOrgId` up to the root and return just the root id. */
42
+ export declare function resolveRootOrgIdWith(orgId: string, getParent: GetParentOrgId): Promise<string>;
43
+ /**
44
+ * True when `ancestorOrgId` is an ancestor of `candidateOrgId` — i.e.
45
+ * `candidateOrgId` lives somewhere in the subtree rooted at `ancestorOrgId`.
46
+ * Walks `candidateOrgId`'s parent chain upward, depth-capped and cycle-safe.
47
+ * Returns `false` when the two are equal (an org is not its own ancestor) or
48
+ * unrelated.
49
+ */
50
+ export declare function isAncestorOrgWith(ancestorOrgId: string, candidateOrgId: string, getParent: GetParentOrgId): Promise<boolean>;
51
+ /**
52
+ * Expand `orgId` to itself plus every descendant org id (breadth-first over
53
+ * `parentOrgId`). This is the scope a parent org "sees" for visibility and
54
+ * analytics rollups: `[self, ...descendants]`. Returns `[orgId]` when the org
55
+ * has no children. Cycle-safe and depth-capped.
56
+ */
57
+ export declare function expandOrgScopeWith(orgId: string, getChildren: GetChildOrgIds): Promise<string[]>;
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.MAX_ORG_DEPTH = void 0;
6
+ exports.toOrgIdString = toOrgIdString;
7
+ exports.resolveOrgLineageWith = resolveOrgLineageWith;
8
+ exports.resolveRootOrgIdWith = resolveRootOrgIdWith;
9
+ exports.isAncestorOrgWith = isAncestorOrgWith;
10
+ exports.expandOrgScopeWith = expandOrgScopeWith;
11
+ /**
12
+ * Org → team hierarchy traversal (org-team-hierarchy proposal).
13
+ *
14
+ * A "team" is an organization whose `parentOrgId` points at another org; a root
15
+ * org has `parentOrgId = null`. These helpers walk that single self-referential
16
+ * column, but hold **no database dependency** of their own: each takes a query
17
+ * callback so every service (platform, quota, …) can share the cycle-safe,
18
+ * depth-capped traversal logic while reading its own Mongoose model with its own
19
+ * `_id` casting rules.
20
+ *
21
+ * - {@link resolveOrgLineageWith} — UP: direct parent + root of the chain.
22
+ * - {@link resolveRootOrgIdWith} — UP: just the root id.
23
+ * - {@link isAncestorOrgWith} — UP: is A an ancestor of B?
24
+ * - {@link expandOrgScopeWith} — DOWN: self + all descendant org ids.
25
+ *
26
+ * Every org is flat today (`parentOrgId` null on all rows), so lineage resolves
27
+ * to `{ rootOrgId: self }` and scope to `[self]` — i.e. these are no-ops until
28
+ * orgs get parents.
29
+ */
30
+ /** Hard ceiling on ancestry/descendant traversal — cycle + abuse guard. */
31
+ exports.MAX_ORG_DEPTH = 16;
32
+ /** Normalize a Mixed/ObjectId/string org id to a non-empty string, or undefined. */
33
+ function toOrgIdString(v) {
34
+ if (v === null || v === undefined)
35
+ return undefined;
36
+ const s = String(v);
37
+ return s && s !== 'null' && s !== 'undefined' ? s : undefined;
38
+ }
39
+ /**
40
+ * Walk `parentOrgId` from `orgId` up to the root. Returns the direct parent (if
41
+ * any) and the root org id (the input itself when the org has no parent). On a
42
+ * detected cycle, a missing org, or the depth cap, traversal stops and the last
43
+ * reached id is treated as the root.
44
+ */
45
+ async function resolveOrgLineageWith(orgId, getParent) {
46
+ const seen = new Set([orgId]);
47
+ let currentId = orgId;
48
+ let parentOrgId;
49
+ for (let depth = 0; depth < exports.MAX_ORG_DEPTH; depth++) {
50
+ const parent = toOrgIdString(await getParent(currentId));
51
+ if (!parent)
52
+ break; // currentId is the root
53
+ // Record the direct parent only when it isn't a self-loop, so a malformed
54
+ // A→A org isn't reported as its own parent.
55
+ if (depth === 0 && parent !== orgId)
56
+ parentOrgId = parent;
57
+ if (seen.has(parent))
58
+ break; // cycle — treat currentId as the root
59
+ seen.add(parent);
60
+ currentId = parent;
61
+ }
62
+ return { rootOrgId: currentId, ...(parentOrgId && { parentOrgId }) };
63
+ }
64
+ /** Walk `parentOrgId` up to the root and return just the root id. */
65
+ async function resolveRootOrgIdWith(orgId, getParent) {
66
+ return (await resolveOrgLineageWith(orgId, getParent)).rootOrgId;
67
+ }
68
+ /**
69
+ * True when `ancestorOrgId` is an ancestor of `candidateOrgId` — i.e.
70
+ * `candidateOrgId` lives somewhere in the subtree rooted at `ancestorOrgId`.
71
+ * Walks `candidateOrgId`'s parent chain upward, depth-capped and cycle-safe.
72
+ * Returns `false` when the two are equal (an org is not its own ancestor) or
73
+ * unrelated.
74
+ */
75
+ async function isAncestorOrgWith(ancestorOrgId, candidateOrgId, getParent) {
76
+ if (ancestorOrgId === candidateOrgId)
77
+ return false;
78
+ const seen = new Set([candidateOrgId]);
79
+ let currentId = candidateOrgId;
80
+ for (let depth = 0; depth < exports.MAX_ORG_DEPTH; depth++) {
81
+ const parent = toOrgIdString(await getParent(currentId));
82
+ if (!parent)
83
+ return false; // reached a root without matching
84
+ if (parent === ancestorOrgId)
85
+ return true;
86
+ if (seen.has(parent))
87
+ return false; // cycle
88
+ seen.add(parent);
89
+ currentId = parent;
90
+ }
91
+ return false;
92
+ }
93
+ /**
94
+ * Expand `orgId` to itself plus every descendant org id (breadth-first over
95
+ * `parentOrgId`). This is the scope a parent org "sees" for visibility and
96
+ * analytics rollups: `[self, ...descendants]`. Returns `[orgId]` when the org
97
+ * has no children. Cycle-safe and depth-capped.
98
+ */
99
+ async function expandOrgScopeWith(orgId, getChildren) {
100
+ const result = [orgId];
101
+ const seen = new Set([orgId]);
102
+ let frontier = [orgId];
103
+ for (let depth = 0; depth < exports.MAX_ORG_DEPTH && frontier.length > 0; depth++) {
104
+ const children = await getChildren(frontier);
105
+ const next = [];
106
+ for (const raw of children) {
107
+ const id = toOrgIdString(raw);
108
+ if (!id || seen.has(id))
109
+ continue;
110
+ seen.add(id);
111
+ result.push(id);
112
+ next.push(id);
113
+ }
114
+ frontier = next;
115
+ }
116
+ return result;
117
+ }
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnLWhpZXJhcmNoeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oZWxwZXJzL29yZy1oaWVyYXJjaHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7OztBQWdDdEMsc0NBSUM7QUFlRCxzREFpQkM7QUFHRCxvREFFQztBQVNELDhDQW9CQztBQVFELGdEQW1CQztBQS9IRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsMkVBQTJFO0FBQzlELFFBQUEsYUFBYSxHQUFHLEVBQUUsQ0FBQztBQVFoQyxvRkFBb0Y7QUFDcEYsU0FBZ0IsYUFBYSxDQUFDLENBQVU7SUFDdEMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxTQUFTO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDcEQsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxNQUFNLElBQUksQ0FBQyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDaEUsQ0FBQztBQVNEOzs7OztHQUtHO0FBQ0ksS0FBSyxVQUFVLHFCQUFxQixDQUFDLEtBQWEsRUFBRSxTQUF5QjtJQUNsRixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDdEMsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLElBQUksV0FBK0IsQ0FBQztJQUVwQyxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcscUJBQWEsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ25ELE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxNQUFNO1lBQUUsTUFBTSxDQUFD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R0FBRyxJQUFJLENBQUM7SUFDbEIsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBPcmcg4oaSIHRlYW0gaGllcmFyY2h5IHRyYXZlcnNhbCAob3JnLXRlYW0taGllcmFyY2h5IHByb3Bvc2FsKS5cbiAqXG4gKiBBIFwidGVhbVwiIGlzIGFuIG9yZ2FuaXphdGlvbiB3aG9zZSBgcGFyZW50T3JnSWRgIHBvaW50cyBhdCBhbm90aGVyIG9yZzsgYSByb290XG4gKiBvcmcgaGFzIGBwYXJlbnRPcmdJZCA9IG51bGxgLiBUaGVzZSBoZWxwZXJzIHdhbGsgdGhhdCBzaW5nbGUgc2VsZi1yZWZlcmVudGlhbFxuICogY29sdW1uLCBidXQgaG9sZCAqKm5vIGRhdGFiYXNlIGRlcGVuZGVuY3kqKiBvZiB0aGVpciBvd246IGVhY2ggdGFrZXMgYSBxdWVyeVxuICogY2FsbGJhY2sgc28gZXZlcnkgc2VydmljZSAocGxhdGZvcm0sIHF1b3RhLCDigKYpIGNhbiBzaGFyZSB0aGUgY3ljbGUtc2FmZSxcbiAqIGRlcHRoLWNhcHBlZCB0cmF2ZXJzYWwgbG9naWMgd2hpbGUgcmVhZGluZyBpdHMgb3duIE1vbmdvb3NlIG1vZGVsIHdpdGggaXRzIG93blxuICogYF9pZGAgY2FzdGluZyBydWxlcy5cbiAqXG4gKiAgIC0ge0BsaW5rIHJlc29sdmVPcmdMaW5lYWdlV2l0aH0g4oCUIFVQOiBkaXJlY3QgcGFyZW50ICsgcm9vdCBvZiB0aGUgY2hhaW4uXG4gKiAgIC0ge0BsaW5rIHJlc29sdmVSb290T3JnSWRXaXRofSAgIOKAlCBVUDoganVzdCB0aGUgcm9vdCBpZC5cbiAqICAgLSB7QGxpbmsgaXNBbmNlc3Rvck9yZ1dpdGh9ICAgICAg4oCUIFVQOiBpcyBBIGFuIGFuY2VzdG9yIG9mIEI/XG4gKiAgIC0ge0BsaW5rIGV4cGFuZE9yZ1Njb3BlV2l0aH0gICAgIOKAlCBET1dOOiBzZWxmICsgYWxsIGRlc2NlbmRhbnQgb3JnIGlkcy5cbiAqXG4gKiBFdmVyeSBvcmcgaXMgZmxhdCB0b2RheSAoYHBhcmVudE9yZ0lkYCBudWxsIG9uIGFsbCByb3dzKSwgc28gbGluZWFnZSByZXNvbHZlc1xuICogdG8gYHsgcm9vdE9yZ0lkOiBzZWxmIH1gIGFuZCBzY29wZSB0byBgW3NlbGZdYCDigJQgaS5lLiB0aGVzZSBhcmUgbm8tb3BzIHVudGlsXG4gKiBvcmdzIGdldCBwYXJlbnRzLlxuICovXG5cbi8qKiBIYXJkIGNlaWxpbmcgb24gYW5jZXN0cnkvZGVzY2VuZGFudCB0cmF2ZXJzYWwg4oCUIGN5Y2xlICsgYWJ1c2UgZ3VhcmQuICovXG5leHBvcnQgY29uc3QgTUFYX09SR19ERVBUSCA9IDE2O1xuXG4vKiogRmV0Y2ggYW4gb3JnJ3MgZGlyZWN0IGBwYXJlbnRPcmdJZGAsIG9yIHVuZGVmaW5lZCBmb3IgYSByb290L21pc3Npbmcgb3JnLiAqL1xuZXhwb3J0IHR5cGUgR2V0UGFyZW50T3JnSWQgPSAob3JnSWQ6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+O1xuXG4vKiogRmV0Y2ggdGhlIGRpcmVjdCBjaGlsZCBvcmcgaWRzIG9mIGV2ZXJ5IG9yZyBpbiBgZnJvbnRpZXJgIChvbmUgcm91bmQgb2YgQkZTKS4gKi9cbmV4cG9ydCB0eXBlIEdldENoaWxkT3JnSWRzID0gKGZyb250aWVyOiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxzdHJpbmdbXT47XG5cbi8qKiBOb3JtYWxpemUgYSBNaXhlZC9PYmplY3RJZC9zdHJpbmcgb3JnIGlkIHRvIGEgbm9uLWVtcHR5IHN0cmluZywgb3IgdW5kZWZpbmVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvT3JnSWRTdHJpbmcodjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcyA9IFN0cmluZyh2KTtcbiAgcmV0dXJuIHMgJiYgcyAhPT0gJ251bGwnICYmIHMgIT09ICd1bmRlZmluZWQnID8gcyA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcmdMaW5lYWdlIHtcbiAgLyoqIFRoZSBvcmcncyBkaXJlY3QgcGFyZW50IGlkLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0J3MgYSByb290IG9yZy4gKi9cbiAgcGFyZW50T3JnSWQ/OiBzdHJpbmc7XG4gIC8qKiBUb3Agb2YgdGhlIGFuY2VzdHJ5IGNoYWluLiBFcXVhbHMgdGhlIGlucHV0IGBvcmdJZGAgZm9yIGEgcm9vdCBvcmcuICovXG4gIHJvb3RPcmdJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdhbGsgYHBhcmVudE9yZ0lkYCBmcm9tIGBvcmdJZGAgdXAgdG8gdGhlIHJvb3QuIFJldHVybnMgdGhlIGRpcmVjdCBwYXJlbnQgKGlmXG4gKiBhbnkpIGFuZCB0aGUgcm9vdCBvcmcgaWQgKHRoZSBpbnB1dCBpdHNlbGYgd2hlbiB0aGUgb3JnIGhhcyBubyBwYXJlbnQpLiBPbiBhXG4gKiBkZXRlY3RlZCBjeWNsZSwgYSBtaXNzaW5nIG9yZywgb3IgdGhlIGRlcHRoIGNhcCwgdHJhdmVyc2FsIHN0b3BzIGFuZCB0aGUgbGFzdFxuICogcmVhY2hlZCBpZCBpcyB0cmVhdGVkIGFzIHRoZSByb290LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU9yZ0xpbmVhZ2VXaXRoKG9yZ0lkOiBzdHJpbmcsIGdldFBhcmVudDogR2V0UGFyZW50T3JnSWQpOiBQcm9taXNlPE9yZ0xpbmVhZ2U+IHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPihbb3JnSWRdKTtcbiAgbGV0IGN1cnJlbnRJZCA9IG9yZ0lkO1xuICBsZXQgcGFyZW50T3JnSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGxldCBkZXB0aCA9IDA7IGRlcHRoIDwgTUFYX09SR19ERVBUSDsgZGVwdGgrKykge1xuICAgIGNvbnN0IHBhcmVudCA9IHRvT3JnSWRTdHJpbmcoYXdhaXQgZ2V0UGFyZW50KGN1cnJlbnRJZCkpO1xuICAgIGlmICghcGFyZW50KSBicmVhazsgLy8gY3VycmVudElkIGlzIHRoZSByb290XG4gICAgLy8gUmVjb3JkIHRoZSBkaXJlY3QgcGFyZW50IG9ubHkgd2hlbiBpdCBpc24ndCBhIHNlbGYtbG9vcCwgc28gYSBtYWxmb3JtZWRcbiAgICAvLyBB4oaSQSBvcmcgaXNuJ3QgcmVwb3J0ZWQgYXMgaXRzIG93biBwYXJlbnQuXG4gICAgaWYgKGRlcHRoID09PSAwICYmIHBhcmVudCAhPT0gb3JnSWQpIHBhcmVudE9yZ0lkID0gcGFyZW50O1xuICAgIGlmIChzZWVuLmhhcyhwYXJlbnQpKSBicmVhazsgLy8gY3ljbGUg4oCUIHRyZWF0IGN1cnJlbnRJZCBhcyB0aGUgcm9vdFxuICAgIHNlZW4uYWRkKHBhcmVudCk7XG4gICAgY3VycmVudElkID0gcGFyZW50O1xuICB9XG5cbiAgcmV0dXJuIHsgcm9vdE9yZ0lkOiBjdXJyZW50SWQsIC4uLihwYXJlbnRPcmdJZCAmJiB7IHBhcmVudE9yZ0lkIH0pIH07XG59XG5cbi8qKiBXYWxrIGBwYXJlbnRPcmdJZGAgdXAgdG8gdGhlIHJvb3QgYW5kIHJldHVybiBqdXN0IHRoZSByb290IGlkLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVSb290T3JnSWRXaXRoKG9yZ0lkOiBzdHJpbmcsIGdldFBhcmVudDogR2V0UGFyZW50T3JnSWQpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gKGF3YWl0IHJlc29sdmVPcmdMaW5lYWdlV2l0aChvcmdJZCwgZ2V0UGFyZW50KSkucm9vdE9yZ0lkO1xufVxuXG4vKipcbiAqIFRydWUgd2hlbiBgYW5jZXN0b3JPcmdJZGAgaXMgYW4gYW5jZXN0b3Igb2YgYGNhbmRpZGF0ZU9yZ0lkYCDigJQgaS5lLlxuICogYGNhbmRpZGF0ZU9yZ0lkYCBsaXZlcyBzb21ld2hlcmUgaW4gdGhlIHN1YnRyZWUgcm9vdGVkIGF0IGBhbmNlc3Rvck9yZ0lkYC5cbiAqIFdhbGtzIGBjYW5kaWRhdGVPcmdJZGAncyBwYXJlbnQgY2hhaW4gdXB3YXJkLCBkZXB0aC1jYXBwZWQgYW5kIGN5Y2xlLXNhZmUuXG4gKiBSZXR1cm5zIGBmYWxzZWAgd2hlbiB0aGUgdHdvIGFyZSBlcXVhbCAoYW4gb3JnIGlzIG5vdCBpdHMgb3duIGFuY2VzdG9yKSBvclxuICogdW5yZWxhdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNBbmNlc3Rvck9yZ1dpdGgoXG4gIGFuY2VzdG9yT3JnSWQ6IHN0cmluZyxcbiAgY2FuZGlkYXRlT3JnSWQ6IHN0cmluZyxcbiAgZ2V0UGFyZW50OiBHZXRQYXJlbnRPcmdJZCxcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoYW5jZXN0b3JPcmdJZCA9PT0gY2FuZGlkYXRlT3JnSWQpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KFtjYW5kaWRhdGVPcmdJZF0pO1xuICBsZXQgY3VycmVudElkID0gY2FuZGlkYXRlT3JnSWQ7XG5cbiAgZm9yIChsZXQgZGVwdGggPSAwOyBkZXB0aCA8IE1BWF9PUkdfREVQVEg7IGRlcHRoKyspIHtcbiAgICBjb25zdCBwYXJlbnQgPSB0b09yZ0lkU3RyaW5nKGF3YWl0IGdldFBhcmVudChjdXJyZW50SWQpKTtcbiAgICBpZiAoIXBhcmVudCkgcmV0dXJuIGZhbHNlOyAvLyByZWFjaGVkIGEgcm9vdCB3aXRob3V0IG1hdGNoaW5nXG4gICAgaWYgKHBhcmVudCA9PT0gYW5jZXN0b3JPcmdJZCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHNlZW4uaGFzKHBhcmVudCkpIHJldHVybiBmYWxzZTsgLy8gY3ljbGVcbiAgICBzZWVuLmFkZChwYXJlbnQpO1xuICAgIGN1cnJlbnRJZCA9IHBhcmVudDtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBFeHBhbmQgYG9yZ0lkYCB0byBpdHNlbGYgcGx1cyBldmVyeSBkZXNjZW5kYW50IG9yZyBpZCAoYnJlYWR0aC1maXJzdCBvdmVyXG4gKiBgcGFyZW50T3JnSWRgKS4gVGhpcyBpcyB0aGUgc2NvcGUgYSBwYXJlbnQgb3JnIFwic2Vlc1wiIGZvciB2aXNpYmlsaXR5IGFuZFxuICogYW5hbHl0aWNzIHJvbGx1cHM6IGBbc2VsZiwgLi4uZGVzY2VuZGFudHNdYC4gUmV0dXJucyBgW29yZ0lkXWAgd2hlbiB0aGUgb3JnXG4gKiBoYXMgbm8gY2hpbGRyZW4uIEN5Y2xlLXNhZmUgYW5kIGRlcHRoLWNhcHBlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cGFuZE9yZ1Njb3BlV2l0aChvcmdJZDogc3RyaW5nLCBnZXRDaGlsZHJlbjogR2V0Q2hpbGRPcmdJZHMpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbb3JnSWRdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KFtvcmdJZF0pO1xuICBsZXQgZnJvbnRpZXI6IHN0cmluZ1tdID0gW29yZ0lkXTtcblxuICBmb3IgKGxldCBkZXB0aCA9IDA7IGRlcHRoIDwgTUFYX09SR19ERVBUSCAmJiBmcm9udGllci5sZW5ndGggPiAwOyBkZXB0aCsrKSB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBhd2FpdCBnZXRDaGlsZHJlbihmcm9udGllcik7XG4gICAgY29uc3QgbmV4dDogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJhdyBvZiBjaGlsZHJlbikge1xuICAgICAgY29uc3QgaWQgPSB0b09yZ0lkU3RyaW5nKHJhdyk7XG4gICAgICBpZiAoIWlkIHx8IHNlZW4uaGFzKGlkKSkgY29udGludWU7XG4gICAgICBzZWVuLmFkZChpZCk7XG4gICAgICByZXN1bHQucHVzaChpZCk7XG4gICAgICBuZXh0LnB1c2goaWQpO1xuICAgIH1cbiAgICBmcm9udGllciA9IG5leHQ7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIl19
@@ -148,6 +148,16 @@ export interface JwtPayload {
148
148
  organizationId?: string;
149
149
  /** Active organization name */
150
150
  organizationName?: string;
151
+ /**
152
+ * Org → team hierarchy (org-team-hierarchy proposal, phase 1).
153
+ * `parentOrganizationId` is the active org's direct parent; `rootOrganizationId`
154
+ * is the top of its ancestry chain. Both are **omitted for flat (root) orgs** —
155
+ * consumers should treat the effective root as `rootOrganizationId ?? organizationId`.
156
+ * Currently every org is flat, so these are absent on all tokens today.
157
+ */
158
+ parentOrganizationId?: string;
159
+ /** Root organization ID of the active org's ancestry chain (see `parentOrganizationId`). */
160
+ rootOrganizationId?: string;
151
161
  /**
152
162
  * Set on tokens issued by the sysadmin impersonation flow
153
163
  * (`POST /admin/impersonate/:userId`). Carries the original sysadmin's
@@ -53,4 +53,4 @@ function validateQuotaType(value, fieldName = 'quotaType') {
53
53
  }
54
54
  return value;
55
55
  }
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQzs7O0FBZ0R0Qyw0Q0FFQztBQXFCRCw4Q0FPQztBQW5ERDs7R0FFRztBQUNVLFFBQUEsaUJBQWlCLEdBQUc7SUFDL0IsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGNBQWM7SUFDN0QsWUFBWSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxZQUFZO0NBQ3JELENBQUM7QUFFWDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxLQUFjO0lBQzdDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLHlCQUFpQixDQUFDLFFBQVEsQ0FBQyxLQUFrQixDQUFDLENBQUM7QUFDckYsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxLQUFjLEVBQUUsU0FBUyxHQUFHLFdBQVc7SUFDdkUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FDYixXQUFXLFNBQVMsTUFBTSxLQUFLLHNCQUFzQix5QkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDcEYsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBRdW90YSB0eXBlIGlkZW50aWZpZXJzLlxuICpcbiAqIC0gYHBsdWdpbnNgIC8gYHBpcGVsaW5lc2Ag4oCUIGNvdW50IG9mIGNyZWF0ZWQgZW50aXRpZXNcbiAqIC0gYGFwaUNhbGxzYCDigJQgZ2VuZXJpYyBBUEkgY2FsbCBjb3VudCAocmVhZC1oZWF2eSBwYXRocylcbiAqIC0gYGFpQ2FsbHNgIOKAlCBBSSBwcm92aWRlciBpbnZvY2F0aW9ucyAoY291bnRlZCBzZXBhcmF0ZWx5IGJlY2F1c2UgZWFjaCBjYWxsXG4gKiAgIGhhcyBleHRlcm5hbCBkb2xsYXIgY29zdDsgc2l6ZWQgc21hbGxlciB0aGFuIGFwaUNhbGxzIHBlciB0aWVyKVxuICogLSBgc3RvcmFnZUJ5dGVzYCDigJQgcmVnaXN0cnkgc3RvcmFnZSBidWRnZXQgcGVyIG9yZy4gVW5saWtlIHRoZSBvdGhlcnNcbiAqICAgKHdoaWNoIGNvdW50IGRpc2NyZXRlIGV2ZW50cyksIHRoaXMgaXMgYSBtZWFzdXJlZCB0b3RhbCByZWNvbXB1dGVkXG4gKiAgIG9uIGRlbWFuZC4gSW5jcmVtZW50ZWQgYnkgdGhlIGltYWdlLXJlZ2lzdHJ5J3MgcHVzaC1nYXRlIGJlZm9yZVxuICogICBpc3N1aW5nIGEgdG9rZW4gd2hvc2Ugc2NvcGUgaW5jbHVkZXMgYHB1c2hgOyB0aGUgR0Mgc2NoZWR1bGVyXG4gKiAgIGV2ZW50dWFsbHkgZnJlZXMgdGhlIGJ5dGVzLCB0aGVuIHRoZSBuZXh0IHB1c2gtZ2F0ZSBjaGVjayByZWFkc1xuICogICB0aGUgbG93ZXIgdmFsdWUuIE5PVCBhIGNvdW50ZXItc3R5bGUgcXVvdGEgaW4gdGhlIHNlbnNlIG9mXG4gKiAgIGBpbmNyZW1lbnRVc2FnZWAg4oCUIHRoZSByZWdpc3RyeSBwdXNoZXMgdGhlIG1lYXN1cmVkIHRvdGFsIHZpYVxuICogICBgdXBkYXRlTGltaXRzYC9gcmVzZXRVc2FnZWAgZmxvd3MuIFRpZXIgbGltaXRzIGFyZSBieXRlcy5cbiAqIC0gYGRhc2hib2FyZHNgIC8gYGFsZXJ0UnVsZXNgIC8gYGFsZXJ0RGVzdGluYXRpb25zYCAvIGBpZHBDb25maWdzYCDigJRcbiAqICAgcmVzb3VyY2UtY291bnQgcXVvdGFzIGFkZGVkIHRvIGNsb3NlIHBlci1vcmcgRG9TIHN1cmZhY2VzIGluIHRoZVxuICogICB1c2VyLWVkaXRhYmxlIGZlYXR1cmUgdGFibGVzLiBXaXRob3V0IHRoZXNlIGNhcHMgYSBzaW5nbGUgb3JnIGNvdWxkXG4gKiAgIHNwYW0gdGhvdXNhbmRzIG9mIGRhc2hib2FyZHMgLyBydWxlcyBhbmQgYmxvYXQgdGhlIHNoYXJlZCBQb3N0Z3JlcyAvXG4gKiAgIE1vbmdvIHdvcmtpbmcgc2V0cy4gQ291bnRlZCBhdCBjcmVhdGUgdGltZTsgZGVjcmVtZW50ZWQgb24gZGVsZXRlLlxuICovXG5leHBvcnQgdHlwZSBRdW90YVR5cGUgPVxuICB8ICdwbHVnaW5zJyB8ICdwaXBlbGluZXMnIHwgJ2FwaUNhbGxzJyB8ICdhaUNhbGxzJyB8ICdzdG9yYWdlQnl0ZXMnXG4gIHwgJ2Rhc2hib2FyZHMnIHwgJ2FsZXJ0UnVsZXMnIHwgJ2FsZXJ0RGVzdGluYXRpb25zJyB8ICdpZHBDb25maWdzJztcblxuLyoqXG4gKiBWYWxpZCBxdW90YSB0eXBlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFZBTElEX1FVT1RBX1RZUEVTID0gW1xuICAncGx1Z2lucycsICdwaXBlbGluZXMnLCAnYXBpQ2FsbHMnLCAnYWlDYWxscycsICdzdG9yYWdlQnl0ZXMnLFxuICAnZGFzaGJvYXJkcycsICdhbGVydFJ1bGVzJywgJ2FsZXJ0RGVzdGluYXRpb25zJywgJ2lkcENvbmZpZ3MnLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBRdW90YVR5cGUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdmFsdWUgaXMgYSB2YWxpZCBRdW90YVR5cGVcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzVmFsaWRRdW90YVR5cGUocmVxLmJvZHkucXVvdGFUeXBlKSkge1xuICogICAvLyBxdW90YVR5cGUgaXMgZ3VhcmFudGVlZCB0byBiZSBRdW90YVR5cGVcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFF1b3RhVHlwZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFF1b3RhVHlwZSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIFZBTElEX1FVT1RBX1RZUEVTLmluY2x1ZGVzKHZhbHVlIGFzIFF1b3RhVHlwZSk7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYW5kIGFzc2VydCB0aGF0IGEgdmFsdWUgaXMgYSB2YWxpZCBRdW90YVR5cGUuXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlscy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byB2YWxpZGF0ZVxuICogQHBhcmFtIGZpZWxkTmFtZSAtIE5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIHZhbGlkYXRlZCAoZm9yIGVycm9yIG1lc3NhZ2VzKVxuICogQHJldHVybnMgVGhlIHZhbGlkYXRlZCBRdW90YVR5cGVcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdmFsdWUgaXMgbm90IGEgdmFsaWQgUXVvdGFUeXBlXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHRyeSB7XG4gKiAgIGNvbnN0IHF1b3RhVHlwZSA9IHZhbGlkYXRlUXVvdGFUeXBlKHJlcS5ib2R5LnF1b3RhVHlwZSwgJ3F1b3RhVHlwZScpO1xuICogICAvLyBVc2UgcXVvdGFUeXBlIHNhZmVseVxuICogfSBjYXRjaCAoZXJyKSB7XG4gKiAgIHJldHVybiBzZW5kRXJyb3IocmVzLCA0MDAsIGVyci5tZXNzYWdlKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVRdW90YVR5cGUodmFsdWU6IHVua25vd24sIGZpZWxkTmFtZSA9ICdxdW90YVR5cGUnKTogUXVvdGFUeXBlIHtcbiAgaWYgKCFpc1ZhbGlkUXVvdGFUeXBlKHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkICR7ZmllbGROYW1lfTogXCIke3ZhbHVlfVwiLiBNdXN0IGJlIG9uZSBvZjogJHtWQUxJRF9RVU9UQV9UWVBFUy5qb2luKCcsICcpfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogUmVzdWx0IGZyb20gcXVvdGEgY2hlY2sgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhQ2hlY2tSZXN1bHQge1xuICAvKiogV2hldGhlciB0aGUgcmVxdWVzdCBpcyBhbGxvd2VkICovXG4gIGFsbG93ZWQ6IGJvb2xlYW47XG4gIC8qKiBNYXhpbXVtIHF1b3RhIGxpbWl0ICgtMSBmb3IgdW5saW1pdGVkKSAqL1xuICBsaW1pdDogbnVtYmVyO1xuICAvKiogQ3VycmVudCB1c2FnZSBjb3VudCAqL1xuICB1c2VkOiBudW1iZXI7XG4gIC8qKiBSZW1haW5pbmcgcXVvdGEgKC0xIGZvciB1bmxpbWl0ZWQpICovXG4gIHJlbWFpbmluZzogbnVtYmVyO1xuICAvKiogSVNPIHRpbWVzdGFtcCB3aGVuIHF1b3RhIHJlc2V0cyAqL1xuICByZXNldEF0OiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHF1b3RhIGlzIHVubGltaXRlZCAqL1xuICB1bmxpbWl0ZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUXVvdGEgaW5mb3JtYXRpb24gZm9yIGVycm9yIHJlc3BvbnNlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YUluZm8ge1xuICB0eXBlOiBRdW90YVR5cGU7XG4gIGxpbWl0OiBudW1iZXI7XG4gIHVzZWQ6IG51bWJlcjtcbiAgcmVtYWluaW5nOiBudW1iZXI7XG59XG5cbi8qKlxuICogU3RhbmRhcmQgQVBJIHN1Y2Nlc3MgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpU3VjY2Vzc1Jlc3BvbnNlPFQgPSB1bmtub3duPiB7XG4gIHN1Y2Nlc3M6IHRydWU7XG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgZGF0YT86IFQ7XG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU3RhbmRhcmQgQVBJIGVycm9yIHJlc3BvbnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVycm9yUmVzcG9uc2Uge1xuICBzdWNjZXNzOiBmYWxzZTtcbiAgc3RhdHVzQ29kZTogbnVtYmVyO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGNvZGU/OiBzdHJpbmc7XG4gIGRldGFpbHM/OiB1bmtub3duO1xuICBxdW90YT86IFF1b3RhSW5mbztcbn1cblxuLyoqXG4gKiBDb21iaW5lZCBBUEkgcmVzcG9uc2UgdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpUmVzcG9uc2U8VCA9IHVua25vd24+ID0gQXBpU3VjY2Vzc1Jlc3BvbnNlPFQ+IHwgQXBpRXJyb3JSZXNwb25zZTtcblxuLyoqXG4gKiBKV1QgcGF5bG9hZCBmcm9tIGFjY2VzcyB0b2tlbnMuXG4gKlxuICogVXNlcnMgY2FuIGJlbG9uZyB0byBtdWx0aXBsZSBvcmdhbml6YXRpb25zLiBUaGUgdG9rZW4gaXMgc2NvcGVkIHRvIG9uZVxuICogYWN0aXZlIG9yZ2FuaXphdGlvbiBhdCBhIHRpbWUuIFRoZSBgcm9sZWAgZmllbGQgaXMgdGhlIHVzZXIncyBwZXItb3JnXG4gKiByb2xlIGluIHRoYXQgb3JnYW5pemF0aW9uIChmcm9tIHRoZSBVc2VyT3JnYW5pemF0aW9uIGp1bmN0aW9uIGNvbGxlY3Rpb24pLFxuICogYW5kIGBpc0FkbWluYCBpcyBkZXJpdmVkIGFzIGByb2xlID09PSAnYWRtaW4nIHx8IHJvbGUgPT09ICdvd25lcidgLlxuICpcbiAqIFVzZSBgUE9TVCAvYXV0aC9zd2l0Y2gtb3JnYCB0byBjaGFuZ2UgdGhlIGFjdGl2ZSBvcmdhbml6YXRpb24sIHdoaWNoXG4gKiByZS1pc3N1ZXMgdG9rZW5zIHdpdGggdGhlIG5ldyBvcmcncyByb2xlIGFuZCBjb250ZXh0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEp3dFBheWxvYWQge1xuICAvKiogVXNlciBJRCAoc3ViamVjdCkgKi9cbiAgc3ViOiBzdHJpbmc7XG4gIC8qKiBVc2VybmFtZSAqL1xuICB1c2VybmFtZTogc3RyaW5nO1xuICAvKiogVXNlciBlbWFpbCAqL1xuICBlbWFpbDogc3RyaW5nO1xuICAvKiogUGVyLW9yZyByb2xlIGluIHRoZSBhY3RpdmUgb3JnYW5pemF0aW9uICgnb3duZXInIHwgJ2FkbWluJyB8ICdtZW1iZXInKS4gTm90IGEgZ2xvYmFsIHJvbGUuICovXG4gIHJvbGU6ICdvd25lcicgfCAnYWRtaW4nIHwgJ21lbWJlcic7XG4gIC8qKiBEZXJpdmVkOiB0cnVlIHdoZW4gcm9sZSBpcyAnYWRtaW4nIG9yICdvd25lcicgaW4gdGhlIGFjdGl2ZSBvcmdhbml6YXRpb24gKi9cbiAgaXNBZG1pbj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBHbG9iYWwgc3VwZXItYWRtaW4gZmxhZyAoY3Jvc3Mtb3JnKS4gV2hlbiBgdHJ1ZWAsIHRoZSB1c2VyIGlzIHRyZWF0ZWRcbiAgICogYXMgYSBzeXN0ZW0gYWRtaW5pc3RyYXRvciByZWdhcmRsZXNzIG9mIHdoaWNoIG9yZyB0aGV5J3JlIGN1cnJlbnRseVxuICAgKiBhY3RpbmcgdW5kZXIuIFRoaXMgaXMgdGhlIGNhbm9uaWNhbCBzaWduYWwgZm9yIHN5c2FkbWluIGF1dGhvcml0eSDigJRcbiAgICogcHJldmlvdXNseSB0aGUgb25seSBwYXRoIHdhcyBtZW1iZXJzaGlwIGluIHRoZSB3ZWxsLWtub3duIFwic3lzdGVtXCIgb3JnXG4gICAqIHdpdGggcm9sZSBhZG1pbi9vd25lciwgd2hpY2ggY29uZmxhdGVkIFwiUGlwZWxpbmUgQnVpbGRlciBvcGVyYXRvclwiIHdpdGhcbiAgICogXCJyZWFsIGN1c3RvbWVyIHRlbmFudFwiIGluIHRoZSBkYXRhIG1vZGVsLiBFaXRoZXIgcGF0aCBzdGlsbCB3b3Jrc1xuICAgKiBkdXJpbmcgdGhlIHJvbGxvdXQ7IG5ldyB1c2VycyBzaG91bGQgYmUgZ3JhbnRlZCB2aWEgYGlzU3VwZXJBZG1pbmAuXG4gICAqL1xuICBpc1N1cGVyQWRtaW4/OiBib29sZWFuO1xuICAvKiogT3JnYW5pemF0aW9uJ3MgcXVvdGEgdGllciAoJ2RldmVsb3BlcicgfCAncHJvJyB8ICd1bmxpbWl0ZWQnKSAqL1xuICB0aWVyPzogc3RyaW5nO1xuICAvKiogUmVzb2x2ZWQgZmVhdHVyZSBmbGFncyBmb3IgdGhpcyB1c2VyL29yZyAqL1xuICBmZWF0dXJlcz86IHN0cmluZ1tdO1xuICAvKiogQWN0aXZlIG9yZ2FuaXphdGlvbiBJRCAoZnJvbSBVc2VyT3JnYW5pemF0aW9uIG1lbWJlcnNoaXApICovXG4gIG9yZ2FuaXphdGlvbklkPzogc3RyaW5nO1xuICAvKiogQWN0aXZlIG9yZ2FuaXphdGlvbiBuYW1lICovXG4gIG9yZ2FuaXphdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTZXQgb24gdG9rZW5zIGlzc3VlZCBieSB0aGUgc3lzYWRtaW4gaW1wZXJzb25hdGlvbiBmbG93XG4gICAqIChgUE9TVCAvYWRtaW4vaW1wZXJzb25hdGUvOnVzZXJJZGApLiBDYXJyaWVzIHRoZSBvcmlnaW5hbCBzeXNhZG1pbidzXG4gICAqIHVzZXIgaWQgc28gYXVkaXQgZXZlbnRzIHN0aWxsIGF0dHJpYnV0ZSBhY3Rpb25zIGNvcnJlY3RseS5cbiAgICovXG4gIGltcGVyc29uYXRvcklkPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0cnVlLCB0aGUgdG9rZW4gaXMgcmVhZC1vbmx5IOKAlCBhbnkgbm9uLUdFVCByZXF1ZXN0IGlzIHJlamVjdGVkXG4gICAqIHVwc3RyZWFtIGJ5IHRoZSBwbGF0Zm9ybSdzIHJlYWQtb25seSBpbXBlcnNvbmF0aW9uIGdhdGUuIExldHNcbiAgICogc3lzYWRtaW5zIFwidmlldyBhcyB1c2VyIFhcIiB3aXRob3V0IHJpc2tpbmcgYSBkZXN0cnVjdGl2ZSBhY3Rpb24uXG4gICAqL1xuICBpbXBlcnNvbmF0aW9uUmVhZE9ubHk/OiBib29sZWFuO1xuICAvKiogVG9rZW4gdHlwZSAqL1xuICB0eXBlOiAnYWNjZXNzJyB8ICdyZWZyZXNoJztcbiAgLyoqIElzc3VlZCBhdCB0aW1lc3RhbXAgKi9cbiAgaWF0PzogbnVtYmVyO1xuICAvKiogRXhwaXJhdGlvbiB0aW1lc3RhbXAgKi9cbiAgZXhwPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV4dGVuZGVkIEV4cHJlc3MgUmVxdWVzdCB3aXRoIHVzZXIgcHJvcGVydHkuXG4gKi9cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgbmFtZXNwYWNlIEV4cHJlc3Mge1xuICAgIGludGVyZmFjZSBSZXF1ZXN0IHtcbiAgICAgIHVzZXI/OiBKd3RQYXlsb2FkO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNlcnZpY2UgY29uZmlndXJhdGlvbiBmb3IgaW50ZXJuYWwgSFRUUCBjbGllbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUNvbmZpZyB7XG4gIC8qKiBTZXJ2aWNlIGhvc3RuYW1lICovXG4gIGhvc3Q6IHN0cmluZztcbiAgLyoqIFNlcnZpY2UgcG9ydCAqL1xuICBwb3J0OiBudW1iZXI7XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogSGVhbHRoIGNoZWNrIHJlc3BvbnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aENoZWNrUmVzcG9uc2Uge1xuICBzdGF0dXM6ICdoZWFsdGh5JyB8ICd1bmhlYWx0aHknO1xuICBzZXJ2aWNlOiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogc3RyaW5nO1xuICB1cHRpbWU6IG51bWJlcjtcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgJ2Nvbm5lY3RlZCcgfCAnZGlzY29ubmVjdGVkJyB8ICd1bmtub3duJz47XG59XG4iXX0=
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQzs7O0FBZ0R0Qyw0Q0FFQztBQXFCRCw4Q0FPQztBQW5ERDs7R0FFRztBQUNVLFFBQUEsaUJBQWlCLEdBQUc7SUFDL0IsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGNBQWM7SUFDN0QsWUFBWSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxZQUFZO0NBQ3JELENBQUM7QUFFWDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxLQUFjO0lBQzdDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLHlCQUFpQixDQUFDLFFBQVEsQ0FBQyxLQUFrQixDQUFDLENBQUM7QUFDckYsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxLQUFjLEVBQUUsU0FBUyxHQUFHLFdBQVc7SUFDdkUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FDYixXQUFXLFNBQVMsTUFBTSxLQUFLLHNCQUFzQix5QkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDcEYsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBRdW90YSB0eXBlIGlkZW50aWZpZXJzLlxuICpcbiAqIC0gYHBsdWdpbnNgIC8gYHBpcGVsaW5lc2Ag4oCUIGNvdW50IG9mIGNyZWF0ZWQgZW50aXRpZXNcbiAqIC0gYGFwaUNhbGxzYCDigJQgZ2VuZXJpYyBBUEkgY2FsbCBjb3VudCAocmVhZC1oZWF2eSBwYXRocylcbiAqIC0gYGFpQ2FsbHNgIOKAlCBBSSBwcm92aWRlciBpbnZvY2F0aW9ucyAoY291bnRlZCBzZXBhcmF0ZWx5IGJlY2F1c2UgZWFjaCBjYWxsXG4gKiAgIGhhcyBleHRlcm5hbCBkb2xsYXIgY29zdDsgc2l6ZWQgc21hbGxlciB0aGFuIGFwaUNhbGxzIHBlciB0aWVyKVxuICogLSBgc3RvcmFnZUJ5dGVzYCDigJQgcmVnaXN0cnkgc3RvcmFnZSBidWRnZXQgcGVyIG9yZy4gVW5saWtlIHRoZSBvdGhlcnNcbiAqICAgKHdoaWNoIGNvdW50IGRpc2NyZXRlIGV2ZW50cyksIHRoaXMgaXMgYSBtZWFzdXJlZCB0b3RhbCByZWNvbXB1dGVkXG4gKiAgIG9uIGRlbWFuZC4gSW5jcmVtZW50ZWQgYnkgdGhlIGltYWdlLXJlZ2lzdHJ5J3MgcHVzaC1nYXRlIGJlZm9yZVxuICogICBpc3N1aW5nIGEgdG9rZW4gd2hvc2Ugc2NvcGUgaW5jbHVkZXMgYHB1c2hgOyB0aGUgR0Mgc2NoZWR1bGVyXG4gKiAgIGV2ZW50dWFsbHkgZnJlZXMgdGhlIGJ5dGVzLCB0aGVuIHRoZSBuZXh0IHB1c2gtZ2F0ZSBjaGVjayByZWFkc1xuICogICB0aGUgbG93ZXIgdmFsdWUuIE5PVCBhIGNvdW50ZXItc3R5bGUgcXVvdGEgaW4gdGhlIHNlbnNlIG9mXG4gKiAgIGBpbmNyZW1lbnRVc2FnZWAg4oCUIHRoZSByZWdpc3RyeSBwdXNoZXMgdGhlIG1lYXN1cmVkIHRvdGFsIHZpYVxuICogICBgdXBkYXRlTGltaXRzYC9gcmVzZXRVc2FnZWAgZmxvd3MuIFRpZXIgbGltaXRzIGFyZSBieXRlcy5cbiAqIC0gYGRhc2hib2FyZHNgIC8gYGFsZXJ0UnVsZXNgIC8gYGFsZXJ0RGVzdGluYXRpb25zYCAvIGBpZHBDb25maWdzYCDigJRcbiAqICAgcmVzb3VyY2UtY291bnQgcXVvdGFzIGFkZGVkIHRvIGNsb3NlIHBlci1vcmcgRG9TIHN1cmZhY2VzIGluIHRoZVxuICogICB1c2VyLWVkaXRhYmxlIGZlYXR1cmUgdGFibGVzLiBXaXRob3V0IHRoZXNlIGNhcHMgYSBzaW5nbGUgb3JnIGNvdWxkXG4gKiAgIHNwYW0gdGhvdXNhbmRzIG9mIGRhc2hib2FyZHMgLyBydWxlcyBhbmQgYmxvYXQgdGhlIHNoYXJlZCBQb3N0Z3JlcyAvXG4gKiAgIE1vbmdvIHdvcmtpbmcgc2V0cy4gQ291bnRlZCBhdCBjcmVhdGUgdGltZTsgZGVjcmVtZW50ZWQgb24gZGVsZXRlLlxuICovXG5leHBvcnQgdHlwZSBRdW90YVR5cGUgPVxuICB8ICdwbHVnaW5zJyB8ICdwaXBlbGluZXMnIHwgJ2FwaUNhbGxzJyB8ICdhaUNhbGxzJyB8ICdzdG9yYWdlQnl0ZXMnXG4gIHwgJ2Rhc2hib2FyZHMnIHwgJ2FsZXJ0UnVsZXMnIHwgJ2FsZXJ0RGVzdGluYXRpb25zJyB8ICdpZHBDb25maWdzJztcblxuLyoqXG4gKiBWYWxpZCBxdW90YSB0eXBlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFZBTElEX1FVT1RBX1RZUEVTID0gW1xuICAncGx1Z2lucycsICdwaXBlbGluZXMnLCAnYXBpQ2FsbHMnLCAnYWlDYWxscycsICdzdG9yYWdlQnl0ZXMnLFxuICAnZGFzaGJvYXJkcycsICdhbGVydFJ1bGVzJywgJ2FsZXJ0RGVzdGluYXRpb25zJywgJ2lkcENvbmZpZ3MnLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBRdW90YVR5cGUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdmFsdWUgaXMgYSB2YWxpZCBRdW90YVR5cGVcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzVmFsaWRRdW90YVR5cGUocmVxLmJvZHkucXVvdGFUeXBlKSkge1xuICogICAvLyBxdW90YVR5cGUgaXMgZ3VhcmFudGVlZCB0byBiZSBRdW90YVR5cGVcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFF1b3RhVHlwZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFF1b3RhVHlwZSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIFZBTElEX1FVT1RBX1RZUEVTLmluY2x1ZGVzKHZhbHVlIGFzIFF1b3RhVHlwZSk7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYW5kIGFzc2VydCB0aGF0IGEgdmFsdWUgaXMgYSB2YWxpZCBRdW90YVR5cGUuXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlscy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byB2YWxpZGF0ZVxuICogQHBhcmFtIGZpZWxkTmFtZSAtIE5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIHZhbGlkYXRlZCAoZm9yIGVycm9yIG1lc3NhZ2VzKVxuICogQHJldHVybnMgVGhlIHZhbGlkYXRlZCBRdW90YVR5cGVcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdmFsdWUgaXMgbm90IGEgdmFsaWQgUXVvdGFUeXBlXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHRyeSB7XG4gKiAgIGNvbnN0IHF1b3RhVHlwZSA9IHZhbGlkYXRlUXVvdGFUeXBlKHJlcS5ib2R5LnF1b3RhVHlwZSwgJ3F1b3RhVHlwZScpO1xuICogICAvLyBVc2UgcXVvdGFUeXBlIHNhZmVseVxuICogfSBjYXRjaCAoZXJyKSB7XG4gKiAgIHJldHVybiBzZW5kRXJyb3IocmVzLCA0MDAsIGVyci5tZXNzYWdlKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVRdW90YVR5cGUodmFsdWU6IHVua25vd24sIGZpZWxkTmFtZSA9ICdxdW90YVR5cGUnKTogUXVvdGFUeXBlIHtcbiAgaWYgKCFpc1ZhbGlkUXVvdGFUeXBlKHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkICR7ZmllbGROYW1lfTogXCIke3ZhbHVlfVwiLiBNdXN0IGJlIG9uZSBvZjogJHtWQUxJRF9RVU9UQV9UWVBFUy5qb2luKCcsICcpfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogUmVzdWx0IGZyb20gcXVvdGEgY2hlY2sgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhQ2hlY2tSZXN1bHQge1xuICAvKiogV2hldGhlciB0aGUgcmVxdWVzdCBpcyBhbGxvd2VkICovXG4gIGFsbG93ZWQ6IGJvb2xlYW47XG4gIC8qKiBNYXhpbXVtIHF1b3RhIGxpbWl0ICgtMSBmb3IgdW5saW1pdGVkKSAqL1xuICBsaW1pdDogbnVtYmVyO1xuICAvKiogQ3VycmVudCB1c2FnZSBjb3VudCAqL1xuICB1c2VkOiBudW1iZXI7XG4gIC8qKiBSZW1haW5pbmcgcXVvdGEgKC0xIGZvciB1bmxpbWl0ZWQpICovXG4gIHJlbWFpbmluZzogbnVtYmVyO1xuICAvKiogSVNPIHRpbWVzdGFtcCB3aGVuIHF1b3RhIHJlc2V0cyAqL1xuICByZXNldEF0OiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHF1b3RhIGlzIHVubGltaXRlZCAqL1xuICB1bmxpbWl0ZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUXVvdGEgaW5mb3JtYXRpb24gZm9yIGVycm9yIHJlc3BvbnNlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YUluZm8ge1xuICB0eXBlOiBRdW90YVR5cGU7XG4gIGxpbWl0OiBudW1iZXI7XG4gIHVzZWQ6IG51bWJlcjtcbiAgcmVtYWluaW5nOiBudW1iZXI7XG59XG5cbi8qKlxuICogU3RhbmRhcmQgQVBJIHN1Y2Nlc3MgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpU3VjY2Vzc1Jlc3BvbnNlPFQgPSB1bmtub3duPiB7XG4gIHN1Y2Nlc3M6IHRydWU7XG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgZGF0YT86IFQ7XG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU3RhbmRhcmQgQVBJIGVycm9yIHJlc3BvbnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVycm9yUmVzcG9uc2Uge1xuICBzdWNjZXNzOiBmYWxzZTtcbiAgc3RhdHVzQ29kZTogbnVtYmVyO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGNvZGU/OiBzdHJpbmc7XG4gIGRldGFpbHM/OiB1bmtub3duO1xuICBxdW90YT86IFF1b3RhSW5mbztcbn1cblxuLyoqXG4gKiBDb21iaW5lZCBBUEkgcmVzcG9uc2UgdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpUmVzcG9uc2U8VCA9IHVua25vd24+ID0gQXBpU3VjY2Vzc1Jlc3BvbnNlPFQ+IHwgQXBpRXJyb3JSZXNwb25zZTtcblxuLyoqXG4gKiBKV1QgcGF5bG9hZCBmcm9tIGFjY2VzcyB0b2tlbnMuXG4gKlxuICogVXNlcnMgY2FuIGJlbG9uZyB0byBtdWx0aXBsZSBvcmdhbml6YXRpb25zLiBUaGUgdG9rZW4gaXMgc2NvcGVkIHRvIG9uZVxuICogYWN0aXZlIG9yZ2FuaXphdGlvbiBhdCBhIHRpbWUuIFRoZSBgcm9sZWAgZmllbGQgaXMgdGhlIHVzZXIncyBwZXItb3JnXG4gKiByb2xlIGluIHRoYXQgb3JnYW5pemF0aW9uIChmcm9tIHRoZSBVc2VyT3JnYW5pemF0aW9uIGp1bmN0aW9uIGNvbGxlY3Rpb24pLFxuICogYW5kIGBpc0FkbWluYCBpcyBkZXJpdmVkIGFzIGByb2xlID09PSAnYWRtaW4nIHx8IHJvbGUgPT09ICdvd25lcidgLlxuICpcbiAqIFVzZSBgUE9TVCAvYXV0aC9zd2l0Y2gtb3JnYCB0byBjaGFuZ2UgdGhlIGFjdGl2ZSBvcmdhbml6YXRpb24sIHdoaWNoXG4gKiByZS1pc3N1ZXMgdG9rZW5zIHdpdGggdGhlIG5ldyBvcmcncyByb2xlIGFuZCBjb250ZXh0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEp3dFBheWxvYWQge1xuICAvKiogVXNlciBJRCAoc3ViamVjdCkgKi9cbiAgc3ViOiBzdHJpbmc7XG4gIC8qKiBVc2VybmFtZSAqL1xuICB1c2VybmFtZTogc3RyaW5nO1xuICAvKiogVXNlciBlbWFpbCAqL1xuICBlbWFpbDogc3RyaW5nO1xuICAvKiogUGVyLW9yZyByb2xlIGluIHRoZSBhY3RpdmUgb3JnYW5pemF0aW9uICgnb3duZXInIHwgJ2FkbWluJyB8ICdtZW1iZXInKS4gTm90IGEgZ2xvYmFsIHJvbGUuICovXG4gIHJvbGU6ICdvd25lcicgfCAnYWRtaW4nIHwgJ21lbWJlcic7XG4gIC8qKiBEZXJpdmVkOiB0cnVlIHdoZW4gcm9sZSBpcyAnYWRtaW4nIG9yICdvd25lcicgaW4gdGhlIGFjdGl2ZSBvcmdhbml6YXRpb24gKi9cbiAgaXNBZG1pbj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBHbG9iYWwgc3VwZXItYWRtaW4gZmxhZyAoY3Jvc3Mtb3JnKS4gV2hlbiBgdHJ1ZWAsIHRoZSB1c2VyIGlzIHRyZWF0ZWRcbiAgICogYXMgYSBzeXN0ZW0gYWRtaW5pc3RyYXRvciByZWdhcmRsZXNzIG9mIHdoaWNoIG9yZyB0aGV5J3JlIGN1cnJlbnRseVxuICAgKiBhY3RpbmcgdW5kZXIuIFRoaXMgaXMgdGhlIGNhbm9uaWNhbCBzaWduYWwgZm9yIHN5c2FkbWluIGF1dGhvcml0eSDigJRcbiAgICogcHJldmlvdXNseSB0aGUgb25seSBwYXRoIHdhcyBtZW1iZXJzaGlwIGluIHRoZSB3ZWxsLWtub3duIFwic3lzdGVtXCIgb3JnXG4gICAqIHdpdGggcm9sZSBhZG1pbi9vd25lciwgd2hpY2ggY29uZmxhdGVkIFwiUGlwZWxpbmUgQnVpbGRlciBvcGVyYXRvclwiIHdpdGhcbiAgICogXCJyZWFsIGN1c3RvbWVyIHRlbmFudFwiIGluIHRoZSBkYXRhIG1vZGVsLiBFaXRoZXIgcGF0aCBzdGlsbCB3b3Jrc1xuICAgKiBkdXJpbmcgdGhlIHJvbGxvdXQ7IG5ldyB1c2VycyBzaG91bGQgYmUgZ3JhbnRlZCB2aWEgYGlzU3VwZXJBZG1pbmAuXG4gICAqL1xuICBpc1N1cGVyQWRtaW4/OiBib29sZWFuO1xuICAvKiogT3JnYW5pemF0aW9uJ3MgcXVvdGEgdGllciAoJ2RldmVsb3BlcicgfCAncHJvJyB8ICd1bmxpbWl0ZWQnKSAqL1xuICB0aWVyPzogc3RyaW5nO1xuICAvKiogUmVzb2x2ZWQgZmVhdHVyZSBmbGFncyBmb3IgdGhpcyB1c2VyL29yZyAqL1xuICBmZWF0dXJlcz86IHN0cmluZ1tdO1xuICAvKiogQWN0aXZlIG9yZ2FuaXphdGlvbiBJRCAoZnJvbSBVc2VyT3JnYW5pemF0aW9uIG1lbWJlcnNoaXApICovXG4gIG9yZ2FuaXphdGlvbklkPzogc3RyaW5nO1xuICAvKiogQWN0aXZlIG9yZ2FuaXphdGlvbiBuYW1lICovXG4gIG9yZ2FuaXphdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcmcg4oaSIHRlYW0gaGllcmFyY2h5IChvcmctdGVhbS1oaWVyYXJjaHkgcHJvcG9zYWwsIHBoYXNlIDEpLlxuICAgKiBgcGFyZW50T3JnYW5pemF0aW9uSWRgIGlzIHRoZSBhY3RpdmUgb3JnJ3MgZGlyZWN0IHBhcmVudDsgYHJvb3RPcmdhbml6YXRpb25JZGBcbiAgICogaXMgdGhlIHRvcCBvZiBpdHMgYW5jZXN0cnkgY2hhaW4uIEJvdGggYXJlICoqb21pdHRlZCBmb3IgZmxhdCAocm9vdCkgb3JncyoqIOKAlFxuICAgKiBjb25zdW1lcnMgc2hvdWxkIHRyZWF0IHRoZSBlZmZlY3RpdmUgcm9vdCBhcyBgcm9vdE9yZ2FuaXphdGlvbklkID8/IG9yZ2FuaXphdGlvbklkYC5cbiAgICogQ3VycmVudGx5IGV2ZXJ5IG9yZyBpcyBmbGF0LCBzbyB0aGVzZSBhcmUgYWJzZW50IG9uIGFsbCB0b2tlbnMgdG9kYXkuXG4gICAqL1xuICBwYXJlbnRPcmdhbml6YXRpb25JZD86IHN0cmluZztcbiAgLyoqIFJvb3Qgb3JnYW5pemF0aW9uIElEIG9mIHRoZSBhY3RpdmUgb3JnJ3MgYW5jZXN0cnkgY2hhaW4gKHNlZSBgcGFyZW50T3JnYW5pemF0aW9uSWRgKS4gKi9cbiAgcm9vdE9yZ2FuaXphdGlvbklkPzogc3RyaW5nO1xuICAvKipcbiAgICogU2V0IG9uIHRva2VucyBpc3N1ZWQgYnkgdGhlIHN5c2FkbWluIGltcGVyc29uYXRpb24gZmxvd1xuICAgKiAoYFBPU1QgL2FkbWluL2ltcGVyc29uYXRlLzp1c2VySWRgKS4gQ2FycmllcyB0aGUgb3JpZ2luYWwgc3lzYWRtaW4nc1xuICAgKiB1c2VyIGlkIHNvIGF1ZGl0IGV2ZW50cyBzdGlsbCBhdHRyaWJ1dGUgYWN0aW9ucyBjb3JyZWN0bHkuXG4gICAqL1xuICBpbXBlcnNvbmF0b3JJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgdGhlIHRva2VuIGlzIHJlYWQtb25seSDigJQgYW55IG5vbi1HRVQgcmVxdWVzdCBpcyByZWplY3RlZFxuICAgKiB1cHN0cmVhbSBieSB0aGUgcGxhdGZvcm0ncyByZWFkLW9ubHkgaW1wZXJzb25hdGlvbiBnYXRlLiBMZXRzXG4gICAqIHN5c2FkbWlucyBcInZpZXcgYXMgdXNlciBYXCIgd2l0aG91dCByaXNraW5nIGEgZGVzdHJ1Y3RpdmUgYWN0aW9uLlxuICAgKi9cbiAgaW1wZXJzb25hdGlvblJlYWRPbmx5PzogYm9vbGVhbjtcbiAgLyoqIFRva2VuIHR5cGUgKi9cbiAgdHlwZTogJ2FjY2VzcycgfCAncmVmcmVzaCc7XG4gIC8qKiBJc3N1ZWQgYXQgdGltZXN0YW1wICovXG4gIGlhdD86IG51bWJlcjtcbiAgLyoqIEV4cGlyYXRpb24gdGltZXN0YW1wICovXG4gIGV4cD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBFeHRlbmRlZCBFeHByZXNzIFJlcXVlc3Qgd2l0aCB1c2VyIHByb3BlcnR5LlxuICovXG5kZWNsYXJlIGdsb2JhbCB7XG4gIG5hbWVzcGFjZSBFeHByZXNzIHtcbiAgICBpbnRlcmZhY2UgUmVxdWVzdCB7XG4gICAgICB1c2VyPzogSnd0UGF5bG9hZDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24gZm9yIGludGVybmFsIEhUVFAgY2xpZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VDb25maWcge1xuICAvKiogU2VydmljZSBob3N0bmFtZSAqL1xuICBob3N0OiBzdHJpbmc7XG4gIC8qKiBTZXJ2aWNlIHBvcnQgKi9cbiAgcG9ydDogbnVtYmVyO1xuICAvKiogUmVxdWVzdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEhlYWx0aCBjaGVjayByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhDaGVja1Jlc3BvbnNlIHtcbiAgc3RhdHVzOiAnaGVhbHRoeScgfCAndW5oZWFsdGh5JztcbiAgc2VydmljZTogc3RyaW5nO1xuICB0aW1lc3RhbXA6IHN0cmluZztcbiAgdXB0aW1lOiBudW1iZXI7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsICdjb25uZWN0ZWQnIHwgJ2Rpc2Nvbm5lY3RlZCcgfCAndW5rbm93bic+O1xufVxuIl19
package/package.json CHANGED
@@ -49,7 +49,7 @@
49
49
  "plugins",
50
50
  "typescript",
51
51
  "self-service",
52
- "multi-tenant",
52
+ "multi-team",
53
53
  "compliance",
54
54
  "automation",
55
55
  "infrastructure-as-code",
@@ -73,7 +73,7 @@
73
73
  "access": "public",
74
74
  "registry": "https://registry.npmjs.org/"
75
75
  },
76
- "version": "3.4.57",
76
+ "version": "3.4.59",
77
77
  "bugs": {
78
78
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
79
79
  },