@pipeline-builder/api-core 3.4.36 → 3.4.38

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
@@ -34,7 +34,7 @@ Tokens satisfy the standard `requireAuth` middleware unmodified (sub: `service:<
34
34
 
35
35
  ### Internal HTTP Client
36
36
  - `InternalHttpClient`, `createSafeClient` — Service-to-service HTTP communication
37
- - `ServiceConfig`, `RequestOptions`, `HttpResponse` — Client types
37
+ - `ServiceConfig`, `RequestOptions` — Client types
38
38
 
39
39
  ### AI Provider Constants
40
40
  - `AI_PROVIDER_CATALOG` — Static provider/model catalog
package/lib/index.d.ts CHANGED
@@ -5,13 +5,13 @@
5
5
  *
6
6
  * **Middleware**
7
7
  * - requireAuth, requireAdmin, requireSystemAdmin, requireFeature — JWT authentication
8
- * - isSystemOrg, isSystemAdmin, isServicePrincipal — authorization helpers
8
+ * - isSystemAdmin, isServicePrincipal — authorization helpers (isSystemOrgId remains as a content-owner check, not a privilege gate)
9
9
  * - signServiceToken, getServiceAuthHeader — inter-service JWT minting
10
10
  *
11
11
  * **Types**
12
12
  * - ErrorCode, ErrorCodeStatus — standardized error code enum and status mapping
13
13
  * - RequestIdentity — parsed JWT identity
14
- * - ServiceConfig, RequestOptions, HttpResponse — HTTP client types
14
+ * - ServiceConfig, RequestOptions — HTTP client types
15
15
  * - QuotaType, QuotaCheckResult — quota service types
16
16
  * - PipelineType, ComputeType, AccessModifier — pipeline domain types
17
17
  * - FeatureFlags — feature flag types
package/lib/index.js CHANGED
@@ -23,13 +23,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
23
23
  *
24
24
  * **Middleware**
25
25
  * - requireAuth, requireAdmin, requireSystemAdmin, requireFeature — JWT authentication
26
- * - isSystemOrg, isSystemAdmin, isServicePrincipal — authorization helpers
26
+ * - isSystemAdmin, isServicePrincipal — authorization helpers (isSystemOrgId remains as a content-owner check, not a privilege gate)
27
27
  * - signServiceToken, getServiceAuthHeader — inter-service JWT minting
28
28
  *
29
29
  * **Types**
30
30
  * - ErrorCode, ErrorCodeStatus — standardized error code enum and status mapping
31
31
  * - RequestIdentity — parsed JWT identity
32
- * - ServiceConfig, RequestOptions, HttpResponse — HTTP client types
32
+ * - ServiceConfig, RequestOptions — HTTP client types
33
33
  * - QuotaType, QuotaCheckResult — quota service types
34
34
  * - PipelineType, ComputeType, AccessModifier — pipeline domain types
35
35
  * - FeatureFlags — feature flag types
@@ -84,4 +84,4 @@ __exportStar(require("./errors"), exports);
84
84
  __exportStar(require("./validation"), exports);
85
85
  // OpenAPI
86
86
  __exportStar(require("./openapi"), exports);
87
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0NHO0FBRUgsUUFBUTtBQUNSLDBDQUF3QjtBQUV4QixZQUFZO0FBQ1osOENBQTRCO0FBRTVCLFFBQVE7QUFDUiwwQ0FBd0I7QUFFeEIsVUFBVTtBQUNWLDRDQUEwQjtBQUUxQixXQUFXO0FBQ1gsNkNBQTJCO0FBRTNCLGFBQWE7QUFDYiwrQ0FBNkI7QUFFN0IsU0FBUztBQUNULDJDQUF5QjtBQUV6QixTQUFTO0FBQ1QsMkNBQXlCO0FBRXpCLGFBQWE7QUFDYiwrQ0FBNkI7QUFFN0IsVUFBVTtBQUNWLDRDQUEwQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIEBtb2R1bGUgQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmVcbiAqXG4gKiBDb3JlIEFQSSB1dGlsaXRpZXMgc2hhcmVkIGFjcm9zcyBhbGwgc2VydmljZXMuXG4gKlxuICogKipNaWRkbGV3YXJlKipcbiAqIC0gcmVxdWlyZUF1dGgsIHJlcXVpcmVBZG1pbiwgcmVxdWlyZVN5c3RlbUFkbWluLCByZXF1aXJlRmVhdHVyZSDigJQgSldUIGF1dGhlbnRpY2F0aW9uXG4gKiAtIGlzU3lzdGVtT3JnLCBpc1N5c3RlbUFkbWluLCBpc1NlcnZpY2VQcmluY2lwYWwg4oCUIGF1dGhvcml6YXRpb24gaGVscGVyc1xuICogLSBzaWduU2VydmljZVRva2VuLCBnZXRTZXJ2aWNlQXV0aEhlYWRlciDigJQgaW50ZXItc2VydmljZSBKV1QgbWludGluZ1xuICpcbiAqICoqVHlwZXMqKlxuICogLSBFcnJvckNvZGUsIEVycm9yQ29kZVN0YXR1cyDigJQgc3RhbmRhcmRpemVkIGVycm9yIGNvZGUgZW51bSBhbmQgc3RhdHVzIG1hcHBpbmdcbiAqIC0gUmVxdWVzdElkZW50aXR5IOKAlCBwYXJzZWQgSldUIGlkZW50aXR5XG4gKiAtIFNlcnZpY2VDb25maWcsIFJlcXVlc3RPcHRpb25zLCBIdHRwUmVzcG9uc2Ug4oCUIEhUVFAgY2xpZW50IHR5cGVzXG4gKiAtIFF1b3RhVHlwZSwgUXVvdGFDaGVja1Jlc3VsdCDigJQgcXVvdGEgc2VydmljZSB0eXBlc1xuICogLSBQaXBlbGluZVR5cGUsIENvbXB1dGVUeXBlLCBBY2Nlc3NNb2RpZmllciDigJQgcGlwZWxpbmUgZG9tYWluIHR5cGVzXG4gKiAtIEZlYXR1cmVGbGFncyDigJQgZmVhdHVyZSBmbGFnIHR5cGVzXG4gKlxuICogKipVdGlsaXRpZXMqKlxuICogLSBjcmVhdGVMb2dnZXIg4oCUIFdpbnN0b24tYmFzZWQgc3RydWN0dXJlZCBsb2dnZXIgZmFjdG9yeVxuICogLSBzZW5kU3VjY2Vzcywgc2VuZEVycm9yLCBzZW5kUGFnaW5hdGVkLCBzZW5kQmFkUmVxdWVzdCwgc2VuZEludGVybmFsRXJyb3Ig4oCUIEhUVFAgcmVzcG9uc2UgaGVscGVyc1xuICogLSBnZXRQYXJhbSwgZ2V0T3JnSWQsIGdldEF1dGhIZWFkZXIg4oCUIHJlcXVlc3QgcGFyYW1ldGVyIGV4dHJhY3Rpb25cbiAqIC0gcGFyc2VRdWVyeUJvb2xlYW4sIHBhcnNlUXVlcnlJbnQsIHBhcnNlUXVlcnlTdHJpbmcg4oCUIHF1ZXJ5IHN0cmluZyBwYXJzaW5nXG4gKiAtIGdldElkZW50aXR5LCB2YWxpZGF0ZUlkZW50aXR5IOKAlCBpZGVudGl0eSBleHRyYWN0aW9uIGZyb20gcmVxdWVzdHNcbiAqIC0gZXJyb3JNZXNzYWdlIOKAlCBzYWZlIGVycm9yLXRvLXN0cmluZyBjb252ZXJzaW9uXG4gKlxuICogKipDb25zdGFudHMqKlxuICogLSBIVFRQIHN0YXR1cyBjb2RlcywgQUkgcHJvdmlkZXIgaWRlbnRpZmllcnMsIHRpbWUgY29uc3RhbnRzXG4gKlxuICogKipTZXJ2aWNlcyoqXG4gKiAtIEludGVybmFsSHR0cENsaWVudCwgY3JlYXRlU2FmZUNsaWVudCDigJQgaW50ZXJuYWwgc2VydmljZS10by1zZXJ2aWNlIEhUVFAgY2xpZW50XG4gKiAtIGNyZWF0ZVF1b3RhU2VydmljZSDigJQgcXVvdGEgZW5mb3JjZW1lbnQgY2xpZW50IGZhY3RvcnlcbiAqIC0gQ2FjaGVTZXJ2aWNlIOKAlCBpbi1tZW1vcnkgVFRMIGNhY2hlXG4gKiAtIENvbXBsaWFuY2VDbGllbnQg4oCUIGNvbXBsaWFuY2Ugc2VydmljZSBjbGllbnRcbiAqIC0gRW50aXR5RXZlbnRFbWl0dGVyIOKAlCBkb21haW4gZXZlbnQgcHViL3N1YlxuICpcbiAqICoqRXJyb3JzKipcbiAqIC0gQXBwRXJyb3IsIE5vdEZvdW5kRXJyb3IsIEZvcmJpZGRlbkVycm9yIOKAlCB0eXBlZCBIVFRQIGVycm9yIGNsYXNzZXNcbiAqXG4gKiAqKlZhbGlkYXRpb24qKlxuICogLSBab2QtYmFzZWQgcmVxdWVzdCB2YWxpZGF0aW9uIHNjaGVtYXMgYW5kIG1pZGRsZXdhcmVcbiAqXG4gKiAqKlJvdXRlcyoqXG4gKiAtIEhlYWx0aCBjaGVjayByb3V0ZSBmYWN0b3J5XG4gKlxuICogKipPcGVuQVBJKipcbiAqIC0gU2NoZW1hIHJlZ2lzdHJ5IGFuZCBzcGVjIGdlbmVyYXRpb25cbiAqL1xuXG4vLyBUeXBlc1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG5cbi8vIENvbnN0YW50c1xuZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMnO1xuXG4vLyBVdGlsc1xuZXhwb3J0ICogZnJvbSAnLi91dGlscyc7XG5cbi8vIEhlbHBlcnNcbmV4cG9ydCAqIGZyb20gJy4vaGVscGVycyc7XG5cbi8vIFNlcnZpY2VzXG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzJztcblxuLy8gTWlkZGxld2FyZVxuZXhwb3J0ICogZnJvbSAnLi9taWRkbGV3YXJlJztcblxuLy8gUm91dGVzXG5leHBvcnQgKiBmcm9tICcuL3JvdXRlcyc7XG5cbi8vIEVycm9yc1xuZXhwb3J0ICogZnJvbSAnLi9lcnJvcnMnO1xuXG4vLyBWYWxpZGF0aW9uXG5leHBvcnQgKiBmcm9tICcuL3ZhbGlkYXRpb24nO1xuXG4vLyBPcGVuQVBJXG5leHBvcnQgKiBmcm9tICcuL29wZW5hcGknO1xuIl19
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0NHO0FBRUgsUUFBUTtBQUNSLDBDQUF3QjtBQUV4QixZQUFZO0FBQ1osOENBQTRCO0FBRTVCLFFBQVE7QUFDUiwwQ0FBd0I7QUFFeEIsVUFBVTtBQUNWLDRDQUEwQjtBQUUxQixXQUFXO0FBQ1gsNkNBQTJCO0FBRTNCLGFBQWE7QUFDYiwrQ0FBNkI7QUFFN0IsU0FBUztBQUNULDJDQUF5QjtBQUV6QixTQUFTO0FBQ1QsMkNBQXlCO0FBRXpCLGFBQWE7QUFDYiwrQ0FBNkI7QUFFN0IsVUFBVTtBQUNWLDRDQUEwQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIEBtb2R1bGUgQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmVcbiAqXG4gKiBDb3JlIEFQSSB1dGlsaXRpZXMgc2hhcmVkIGFjcm9zcyBhbGwgc2VydmljZXMuXG4gKlxuICogKipNaWRkbGV3YXJlKipcbiAqIC0gcmVxdWlyZUF1dGgsIHJlcXVpcmVBZG1pbiwgcmVxdWlyZVN5c3RlbUFkbWluLCByZXF1aXJlRmVhdHVyZSDigJQgSldUIGF1dGhlbnRpY2F0aW9uXG4gKiAtIGlzU3lzdGVtQWRtaW4sIGlzU2VydmljZVByaW5jaXBhbCDigJQgYXV0aG9yaXphdGlvbiBoZWxwZXJzIChpc1N5c3RlbU9yZ0lkIHJlbWFpbnMgYXMgYSBjb250ZW50LW93bmVyIGNoZWNrLCBub3QgYSBwcml2aWxlZ2UgZ2F0ZSlcbiAqIC0gc2lnblNlcnZpY2VUb2tlbiwgZ2V0U2VydmljZUF1dGhIZWFkZXIg4oCUIGludGVyLXNlcnZpY2UgSldUIG1pbnRpbmdcbiAqXG4gKiAqKlR5cGVzKipcbiAqIC0gRXJyb3JDb2RlLCBFcnJvckNvZGVTdGF0dXMg4oCUIHN0YW5kYXJkaXplZCBlcnJvciBjb2RlIGVudW0gYW5kIHN0YXR1cyBtYXBwaW5nXG4gKiAtIFJlcXVlc3RJZGVudGl0eSDigJQgcGFyc2VkIEpXVCBpZGVudGl0eVxuICogLSBTZXJ2aWNlQ29uZmlnLCBSZXF1ZXN0T3B0aW9ucyDigJQgSFRUUCBjbGllbnQgdHlwZXNcbiAqIC0gUXVvdGFUeXBlLCBRdW90YUNoZWNrUmVzdWx0IOKAlCBxdW90YSBzZXJ2aWNlIHR5cGVzXG4gKiAtIFBpcGVsaW5lVHlwZSwgQ29tcHV0ZVR5cGUsIEFjY2Vzc01vZGlmaWVyIOKAlCBwaXBlbGluZSBkb21haW4gdHlwZXNcbiAqIC0gRmVhdHVyZUZsYWdzIOKAlCBmZWF0dXJlIGZsYWcgdHlwZXNcbiAqXG4gKiAqKlV0aWxpdGllcyoqXG4gKiAtIGNyZWF0ZUxvZ2dlciDigJQgV2luc3Rvbi1iYXNlZCBzdHJ1Y3R1cmVkIGxvZ2dlciBmYWN0b3J5XG4gKiAtIHNlbmRTdWNjZXNzLCBzZW5kRXJyb3IsIHNlbmRQYWdpbmF0ZWQsIHNlbmRCYWRSZXF1ZXN0LCBzZW5kSW50ZXJuYWxFcnJvciDigJQgSFRUUCByZXNwb25zZSBoZWxwZXJzXG4gKiAtIGdldFBhcmFtLCBnZXRPcmdJZCwgZ2V0QXV0aEhlYWRlciDigJQgcmVxdWVzdCBwYXJhbWV0ZXIgZXh0cmFjdGlvblxuICogLSBwYXJzZVF1ZXJ5Qm9vbGVhbiwgcGFyc2VRdWVyeUludCwgcGFyc2VRdWVyeVN0cmluZyDigJQgcXVlcnkgc3RyaW5nIHBhcnNpbmdcbiAqIC0gZ2V0SWRlbnRpdHksIHZhbGlkYXRlSWRlbnRpdHkg4oCUIGlkZW50aXR5IGV4dHJhY3Rpb24gZnJvbSByZXF1ZXN0c1xuICogLSBlcnJvck1lc3NhZ2Ug4oCUIHNhZmUgZXJyb3ItdG8tc3RyaW5nIGNvbnZlcnNpb25cbiAqXG4gKiAqKkNvbnN0YW50cyoqXG4gKiAtIEhUVFAgc3RhdHVzIGNvZGVzLCBBSSBwcm92aWRlciBpZGVudGlmaWVycywgdGltZSBjb25zdGFudHNcbiAqXG4gKiAqKlNlcnZpY2VzKipcbiAqIC0gSW50ZXJuYWxIdHRwQ2xpZW50LCBjcmVhdGVTYWZlQ2xpZW50IOKAlCBpbnRlcm5hbCBzZXJ2aWNlLXRvLXNlcnZpY2UgSFRUUCBjbGllbnRcbiAqIC0gY3JlYXRlUXVvdGFTZXJ2aWNlIOKAlCBxdW90YSBlbmZvcmNlbWVudCBjbGllbnQgZmFjdG9yeVxuICogLSBDYWNoZVNlcnZpY2Ug4oCUIGluLW1lbW9yeSBUVEwgY2FjaGVcbiAqIC0gQ29tcGxpYW5jZUNsaWVudCDigJQgY29tcGxpYW5jZSBzZXJ2aWNlIGNsaWVudFxuICogLSBFbnRpdHlFdmVudEVtaXR0ZXIg4oCUIGRvbWFpbiBldmVudCBwdWIvc3ViXG4gKlxuICogKipFcnJvcnMqKlxuICogLSBBcHBFcnJvciwgTm90Rm91bmRFcnJvciwgRm9yYmlkZGVuRXJyb3Ig4oCUIHR5cGVkIEhUVFAgZXJyb3IgY2xhc3Nlc1xuICpcbiAqICoqVmFsaWRhdGlvbioqXG4gKiAtIFpvZC1iYXNlZCByZXF1ZXN0IHZhbGlkYXRpb24gc2NoZW1hcyBhbmQgbWlkZGxld2FyZVxuICpcbiAqICoqUm91dGVzKipcbiAqIC0gSGVhbHRoIGNoZWNrIHJvdXRlIGZhY3RvcnlcbiAqXG4gKiAqKk9wZW5BUEkqKlxuICogLSBTY2hlbWEgcmVnaXN0cnkgYW5kIHNwZWMgZ2VuZXJhdGlvblxuICovXG5cbi8vIFR5cGVzXG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcblxuLy8gQ29uc3RhbnRzXG5leHBvcnQgKiBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8vIFV0aWxzXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzJztcblxuLy8gSGVscGVyc1xuZXhwb3J0ICogZnJvbSAnLi9oZWxwZXJzJztcblxuLy8gU2VydmljZXNcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMnO1xuXG4vLyBNaWRkbGV3YXJlXG5leHBvcnQgKiBmcm9tICcuL21pZGRsZXdhcmUnO1xuXG4vLyBSb3V0ZXNcbmV4cG9ydCAqIGZyb20gJy4vcm91dGVzJztcblxuLy8gRXJyb3JzXG5leHBvcnQgKiBmcm9tICcuL2Vycm9ycyc7XG5cbi8vIFZhbGlkYXRpb25cbmV4cG9ydCAqIGZyb20gJy4vdmFsaWRhdGlvbic7XG5cbi8vIE9wZW5BUElcbmV4cG9ydCAqIGZyb20gJy4vb3BlbmFwaSc7XG4iXX0=
@@ -30,11 +30,16 @@ export declare const SYSTEM_ORG_ID: string;
30
30
  * while SYSTEM_ORG_ID is the well-known name "system".
31
31
  */
32
32
  export declare function isSystemOrgId(orgId?: string, orgName?: string): boolean;
33
- /** True when the request's JWT identifies the system (super-admin) org. */
34
- export declare function isSystemOrg(req: Request): boolean;
35
33
  /**
36
34
  * Check if the request is from a system admin.
37
- * A system admin has per-org role 'admin' or 'owner' in the system organization.
35
+ *
36
+ * Authority is granted solely by the user-level `isSuperAdmin` flag carried
37
+ * in the JWT. The "membership in the well-known 'system' org with role
38
+ * admin/owner" path was removed — it conflated a Pipeline Builder operator
39
+ * with a real customer tenant in the data model, and meant any unintended
40
+ * write that created a 'system'-named org could quietly grant cross-org
41
+ * authority. The `system` org still exists as a *content holder* for shared
42
+ * sample data; it just no longer confers privilege.
38
43
  */
39
44
  export declare function isSystemAdmin(req: Request): boolean;
40
45
  /** Requires system admin (admin role + system organization). */
@@ -42,7 +47,7 @@ export declare function requireSystemAdmin(req: Request, res: Response, next: Ne
42
47
  /**
43
48
  * Require a specific feature flag. Use after requireAuth.
44
49
  * Checks the `features` array in the JWT payload (set at token issuance).
45
- * System org users always pass (all features enabled).
50
+ * Sysadmins (isSuperAdmin) bypass — they always have every feature.
46
51
  */
47
52
  export declare function requireFeature(feature: string): (req: Request, res: Response, next: NextFunction) => void;
48
53
  /**
@@ -9,7 +9,6 @@ exports.SYSTEM_ORG_ID = void 0;
9
9
  exports.requireAuth = requireAuth;
10
10
  exports.requireAdmin = requireAdmin;
11
11
  exports.isSystemOrgId = isSystemOrgId;
12
- exports.isSystemOrg = isSystemOrg;
13
12
  exports.isSystemAdmin = isSystemAdmin;
14
13
  exports.requireSystemAdmin = requireSystemAdmin;
15
14
  exports.requireFeature = requireFeature;
@@ -126,18 +125,19 @@ exports.SYSTEM_ORG_ID = (process.env.SYSTEM_ORG_ID || 'system').toLowerCase();
126
125
  function isSystemOrgId(orgId, orgName) {
127
126
  return orgId?.toLowerCase() === exports.SYSTEM_ORG_ID || orgName?.toLowerCase() === exports.SYSTEM_ORG_ID;
128
127
  }
129
- /** True when the request's JWT identifies the system (super-admin) org. */
130
- function isSystemOrg(req) {
131
- if (!req.user)
132
- return false;
133
- return isSystemOrgId(req.user.organizationId, req.user.organizationName);
134
- }
135
128
  /**
136
129
  * Check if the request is from a system admin.
137
- * A system admin has per-org role 'admin' or 'owner' in the system organization.
130
+ *
131
+ * Authority is granted solely by the user-level `isSuperAdmin` flag carried
132
+ * in the JWT. The "membership in the well-known 'system' org with role
133
+ * admin/owner" path was removed — it conflated a Pipeline Builder operator
134
+ * with a real customer tenant in the data model, and meant any unintended
135
+ * write that created a 'system'-named org could quietly grant cross-org
136
+ * authority. The `system` org still exists as a *content holder* for shared
137
+ * sample data; it just no longer confers privilege.
138
138
  */
139
139
  function isSystemAdmin(req) {
140
- return (req.user?.role === 'admin' || req.user?.role === 'owner') && isSystemOrg(req);
140
+ return req.user?.isSuperAdmin === true;
141
141
  }
142
142
  /** Requires system admin (admin role + system organization). */
143
143
  function requireSystemAdmin(req, res, next) {
@@ -149,15 +149,18 @@ function requireSystemAdmin(req, res, next) {
149
149
  /**
150
150
  * Require a specific feature flag. Use after requireAuth.
151
151
  * Checks the `features` array in the JWT payload (set at token issuance).
152
- * System org users always pass (all features enabled).
152
+ * Sysadmins (isSuperAdmin) bypass — they always have every feature.
153
153
  */
154
154
  function requireFeature(feature) {
155
155
  return (req, res, next) => {
156
156
  if (!req.user) {
157
157
  return (0, response_1.sendError)(res, http_status_1.HttpStatus.UNAUTHORIZED, 'Authentication required', error_codes_1.ErrorCode.UNAUTHORIZED);
158
158
  }
159
- // System org always has all features
160
- if (isSystemOrg(req))
159
+ // Sysadmins get all features; the `features` array on their token is
160
+ // populated with every flag at issuance time but the bypass here keeps
161
+ // the rule explicit and survives a token issued before a new feature
162
+ // flag was added.
163
+ if (req.user.isSuperAdmin === true)
161
164
  return next();
162
165
  if (!req.user.features?.includes(feature)) {
163
166
  return (0, response_1.sendError)(res, http_status_1.HttpStatus.FORBIDDEN, `This feature requires a higher plan (${feature})`, error_codes_1.ErrorCode.INSUFFICIENT_PERMISSIONS);
@@ -227,4 +230,4 @@ function getServiceAuthHeader(opts) {
227
230
  function isServicePrincipal(req) {
228
231
  return req.user?.sub?.startsWith('service:') ?? false;
229
232
  }
230
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlL2F1dGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7Ozs7OztBQTJEdEMsa0NBYUM7QUFrRUQsb0NBY0M7QUFXRCxzQ0FFQztBQUdELGtDQUdDO0FBTUQsc0NBRUM7QUFHRCxnREFhQztBQU9ELHdDQW1CQztBQVFELHNEQUtDO0FBa0NELDRDQW9CQztBQUdELG9EQUVDO0FBR0QsZ0RBRUM7QUF2U0QsZ0VBQStCO0FBQy9CLDBEQUFzRDtBQUV0RCxzREFBaUQ7QUFDakQsOENBQW1EO0FBQ25ELDRDQUErQztBQUMvQyxnREFBOEM7QUFFOUMsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxFQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFL0MsNERBQTREO0FBQzVELElBQUksVUFBOEIsQ0FBQztBQUNuQyxJQUFJLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUM5QixNQUFNLDhCQUE4QixHQUFHLE9BQU8sQ0FBQyxDQUFDLFlBQVk7QUFFNUQsU0FBUyxZQUFZO0lBQ25CLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN2QixJQUFJLENBQUMsVUFBVSxJQUFJLEdBQUcsR0FBRyxxQkFBcUIsR0FBRyw4QkFBOEIsRUFBRSxDQUFDO1FBQ2hGLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sQ0FBQyxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztZQUMzRCxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELElBQUksVUFBVSxJQUFJLFVBQVUsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN4QyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFD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QUFVLENBQUM7SUFDeEUsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVk7UUFBRSxXQUFXLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO0lBQzlFLE9BQU8sc0JBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRCxrRkFBa0Y7QUFDbEYsU0FBZ0Isb0JBQW9CLENBQUMsSUFBeUI7SUFDNUQsT0FBTyxVQUFVLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDNUMsQ0FBQztBQUVELCtGQUErRjtBQUMvRixTQUFnQixrQkFBa0IsQ0FBQyxHQUFZO0lBQzdDLE9BQU8sR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssQ0FBQztBQUN4RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IFJlcXVlc3QsIFJlc3BvbnNlLCBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCBqd3QgZnJvbSAnanNvbndlYnRva2VuJztcbmltcG9ydCB7IEh0dHBTdGF0dXMgfSBmcm9tICcuLi9jb25zdGFudHMvaHR0cC1zdGF0dXMnO1xuaW1wb3J0IHsgSnd0UGF5bG9hZCB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbic7XG5pbXBvcnQgeyBFcnJvckNvZGUgfSBmcm9tICcuLi90eXBlcy9lcnJvci1jb2Rlcyc7XG5pbXBvcnQgeyBnZXRIZWFkZXJTdHJpbmcgfSBmcm9tICcuLi91dGlscy9oZWFkZXJzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgeyBzZW5kRXJyb3IgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZSc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignYXV0aC1taWRkbGV3YXJlJyk7XG5cbi8qKiBDYWNoZWQgSldUIHNlY3JldCB3aXRoIHBlcmlvZGljIHJlZnJlc2ggZnJvbSBlbnYgdmFyLiAqL1xubGV0IF9qd3RTZWNyZXQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbmxldCBfand0U2VjcmV0UmVmcmVzaGVkQXQgPSAwO1xuY29uc3QgSldUX1NFQ1JFVF9SRUZSRVNIX0lOVEVSVkFMX01TID0gMzAwXzAwMDsgLy8gNSBtaW51dGVzXG5cbmZ1bmN0aW9uIGdldEp3dFNlY3JldCgpOiBzdHJpbmcge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBpZiAoIV9qd3RTZWNyZXQgfHwgbm93IC0gX2p3dFNlY3JldFJlZnJlc2hlZEF0ID4gSldUX1NFQ1JFVF9SRUZSRVNIX0lOVEVSVkFMX01TKSB7XG4gICAgY29uc3Qgc2VjcmV0ID0gcHJvY2Vzcy5lbnYuSldUX1NFQ1JFVDtcbiAgICBpZiAoIXNlY3JldCkge1xuICAgICAgbG9nZ2VyLmVycm9yKCdKV1RfU0VDUkVUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXQnKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSldUX1NFQ1JFVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAoX2p3dFNlY3JldCAmJiBfand0U2VjcmV0ICE9PSBzZWNyZXQpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdKV1Qgc2VjcmV0IHJvdGF0ZWQnKTtcbiAgICB9XG4gICAgX2p3dFNlY3JldCA9IHNlY3JldDtcbiAgICBfand0U2VjcmV0UmVmcmVzaGVkQXQgPSBub3c7XG4gIH1cbiAgcmV0dXJuIF9qd3RTZWNyZXQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWlyZUF1dGhPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFsbG93IHgtb3JnLWlkL3gtb3JnLW5hbWUgaGVhZGVycyB0byBvdmVycmlkZSB0aGUgSldUJ3Mgb3JnYW5pemF0aW9uIGZpZWxkcy5cbiAgICpcbiAgICogKipTRUNVUklUWSBXQVJOSU5HOioqIFdoZW4gZW5hYmxlZCwgYSBjYWxsZXIgY2FuIHNldCBgeC1vcmctaWRgIHRvIEFOWVxuICAgKiBvcmdhbml6YXRpb24gSUQsIGVmZmVjdGl2ZWx5IGltcGVyc29uYXRpbmcgdGhhdCBvcmcuIFRoaXMgTVVTVCBvbmx5IGJlXG4gICAqIHVzZWQgb24gcm91dGVzIHRoYXQgYXJlOlxuICAgKiAgIDEuIEludGVybmFsIHNlcnZpY2UtdG8tc2VydmljZSByb3V0ZXMgKG5vdCBleHBvc2VkIHRvIGVuZCB1c2VycylcbiAgICogICAyLiBCZWhpbmQgbmV0d29yayBpc29sYXRpb24gKGNvbnRhaW5lciBuZXR3b3JrLCBWUEMsIGV0Yy4pXG4gICAqXG4gICAqIE5FVkVSIGVuYWJsZSB0aGlzIG9uIHVzZXItZmFjaW5nIEFQSSByb3V0ZXMuIElmIHVuc3VyZSwgbGVhdmUgaXQgZGlzYWJsZWQuXG4gICAqL1xuICBhbGxvd09yZ0hlYWRlck92ZXJyaWRlPzogYm9vbGVhbjtcbn1cblxuLyoqIEpXVCBhdXRoIG1pZGRsZXdhcmUuIFVzZSBkaXJlY3RseSBvciBjYWxsIHdpdGggb3B0aW9ucy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQXV0aChcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVBdXRoKFxuICBvcHRpb25zPzogUmVxdWlyZUF1dGhPcHRpb25zLFxuKTogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVBdXRoKFxuICByZXFPck9wdGlvbnM/OiBSZXF1ZXN0IHwgUmVxdWlyZUF1dGhPcHRpb25zLFxuICByZXM/OiBSZXNwb25zZSxcbiAgbmV4dD86IE5leHRGdW5jdGlvbixcbik6IHZvaWQgfCAoKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB2b2lkKSB7XG4gIGlmIChyZXFPck9wdGlvbnMgJiYgcmVzICYmIG5leHQgJiYgJ2hlYWRlcnMnIGluIHJlcU9yT3B0aW9ucykge1xuICAgIHJldHVybiBfcmVxdWlyZUF1dGgoe30sIHJlcU9yT3B0aW9ucyBhcyBSZXF1ZXN0LCByZXMsIG5leHQpO1xuICB9XG5cbiAgY29uc3Qgb3B0aW9ucyA9IChyZXFPck9wdGlvbnMgYXMgUmVxdWlyZUF1dGhPcHRpb25zKSB8fCB7fTtcbiAgcmV0dXJuIChyZXE6IFJlcXVlc3QsIHJlc0lubmVyOiBSZXNwb25zZSwgbmV4dElubmVyOiBOZXh0RnVuY3Rpb24pID0+IHtcbiAgICBfcmVxdWlyZUF1dGgob3B0aW9ucywgcmVxLCByZXNJbm5lciwgbmV4dElubmVyKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gX3JlcXVpcmVBdXRoKFxuICBvcHRpb25zOiBSZXF1aXJlQXV0aE9wdGlvbnMsXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuKTogdm9pZCB7XG4gIGNvbnN0IGF1dGhIZWFkZXIgPSByZXEuaGVhZGVycy5hdXRob3JpemF0aW9uO1xuXG4gIGlmICghYXV0aEhlYWRlcikge1xuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0F1dGhvcml6YXRpb24gaGVhZGVyIHJlcXVpcmVkJywgRXJyb3JDb2RlLlRPS0VOX01JU1NJTkcpO1xuICB9XG5cbiAgY29uc3QgcGFydHMgPSBhdXRoSGVhZGVyLnNwbGl0KCcgJyk7XG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDIgfHwgcGFydHNbMF0gIT09ICdCZWFyZXInKSB7XG4gICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnSW52YWxpZCBhdXRob3JpemF0aW9uIGZvcm1hdC4gVXNlOiBCZWFyZXIgPHRva2VuPicsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gUGFzcyB0aHJvdWdoIG9wdGlvbmFsIGlzc3Vlci9hdWRpZW5jZSB2ZXJpZmljYXRpb24gd2hlbiBlbnYtY29uZmlndXJlZC5cbiAgICAvLyBXaXRob3V0IHRoZXNlLCBhIEpXVCBzaWduZWQgYnkgYW55IHN5c3RlbSB0aGF0IGhhcHBlbnMgdG8gc2hhcmUgdGhlXG4gICAgLy8gc2FtZSBKV1RfU0VDUkVUIHdvdWxkIGJlIGFjY2VwdGVkIOKAlCBkZWZlbmNlLWluLWRlcHRoIGZvciBzaGFyZWQtc2VjcmV0XG4gICAgLy8gbWlzY29uZmlndXJhdGlvbnMgYWNyb3NzIHNlcnZpY2VzIC8gZW52aXJvbm1lbnRzLlxuICAgIGNvbnN0IHZlcmlmeU9wdGlvbnM6IGp3dC5WZXJpZnlPcHRpb25zID0ge307XG4gICAgY29uc3QgZXhwZWN0ZWRJc3N1ZXIgPSBwcm9jZXNzLmVudi5KV1RfSVNTVUVSO1xuICAgIGNvbnN0IGV4cGVjdGVkQXVkaWVuY2UgPSBwcm9jZXNzLmVudi5KV1RfQVVESUVOQ0U7XG4gICAgaWYgKGV4cGVjdGVkSXNzdWVyKSB2ZXJpZnlPcHRpb25zLmlzc3VlciA9IGV4cGVjdGVkSXNzdWVyO1xuICAgIGlmIChleHBlY3RlZEF1ZGllbmNlKSB2ZXJpZnlPcHRpb25zLmF1ZGllbmNlID0gZXhwZWN0ZWRBdWRpZW5jZTtcbiAgICBjb25zdCBkZWNvZGVkID0gand0LnZlcmlmeShwYXJ0c1sxXSwgZ2V0Snd0U2VjcmV0KCksIHZlcmlmeU9wdGlvbnMpIGFzIEp3dFBheWxvYWQ7XG5cbiAgICBpZiAoZGVjb2RlZC50eXBlICE9PSAnYWNjZXNzJykge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnT25seSBhY2Nlc3MgdG9rZW5zIGNhbiBiZSB1c2VkIGZvciBBUEkgcmVxdWVzdHMnLCBFcnJvckNvZGUuVE9LRU5fSU5WQUxJRCk7XG4gICAgfVxuXG4gICAgaWYgKCFkZWNvZGVkLnN1YiB8fCAhZGVjb2RlZC5yb2xlKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdUb2tlbiBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcycsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgICB9XG5cbiAgICByZXEudXNlciA9IHsgLi4uZGVjb2RlZCB9O1xuXG4gICAgaWYgKG9wdGlvbnMuYWxsb3dPcmdIZWFkZXJPdmVycmlkZSkge1xuICAgICAgY29uc3QgaGVhZGVyT3JnSWQgPSBnZXRIZWFkZXJTdHJpbmcocmVxLmhlYWRlcnNbJ3gtb3JnLWlkJ10pO1xuICAgICAgY29uc3QgaGVhZGVyT3JnTmFtZSA9IGdldEhlYWRlclN0cmluZyhyZXEuaGVhZGVyc1sneC1vcmctbmFtZSddKTtcbiAgICAgIGlmIChoZWFkZXJPcmdJZCkgcmVxLnVzZXIub3JnYW5pemF0aW9uSWQgPSBoZWFkZXJPcmdJZDtcbiAgICAgIGlmIChoZWFkZXJPcmdOYW1lKSByZXEudXNlci5vcmdhbml6YXRpb25OYW1lID0gaGVhZGVyT3JnTmFtZTtcbiAgICB9XG5cbiAgICBuZXh0KCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2Ygand0LlRva2VuRXhwaXJlZEVycm9yKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdUb2tlbiBoYXMgZXhwaXJlZCcsIEVycm9yQ29kZS5UT0tFTl9FWFBJUkVEKTtcbiAgICB9XG5cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBqd3QuSnNvbldlYlRva2VuRXJyb3IpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0ludmFsaWQgdG9rZW4nLCBFcnJvckNvZGUuVE9LRU5fSU5WQUxJRCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnQXV0aGVudGljYXRpb24gZmFpbGVkJywgRXJyb3JDb2RlLlVOQVVUSE9SSVpFRCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXF1aXJlcyBhZG1pbiByb2xlLiBVc2UgYWZ0ZXIgcmVxdWlyZUF1dGguXG4gKiBQZXJtaXRzIHVzZXJzIHdob3NlIHBlci1vcmcgcm9sZSBpcyAnYWRtaW4nIG9yICdvd25lcicuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQWRtaW4oXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuKTogdm9pZCB7XG4gIGlmICghcmVxLnVzZXIpIHtcbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiByZXF1aXJlZCcsIEVycm9yQ29kZS5VTkFVVEhPUklaRUQpO1xuICB9XG5cbiAgaWYgKHJlcS51c2VyLnJvbGUgIT09ICdhZG1pbicgJiYgcmVxLnVzZXIucm9sZSAhPT0gJ293bmVyJykge1xuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLkZPUkJJRERFTiwgJ0FkbWluIGFjY2VzcyByZXF1aXJlZCcsIEVycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMpO1xuICB9XG5cbiAgbmV4dCgpO1xufVxuXG4vKiogT3JnYW5pemF0aW9uIElEL25hbWUgdGhhdCBpZGVudGlmaWVzIHRoZSBzeXN0ZW0gKHN1cGVyLWFkbWluKSB0ZW5hbnQuICovXG5leHBvcnQgY29uc3QgU1lTVEVNX09SR19JRCA9IChwcm9jZXNzLmVudi5TWVNURU1fT1JHX0lEIHx8ICdzeXN0ZW0nKS50b0xvd2VyQ2FzZSgpO1xuXG4vKipcbiAqIENoZWNrIGlmIGFuIG9yZ0lkIG9yIG9yZ05hbWUgbWF0Y2hlcyB0aGUgc3lzdGVtIG9yZy5cbiAqIFVzZSB0aGlzIGluc3RlYWQgb2YgY29tcGFyaW5nIGRpcmVjdGx5IGFnYWluc3QgU1lTVEVNX09SR19JRCxcbiAqIGJlY2F1c2UgdGhlIEpXVCBvcmdJZCBpcyBhIGRhdGFiYXNlIElEIChlLmcuIE1vbmdvREIgT2JqZWN0SWQpXG4gKiB3aGlsZSBTWVNURU1fT1JHX0lEIGlzIHRoZSB3ZWxsLWtub3duIG5hbWUgXCJzeXN0ZW1cIi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3lzdGVtT3JnSWQob3JnSWQ/OiBzdHJpbmcsIG9yZ05hbWU/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9yZ0lkPy50b0xvd2VyQ2FzZSgpID09PSBTWVNURU1fT1JHX0lEIHx8IG9yZ05hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFNZU1RFTV9PUkdfSUQ7XG59XG5cbi8qKiBUcnVlIHdoZW4gdGhlIHJlcXVlc3QncyBKV1QgaWRlbnRpZmllcyB0aGUgc3lzdGVtIChzdXBlci1hZG1pbikgb3JnLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3lzdGVtT3JnKHJlcTogUmVxdWVzdCk6IGJvb2xlYW4ge1xuICBpZiAoIXJlcS51c2VyKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBpc1N5c3RlbU9yZ0lkKHJlcS51c2VyLm9yZ2FuaXphdGlvbklkLCByZXEudXNlci5vcmdhbml6YXRpb25OYW1lKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgcmVxdWVzdCBpcyBmcm9tIGEgc3lzdGVtIGFkbWluLlxuICogQSBzeXN0ZW0gYWRtaW4gaGFzIHBlci1vcmcgcm9sZSAnYWRtaW4nIG9yICdvd25lcicgaW4gdGhlIHN5c3RlbSBvcmdhbml6YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N5c3RlbUFkbWluKHJlcTogUmVxdWVzdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKHJlcS51c2VyPy5yb2xlID09PSAnYWRtaW4nIHx8IHJlcS51c2VyPy5yb2xlID09PSAnb3duZXInKSAmJiBpc1N5c3RlbU9yZyhyZXEpO1xufVxuXG4vKiogUmVxdWlyZXMgc3lzdGVtIGFkbWluIChhZG1pbiByb2xlICsgc3lzdGVtIG9yZ2FuaXphdGlvbikuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZVN5c3RlbUFkbWluKFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG5leHQ6IE5leHRGdW5jdGlvbixcbik6IHZvaWQge1xuICBpZiAoIWlzU3lzdGVtQWRtaW4ocmVxKSkge1xuICAgIHJldHVybiBzZW5kRXJyb3IoXG4gICAgICByZXMsIEh0dHBTdGF0dXMuRk9SQklEREVOLFxuICAgICAgJ0FjY2VzcyBkZW5pZWQuIE9ubHkgc3lzdGVtIGFkbWluaXN0cmF0b3JzIGNhbiBwZXJmb3JtIHRoaXMgYWN0aW9uLicsXG4gICAgICBFcnJvckNvZGUuSU5TVUZGSUNJRU5UX1BFUk1JU1NJT05TLFxuICAgICk7XG4gIH1cbiAgbmV4dCgpO1xufVxuXG4vKipcbiAqIFJlcXVpcmUgYSBzcGVjaWZpYyBmZWF0dXJlIGZsYWcuIFVzZSBhZnRlciByZXF1aXJlQXV0aC5cbiAqIENoZWNrcyB0aGUgYGZlYXR1cmVzYCBhcnJheSBpbiB0aGUgSldUIHBheWxvYWQgKHNldCBhdCB0b2tlbiBpc3N1YW5jZSkuXG4gKiBTeXN0ZW0gb3JnIHVzZXJzIGFsd2F5cyBwYXNzIChhbGwgZmVhdHVyZXMgZW5hYmxlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlRmVhdHVyZShmZWF0dXJlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbik6IHZvaWQgPT4ge1xuICAgIGlmICghcmVxLnVzZXIpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0F1dGhlbnRpY2F0aW9uIHJlcXVpcmVkJywgRXJyb3JDb2RlLlVOQVVUSE9SSVpFRCk7XG4gICAgfVxuXG4gICAgLy8gU3lzdGVtIG9yZyBhbHdheXMgaGFzIGFsbCBmZWF0dXJlc1xuICAgIGlmIChpc1N5c3RlbU9yZyhyZXEpKSByZXR1cm4gbmV4dCgpO1xuXG4gICAgaWYgKCFyZXEudXNlci5mZWF0dXJlcz8uaW5jbHVkZXMoZmVhdHVyZSkpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IoXG4gICAgICAgIHJlcywgSHR0cFN0YXR1cy5GT1JCSURERU4sXG4gICAgICAgIGBUaGlzIGZlYXR1cmUgcmVxdWlyZXMgYSBoaWdoZXIgcGxhbiAoJHtmZWF0dXJlfSlgLFxuICAgICAgICBFcnJvckNvZGUuSU5TVUZGSUNJRU5UX1BFUk1JU1NJT05TLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBuZXh0KCk7XG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZWZmZWN0aXZlIGFjY2VzcyBtb2RpZmllciBmb3IgYW4gZW50aXR5IGJlaW5nIGNyZWF0ZWQvdXBkYXRlZC5cbiAqICdwdWJsaWMnIGlzIHBlcm1pdHRlZCBmb3IgYW55IGFkbWluIG9yIG93bmVyIHJvbGUgKHN5c3RlbSBhZG1pbnMgY3JlYXRlXG4gKiBjYXRhbG9nLXdpZGUgcHVibGljIGVudGl0aWVzOyBvcmcgYWRtaW5zIGNyZWF0ZSBvcmctd2lkZSBwdWJsaWMgZW50aXRpZXMpLlxuICogRXZlcnlvbmUgZWxzZSAobWVtYmVyIHJvbGUsIG5vIHJvbGUpIGdldHMgJ3ByaXZhdGUnLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUFjY2Vzc01vZGlmaWVyKHJlcTogUmVxdWVzdCwgcmVxdWVzdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiAncHVibGljJyB8ICdwcml2YXRlJyB7XG4gIGlmIChyZXF1ZXN0ZWQgPT09ICdwdWJsaWMnICYmIChyZXEudXNlcj8ucm9sZSA9PT0gJ2FkbWluJyB8fCByZXEudXNlcj8ucm9sZSA9PT0gJ293bmVyJykpIHtcbiAgICByZXR1cm4gJ3B1YmxpYyc7XG4gIH1cbiAgcmV0dXJuICdwcml2YXRlJztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZXJ2aWNlLXRvLXNlcnZpY2UgdG9rZW5zXG4vL1xuLy8gSW50ZXItc2VydmljZSBIVFRQIGNhbGxzIChiaWxsaW5nIOKGkiBtZXNzYWdlLCBwbGF0Zm9ybSDihpIgY29tcGxpYW5jZSwgZXRjLilcbi8vIG5lZWQgdG8gc2F0aXNmeSB0aGUgc2FtZSBgcmVxdWlyZUF1dGhgIG1pZGRsZXdhcmUgYXMgdXNlciByZXF1ZXN0cy5cbi8vIGBzaWduU2VydmljZVRva2VuYCBtaW50cyBhIHNob3J0LWxpdmVkIEpXVCBzaWduZWQgd2l0aCB0aGUgc2hhcmVkXG4vLyBKV1RfU0VDUkVULCBpZGVudGlmeWluZyB0aGUgY2FsbGluZyBzZXJ2aWNlIHZpYSBgc3ViOiAnc2VydmljZTo8bmFtZT4nYC5cbi8vIGByZXF1aXJlQXV0aGAgYWNjZXB0cyB0aGVzZSB0b2tlbnMgdHJhbnNwYXJlbnRseSDigJQgdGhleSBwYXNzIGBkZWNvZGVkLnN1YmBcbi8vIGFuZCBgZGVjb2RlZC5yb2xlYCBjaGVja3MsIGFuZCBkb3duc3RyZWFtIGByZXF1aXJlT3JnYW5pemF0aW9uYCAvXG4vLyBgcmVxdWlyZUFkbWluYCByZWx5IG9uIHRoZSBvcmcvcm9sZSBlbWJlZGRlZCBpbiB0aGUgdG9rZW4uXG4vL1xuLy8gVG9rZW5zIGRlZmF1bHQgdG8gNS1taW51dGUgVFRMIOKAlCBsb25nIGVub3VnaCB0byBzdXJ2aXZlIGEgYmFja2VuZCBob3AsXG4vLyBzaG9ydCBlbm91Z2ggdGhhdCBhIGxlYWtlZCB0b2tlbiBpcyBsb3ctdmFsdWUuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgREVGQVVMVF9TRVJWSUNFX1RPS0VOX1RUTF9TRUNPTkRTID0gMzAwO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VUb2tlbk9wdGlvbnMge1xuICAvKiogQ2FsbGluZyBzZXJ2aWNlIGlkZW50aWZpZXIgKGUuZy4gJ2JpbGxpbmcnLCAncGxhdGZvcm0nKS4gRW1iZWRkZWQgYXMgYHN1Yjogc2VydmljZTo8bmFtZT5gLiAqL1xuICBzZXJ2aWNlTmFtZTogc3RyaW5nO1xuICAvKiogQWN0aXZlIG9yZyBjb250ZXh0IGZvciB0aGUgY2FsbC4gVXNlIHRoZSB0YXJnZXQgdGVuYW50J3Mgb3JnIElELCBvciAnc3lzdGVtJyBmb3Igc3lzdGVtLXdpZGUgb3BzLiAqL1xuICBvcmdJZD86IHN0cmluZztcbiAgLyoqIEFjdGl2ZSBvcmcgbmFtZS4gRGVmYXVsdHMgdG8gb3JnSWQuICovXG4gIG9yZ05hbWU/OiBzdHJpbmc7XG4gIC8qKiBUVEwgaW4gc2Vjb25kcyAoZGVmYXVsdCAzMDApLiAqL1xuICB0dGxTZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIE1pbnQgYSBKV1QgaWRlbnRpZnlpbmcgdGhlIGNhbGxpbmcgc2VydmljZS4gVXNlZCBmb3IgaW50ZXItc2VydmljZSBIVFRQIGNhbGxzLlxuICogVGhlIHRva2VuIHNhdGlzZmllcyBgcmVxdWlyZUF1dGhgIGFuZCAod2hlbiBvcmdJZCBpcyBwcmVzZW50KSBgcmVxdWlyZU9yZ2FuaXphdGlvbmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduU2VydmljZVRva2VuKG9wdHM6IFNlcnZpY2VUb2tlbk9wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCBwYXlsb2FkOiBKd3RQYXlsb2FkID0ge1xuICAgIHN1YjogYHNlcnZpY2U6JHtvcHRzLnNlcnZpY2VOYW1lfWAsXG4gICAgdXNlcm5hbWU6IGAke29wdHMuc2VydmljZU5hbWV9LXNlcnZpY2VgLFxuICAgIGVtYWlsOiBgJHtvcHRzLnNlcnZpY2VOYW1lfUBpbnRlcm5hbGAsXG4gICAgcm9sZTogJ293bmVyJyxcbiAgICBpc0FkbWluOiB0cnVlLFxuICAgIHR5cGU6ICdhY2Nlc3MnLFxuICAgIG9yZ2FuaXphdGlvbklkOiBvcHRzLm9yZ0lkLFxuICAgIG9yZ2FuaXphdGlvbk5hbWU6IG9wdHMub3JnTmFtZSA/PyBvcHRzLm9yZ0lkLFxuICB9O1xuICAvLyBNYXRjaCB0aGUgb3B0aW9uYWwgaXNzdWVyL2F1ZGllbmNlIHRoYXQgcmVxdWlyZUF1dGggdmVyaWZpZXMsIHdoZW5cbiAgLy8gY29uZmlndXJlZC4gV2l0aG91dCB0aGVzZSwgYSBzZXJ2aWNlIHRva2VuIHNpZ25lZCBoZXJlIHdvdWxkIGZhaWxcbiAgLy8gcmVxdWlyZUF1dGggaW4gYSBkZXBsb3ltZW50IHRoYXQgaGFzIHNldCBKV1RfSVNTVUVSL0pXVF9BVURJRU5DRS5cbiAgY29uc3Qgc2lnbk9wdGlvbnM6IGp3dC5TaWduT3B0aW9ucyA9IHtcbiAgICBleHBpcmVzSW46IG9wdHMudHRsU2Vjb25kcyA/PyBERUZBVUxUX1NFUlZJQ0VfVE9LRU5fVFRMX1NFQ09ORFMsXG4gIH07XG4gIGlmIChwcm9jZXNzLmVudi5KV1RfSVNTVUVSKSBzaWduT3B0aW9ucy5pc3N1ZXIgPSBwcm9jZXNzLmVudi5KV1RfSVNTVUVSO1xuICBpZiAocHJvY2Vzcy5lbnYuSldUX0FVRElFTkNFKSBzaWduT3B0aW9ucy5hdWRpZW5jZSA9IHByb2Nlc3MuZW52LkpXVF9BVURJRU5DRTtcbiAgcmV0dXJuIGp3dC5zaWduKHBheWxvYWQsIGdldEp3dFNlY3JldCgpLCBzaWduT3B0aW9ucyk7XG59XG5cbi8qKiBDb252ZW5pZW5jZTogcmV0dXJucyBhIGBCZWFyZXIgPHRva2VuPmAgaGVhZGVyIHZhbHVlIGZvciBmZXRjaC9heGlvcyBjYWxscy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXJ2aWNlQXV0aEhlYWRlcihvcHRzOiBTZXJ2aWNlVG9rZW5PcHRpb25zKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBCZWFyZXIgJHtzaWduU2VydmljZVRva2VuKG9wdHMpfWA7XG59XG5cbi8qKiBUcnVlIHdoZW4gYHJlcS51c2VyLnN1YmAgd2FzIGlzc3VlZCBieSBgc2lnblNlcnZpY2VUb2tlbmAgKGkuZS4gc3RhcnRzIHdpdGggYHNlcnZpY2U6YCkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTZXJ2aWNlUHJpbmNpcGFsKHJlcTogUmVxdWVzdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVxLnVzZXI/LnN1Yj8uc3RhcnRzV2l0aCgnc2VydmljZTonKSA/PyBmYWxzZTtcbn1cbiJdfQ==
233
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlL2F1dGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7Ozs7OztBQTJEdEMsa0NBYUM7QUFrRUQsb0NBY0M7QUFXRCxzQ0FFQztBQWFELHNDQUVDO0FBR0QsZ0RBYUM7QUFPRCx3Q0FzQkM7QUFRRCxzREFLQztBQWtDRCw0Q0FvQkM7QUFHRCxvREFFQztBQUdELGdEQUVDO0FBM1NELGdFQUErQjtBQUMvQiwwREFBc0Q7QUFFdEQsc0RBQWlEO0FBQ2pELDhDQUFtRDtBQUNuRCw0Q0FBK0M7QUFDL0MsZ0RBQThDO0FBRTlDLE1BQU0sTUFBTSxHQUFHLElBQUEscUJBQVksRUFBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBRS9DLDREQUE0RDtBQUM1RCxJQUFJLFVBQThCLENBQUM7QUFDbkMsSUFBSSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7QUFDOUIsTUFBTSw4QkFBOEIsR0FBRyxPQUFPLENBQUMsQ0FBQyxZQUFZO0FBRTVELFNBQVMsWUFBWTtJQUNuQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDdkIsSUFBSSxDQUFDLFVBQVUsSUFBSSxHQUFHLEdBQUcscUJBQXFCLEdBQUcsOEJBQThCLEVBQUUsQ0FBQztRQUNoRixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUN0QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7WUFDM0QsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxJQUFJLFVBQVUsSUFBSSxVQUFVLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3BD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Q0FBQyxJQUF5QjtJQUM1RCxPQUFPLFVBQVUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUM1QyxDQUFDO0FBRUQsK0ZBQStGO0FBQy9GLFNBQWdCLGtCQUFrQixDQUFDLEdBQVk7SUFDN0MsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDO0FBQ3hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgUmVxdWVzdCwgUmVzcG9uc2UsIE5leHRGdW5jdGlvbiB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IGp3dCBmcm9tICdqc29ud2VidG9rZW4nO1xuaW1wb3J0IHsgSHR0cFN0YXR1cyB9IGZyb20gJy4uL2NvbnN0YW50cy9odHRwLXN0YXR1cyc7XG5pbXBvcnQgeyBKd3RQYXlsb2FkIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uJztcbmltcG9ydCB7IEVycm9yQ29kZSB9IGZyb20gJy4uL3R5cGVzL2Vycm9yLWNvZGVzJztcbmltcG9ydCB7IGdldEhlYWRlclN0cmluZyB9IGZyb20gJy4uL3V0aWxzL2hlYWRlcnMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyJztcbmltcG9ydCB7IHNlbmRFcnJvciB9IGZyb20gJy4uL3V0aWxzL3Jlc3BvbnNlJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdhdXRoLW1pZGRsZXdhcmUnKTtcblxuLyoqIENhY2hlZCBKV1Qgc2VjcmV0IHdpdGggcGVyaW9kaWMgcmVmcmVzaCBmcm9tIGVudiB2YXIuICovXG5sZXQgX2p3dFNlY3JldDogc3RyaW5nIHwgdW5kZWZpbmVkO1xubGV0IF9qd3RTZWNyZXRSZWZyZXNoZWRBdCA9IDA7XG5jb25zdCBKV1RfU0VDUkVUX1JFRlJFU0hfSU5URVJWQUxfTVMgPSAzMDBfMDAwOyAvLyA1IG1pbnV0ZXNcblxuZnVuY3Rpb24gZ2V0Snd0U2VjcmV0KCk6IHN0cmluZyB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGlmICghX2p3dFNlY3JldCB8fCBub3cgLSBfand0U2VjcmV0UmVmcmVzaGVkQXQgPiBKV1RfU0VDUkVUX1JFRlJFU0hfSU5URVJWQUxfTVMpIHtcbiAgICBjb25zdCBzZWNyZXQgPSBwcm9jZXNzLmVudi5KV1RfU0VDUkVUO1xuICAgIGlmICghc2VjcmV0KSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0pXVF9TRUNSRVQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldCcpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdKV1RfU0VDUkVUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlmIChfand0U2VjcmV0ICYmIF9qd3RTZWNyZXQgIT09IHNlY3JldCkge1xuICAgICAgbG9nZ2VyLmluZm8oJ0pXVCBzZWNyZXQgcm90YXRlZCcpO1xuICAgIH1cbiAgICBfand0U2VjcmV0ID0gc2VjcmV0O1xuICAgIF9qd3RTZWNyZXRSZWZyZXNoZWRBdCA9IG5vdztcbiAgfVxuICByZXR1cm4gX2p3dFNlY3JldDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXF1aXJlQXV0aE9wdGlvbnMge1xuICAvKipcbiAgICogQWxsb3cgeC1vcmctaWQveC1vcmctbmFtZSBoZWFkZXJzIHRvIG92ZXJyaWRlIHRoZSBKV1QncyBvcmdhbml6YXRpb24gZmllbGRzLlxuICAgKlxuICAgKiAqKlNFQ1VSSVRZIFdBUk5JTkc6KiogV2hlbiBlbmFibGVkLCBhIGNhbGxlciBjYW4gc2V0IGB4LW9yZy1pZGAgdG8gQU5ZXG4gICAqIG9yZ2FuaXphdGlvbiBJRCwgZWZmZWN0aXZlbHkgaW1wZXJzb25hdGluZyB0aGF0IG9yZy4gVGhpcyBNVVNUIG9ubHkgYmVcbiAgICogdXNlZCBvbiByb3V0ZXMgdGhhdCBhcmU6XG4gICAqICAgMS4gSW50ZXJuYWwgc2VydmljZS10by1zZXJ2aWNlIHJvdXRlcyAobm90IGV4cG9zZWQgdG8gZW5kIHVzZXJzKVxuICAgKiAgIDIuIEJlaGluZCBuZXR3b3JrIGlzb2xhdGlvbiAoY29udGFpbmVyIG5ldHdvcmssIFZQQywgZXRjLilcbiAgICpcbiAgICogTkVWRVIgZW5hYmxlIHRoaXMgb24gdXNlci1mYWNpbmcgQVBJIHJvdXRlcy4gSWYgdW5zdXJlLCBsZWF2ZSBpdCBkaXNhYmxlZC5cbiAgICovXG4gIGFsbG93T3JnSGVhZGVyT3ZlcnJpZGU/OiBib29sZWFuO1xufVxuXG4vKiogSldUIGF1dGggbWlkZGxld2FyZS4gVXNlIGRpcmVjdGx5IG9yIGNhbGwgd2l0aCBvcHRpb25zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVBdXRoKFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG5leHQ6IE5leHRGdW5jdGlvbixcbik6IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUF1dGgoXG4gIG9wdGlvbnM/OiBSZXF1aXJlQXV0aE9wdGlvbnMsXG4pOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUF1dGgoXG4gIHJlcU9yT3B0aW9ucz86IFJlcXVlc3QgfCBSZXF1aXJlQXV0aE9wdGlvbnMsXG4gIHJlcz86IFJlc3BvbnNlLFxuICBuZXh0PzogTmV4dEZ1bmN0aW9uLFxuKTogdm9pZCB8ICgocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHZvaWQpIHtcbiAgaWYgKHJlcU9yT3B0aW9ucyAmJiByZXMgJiYgbmV4dCAmJiAnaGVhZGVycycgaW4gcmVxT3JPcHRpb25zKSB7XG4gICAgcmV0dXJuIF9yZXF1aXJlQXV0aCh7fSwgcmVxT3JPcHRpb25zIGFzIFJlcXVlc3QsIHJlcywgbmV4dCk7XG4gIH1cblxuICBjb25zdCBvcHRpb25zID0gKHJlcU9yT3B0aW9ucyBhcyBSZXF1aXJlQXV0aE9wdGlvbnMpIHx8IHt9O1xuICByZXR1cm4gKHJlcTogUmVxdWVzdCwgcmVzSW5uZXI6IFJlc3BvbnNlLCBuZXh0SW5uZXI6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgIF9yZXF1aXJlQXV0aChvcHRpb25zLCByZXEsIHJlc0lubmVyLCBuZXh0SW5uZXIpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBfcmVxdWlyZUF1dGgoXG4gIG9wdGlvbnM6IFJlcXVpcmVBdXRoT3B0aW9ucyxcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkIHtcbiAgY29uc3QgYXV0aEhlYWRlciA9IHJlcS5oZWFkZXJzLmF1dGhvcml6YXRpb247XG5cbiAgaWYgKCFhdXRoSGVhZGVyKSB7XG4gICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnQXV0aG9yaXphdGlvbiBoZWFkZXIgcmVxdWlyZWQnLCBFcnJvckNvZGUuVE9LRU5fTUlTU0lORyk7XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IGF1dGhIZWFkZXIuc3BsaXQoJyAnKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMiB8fCBwYXJ0c1swXSAhPT0gJ0JlYXJlcicpIHtcbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdJbnZhbGlkIGF1dGhvcml6YXRpb24gZm9ybWF0LiBVc2U6IEJlYXJlciA8dG9rZW4+JywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBQYXNzIHRocm91Z2ggb3B0aW9uYWwgaXNzdWVyL2F1ZGllbmNlIHZlcmlmaWNhdGlvbiB3aGVuIGVudi1jb25maWd1cmVkLlxuICAgIC8vIFdpdGhvdXQgdGhlc2UsIGEgSldUIHNpZ25lZCBieSBhbnkgc3lzdGVtIHRoYXQgaGFwcGVucyB0byBzaGFyZSB0aGVcbiAgICAvLyBzYW1lIEpXVF9TRUNSRVQgd291bGQgYmUgYWNjZXB0ZWQg4oCUIGRlZmVuY2UtaW4tZGVwdGggZm9yIHNoYXJlZC1zZWNyZXRcbiAgICAvLyBtaXNjb25maWd1cmF0aW9ucyBhY3Jvc3Mgc2VydmljZXMgLyBlbnZpcm9ubWVudHMuXG4gICAgY29uc3QgdmVyaWZ5T3B0aW9uczogand0LlZlcmlmeU9wdGlvbnMgPSB7fTtcbiAgICBjb25zdCBleHBlY3RlZElzc3VlciA9IHByb2Nlc3MuZW52LkpXVF9JU1NVRVI7XG4gICAgY29uc3QgZXhwZWN0ZWRBdWRpZW5jZSA9IHByb2Nlc3MuZW52LkpXVF9BVURJRU5DRTtcbiAgICBpZiAoZXhwZWN0ZWRJc3N1ZXIpIHZlcmlmeU9wdGlvbnMuaXNzdWVyID0gZXhwZWN0ZWRJc3N1ZXI7XG4gICAgaWYgKGV4cGVjdGVkQXVkaWVuY2UpIHZlcmlmeU9wdGlvbnMuYXVkaWVuY2UgPSBleHBlY3RlZEF1ZGllbmNlO1xuICAgIGNvbnN0IGRlY29kZWQgPSBqd3QudmVyaWZ5KHBhcnRzWzFdLCBnZXRKd3RTZWNyZXQoKSwgdmVyaWZ5T3B0aW9ucykgYXMgSnd0UGF5bG9hZDtcblxuICAgIGlmIChkZWNvZGVkLnR5cGUgIT09ICdhY2Nlc3MnKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdPbmx5IGFjY2VzcyB0b2tlbnMgY2FuIGJlIHVzZWQgZm9yIEFQSSByZXF1ZXN0cycsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgICB9XG5cbiAgICBpZiAoIWRlY29kZWQuc3ViIHx8ICFkZWNvZGVkLnJvbGUpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ1Rva2VuIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzJywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICAgIH1cblxuICAgIHJlcS51c2VyID0geyAuLi5kZWNvZGVkIH07XG5cbiAgICBpZiAob3B0aW9ucy5hbGxvd09yZ0hlYWRlck92ZXJyaWRlKSB7XG4gICAgICBjb25zdCBoZWFkZXJPcmdJZCA9IGdldEhlYWRlclN0cmluZyhyZXEuaGVhZGVyc1sneC1vcmctaWQnXSk7XG4gICAgICBjb25zdCBoZWFkZXJPcmdOYW1lID0gZ2V0SGVhZGVyU3RyaW5nKHJlcS5oZWFkZXJzWyd4LW9yZy1uYW1lJ10pO1xuICAgICAgaWYgKGhlYWRlck9yZ0lkKSByZXEudXNlci5vcmdhbml6YXRpb25JZCA9IGhlYWRlck9yZ0lkO1xuICAgICAgaWYgKGhlYWRlck9yZ05hbWUpIHJlcS51c2VyLm9yZ2FuaXphdGlvbk5hbWUgPSBoZWFkZXJPcmdOYW1lO1xuICAgIH1cblxuICAgIG5leHQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBqd3QuVG9rZW5FeHBpcmVkRXJyb3IpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ1Rva2VuIGhhcyBleHBpcmVkJywgRXJyb3JDb2RlLlRPS0VOX0VYUElSRUQpO1xuICAgIH1cblxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIGp3dC5Kc29uV2ViVG9rZW5FcnJvcikge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnSW52YWxpZCB0b2tlbicsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiBmYWlsZWQnLCBFcnJvckNvZGUuVU5BVVRIT1JJWkVEKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGFkbWluIHJvbGUuIFVzZSBhZnRlciByZXF1aXJlQXV0aC5cbiAqIFBlcm1pdHMgdXNlcnMgd2hvc2UgcGVyLW9yZyByb2xlIGlzICdhZG1pbicgb3IgJ293bmVyJy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVBZG1pbihcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkIHtcbiAgaWYgKCFyZXEudXNlcikge1xuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0F1dGhlbnRpY2F0aW9uIHJlcXVpcmVkJywgRXJyb3JDb2RlLlVOQVVUSE9SSVpFRCk7XG4gIH1cblxuICBpZiAocmVxLnVzZXIucm9sZSAhPT0gJ2FkbWluJyAmJiByZXEudXNlci5yb2xlICE9PSAnb3duZXInKSB7XG4gICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuRk9SQklEREVOLCAnQWRtaW4gYWNjZXNzIHJlcXVpcmVkJywgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyk7XG4gIH1cblxuICBuZXh0KCk7XG59XG5cbi8qKiBPcmdhbml6YXRpb24gSUQvbmFtZSB0aGF0IGlkZW50aWZpZXMgdGhlIHN5c3RlbSAoc3VwZXItYWRtaW4pIHRlbmFudC4gKi9cbmV4cG9ydCBjb25zdCBTWVNURU1fT1JHX0lEID0gKHByb2Nlc3MuZW52LlNZU1RFTV9PUkdfSUQgfHwgJ3N5c3RlbScpLnRvTG93ZXJDYXNlKCk7XG5cbi8qKlxuICogQ2hlY2sgaWYgYW4gb3JnSWQgb3Igb3JnTmFtZSBtYXRjaGVzIHRoZSBzeXN0ZW0gb3JnLlxuICogVXNlIHRoaXMgaW5zdGVhZCBvZiBjb21wYXJpbmcgZGlyZWN0bHkgYWdhaW5zdCBTWVNURU1fT1JHX0lELFxuICogYmVjYXVzZSB0aGUgSldUIG9yZ0lkIGlzIGEgZGF0YWJhc2UgSUQgKGUuZy4gTW9uZ29EQiBPYmplY3RJZClcbiAqIHdoaWxlIFNZU1RFTV9PUkdfSUQgaXMgdGhlIHdlbGwta25vd24gbmFtZSBcInN5c3RlbVwiLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTeXN0ZW1PcmdJZChvcmdJZD86IHN0cmluZywgb3JnTmFtZT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3JnSWQ/LnRvTG93ZXJDYXNlKCkgPT09IFNZU1RFTV9PUkdfSUQgfHwgb3JnTmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gU1lTVEVNX09SR19JRDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgcmVxdWVzdCBpcyBmcm9tIGEgc3lzdGVtIGFkbWluLlxuICpcbiAqIEF1dGhvcml0eSBpcyBncmFudGVkIHNvbGVseSBieSB0aGUgdXNlci1sZXZlbCBgaXNTdXBlckFkbWluYCBmbGFnIGNhcnJpZWRcbiAqIGluIHRoZSBKV1QuIFRoZSBcIm1lbWJlcnNoaXAgaW4gdGhlIHdlbGwta25vd24gJ3N5c3RlbScgb3JnIHdpdGggcm9sZVxuICogYWRtaW4vb3duZXJcIiBwYXRoIHdhcyByZW1vdmVkIOKAlCBpdCBjb25mbGF0ZWQgYSBQaXBlbGluZSBCdWlsZGVyIG9wZXJhdG9yXG4gKiB3aXRoIGEgcmVhbCBjdXN0b21lciB0ZW5hbnQgaW4gdGhlIGRhdGEgbW9kZWwsIGFuZCBtZWFudCBhbnkgdW5pbnRlbmRlZFxuICogd3JpdGUgdGhhdCBjcmVhdGVkIGEgJ3N5c3RlbSctbmFtZWQgb3JnIGNvdWxkIHF1aWV0bHkgZ3JhbnQgY3Jvc3Mtb3JnXG4gKiBhdXRob3JpdHkuIFRoZSBgc3lzdGVtYCBvcmcgc3RpbGwgZXhpc3RzIGFzIGEgKmNvbnRlbnQgaG9sZGVyKiBmb3Igc2hhcmVkXG4gKiBzYW1wbGUgZGF0YTsgaXQganVzdCBubyBsb25nZXIgY29uZmVycyBwcml2aWxlZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N5c3RlbUFkbWluKHJlcTogUmVxdWVzdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVxLnVzZXI/LmlzU3VwZXJBZG1pbiA9PT0gdHJ1ZTtcbn1cblxuLyoqIFJlcXVpcmVzIHN5c3RlbSBhZG1pbiAoYWRtaW4gcm9sZSArIHN5c3RlbSBvcmdhbml6YXRpb24pLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVTeXN0ZW1BZG1pbihcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkIHtcbiAgaWYgKCFpc1N5c3RlbUFkbWluKHJlcSkpIHtcbiAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgcmVzLCBIdHRwU3RhdHVzLkZPUkJJRERFTixcbiAgICAgICdBY2Nlc3MgZGVuaWVkLiBPbmx5IHN5c3RlbSBhZG1pbmlzdHJhdG9ycyBjYW4gcGVyZm9ybSB0aGlzIGFjdGlvbi4nLFxuICAgICAgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyxcbiAgICApO1xuICB9XG4gIG5leHQoKTtcbn1cblxuLyoqXG4gKiBSZXF1aXJlIGEgc3BlY2lmaWMgZmVhdHVyZSBmbGFnLiBVc2UgYWZ0ZXIgcmVxdWlyZUF1dGguXG4gKiBDaGVja3MgdGhlIGBmZWF0dXJlc2AgYXJyYXkgaW4gdGhlIEpXVCBwYXlsb2FkIChzZXQgYXQgdG9rZW4gaXNzdWFuY2UpLlxuICogU3lzYWRtaW5zIChpc1N1cGVyQWRtaW4pIGJ5cGFzcyDigJQgdGhleSBhbHdheXMgaGF2ZSBldmVyeSBmZWF0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUZlYXR1cmUoZmVhdHVyZTogc3RyaW5nKSB7XG4gIHJldHVybiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pOiB2b2lkID0+IHtcbiAgICBpZiAoIXJlcS51c2VyKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiByZXF1aXJlZCcsIEVycm9yQ29kZS5VTkFVVEhPUklaRUQpO1xuICAgIH1cblxuICAgIC8vIFN5c2FkbWlucyBnZXQgYWxsIGZlYXR1cmVzOyB0aGUgYGZlYXR1cmVzYCBhcnJheSBvbiB0aGVpciB0b2tlbiBpc1xuICAgIC8vIHBvcHVsYXRlZCB3aXRoIGV2ZXJ5IGZsYWcgYXQgaXNzdWFuY2UgdGltZSBidXQgdGhlIGJ5cGFzcyBoZXJlIGtlZXBzXG4gICAgLy8gdGhlIHJ1bGUgZXhwbGljaXQgYW5kIHN1cnZpdmVzIGEgdG9rZW4gaXNzdWVkIGJlZm9yZSBhIG5ldyBmZWF0dXJlXG4gICAgLy8gZmxhZyB3YXMgYWRkZWQuXG4gICAgaWYgKHJlcS51c2VyLmlzU3VwZXJBZG1pbiA9PT0gdHJ1ZSkgcmV0dXJuIG5leHQoKTtcblxuICAgIGlmICghcmVxLnVzZXIuZmVhdHVyZXM/LmluY2x1ZGVzKGZlYXR1cmUpKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgICByZXMsIEh0dHBTdGF0dXMuRk9SQklEREVOLFxuICAgICAgICBgVGhpcyBmZWF0dXJlIHJlcXVpcmVzIGEgaGlnaGVyIHBsYW4gKCR7ZmVhdHVyZX0pYCxcbiAgICAgICAgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbmV4dCgpO1xuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGVmZmVjdGl2ZSBhY2Nlc3MgbW9kaWZpZXIgZm9yIGFuIGVudGl0eSBiZWluZyBjcmVhdGVkL3VwZGF0ZWQuXG4gKiAncHVibGljJyBpcyBwZXJtaXR0ZWQgZm9yIGFueSBhZG1pbiBvciBvd25lciByb2xlIChzeXN0ZW0gYWRtaW5zIGNyZWF0ZVxuICogY2F0YWxvZy13aWRlIHB1YmxpYyBlbnRpdGllczsgb3JnIGFkbWlucyBjcmVhdGUgb3JnLXdpZGUgcHVibGljIGVudGl0aWVzKS5cbiAqIEV2ZXJ5b25lIGVsc2UgKG1lbWJlciByb2xlLCBubyByb2xlKSBnZXRzICdwcml2YXRlJy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVBY2Nlc3NNb2RpZmllcihyZXE6IFJlcXVlc3QsIHJlcXVlc3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogJ3B1YmxpYycgfCAncHJpdmF0ZScge1xuICBpZiAocmVxdWVzdGVkID09PSAncHVibGljJyAmJiAocmVxLnVzZXI/LnJvbGUgPT09ICdhZG1pbicgfHwgcmVxLnVzZXI/LnJvbGUgPT09ICdvd25lcicpKSB7XG4gICAgcmV0dXJuICdwdWJsaWMnO1xuICB9XG4gIHJldHVybiAncHJpdmF0ZSc7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2VydmljZS10by1zZXJ2aWNlIHRva2Vuc1xuLy9cbi8vIEludGVyLXNlcnZpY2UgSFRUUCBjYWxscyAoYmlsbGluZyDihpIgbWVzc2FnZSwgcGxhdGZvcm0g4oaSIGNvbXBsaWFuY2UsIGV0Yy4pXG4vLyBuZWVkIHRvIHNhdGlzZnkgdGhlIHNhbWUgYHJlcXVpcmVBdXRoYCBtaWRkbGV3YXJlIGFzIHVzZXIgcmVxdWVzdHMuXG4vLyBgc2lnblNlcnZpY2VUb2tlbmAgbWludHMgYSBzaG9ydC1saXZlZCBKV1Qgc2lnbmVkIHdpdGggdGhlIHNoYXJlZFxuLy8gSldUX1NFQ1JFVCwgaWRlbnRpZnlpbmcgdGhlIGNhbGxpbmcgc2VydmljZSB2aWEgYHN1YjogJ3NlcnZpY2U6PG5hbWU+J2AuXG4vLyBgcmVxdWlyZUF1dGhgIGFjY2VwdHMgdGhlc2UgdG9rZW5zIHRyYW5zcGFyZW50bHkg4oCUIHRoZXkgcGFzcyBgZGVjb2RlZC5zdWJgXG4vLyBhbmQgYGRlY29kZWQucm9sZWAgY2hlY2tzLCBhbmQgZG93bnN0cmVhbSBgcmVxdWlyZU9yZ2FuaXphdGlvbmAgL1xuLy8gYHJlcXVpcmVBZG1pbmAgcmVseSBvbiB0aGUgb3JnL3JvbGUgZW1iZWRkZWQgaW4gdGhlIHRva2VuLlxuLy9cbi8vIFRva2VucyBkZWZhdWx0IHRvIDUtbWludXRlIFRUTCDigJQgbG9uZyBlbm91Z2ggdG8gc3Vydml2ZSBhIGJhY2tlbmQgaG9wLFxuLy8gc2hvcnQgZW5vdWdoIHRoYXQgYSBsZWFrZWQgdG9rZW4gaXMgbG93LXZhbHVlLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IERFRkFVTFRfU0VSVklDRV9UT0tFTl9UVExfU0VDT05EUyA9IDMwMDtcblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlVG9rZW5PcHRpb25zIHtcbiAgLyoqIENhbGxpbmcgc2VydmljZSBpZGVudGlmaWVyIChlLmcuICdiaWxsaW5nJywgJ3BsYXRmb3JtJykuIEVtYmVkZGVkIGFzIGBzdWI6IHNlcnZpY2U6PG5hbWU+YC4gKi9cbiAgc2VydmljZU5hbWU6IHN0cmluZztcbiAgLyoqIEFjdGl2ZSBvcmcgY29udGV4dCBmb3IgdGhlIGNhbGwuIFVzZSB0aGUgdGFyZ2V0IHRlbmFudCdzIG9yZyBJRCwgb3IgJ3N5c3RlbScgZm9yIHN5c3RlbS13aWRlIG9wcy4gKi9cbiAgb3JnSWQ/OiBzdHJpbmc7XG4gIC8qKiBBY3RpdmUgb3JnIG5hbWUuIERlZmF1bHRzIHRvIG9yZ0lkLiAqL1xuICBvcmdOYW1lPzogc3RyaW5nO1xuICAvKiogVFRMIGluIHNlY29uZHMgKGRlZmF1bHQgMzAwKS4gKi9cbiAgdHRsU2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBNaW50IGEgSldUIGlkZW50aWZ5aW5nIHRoZSBjYWxsaW5nIHNlcnZpY2UuIFVzZWQgZm9yIGludGVyLXNlcnZpY2UgSFRUUCBjYWxscy5cbiAqIFRoZSB0b2tlbiBzYXRpc2ZpZXMgYHJlcXVpcmVBdXRoYCBhbmQgKHdoZW4gb3JnSWQgaXMgcHJlc2VudCkgYHJlcXVpcmVPcmdhbml6YXRpb25gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnblNlcnZpY2VUb2tlbihvcHRzOiBTZXJ2aWNlVG9rZW5PcHRpb25zKTogc3RyaW5nIHtcbiAgY29uc3QgcGF5bG9hZDogSnd0UGF5bG9hZCA9IHtcbiAgICBzdWI6IGBzZXJ2aWNlOiR7b3B0cy5zZXJ2aWNlTmFtZX1gLFxuICAgIHVzZXJuYW1lOiBgJHtvcHRzLnNlcnZpY2VOYW1lfS1zZXJ2aWNlYCxcbiAgICBlbWFpbDogYCR7b3B0cy5zZXJ2aWNlTmFtZX1AaW50ZXJuYWxgLFxuICAgIHJvbGU6ICdvd25lcicsXG4gICAgaXNBZG1pbjogdHJ1ZSxcbiAgICB0eXBlOiAnYWNjZXNzJyxcbiAgICBvcmdhbml6YXRpb25JZDogb3B0cy5vcmdJZCxcbiAgICBvcmdhbml6YXRpb25OYW1lOiBvcHRzLm9yZ05hbWUgPz8gb3B0cy5vcmdJZCxcbiAgfTtcbiAgLy8gTWF0Y2ggdGhlIG9wdGlvbmFsIGlzc3Vlci9hdWRpZW5jZSB0aGF0IHJlcXVpcmVBdXRoIHZlcmlmaWVzLCB3aGVuXG4gIC8vIGNvbmZpZ3VyZWQuIFdpdGhvdXQgdGhlc2UsIGEgc2VydmljZSB0b2tlbiBzaWduZWQgaGVyZSB3b3VsZCBmYWlsXG4gIC8vIHJlcXVpcmVBdXRoIGluIGEgZGVwbG95bWVudCB0aGF0IGhhcyBzZXQgSldUX0lTU1VFUi9KV1RfQVVESUVOQ0UuXG4gIGNvbnN0IHNpZ25PcHRpb25zOiBqd3QuU2lnbk9wdGlvbnMgPSB7XG4gICAgZXhwaXJlc0luOiBvcHRzLnR0bFNlY29uZHMgPz8gREVGQVVMVF9TRVJWSUNFX1RPS0VOX1RUTF9TRUNPTkRTLFxuICB9O1xuICBpZiAocHJvY2Vzcy5lbnYuSldUX0lTU1VFUikgc2lnbk9wdGlvbnMuaXNzdWVyID0gcHJvY2Vzcy5lbnYuSldUX0lTU1VFUjtcbiAgaWYgKHByb2Nlc3MuZW52LkpXVF9BVURJRU5DRSkgc2lnbk9wdGlvbnMuYXVkaWVuY2UgPSBwcm9jZXNzLmVudi5KV1RfQVVESUVOQ0U7XG4gIHJldHVybiBqd3Quc2lnbihwYXlsb2FkLCBnZXRKd3RTZWNyZXQoKSwgc2lnbk9wdGlvbnMpO1xufVxuXG4vKiogQ29udmVuaWVuY2U6IHJldHVybnMgYSBgQmVhcmVyIDx0b2tlbj5gIGhlYWRlciB2YWx1ZSBmb3IgZmV0Y2gvYXhpb3MgY2FsbHMuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VydmljZUF1dGhIZWFkZXIob3B0czogU2VydmljZVRva2VuT3B0aW9ucyk6IHN0cmluZyB7XG4gIHJldHVybiBgQmVhcmVyICR7c2lnblNlcnZpY2VUb2tlbihvcHRzKX1gO1xufVxuXG4vKiogVHJ1ZSB3aGVuIGByZXEudXNlci5zdWJgIHdhcyBpc3N1ZWQgYnkgYHNpZ25TZXJ2aWNlVG9rZW5gIChpLmUuIHN0YXJ0cyB3aXRoIGBzZXJ2aWNlOmApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2VydmljZVByaW5jaXBhbChyZXE6IFJlcXVlc3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcS51c2VyPy5zdWI/LnN0YXJ0c1dpdGgoJ3NlcnZpY2U6JykgPz8gZmFsc2U7XG59XG4iXX0=
@@ -104,4 +104,9 @@ export declare function createSafeClient(config: ServiceConfig): {
104
104
  * Safe PUT request - returns null on error.
105
105
  */
106
106
  put<T>(path: string, body?: unknown, options?: RequestOptions): Promise<HttpClientResponse<T> | null>;
107
+ /**
108
+ * Safe DELETE request - returns null on error. Used by destructive
109
+ * cross-service operations (e.g. org-cascade delete in platform).
110
+ */
111
+ delete<T>(path: string, options?: RequestOptions): Promise<HttpClientResponse<T> | null>;
107
112
  };
@@ -276,6 +276,19 @@ function createSafeClient(config) {
276
276
  return null;
277
277
  }
278
278
  },
279
+ /**
280
+ * Safe DELETE request - returns null on error. Used by destructive
281
+ * cross-service operations (e.g. org-cascade delete in platform).
282
+ */
283
+ async delete(path, options) {
284
+ try {
285
+ return await client.delete(path, options);
286
+ }
287
+ catch (err) {
288
+ logger.debug('Safe DELETE failed, returning null', { path, error: err instanceof Error ? err.message : String(err) });
289
+ return null;
290
+ }
291
+ },
279
292
  };
280
293
  }
281
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaHR0cC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTZSdEMsNENBZ0RDO0FBM1VELDJDQUE2QjtBQUM3QixxREFPMEI7QUFDMUIsMERBQXNEO0FBRXRELDRDQUErQztBQUUvQyxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEVBQUMsYUFBYSxDQUFDLENBQUM7QUFFM0M7O0dBRUc7QUFDSCxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsSUFBSSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFnQ2hGOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBYSxrQkFBa0I7SUFDckIsTUFBTSxDQUEwQjtJQUNoQyxLQUFLLENBQWE7SUFFMUI7Ozs7T0FJRztJQUNILFlBQVksTUFBcUI7UUFDL0IsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNqQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDakIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLElBQUksZUFBZTtTQUMzQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFjLElBQVksRUFBRSxPQUF3QjtRQUMzRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBSSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxL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RSxPQUFPLENBQUMsQ0FBQztZQUNuRCxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixNQUFNLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNwSCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO1FBRUQ7O1dBRUc7UUFDSCxLQUFLLENBQUMsR0FBRyxDQUNQLElBQVksRUFDWixJQUFjLEVBQ2QsT0FBd0I7WUFFeEIsSUFBSSxDQUFDO2dCQUNILE9BQU8sTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDbEQsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbkgsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCAqIGFzIGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQge1xuICBERUZBVUxUX01BWF9SRVRSSUVTLFxuICBERUZBVUxUX1JFVFJZX0RFTEFZX01TLFxuICBERUZBVUxUX01BWF9SQVRFX0xJTUlUX1JFVFJJRVMsXG4gIGdldFJldHJ5RGVjaXNpb24sXG4gIGdldEVycm9yUmV0cnlEZWNpc2lvbixcbiAgUmV0cnlDb25maWcsXG59IGZyb20gJy4vcmV0cnktc3RyYXRlZ3knO1xuaW1wb3J0IHsgSHR0cFN0YXR1cyB9IGZyb20gJy4uL2NvbnN0YW50cy9odHRwLXN0YXR1cyc7XG5pbXBvcnQgeyBTZXJ2aWNlQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlcic7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignaHR0cC1jbGllbnQnKTtcblxuLyoqXG4gKiBEZWZhdWx0IHJlcXVlc3QgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKGVudjogYEhUVFBfQ0xJRU5UX1RJTUVPVVRgKS5cbiAqL1xuY29uc3QgREVGQVVMVF9USU1FT1VUID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuSFRUUF9DTElFTlRfVElNRU9VVCB8fCAnNTAwMCcsIDEwKTtcblxuLyoqXG4gKiBIVFRQIHJlcXVlc3Qgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0T3B0aW9ucyB7XG4gIC8qKiBSZXF1ZXN0IGhlYWRlcnMgKi9cbiAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHJldHJ5IGF0dGVtcHRzIGZvciB0cmFuc2llbnQgZmFpbHVyZXMgKGRlZmF1bHQ6IDIpICovXG4gIG1heFJldHJpZXM/OiBudW1iZXI7XG4gIC8qKiBCYXNlIGRlbGF5IGJldHdlZW4gcmV0cmllcyBpbiBtcyDigJQgZG91YmxlcyBlYWNoIGF0dGVtcHQgKGRlZmF1bHQ6IDIwMCkgKi9cbiAgcmV0cnlEZWxheU1zPzogbnVtYmVyO1xuICAvKiogTWF4aW11bSByZXRyeSBhdHRlbXB0cyBzcGVjaWZpY2FsbHkgZm9yIDQyOSByYXRlIGxpbWl0aW5nIChkZWZhdWx0OiA0KSAqL1xuICBtYXhSYXRlTGltaXRSZXRyaWVzPzogbnVtYmVyO1xuICAvKiogT3B0aW9uYWwgcmVxdWVzdCBJRCBmb3IgZGlzdHJpYnV0ZWQgdHJhY2luZyAoYWRkZWQgYXMgWC1SZXF1ZXN0LUlkIGhlYWRlcikgKi9cbiAgcmVxdWVzdElkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhUVFAgY2xpZW50IHJlc3BvbnNlIHdyYXBwZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cENsaWVudFJlc3BvbnNlPFQgPSB1bmtub3duPiB7XG4gIC8qKiBIVFRQIHN0YXR1cyBjb2RlICovXG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgLyoqIFJlc3BvbnNlIGJvZHkgKHBhcnNlZCBKU09OKSAqL1xuICBib2R5OiBUO1xuICAvKiogUmVzcG9uc2UgaGVhZGVycyAqL1xuICBoZWFkZXJzOiBodHRwLkluY29taW5nSHR0cEhlYWRlcnM7XG59XG5cbi8qKlxuICogSW50ZXJuYWwgSFRUUCBjbGllbnQgZm9yIHNlcnZpY2UtdG8tc2VydmljZSBjb21tdW5pY2F0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjbGllbnQgPSBuZXcgSW50ZXJuYWxIdHRwQ2xpZW50KHtcbiAqICAgaG9zdDogJ3F1b3RhJyxcbiAqICAgcG9ydDogMzAwMCxcbiAqICAgdGltZW91dDogNTAwMCxcbiAqIH0pO1xuICpcbiAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldCgnL29yZzEyMy9hcGlDYWxscycpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnBvc3QoJy9vcmcxMjMvaW5jcmVtZW50JywgeyBxdW90YVR5cGU6ICdhcGlDYWxscycgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEludGVybmFsSHR0cENsaWVudCB7XG4gIHByaXZhdGUgY29uZmlnOiBSZXF1aXJlZDxTZXJ2aWNlQ29uZmlnPjtcbiAgcHJpdmF0ZSBhZ2VudDogaHR0cC5BZ2VudDtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IEhUVFAgY2xpZW50IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gU2VydmljZSBjb25maWd1cmF0aW9uXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IFNlcnZpY2VDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGhvc3Q6IGNvbmZpZy5ob3N0LFxuICAgICAgcG9ydDogY29uZmlnLnBvcnQsXG4gICAgICB0aW1lb3V0OiBjb25maWcudGltZW91dCA/PyBERUZBVUxUX1RJTUVPVVQsXG4gICAgfTtcbiAgICB0aGlzLmFnZW50ID0gbmV3IGh0dHAuQWdlbnQoeyBrZWVwQWxpdmU6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhIEdFVCByZXF1ZXN0LlxuICAgKi9cbiAgYXN5bmMgZ2V0PFQgPSB1bmtub3duPihwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFdpdGhSZXRyeTxUPignR0VUJywgcGF0aCwgdW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGEgUE9TVCByZXF1ZXN0LlxuICAgKi9cbiAgYXN5bmMgcG9zdDxUID0gdW5rbm93bj4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGJvZHk/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0V2l0aFJldHJ5PFQ+KCdQT1NUJywgcGF0aCwgYm9keSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhIFBVVCByZXF1ZXN0LlxuICAgKi9cbiAgYXN5bmMgcHV0PFQgPSB1bmtub3duPihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYm9keT86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RXaXRoUmV0cnk8VD4oJ1BVVCcsIHBhdGgsIGJvZHksIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYSBERUxFVEUgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIGRlbGV0ZTxUID0gdW5rbm93bj4ocGF0aDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RXaXRoUmV0cnk8VD4oJ0RFTEVURScsIHBhdGgsIHVuZGVmaW5lZCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCB3aXRoIHJldHJ5IGxvZ2ljIGZvciB0cmFuc2llbnQgZmFpbHVyZXMuXG4gICAqXG4gICAqIC0gNDI5IChyYXRlIGxpbWl0KTogcmVzcGVjdHMgYFJldHJ5LUFmdGVyYCBoZWFkZXIsIHVzZXMgbG9uZ2VyIGJhc2UgZGVsYXkgKDR4KSxcbiAgICogICByZXRyaWVzIHVwIHRvIGBtYXhSYXRlTGltaXRSZXRyaWVzYCB0aW1lcyAoZGVmYXVsdCA0KS5cbiAgICogLSA1MDIvNTAzLzUwNCAoc2VydmVyIGVycm9ycyk6IHN0YW5kYXJkIGV4cG9uZW50aWFsIGJhY2tvZmYsIHVwIHRvIGBtYXhSZXRyaWVzYCAoZGVmYXVsdCAyKS5cbiAgICogLSBDb25uZWN0aW9uIGVycm9ycyAvIHRpbWVvdXRzOiByZXRyaWVzIHVwIHRvIGBtYXhSZXRyaWVzYC5cbiAgICogLSBBbGwgZGVsYXlzIGluY2x1ZGUgwrEyNSUgaml0dGVyIHRvIHByZXZlbnQgdGh1bmRlcmluZyBoZXJkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXF1ZXN0V2l0aFJldHJ5PFQ+KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBib2R5PzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgcmV0cnlDb25maWc6IFJldHJ5Q29uZmlnID0ge1xuICAgICAgbWF4UmV0cmllczogb3B0aW9ucz8ubWF4UmV0cmllcyA/PyBERUZBVUxUX01BWF9SRVRSSUVTLFxuICAgICAgbWF4UmF0ZUxpbWl0UmV0cmllczogb3B0aW9ucz8ubWF4UmF0ZUxpbWl0UmV0cmllcyA/PyBERUZBVUxUX01BWF9SQVRFX0xJTUlUX1JFVFJJRVMsXG4gICAgICByZXRyeURlbGF5TXM6IG9wdGlvbnM/LnJldHJ5RGVsYXlNcyA/PyBERUZBVUxUX1JFVFJZX0RFTEFZX01TLFxuICAgIH07XG4gICAgY29uc3QgdG90YWxNYXhBdHRlbXB0cyA9IE1hdGgubWF4KHJldHJ5Q29uZmlnLm1heFJldHJpZXMsIHJldHJ5Q29uZmlnLm1heFJhdGVMaW1pdFJldHJpZXMpO1xuXG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8PSB0b3RhbE1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0PFQ+KG1ldGhvZCwgcGF0aCwgYm9keSwgb3B0aW9ucyk7XG5cbiAgICAgICAgY29uc3QgZGVjaXNpb24gPSBnZXRSZXRyeURlY2lzaW9uKHJlc3BvbnNlLnN0YXR1c0NvZGUsIHJlc3BvbnNlLmhlYWRlcnMsIGF0dGVtcHQsIHJldHJ5Q29uZmlnKTtcbiAgICAgICAgaWYgKGRlY2lzaW9uLnNob3VsZFJldHJ5KSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGRlY2lzaW9uLnJlYXNvbiArICcsIHJldHJ5aW5nJywgeyBtZXRob2QsIHBhdGgsIGF0dGVtcHQ6IGF0dGVtcHQgKyAxLCBkZWxheU1zOiBkZWNpc2lvbi5kZWxheU1zIH0pO1xuICAgICAgICAgIGF3YWl0IHRoaXMuc2xlZXAoZGVjaXNpb24uZGVsYXlNcyk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XG5cbiAgICAgICAgY29uc3QgZGVjaXNpb24gPSBnZXRFcnJvclJldHJ5RGVjaXNpb24oYXR0ZW1wdCwgcmV0cnlDb25maWcpO1xuICAgICAgICBpZiAoZGVjaXNpb24uc2hvdWxkUmV0cnkpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JldHJ5aW5nIGFmdGVyIGVycm9yJywgeyBtZXRob2QsIHBhdGgsIGVycm9yOiBsYXN0RXJyb3IubWVzc2FnZSwgYXR0ZW1wdDogYXR0ZW1wdCArIDEgfSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zbGVlcChkZWNpc2lvbi5kZWxheU1zKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IGxhc3RFcnJvciE7XG4gIH1cblxuICBwcml2YXRlIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgcmVxdWVzdCBtZXRob2QuXG4gICAqL1xuICBwcml2YXRlIHJlcXVlc3Q8VD4oXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGJvZHk/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYm9keVN0ciA9IGJvZHkgPyBKU09OLnN0cmluZ2lmeShib2R5KSA6IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3QgaGVhZGVyczogaHR0cC5PdXRnb2luZ0h0dHBIZWFkZXJzID0ge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAuLi5vcHRpb25zPy5oZWFkZXJzLFxuICAgICAgfTtcblxuICAgICAgLy8gUHJvcGFnYXRlIHJlcXVlc3QgSUQgZm9yIGRpc3RyaWJ1dGVkIHRyYWNpbmdcbiAgICAgIGlmIChvcHRpb25zPy5yZXF1ZXN0SWQpIHtcbiAgICAgICAgaGVhZGVyc1snWC1SZXF1ZXN0LUlkJ10gPSBvcHRpb25zLnJlcXVlc3RJZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGJvZHlTdHIpIHtcbiAgICAgICAgaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGJvZHlTdHIpO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBwYXRoIHRvIHByZXZlbnQgcHJvdG9jb2wgaW5qZWN0aW9uIC8gcmVxdWVzdCBzbXVnZ2xpbmdcbiAgICAgIGlmIChwYXRoLmluY2x1ZGVzKCc6Ly8nKSB8fCBwYXRoLnN0YXJ0c1dpdGgoJy8vJykgfHwgL1tcXHJcXG5cXDBdLy50ZXN0KHBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByZXF1ZXN0IHBhdGg6ICR7cGF0aH1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVxdWVzdE9wdGlvbnM6IGh0dHAuUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICAgIGhvc3RuYW1lOiB0aGlzLmNvbmZpZy5ob3N0LFxuICAgICAgICBwb3J0OiB0aGlzLmNvbmZpZy5wb3J0LFxuICAgICAgICBwYXRoOiBwYXRoLnN0YXJ0c1dpdGgoJy8nKSA/IHBhdGggOiBgLyR7cGF0aH1gLFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHRpbWVvdXQ6IG9wdGlvbnM/LnRpbWVvdXQgPz8gdGhpcy5jb25maWcudGltZW91dCxcbiAgICAgICAgYWdlbnQ6IHRoaXMuYWdlbnQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXEgPSBodHRwLnJlcXVlc3QocmVxdWVzdE9wdGlvbnMsIChyZXMpID0+IHtcbiAgICAgICAgbGV0IGRhdGEgPSAnJztcblxuICAgICAgICByZXMub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgICBkYXRhICs9IGNodW5rO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXMub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkQm9keSA9IGRhdGEgPyBKU09OLnBhcnNlKGRhdGEpIDoge307XG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgc3RhdHVzQ29kZTogcmVzLnN0YXR1c0NvZGUgfHwgSHR0cFN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IsXG4gICAgICAgICAgICAgIGJvZHk6IHBhcnNlZEJvZHkgYXMgVCxcbiAgICAgICAgICAgICAgaGVhZGVyczogcmVzLmhlYWRlcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChwYXJzZUVycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHBhcnNlIHJlc3BvbnNlIGJvZHknLCB7XG4gICAgICAgICAgICAgIGhvc3Q6IHRoaXMuY29uZmlnLmhvc3QsXG4gICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgIGVycm9yOiBwYXJzZUVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBwYXJzZUVycm9yLm1lc3NhZ2UgOiBTdHJpbmcocGFyc2VFcnJvciksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXMuc3RhdHVzQ29kZSB8fCBIdHRwU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUixcbiAgICAgICAgICAgICAgYm9keToge30gYXMgVCxcbiAgICAgICAgICAgICAgaGVhZGVyczogcmVzLmhlYWRlcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHJlcS5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdIVFRQIHJlcXVlc3QgZmFpbGVkJywge1xuICAgICAgICAgIGhvc3Q6IHRoaXMuY29uZmlnLmhvc3QsXG4gICAgICAgICAgcG9ydDogdGhpcy5jb25maWcucG9ydCxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICBlcnJvcjogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcblxuICAgICAgcmVxLm9uKCd0aW1lb3V0JywgKCkgPT4ge1xuICAgICAgICByZXEuZGVzdHJveSgpO1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgUmVxdWVzdCB0aW1lb3V0IGFmdGVyICR7dGhpcy5jb25maWcudGltZW91dH1tc2ApO1xuICAgICAgICBsb2dnZXIud2FybignSFRUUCByZXF1ZXN0IHRpbWVvdXQnLCB7XG4gICAgICAgICAgaG9zdDogdGhpcy5jb25maWcuaG9zdCxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlnLnRpbWVvdXQsXG4gICAgICAgIH0pO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChib2R5U3RyKSB7XG4gICAgICAgIHJlcS53cml0ZShib2R5U3RyKTtcbiAgICAgIH1cblxuICAgICAgcmVxLmVuZCgpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIEhUVFAgY2xpZW50IHdpdGggZXJyb3IgaGFuZGxpbmcgdGhhdCByZXR1cm5zIG51bGwgb24gZmFpbHVyZS5cbiAqIFVzZWZ1bCBmb3IgZmFpbC1vcGVuIHNjZW5hcmlvcy5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gU2VydmljZSBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBDbGllbnQgd3JhcHBlciB3aXRoIHNhZmUgbWV0aG9kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2FmZUNsaWVudChjb25maWc6IFNlcnZpY2VDb25maWcpIHtcbiAgY29uc3QgY2xpZW50ID0gbmV3IEludGVybmFsSHR0cENsaWVudChjb25maWcpO1xuXG4gIHJldHVybiB7XG4gICAgLyoqXG4gICAgICogU2FmZSBHRVQgcmVxdWVzdCAtIHJldHVybnMgbnVsbCBvbiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBnZXQ8VD4ocGF0aDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPiB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjbGllbnQuZ2V0PFQ+KHBhdGgsIG9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnU2FmZSBHRVQgZmFpbGVkLCByZXR1cm5pbmcgbnVsbCcsIHsgcGF0aCwgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNhZmUgUE9TVCByZXF1ZXN0IC0gcmV0dXJucyBudWxsIG9uIGVycm9yLlxuICAgICAqL1xuICAgIGFzeW5jIHBvc3Q8VD4oXG4gICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICBib2R5PzogdW5rbm93bixcbiAgICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPiB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjbGllbnQucG9zdDxUPihwYXRoLCBib2R5LCBvcHRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1NhZmUgUE9TVCBmYWlsZWQsIHJldHVybmluZyBudWxsJywgeyBwYXRoLCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2FmZSBQVVQgcmVxdWVzdCAtIHJldHVybnMgbnVsbCBvbiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBwdXQ8VD4oXG4gICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICBib2R5PzogdW5rbm93bixcbiAgICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPiB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjbGllbnQucHV0PFQ+KHBhdGgsIGJvZHksIG9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnU2FmZSBQVVQgZmFpbGVkLCByZXR1cm5pbmcgbnVsbCcsIHsgcGF0aCwgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
294
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaHR0cC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTZSdEMsNENBZ0VDO0FBM1ZELDJDQUE2QjtBQUM3QixxREFPMEI7QUFDMUIsMERBQXNEO0FBRXRELDRDQUErQztBQUUvQyxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEVBQUMsYUFBYSxDQUFDLENBQUM7QUFFM0M7O0dBRUc7QUFDSCxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsSUFBSSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFnQ2hGOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBYSxrQkFBa0I7SUFDckIsTUFBTSxDQUEwQjtJQUNoQyxLQUFLLENBQWE7SUFFMUI7Ozs7T0FJRztJQUNILFlBQVksTUFBcUI7UUFDL0IsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNqQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDakIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLElBQUksZUFBZTtTQUMzQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFjLElBQVksRUFBRSxPQUF3QjtRQUMzRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBSSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUNSLElBQVksRUFDWixJQUFjLEVBQ2QsT0FBd0I7UUFFeEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUksTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FDUCxJQUFZLEVBQ1osSUFBYyxFQUNkLE9BQXdCO1FBRXhCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFJLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQWMsSUFBWSxFQUFFLE9BQXdCO1FBQzlELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFJLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLEtBQUssQ0FBQyxnQkFBZ0IsQ0FDNUIsTUFBYyxFQUNkLElBQVksRUFDWixJQUFjLEVBQ2QsT0FBd0I7UUFFeEIsTUFBTSxXQUFXLEdBQWdCO1lBQy9CLFVBQVUsRUFBRSxPQUFPLEVBQUUsVUFBVSxJQUFJLG9DQUFtQjtZQUN0RCxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLElBQUksK0NBQThCO1lBQ25GLFlBQVksRUFBRSxPQUFPLEVBQUUsWUFBWSxJQUFJLHVDQUFzQjtTQUM5RCxDQUFDO1FBQ0YsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFM0YsSUFBSSxTQUE0QixDQUFDO1FBRWpDLEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sSUFBSSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQzdELElBQUksQ0FBQztnQkFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUksTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBRXBFLE1BQU0sUUFBUSxHQUFHLElBQUEsaUNBQWdCLEVBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDL0YsSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ3pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztvQkFDaEgsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDbkMsU0FBUztnQkFDWCxDQUFDO2dCQUVELE9BQU8sUUFBUSxDQUFDO1lBQ2xCLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLFNBQVMsR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUV0RSxNQUFNLFFBQVEsR0FBRyxJQUFBLHNDQUFxQixFQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ3pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDdkcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDbkMsU0FBUztnQkFDWCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLFNBQVUsQ0FBQztJQUNuQixDQUFDO0lBRU8sS0FBSyxDQUFDLEVBQVU7UUFDdEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxPQUFPLENBQ2IsTUFBYyxFQUNkLElBQVksRUFDWixJQUFjLEVBQ2QsT0FBd0I7UUFFeEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUV4RCxNQUFNLE9BQU8sR0FBNkI7Z0JBQ3hDLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLEdBQUcsT0FBTyxFQUFFLE9BQU87YUFDcEIsQ0FBQztZQUVGLCtDQUErQztZQUMvQyxJQUFJLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQztnQkFDdkIsT0FBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7WUFDOUMsQ0FBQztZQUVELElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osT0FBTyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6RCxDQUFDO1lBRUQsa0VBQWtFO1lBQ2xFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDM0UsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNuRCxDQUFDO1lBRUQsTUFBTSxjQUFjLEdBQXdCO2dCQUMxQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJO2dCQUMxQixJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJO2dCQUN0QixJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRTtnQkFDOUMsTUFBTTtnQkFDTixPQUFPO2dCQUNQLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTztnQkFDaEQsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2FBQ2xCLENBQUM7WUFFRixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUMvQyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBRWQsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDdkIsSUFBSSxJQUFJLEtBQUssQ0FBQztnQkFDaEIsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFO29CQUNqQixJQUFJLENBQUM7d0JBQ0gsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQ2hELE9BQU8sQ0FBQzs0QkFDTixVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVUsSUFBSSx3QkFBVSxDQUFDLHFCQUFxQjs0QkFDOUQsSUFBSSxFQUFFLFVBQWU7NEJBQ3JCLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTzt5QkFDckIsQ0FBQyxDQUFDO29CQUNMLENBQUM7b0JBQUMsT0FBTyxVQUFVLEVBQUUsQ0FBQzt3QkFDcEIsTUFBTSxDQUFDLElBQUksQ0FBQywrQkFBK0IsRUFBRTs0QkFDM0MsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSTs0QkFDdEIsSUFBSTs0QkFDSixLQUFLLEVBQUUsVUFBVSxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQzt5QkFDN0UsQ0FBQyxDQUFDO3dCQUNILE9BQU8sQ0FBQzs0QkFDTixVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVUsSUFBSSx3QkFBVSxDQUFDLHFCQUFxQjs0QkFDOUQsSUFBSSxFQUFFLEVBQU87NEJBQ2IsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPO3lCQUNyQixDQUFDLENBQUM7b0JBQ0wsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBRUgsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDeEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRTtvQkFDbEMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSTtvQkFDdEIsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSTtvQkFDdEIsSUFBSTtvQkFDSixNQUFNO29CQUNOLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTztpQkFDckIsQ0FBQyxDQUFDO2dCQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQixDQUFDLENBQUMsQ0FBQztZQUVILEdBQUcsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtnQkFDckIsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNkLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLHlCQUF5QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7Z0JBQzFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUU7b0JBQ2xDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUk7b0JBQ3RCLElBQUk7b0JBQ0osT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTztpQkFDN0IsQ0FBQyxDQUFDO2dCQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQixDQUFDLENBQUMsQ0FBQztZQUVILElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyQixDQUFDO1lBRUQsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFqTkQsZ0RBaU5DO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQUMsTUFBcUI7SUFDcEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU5QyxPQUFPO1FBQ0w7O1dBRUc7UUFDSCxLQUFLLENBQUMsR0FBRyxDQUFJLElBQVksRUFBRSxPQUF3QjtZQUNqRCxJQUFJLENBQUM7Z0JBQ0gsT0FBTyxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUksSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzVDLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ25ILE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7UUFFRDs7V0FFRztRQUNILEtBQUssQ0FBQyxJQUFJLENBQ1IsSUFBWSxFQUNaLElBQWMsRUFDZCxPQUF3QjtZQUV4QixJQUFJLENBQUM7Z0JBQ0gsT0FBTyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUksSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNuRCxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixNQUFNLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNwSCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO1FBRUQ7O1dBRUc7UUFDSCxLQUFLLENBQUMsR0FBRyxDQUNQLElBQVksRUFDWixJQUFjLEVBQ2QsT0FBd0I7WUFFeEIsSUFBSSxDQUFDO2dCQUNILE9BQU8sTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDbEQsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbkgsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUVEOzs7V0FHRztRQUNILEtBQUssQ0FBQyxNQUFNLENBQ1YsSUFBWSxFQUNaLE9BQXdCO1lBRXhCLElBQUksQ0FBQztnQkFDSCxPQUFPLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBSSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDL0MsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdEgsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCAqIGFzIGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQge1xuICBERUZBVUxUX01BWF9SRVRSSUVTLFxuICBERUZBVUxUX1JFVFJZX0RFTEFZX01TLFxuICBERUZBVUxUX01BWF9SQVRFX0xJTUlUX1JFVFJJRVMsXG4gIGdldFJldHJ5RGVjaXNpb24sXG4gIGdldEVycm9yUmV0cnlEZWNpc2lvbixcbiAgUmV0cnlDb25maWcsXG59IGZyb20gJy4vcmV0cnktc3RyYXRlZ3knO1xuaW1wb3J0IHsgSHR0cFN0YXR1cyB9IGZyb20gJy4uL2NvbnN0YW50cy9odHRwLXN0YXR1cyc7XG5pbXBvcnQgeyBTZXJ2aWNlQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlcic7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignaHR0cC1jbGllbnQnKTtcblxuLyoqXG4gKiBEZWZhdWx0IHJlcXVlc3QgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKGVudjogYEhUVFBfQ0xJRU5UX1RJTUVPVVRgKS5cbiAqL1xuY29uc3QgREVGQVVMVF9USU1FT1VUID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuSFRUUF9DTElFTlRfVElNRU9VVCB8fCAnNTAwMCcsIDEwKTtcblxuLyoqXG4gKiBIVFRQIHJlcXVlc3Qgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0T3B0aW9ucyB7XG4gIC8qKiBSZXF1ZXN0IGhlYWRlcnMgKi9cbiAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHJldHJ5IGF0dGVtcHRzIGZvciB0cmFuc2llbnQgZmFpbHVyZXMgKGRlZmF1bHQ6IDIpICovXG4gIG1heFJldHJpZXM/OiBudW1iZXI7XG4gIC8qKiBCYXNlIGRlbGF5IGJldHdlZW4gcmV0cmllcyBpbiBtcyDigJQgZG91YmxlcyBlYWNoIGF0dGVtcHQgKGRlZmF1bHQ6IDIwMCkgKi9cbiAgcmV0cnlEZWxheU1zPzogbnVtYmVyO1xuICAvKiogTWF4aW11bSByZXRyeSBhdHRlbXB0cyBzcGVjaWZpY2FsbHkgZm9yIDQyOSByYXRlIGxpbWl0aW5nIChkZWZhdWx0OiA0KSAqL1xuICBtYXhSYXRlTGltaXRSZXRyaWVzPzogbnVtYmVyO1xuICAvKiogT3B0aW9uYWwgcmVxdWVzdCBJRCBmb3IgZGlzdHJpYnV0ZWQgdHJhY2luZyAoYWRkZWQgYXMgWC1SZXF1ZXN0LUlkIGhlYWRlcikgKi9cbiAgcmVxdWVzdElkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhUVFAgY2xpZW50IHJlc3BvbnNlIHdyYXBwZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cENsaWVudFJlc3BvbnNlPFQgPSB1bmtub3duPiB7XG4gIC8qKiBIVFRQIHN0YXR1cyBjb2RlICovXG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgLyoqIFJlc3BvbnNlIGJvZHkgKHBhcnNlZCBKU09OKSAqL1xuICBib2R5OiBUO1xuICAvKiogUmVzcG9uc2UgaGVhZGVycyAqL1xuICBoZWFkZXJzOiBodHRwLkluY29taW5nSHR0cEhlYWRlcnM7XG59XG5cbi8qKlxuICogSW50ZXJuYWwgSFRUUCBjbGllbnQgZm9yIHNlcnZpY2UtdG8tc2VydmljZSBjb21tdW5pY2F0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjbGllbnQgPSBuZXcgSW50ZXJuYWxIdHRwQ2xpZW50KHtcbiAqICAgaG9zdDogJ3F1b3RhJyxcbiAqICAgcG9ydDogMzAwMCxcbiAqICAgdGltZW91dDogNTAwMCxcbiAqIH0pO1xuICpcbiAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldCgnL29yZzEyMy9hcGlDYWxscycpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnBvc3QoJy9vcmcxMjMvaW5jcmVtZW50JywgeyBxdW90YVR5cGU6ICdhcGlDYWxscycgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEludGVybmFsSHR0cENsaWVudCB7XG4gIHByaXZhdGUgY29uZmlnOiBSZXF1aXJlZDxTZXJ2aWNlQ29uZmlnPjtcbiAgcHJpdmF0ZSBhZ2VudDogaHR0cC5BZ2VudDtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IEhUVFAgY2xpZW50IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gU2VydmljZSBjb25maWd1cmF0aW9uXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IFNlcnZpY2VDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGhvc3Q6IGNvbmZpZy5ob3N0LFxuICAgICAgcG9ydDogY29uZmlnLnBvcnQsXG4gICAgICB0aW1lb3V0OiBjb25maWcudGltZW91dCA/PyBERUZBVUxUX1RJTUVPVVQsXG4gICAgfTtcbiAgICB0aGlzLmFnZW50ID0gbmV3IGh0dHAuQWdlbnQoeyBrZWVwQWxpdmU6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhIEdFVCByZXF1ZXN0LlxuICAgKi9cbiAgYXN5bmMgZ2V0PFQgPSB1bmtub3duPihwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFdpdGhSZXRyeTxUPignR0VUJywgcGF0aCwgdW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGEgUE9TVCByZXF1ZXN0LlxuICAgKi9cbiAgYXN5bmMgcG9zdDxUID0gdW5rbm93bj4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGJvZHk/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0V2l0aFJldHJ5PFQ+KCdQT1NUJywgcGF0aCwgYm9keSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhIFBVVCByZXF1ZXN0LlxuICAgKi9cbiAgYXN5bmMgcHV0PFQgPSB1bmtub3duPihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYm9keT86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RXaXRoUmV0cnk8VD4oJ1BVVCcsIHBhdGgsIGJvZHksIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYSBERUxFVEUgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIGRlbGV0ZTxUID0gdW5rbm93bj4ocGF0aDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RXaXRoUmV0cnk8VD4oJ0RFTEVURScsIHBhdGgsIHVuZGVmaW5lZCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCB3aXRoIHJldHJ5IGxvZ2ljIGZvciB0cmFuc2llbnQgZmFpbHVyZXMuXG4gICAqXG4gICAqIC0gNDI5IChyYXRlIGxpbWl0KTogcmVzcGVjdHMgYFJldHJ5LUFmdGVyYCBoZWFkZXIsIHVzZXMgbG9uZ2VyIGJhc2UgZGVsYXkgKDR4KSxcbiAgICogICByZXRyaWVzIHVwIHRvIGBtYXhSYXRlTGltaXRSZXRyaWVzYCB0aW1lcyAoZGVmYXVsdCA0KS5cbiAgICogLSA1MDIvNTAzLzUwNCAoc2VydmVyIGVycm9ycyk6IHN0YW5kYXJkIGV4cG9uZW50aWFsIGJhY2tvZmYsIHVwIHRvIGBtYXhSZXRyaWVzYCAoZGVmYXVsdCAyKS5cbiAgICogLSBDb25uZWN0aW9uIGVycm9ycyAvIHRpbWVvdXRzOiByZXRyaWVzIHVwIHRvIGBtYXhSZXRyaWVzYC5cbiAgICogLSBBbGwgZGVsYXlzIGluY2x1ZGUgwrEyNSUgaml0dGVyIHRvIHByZXZlbnQgdGh1bmRlcmluZyBoZXJkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXF1ZXN0V2l0aFJldHJ5PFQ+KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBib2R5PzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgcmV0cnlDb25maWc6IFJldHJ5Q29uZmlnID0ge1xuICAgICAgbWF4UmV0cmllczogb3B0aW9ucz8ubWF4UmV0cmllcyA/PyBERUZBVUxUX01BWF9SRVRSSUVTLFxuICAgICAgbWF4UmF0ZUxpbWl0UmV0cmllczogb3B0aW9ucz8ubWF4UmF0ZUxpbWl0UmV0cmllcyA/PyBERUZBVUxUX01BWF9SQVRFX0xJTUlUX1JFVFJJRVMsXG4gICAgICByZXRyeURlbGF5TXM6IG9wdGlvbnM/LnJldHJ5RGVsYXlNcyA/PyBERUZBVUxUX1JFVFJZX0RFTEFZX01TLFxuICAgIH07XG4gICAgY29uc3QgdG90YWxNYXhBdHRlbXB0cyA9IE1hdGgubWF4KHJldHJ5Q29uZmlnLm1heFJldHJpZXMsIHJldHJ5Q29uZmlnLm1heFJhdGVMaW1pdFJldHJpZXMpO1xuXG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8PSB0b3RhbE1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0PFQ+KG1ldGhvZCwgcGF0aCwgYm9keSwgb3B0aW9ucyk7XG5cbiAgICAgICAgY29uc3QgZGVjaXNpb24gPSBnZXRSZXRyeURlY2lzaW9uKHJlc3BvbnNlLnN0YXR1c0NvZGUsIHJlc3BvbnNlLmhlYWRlcnMsIGF0dGVtcHQsIHJldHJ5Q29uZmlnKTtcbiAgICAgICAgaWYgKGRlY2lzaW9uLnNob3VsZFJldHJ5KSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGRlY2lzaW9uLnJlYXNvbiArICcsIHJldHJ5aW5nJywgeyBtZXRob2QsIHBhdGgsIGF0dGVtcHQ6IGF0dGVtcHQgKyAxLCBkZWxheU1zOiBkZWNpc2lvbi5kZWxheU1zIH0pO1xuICAgICAgICAgIGF3YWl0IHRoaXMuc2xlZXAoZGVjaXNpb24uZGVsYXlNcyk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XG5cbiAgICAgICAgY29uc3QgZGVjaXNpb24gPSBnZXRFcnJvclJldHJ5RGVjaXNpb24oYXR0ZW1wdCwgcmV0cnlDb25maWcpO1xuICAgICAgICBpZiAoZGVjaXNpb24uc2hvdWxkUmV0cnkpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JldHJ5aW5nIGFmdGVyIGVycm9yJywgeyBtZXRob2QsIHBhdGgsIGVycm9yOiBsYXN0RXJyb3IubWVzc2FnZSwgYXR0ZW1wdDogYXR0ZW1wdCArIDEgfSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zbGVlcChkZWNpc2lvbi5kZWxheU1zKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IGxhc3RFcnJvciE7XG4gIH1cblxuICBwcml2YXRlIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgcmVxdWVzdCBtZXRob2QuXG4gICAqL1xuICBwcml2YXRlIHJlcXVlc3Q8VD4oXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGJvZHk/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYm9keVN0ciA9IGJvZHkgPyBKU09OLnN0cmluZ2lmeShib2R5KSA6IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3QgaGVhZGVyczogaHR0cC5PdXRnb2luZ0h0dHBIZWFkZXJzID0ge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAuLi5vcHRpb25zPy5oZWFkZXJzLFxuICAgICAgfTtcblxuICAgICAgLy8gUHJvcGFnYXRlIHJlcXVlc3QgSUQgZm9yIGRpc3RyaWJ1dGVkIHRyYWNpbmdcbiAgICAgIGlmIChvcHRpb25zPy5yZXF1ZXN0SWQpIHtcbiAgICAgICAgaGVhZGVyc1snWC1SZXF1ZXN0LUlkJ10gPSBvcHRpb25zLnJlcXVlc3RJZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGJvZHlTdHIpIHtcbiAgICAgICAgaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGJvZHlTdHIpO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBwYXRoIHRvIHByZXZlbnQgcHJvdG9jb2wgaW5qZWN0aW9uIC8gcmVxdWVzdCBzbXVnZ2xpbmdcbiAgICAgIGlmIChwYXRoLmluY2x1ZGVzKCc6Ly8nKSB8fCBwYXRoLnN0YXJ0c1dpdGgoJy8vJykgfHwgL1tcXHJcXG5cXDBdLy50ZXN0KHBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByZXF1ZXN0IHBhdGg6ICR7cGF0aH1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVxdWVzdE9wdGlvbnM6IGh0dHAuUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICAgIGhvc3RuYW1lOiB0aGlzLmNvbmZpZy5ob3N0LFxuICAgICAgICBwb3J0OiB0aGlzLmNvbmZpZy5wb3J0LFxuICAgICAgICBwYXRoOiBwYXRoLnN0YXJ0c1dpdGgoJy8nKSA/IHBhdGggOiBgLyR7cGF0aH1gLFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHRpbWVvdXQ6IG9wdGlvbnM/LnRpbWVvdXQgPz8gdGhpcy5jb25maWcudGltZW91dCxcbiAgICAgICAgYWdlbnQ6IHRoaXMuYWdlbnQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXEgPSBodHRwLnJlcXVlc3QocmVxdWVzdE9wdGlvbnMsIChyZXMpID0+IHtcbiAgICAgICAgbGV0IGRhdGEgPSAnJztcblxuICAgICAgICByZXMub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgICBkYXRhICs9IGNodW5rO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXMub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkQm9keSA9IGRhdGEgPyBKU09OLnBhcnNlKGRhdGEpIDoge307XG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgc3RhdHVzQ29kZTogcmVzLnN0YXR1c0NvZGUgfHwgSHR0cFN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IsXG4gICAgICAgICAgICAgIGJvZHk6IHBhcnNlZEJvZHkgYXMgVCxcbiAgICAgICAgICAgICAgaGVhZGVyczogcmVzLmhlYWRlcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChwYXJzZUVycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHBhcnNlIHJlc3BvbnNlIGJvZHknLCB7XG4gICAgICAgICAgICAgIGhvc3Q6IHRoaXMuY29uZmlnLmhvc3QsXG4gICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgIGVycm9yOiBwYXJzZUVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBwYXJzZUVycm9yLm1lc3NhZ2UgOiBTdHJpbmcocGFyc2VFcnJvciksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXMuc3RhdHVzQ29kZSB8fCBIdHRwU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUixcbiAgICAgICAgICAgICAgYm9keToge30gYXMgVCxcbiAgICAgICAgICAgICAgaGVhZGVyczogcmVzLmhlYWRlcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHJlcS5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdIVFRQIHJlcXVlc3QgZmFpbGVkJywge1xuICAgICAgICAgIGhvc3Q6IHRoaXMuY29uZmlnLmhvc3QsXG4gICAgICAgICAgcG9ydDogdGhpcy5jb25maWcucG9ydCxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICBlcnJvcjogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcblxuICAgICAgcmVxLm9uKCd0aW1lb3V0JywgKCkgPT4ge1xuICAgICAgICByZXEuZGVzdHJveSgpO1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgUmVxdWVzdCB0aW1lb3V0IGFmdGVyICR7dGhpcy5jb25maWcudGltZW91dH1tc2ApO1xuICAgICAgICBsb2dnZXIud2FybignSFRUUCByZXF1ZXN0IHRpbWVvdXQnLCB7XG4gICAgICAgICAgaG9zdDogdGhpcy5jb25maWcuaG9zdCxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlnLnRpbWVvdXQsXG4gICAgICAgIH0pO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChib2R5U3RyKSB7XG4gICAgICAgIHJlcS53cml0ZShib2R5U3RyKTtcbiAgICAgIH1cblxuICAgICAgcmVxLmVuZCgpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIEhUVFAgY2xpZW50IHdpdGggZXJyb3IgaGFuZGxpbmcgdGhhdCByZXR1cm5zIG51bGwgb24gZmFpbHVyZS5cbiAqIFVzZWZ1bCBmb3IgZmFpbC1vcGVuIHNjZW5hcmlvcy5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gU2VydmljZSBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBDbGllbnQgd3JhcHBlciB3aXRoIHNhZmUgbWV0aG9kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2FmZUNsaWVudChjb25maWc6IFNlcnZpY2VDb25maWcpIHtcbiAgY29uc3QgY2xpZW50ID0gbmV3IEludGVybmFsSHR0cENsaWVudChjb25maWcpO1xuXG4gIHJldHVybiB7XG4gICAgLyoqXG4gICAgICogU2FmZSBHRVQgcmVxdWVzdCAtIHJldHVybnMgbnVsbCBvbiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBnZXQ8VD4ocGF0aDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPiB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjbGllbnQuZ2V0PFQ+KHBhdGgsIG9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnU2FmZSBHRVQgZmFpbGVkLCByZXR1cm5pbmcgbnVsbCcsIHsgcGF0aCwgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNhZmUgUE9TVCByZXF1ZXN0IC0gcmV0dXJucyBudWxsIG9uIGVycm9yLlxuICAgICAqL1xuICAgIGFzeW5jIHBvc3Q8VD4oXG4gICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICBib2R5PzogdW5rbm93bixcbiAgICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPiB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjbGllbnQucG9zdDxUPihwYXRoLCBib2R5LCBvcHRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1NhZmUgUE9TVCBmYWlsZWQsIHJldHVybmluZyBudWxsJywgeyBwYXRoLCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2FmZSBQVVQgcmVxdWVzdCAtIHJldHVybnMgbnVsbCBvbiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBwdXQ8VD4oXG4gICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICBib2R5PzogdW5rbm93bixcbiAgICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPiB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjbGllbnQucHV0PFQ+KHBhdGgsIGJvZHksIG9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnU2FmZSBQVVQgZmFpbGVkLCByZXR1cm5pbmcgbnVsbCcsIHsgcGF0aCwgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNhZmUgREVMRVRFIHJlcXVlc3QgLSByZXR1cm5zIG51bGwgb24gZXJyb3IuIFVzZWQgYnkgZGVzdHJ1Y3RpdmVcbiAgICAgKiBjcm9zcy1zZXJ2aWNlIG9wZXJhdGlvbnMgKGUuZy4gb3JnLWNhc2NhZGUgZGVsZXRlIGluIHBsYXRmb3JtKS5cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGU8VD4oXG4gICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4gfCBudWxsPiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgY2xpZW50LmRlbGV0ZTxUPihwYXRoLCBvcHRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1NhZmUgREVMRVRFIGZhaWxlZCwgcmV0dXJuaW5nIG51bGwnLCB7IHBhdGgsIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG4iXX0=
@@ -6,4 +6,5 @@ export * from './http-client';
6
6
  export { DEFAULT_MAX_RETRIES, DEFAULT_RETRY_DELAY_MS, DEFAULT_MAX_RATE_LIMIT_RETRIES, calculateBackoff, isTransientStatusCode, isRateLimited, getRetryDecision, getErrorRetryDecision, } from './retry-strategy';
7
7
  export type { RetryConfig, RetryDecision } from './retry-strategy';
8
8
  export * from './quota';
9
+ export * from './remote-audit-client';
9
10
  export { enqueueComplianceEvent, registerComplianceQueueBackend, type ComplianceEvent } from './compliance-queue';
@@ -32,7 +32,8 @@ Object.defineProperty(exports, "isRateLimited", { enumerable: true, get: functio
32
32
  Object.defineProperty(exports, "getRetryDecision", { enumerable: true, get: function () { return retry_strategy_1.getRetryDecision; } });
33
33
  Object.defineProperty(exports, "getErrorRetryDecision", { enumerable: true, get: function () { return retry_strategy_1.getErrorRetryDecision; } });
34
34
  __exportStar(require("./quota"), exports);
35
+ __exportStar(require("./remote-audit-client"), exports);
35
36
  var compliance_queue_1 = require("./compliance-queue");
36
37
  Object.defineProperty(exports, "enqueueComplianceEvent", { enumerable: true, get: function () { return compliance_queue_1.enqueueComplianceEvent; } });
37
38
  Object.defineProperty(exports, "registerComplianceQueueBackend", { enumerable: true, get: function () { return compliance_queue_1.registerComplianceQueueBackend; } });
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRXRDLGtEQUFnQztBQUNoQyxzREFBb0M7QUFDcEMsZ0VBQThDO0FBQzlDLGtEQUFnQztBQUNoQyxnREFBOEI7QUFDOUIsbURBUzBCO0FBUnhCLHFIQUFBLG1CQUFtQixPQUFBO0FBQ25CLHdIQUFBLHNCQUFzQixPQUFBO0FBQ3RCLGdJQUFBLDhCQUE4QixPQUFBO0FBQzlCLGtIQUFBLGdCQUFnQixPQUFBO0FBQ2hCLHVIQUFBLHFCQUFxQixPQUFBO0FBQ3JCLCtHQUFBLGFBQWEsT0FBQTtBQUNiLGtIQUFBLGdCQUFnQixPQUFBO0FBQ2hCLHVIQUFBLHFCQUFxQixPQUFBO0FBR3ZCLDBDQUF3QjtBQUN4Qix1REFBa0g7QUFBekcsMEhBQUEsc0JBQXNCLE9BQUE7QUFBRSxrSUFBQSw4QkFBOEIsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQgKiBmcm9tICcuL2NhY2hlLXNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wbGlhbmNlLWNsaWVudCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBsaWFuY2UtZXZlbnQtc3Vic2NyaWJlcic7XG5leHBvcnQgKiBmcm9tICcuL2VudGl0eS1ldmVudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9odHRwLWNsaWVudCc7XG5leHBvcnQge1xuICBERUZBVUxUX01BWF9SRVRSSUVTLFxuICBERUZBVUxUX1JFVFJZX0RFTEFZX01TLFxuICBERUZBVUxUX01BWF9SQVRFX0xJTUlUX1JFVFJJRVMsXG4gIGNhbGN1bGF0ZUJhY2tvZmYsXG4gIGlzVHJhbnNpZW50U3RhdHVzQ29kZSxcbiAgaXNSYXRlTGltaXRlZCxcbiAgZ2V0UmV0cnlEZWNpc2lvbixcbiAgZ2V0RXJyb3JSZXRyeURlY2lzaW9uLFxufSBmcm9tICcuL3JldHJ5LXN0cmF0ZWd5JztcbmV4cG9ydCB0eXBlIHsgUmV0cnlDb25maWcsIFJldHJ5RGVjaXNpb24gfSBmcm9tICcuL3JldHJ5LXN0cmF0ZWd5JztcbmV4cG9ydCAqIGZyb20gJy4vcXVvdGEnO1xuZXhwb3J0IHsgZW5xdWV1ZUNvbXBsaWFuY2VFdmVudCwgcmVnaXN0ZXJDb21wbGlhbmNlUXVldWVCYWNrZW5kLCB0eXBlIENvbXBsaWFuY2VFdmVudCB9IGZyb20gJy4vY29tcGxpYW5jZS1xdWV1ZSc7XG4iXX0=
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRXRDLGtEQUFnQztBQUNoQyxzREFBb0M7QUFDcEMsZ0VBQThDO0FBQzlDLGtEQUFnQztBQUNoQyxnREFBOEI7QUFDOUIsbURBUzBCO0FBUnhCLHFIQUFBLG1CQUFtQixPQUFBO0FBQ25CLHdIQUFBLHNCQUFzQixPQUFBO0FBQ3RCLGdJQUFBLDhCQUE4QixPQUFBO0FBQzlCLGtIQUFBLGdCQUFnQixPQUFBO0FBQ2hCLHVIQUFBLHFCQUFxQixPQUFBO0FBQ3JCLCtHQUFBLGFBQWEsT0FBQTtBQUNiLGtIQUFBLGdCQUFnQixPQUFBO0FBQ2hCLHVIQUFBLHFCQUFxQixPQUFBO0FBR3ZCLDBDQUF3QjtBQUN4Qix3REFBc0M7QUFDdEMsdURBQWtIO0FBQXpHLDBIQUFBLHNCQUFzQixPQUFBO0FBQUUsa0lBQUEsOEJBQThCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS1zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcGxpYW5jZS1jbGllbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wbGlhbmNlLWV2ZW50LXN1YnNjcmliZXInO1xuZXhwb3J0ICogZnJvbSAnLi9lbnRpdHktZXZlbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vaHR0cC1jbGllbnQnO1xuZXhwb3J0IHtcbiAgREVGQVVMVF9NQVhfUkVUUklFUyxcbiAgREVGQVVMVF9SRVRSWV9ERUxBWV9NUyxcbiAgREVGQVVMVF9NQVhfUkFURV9MSU1JVF9SRVRSSUVTLFxuICBjYWxjdWxhdGVCYWNrb2ZmLFxuICBpc1RyYW5zaWVudFN0YXR1c0NvZGUsXG4gIGlzUmF0ZUxpbWl0ZWQsXG4gIGdldFJldHJ5RGVjaXNpb24sXG4gIGdldEVycm9yUmV0cnlEZWNpc2lvbixcbn0gZnJvbSAnLi9yZXRyeS1zdHJhdGVneSc7XG5leHBvcnQgdHlwZSB7IFJldHJ5Q29uZmlnLCBSZXRyeURlY2lzaW9uIH0gZnJvbSAnLi9yZXRyeS1zdHJhdGVneSc7XG5leHBvcnQgKiBmcm9tICcuL3F1b3RhJztcbmV4cG9ydCAqIGZyb20gJy4vcmVtb3RlLWF1ZGl0LWNsaWVudCc7XG5leHBvcnQgeyBlbnF1ZXVlQ29tcGxpYW5jZUV2ZW50LCByZWdpc3RlckNvbXBsaWFuY2VRdWV1ZUJhY2tlbmQsIHR5cGUgQ29tcGxpYW5jZUV2ZW50IH0gZnJvbSAnLi9jb21wbGlhbmNlLXF1ZXVlJztcbiJdfQ==
@@ -1,4 +1,20 @@
1
1
  import { QuotaType, QuotaCheckResult } from '../types/common';
2
+ import { QuotaTier } from '../types/quota-tiers';
3
+ /**
4
+ * Result of a synchronous quota reservation the atomic check+increment
5
+ * variant. `exceeded: true` means the operation was rejected at the DB
6
+ * level; the caller should return 429 without running the gated action.
7
+ */
8
+ export interface QuotaReserveResult {
9
+ exceeded: boolean;
10
+ quota: {
11
+ type: QuotaType;
12
+ limit: number;
13
+ used: number;
14
+ remaining: number;
15
+ resetAt?: string;
16
+ };
17
+ }
2
18
  /**
3
19
  * Quota service client interface.
4
20
  */
@@ -7,10 +23,31 @@ export interface QuotaService {
7
23
  check(orgId: string, quotaType: QuotaType, authHeader: string, requestId?: string): Promise<QuotaCheckResult>;
8
24
  /** Increment quota usage. Returns a promise so callers can optionally handle errors. */
9
25
  increment(orgId: string, quotaType: QuotaType, authHeader: string, amount?: number, requestId?: string): Promise<void>;
26
+ /**
27
+ * Atomic reserve the same atomic check+increment as `increment`, but
28
+ * parses the response so callers can see whether the slot was actually
29
+ * reserved. Use this for expensive resources where the post-hoc fire-
30
+ * and-forget pattern allows concurrent over-spend.
31
+ *
32
+ * Fail-open semantics on transport errors: returns `exceeded: false` so
33
+ * the caller can proceed and the request isn't blocked by quota-service
34
+ * outages (matches `check()`).
35
+ */
36
+ reserve(orgId: string, quotaType: QuotaType, authHeader: string, amount?: number, requestId?: string): Promise<QuotaReserveResult>;
37
+ /** Roll back a previously reserved slot. Fire-and-forget never throws. */
38
+ decrement(orgId: string, quotaType: QuotaType, authHeader: string, amount?: number, requestId?: string): Promise<void>;
10
39
  /** Update quota limits. Returns true on success. */
11
40
  updateLimits(orgId: string, limits: Partial<Record<QuotaType, number>>, authHeader: string, requestId?: string): Promise<boolean>;
12
41
  /** Reset quota usage. Returns true on success. */
13
42
  reset(orgId: string, quotaType?: QuotaType, authHeader?: string, requestId?: string): Promise<boolean>;
43
+ /**
44
+ * Get the org's quota tier ('developer' | 'pro' | 'unlimited'). Used by
45
+ * the plugin-build queue partitioning to route a build to the
46
+ * right per-tier queue. Fail-open returns DEFAULT_TIER ('developer')
47
+ * a misclassified pro/unlimited org will land in the developer queue
48
+ * and still build, just without the tier-scoped scheduling boost.
49
+ */
50
+ getTier(orgId: string, authHeader: string, requestId?: string): Promise<QuotaTier>;
14
51
  }
15
52
  /**
16
53
  * Configuration for quota service client.
@@ -36,7 +73,7 @@ export interface QuotaServiceConfig {
36
73
  * // Check quota before processing
37
74
  * const quota = await quotaService.check(orgId, 'apiCalls', authHeader);
38
75
  * if (!quota.allowed) {
39
- * return res.status(429).json({ error: 'Quota exceeded' });
76
+ * return res.status(429).json({ error: 'Quota exceeded' });
40
77
  * }
41
78
  *
42
79
  * // Increment quota after success
@@ -57,3 +94,30 @@ export declare function createQuotaService(config?: QuotaServiceConfig): QuotaSe
57
94
  * @param logWarn - Logging function for warnings
58
95
  */
59
96
  export declare function incrementQuota(quotaService: QuotaService, orgId: string, quotaType: QuotaType, authHeader: string, logWarn: (message: string, data?: unknown) => void): void;
97
+ /**
98
+ * Atomic reserve helper for the "reserve + commit / rollback" pattern.
99
+ * Use for expensive resources (pipelines, plugins, AI calls) where the
100
+ * fire-and-forget post-hoc `incrementQuota` allows concurrent over-spend.
101
+ *
102
+ * Returns the structured result so the caller can decide whether to run
103
+ * the gated action or 429 the client.
104
+ *
105
+ * @example
106
+ * ```typescript
107
+ * const reservation = await reserveQuota(quotaService, orgId, 'pipelines', authHeader);
108
+ * if (reservation.exceeded) return sendQuotaExceeded(res, 'pipelines', reservation.quota);
109
+ * try {
110
+ * await doExpensiveThing();
111
+ * } catch (err) {
112
+ * await decrementQuota(quotaService, orgId, 'pipelines', authHeader);
113
+ * throw err;
114
+ * }
115
+ * ```
116
+ */
117
+ export declare function reserveQuota(quotaService: QuotaService, orgId: string, quotaType: QuotaType, authHeader: string, amount?: number, requestId?: string): Promise<QuotaReserveResult>;
118
+ /**
119
+ * Fire-and-forget rollback for a previously reserved quota slot.
120
+ * Logs on failure but never throws the action that needed the rollback
121
+ * has already failed, no point compounding the error.
122
+ */
123
+ export declare function decrementQuota(quotaService: QuotaService, orgId: string, quotaType: QuotaType, authHeader: string, logWarn: (message: string, data?: unknown) => void, amount?: number): void;