@pipeline-builder/pipeline-data 0.0.1

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.
Files changed (48) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +61 -0
  3. package/drizzle.config.ts +17 -0
  4. package/lib/api/access-control-builder.d.ts +148 -0
  5. package/lib/api/access-control-builder.js +199 -0
  6. package/lib/api/crud-service.d.ts +343 -0
  7. package/lib/api/crud-service.js +849 -0
  8. package/lib/api/query-builders.d.ts +82 -0
  9. package/lib/api/query-builders.js +460 -0
  10. package/lib/api/reporting-service.d.ts +685 -0
  11. package/lib/api/reporting-service.js +1564 -0
  12. package/lib/api/soft-delete-sweep.d.ts +65 -0
  13. package/lib/api/soft-delete-sweep.js +124 -0
  14. package/lib/api/viewer-context.d.ts +29 -0
  15. package/lib/api/viewer-context.js +63 -0
  16. package/lib/core/query-filters.d.ts +263 -0
  17. package/lib/core/query-filters.js +4 -0
  18. package/lib/database/drizzle-schema.d.ts +7357 -0
  19. package/lib/database/drizzle-schema.js +66 -0
  20. package/lib/database/index.d.ts +5 -0
  21. package/lib/database/index.js +8 -0
  22. package/lib/database/migrator.d.ts +20 -0
  23. package/lib/database/migrator.js +80 -0
  24. package/lib/database/postgres-connection.d.ts +201 -0
  25. package/lib/database/postgres-connection.js +413 -0
  26. package/lib/database/retry-strategy.d.ts +68 -0
  27. package/lib/database/retry-strategy.js +122 -0
  28. package/lib/database/schema/alert.d.ts +588 -0
  29. package/lib/database/schema/alert.js +130 -0
  30. package/lib/database/schema/compliance.d.ts +3319 -0
  31. package/lib/database/schema/compliance.js +377 -0
  32. package/lib/database/schema/dashboard.d.ts +474 -0
  33. package/lib/database/schema/dashboard.js +129 -0
  34. package/lib/database/schema/message-attachment.d.ts +183 -0
  35. package/lib/database/schema/message-attachment.js +40 -0
  36. package/lib/database/schema/message.d.ts +411 -0
  37. package/lib/database/schema/message.js +114 -0
  38. package/lib/database/schema/pipeline-template.d.ts +466 -0
  39. package/lib/database/schema/pipeline-template.js +80 -0
  40. package/lib/database/schema/pipeline.d.ts +1613 -0
  41. package/lib/database/schema/pipeline.js +332 -0
  42. package/lib/database/schema/plugin.d.ts +749 -0
  43. package/lib/database/schema/plugin.js +166 -0
  44. package/lib/database/tenancy.d.ts +103 -0
  45. package/lib/database/tenancy.js +167 -0
  46. package/lib/index.d.ts +32 -0
  47. package/lib/index.js +38 -0
  48. package/package.json +161 -0
@@ -0,0 +1,80 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { SYSTEM_ORG_ID, } from '@pipeline-builder/api-core';
4
+ import { sql } from 'drizzle-orm';
5
+ import { boolean, varchar, pgTable, text, timestamp, uuid, jsonb, index, uniqueIndex } from 'drizzle-orm/pg-core';
6
+ /**
7
+ * Golden-path pipeline templates. A template is a parameterized starter: its
8
+ * `props` is a BuilderProps body with `{{ vars.* }}` placeholders, and `inputs`
9
+ * declares the variables a developer fills in when instantiating it into a real
10
+ * pipeline. System-org public templates form the shared golden-path catalog
11
+ * (visible to every org, same pattern as the sample template catalog / compliance templates).
12
+ *
13
+ * Visibility ladder (three rungs, like `dashboards` — NOT the catalog-wide
14
+ * three-value `visibility` that pipelines/plugins carry):
15
+ * - `private` — only the author (`created_by`) can read/write it; a personal draft
16
+ * - `org` — anyone in the owning org can read it; `pipelines:write` edits it
17
+ * - `public` — shared beyond the org: a team also sees its parent org's public
18
+ * templates, and the system org's public templates are the shared
19
+ * golden-path catalog every org sees. Needs `pipelines:publish`.
20
+ * The read predicate lives in `buildPipelineTemplateConditions`; the write gate
21
+ * in api-core's `requireTemplateWriteAccess`.
22
+ *
23
+ * @table pipeline_templates
24
+ */
25
+ export const pipelineTemplate = pgTable('pipeline_templates', {
26
+ id: uuid('id').primaryKey().defaultRandom(),
27
+ orgId: varchar('org_id', { length: 255 }).default(SYSTEM_ORG_ID).notNull(),
28
+ // Audit
29
+ createdBy: text('created_by').default(SYSTEM_ORG_ID).notNull(),
30
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
31
+ updatedBy: text('updated_by').default(SYSTEM_ORG_ID).notNull(),
32
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
33
+ // Core template information
34
+ name: varchar('name', { length: 255 }).notNull(),
35
+ description: text('description'),
36
+ keywords: jsonb('keywords').$type().default([]).notNull(),
37
+ category: varchar('category', { length: 50 }).default('general').notNull(),
38
+ // Template body: a BuilderProps with `{{ vars.* }}` placeholders. Typed loosely
39
+ // because a template may omit concrete project/organization until instantiated.
40
+ props: jsonb('props').$type().notNull(),
41
+ // Declared inputs (the `vars.*` contract a developer fills in to instantiate).
42
+ inputs: jsonb('inputs').$type().default([]).notNull(),
43
+ // Developer-portal catalog metadata (ownership / lifecycle / classification)
44
+ ownerId: text('owner_id'),
45
+ ownerType: varchar('owner_type', { length: 10 }).$type(),
46
+ lifecycle: varchar('lifecycle', { length: 20 }).$type().default('production').notNull(),
47
+ criticality: varchar('criticality', { length: 10 }).$type(),
48
+ labels: jsonb('labels').$type().default({}).notNull(),
49
+ links: jsonb('links').$type().default([]).notNull(),
50
+ // Access and visibility — see the header for the ladder. Constrained at the
51
+ // SQL layer too via a CHECK in postgres-init.sql so a typo can't sneak past
52
+ // the application layer.
53
+ visibility: varchar('visibility', { length: 10 })
54
+ .$type()
55
+ .default('private')
56
+ .notNull(),
57
+ isDefault: boolean('is_default').default(false).notNull(),
58
+ isActive: boolean('is_active').default(true).notNull(),
59
+ // Soft delete
60
+ deletedAt: timestamp('deleted_at', { withTimezone: true }),
61
+ deletedBy: text('deleted_by'),
62
+ // Soft-delete purge deadline: the retention sweep hard-deletes tombstoned
63
+ // rows once `purge_after` has passed (set on delete alongside deleted_at).
64
+ purgeAfter: timestamp('purge_after', { withTimezone: true }),
65
+ }, (table) => ({
66
+ // Partial index over just the tombstones — drives the retention purge sweep.
67
+ purgeIdx: index('pipeline_template_purge_idx').on(table.purgeAfter).where(sql `deleted_at IS NOT NULL`),
68
+ orgIdIdx: index('pipeline_template_org_id_idx').on(table.orgId),
69
+ activeIdx: index('pipeline_template_active_idx').on(table.isActive),
70
+ categoryIdx: index('pipeline_template_category_idx').on(table.category),
71
+ // Listing is org-scoped, visibility-filtered and active-only, so all three go in.
72
+ orgVisibilityActiveIdx: index('pipeline_template_org_visibility_active_idx').on(table.orgId, table.visibility, table.isActive),
73
+ // Drives the "my private drafts" leg of the visibility predicate.
74
+ createdByIdx: index('pipeline_template_created_by_idx').on(table.orgId, table.createdBy),
75
+ ownerIdx: index('pipeline_template_owner_idx').on(table.orgId, table.ownerId),
76
+ lifecycleIdx: index('pipeline_template_lifecycle_idx').on(table.orgId, table.lifecycle),
77
+ // One template name per org.
78
+ nameOrgUnique: uniqueIndex('pipeline_template_name_org_unique').on(table.name, table.orgId),
79
+ }));
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtdGVtcGxhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGF0YWJhc2Uvc2NoZW1hL3BpcGVsaW5lLXRlbXBsYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUNMLGFBQWEsR0FRZCxNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFbEg7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRTtJQUM1RCxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLGFBQWEsRUFBRTtJQUUzQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLEVBQUU7SUFFMUUsUUFBUTtJQUNSLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sRUFBRTtJQUM5RCxTQUFTLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRTtJQUNqRixTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLEVBQUU7SUFDOUQsU0FB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QUF3QixDQUFDO0lBQ3RHLFFBQVEsRUFBRSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUMvRCxTQUFTLEVBQUUsS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7SUFDbkUsV0FBVyxFQUFFLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO0lBQ3ZFLGtGQUFrRjtJQUNsRixzQkFBc0IsRUFBRSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUM7SUFDOUgsa0VBQWtFO0lBQ2xFLFlBQVksRUFBRSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDO0lBQ3hGLFFBQVEsRUFBRSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDO0lBQzdFLFlBQVksRUFBRSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDO0lBQ3ZGLDZCQUE2QjtJQUM3QixhQUFhLEVBQUUsV0FBVyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQztDQUM1RixDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQge1xuICBTWVNURU1fT1JHX0lELFxuICB0eXBlIENyaXRpY2FsaXR5LFxuICB0eXBlIEVudGl0eUxhYmVscyxcbiAgdHlwZSBFbnRpdHlMaW5rLFxuICB0eXBlIExpZmVjeWNsZSxcbiAgdHlwZSBPd25lclR5cGUsXG4gIHR5cGUgVGVtcGxhdGVJbnB1dCxcbiAgdHlwZSBWaXNpYmlsaXR5LFxufSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBzcWwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgeyBib29sZWFuLCB2YXJjaGFyLCBwZ1RhYmxlLCB0ZXh0LCB0aW1lc3RhbXAsIHV1aWQsIGpzb25iLCBpbmRleCwgdW5pcXVlSW5kZXggfSBmcm9tICdkcml6emxlLW9ybS9wZy1jb3JlJztcblxuLyoqXG4gKiBHb2xkZW4tcGF0aCBwaXBlbGluZSB0ZW1wbGF0ZXMuIEEgdGVtcGxhdGUgaXMgYSBwYXJhbWV0ZXJpemVkIHN0YXJ0ZXI6IGl0c1xuICogYHByb3BzYCBpcyBhIEJ1aWxkZXJQcm9wcyBib2R5IHdpdGggYHt7IHZhcnMuKiB9fWAgcGxhY2Vob2xkZXJzLCBhbmQgYGlucHV0c2BcbiAqIGRlY2xhcmVzIHRoZSB2YXJpYWJsZXMgYSBkZXZlbG9wZXIgZmlsbHMgaW4gd2hlbiBpbnN0YW50aWF0aW5nIGl0IGludG8gYSByZWFsXG4gKiBwaXBlbGluZS4gU3lzdGVtLW9yZyBwdWJsaWMgdGVtcGxhdGVzIGZvcm0gdGhlIHNoYXJlZCBnb2xkZW4tcGF0aCBjYXRhbG9nXG4gKiAodmlzaWJsZSB0byBldmVyeSBvcmcsIHNhbWUgcGF0dGVybiBhcyB0aGUgc2FtcGxlIHRlbXBsYXRlIGNhdGFsb2cgLyBjb21wbGlhbmNlIHRlbXBsYXRlcykuXG4gKlxuICogVmlzaWJpbGl0eSBsYWRkZXIgKHRocmVlIHJ1bmdzLCBsaWtlIGBkYXNoYm9hcmRzYCDigJQgTk9UIHRoZSBjYXRhbG9nLXdpZGVcbiAqIHRocmVlLXZhbHVlIGB2aXNpYmlsaXR5YCB0aGF0IHBpcGVsaW5lcy9wbHVnaW5zIGNhcnJ5KTpcbiAqIC0gYHByaXZhdGVgIOKAlCBvbmx5IHRoZSBhdXRob3IgKGBjcmVhdGVkX2J5YCkgY2FuIHJlYWQvd3JpdGUgaXQ7IGEgcGVyc29uYWwgZHJhZnRcbiAqIC0gYG9yZ2AgICAgIOKAlCBhbnlvbmUgaW4gdGhlIG93bmluZyBvcmcgY2FuIHJlYWQgaXQ7IGBwaXBlbGluZXM6d3JpdGVgIGVkaXRzIGl0XG4gKiAtIGBwdWJsaWNgICDigJQgc2hhcmVkIGJleW9uZCB0aGUgb3JnOiBhIHRlYW0gYWxzbyBzZWVzIGl0cyBwYXJlbnQgb3JnJ3MgcHVibGljXG4gKiAgICAgICAgICAgICAgIHRlbXBsYXRlcywgYW5kIHRoZSBzeXN0ZW0gb3JnJ3MgcHVibGljIHRlbXBsYXRlcyBhcmUgdGhlIHNoYXJlZFxuICogICAgICAgICAgICAgICBnb2xkZW4tcGF0aCBjYXRhbG9nIGV2ZXJ5IG9yZyBzZWVzLiBOZWVkcyBgcGlwZWxpbmVzOnB1Ymxpc2hgLlxuICogVGhlIHJlYWQgcHJlZGljYXRlIGxpdmVzIGluIGBidWlsZFBpcGVsaW5lVGVtcGxhdGVDb25kaXRpb25zYDsgdGhlIHdyaXRlIGdhdGVcbiAqIGluIGFwaS1jb3JlJ3MgYHJlcXVpcmVUZW1wbGF0ZVdyaXRlQWNjZXNzYC5cbiAqXG4gKiBAdGFibGUgcGlwZWxpbmVfdGVtcGxhdGVzXG4gKi9cbmV4cG9ydCBjb25zdCBwaXBlbGluZVRlbXBsYXRlID0gcGdUYWJsZSgncGlwZWxpbmVfdGVtcGxhdGVzJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLmRlZmF1bHQoU1lTVEVNX09SR19JRCkubm90TnVsbCgpLFxuXG4gIC8vIEF1ZGl0XG4gIGNyZWF0ZWRCeTogdGV4dCgnY3JlYXRlZF9ieScpLmRlZmF1bHQoU1lTVEVNX09SR19JRCkubm90TnVsbCgpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRCeTogdGV4dCgndXBkYXRlZF9ieScpLmRlZmF1bHQoU1lTVEVNX09SR19JRCkubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG5cbiAgLy8gQ29yZSB0ZW1wbGF0ZSBpbmZvcm1hdGlvblxuICBuYW1lOiB2YXJjaGFyKCduYW1lJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIGRlc2NyaXB0aW9uOiB0ZXh0KCdkZXNjcmlwdGlvbicpLFxuICBrZXl3b3JkczoganNvbmIoJ2tleXdvcmRzJykuJHR5cGU8c3RyaW5nW10+KCkuZGVmYXVsdChbXSkubm90TnVsbCgpLFxuICBjYXRlZ29yeTogdmFyY2hhcignY2F0ZWdvcnknLCB7IGxlbmd0aDogNTAgfSkuZGVmYXVsdCgnZ2VuZXJhbCcpLm5vdE51bGwoKSxcblxuICAvLyBUZW1wbGF0ZSBib2R5OiBhIEJ1aWxkZXJQcm9wcyB3aXRoIGB7eyB2YXJzLiogfX1gIHBsYWNlaG9sZGVycy4gVHlwZWQgbG9vc2VseVxuICAvLyBiZWNhdXNlIGEgdGVtcGxhdGUgbWF5IG9taXQgY29uY3JldGUgcHJvamVjdC9vcmdhbml6YXRpb24gdW50aWwgaW5zdGFudGlhdGVkLlxuICBwcm9wczoganNvbmIoJ3Byb3BzJykuJHR5cGU8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCkubm90TnVsbCgpLFxuICAvLyBEZWNsYXJlZCBpbnB1dHMgKHRoZSBgdmFycy4qYCBjb250cmFjdCBhIGRldmVsb3BlciBmaWxscyBpbiB0byBpbnN0YW50aWF0ZSkuXG4gIGlucHV0czoganNvbmIoJ2lucHV0cycpLiR0eXBlPFRlbXBsYXRlSW5wdXRbXT4oKS5kZWZhdWx0KFtdKS5ub3ROdWxsKCksXG5cbiAgLy8gRGV2ZWxvcGVyLXBvcnRhbCBjYXRhbG9nIG1ldGFkYXRhIChvd25lcnNoaXAgLyBsaWZlY3ljbGUgLyBjbGFzc2lmaWNhdGlvbilcbiAgb3duZXJJZDogdGV4dCgnb3duZXJfaWQnKSxcbiAgb3duZXJUeXBlOiB2YXJjaGFyKCdvd25lcl90eXBlJywgeyBsZW5ndGg6IDEwIH0pLiR0eXBlPE93bmVyVHlwZT4oKSxcbiAgbGlmZWN5Y2xlOiB2YXJjaGFyKCdsaWZlY3ljbGUnLCB7IGxlbmd0aDogMjAgfSkuJHR5cGU8TGlmZWN5Y2xlPigpLmRlZmF1bHQoJ3Byb2R1Y3Rpb24nIGFzIExpZmVjeWNsZSkubm90TnVsbCgpLFxuICBjcml0aWNhbGl0eTogdmFyY2hhcignY3JpdGljYWxpdHknLCB7IGxlbmd0aDogMTAgfSkuJHR5cGU8Q3JpdGljYWxpdHk+KCksXG4gIGxhYmVsczoganNvbmIoJ2xhYmVscycpLiR0eXBlPEVudGl0eUxhYmVscz4oKS5kZWZhdWx0KHt9KS5ub3ROdWxsKCksXG4gIGxpbmtzOiBqc29uYignbGlua3MnKS4kdHlwZTxFbnRpdHlMaW5rW10+KCkuZGVmYXVsdChbXSkubm90TnVsbCgpLFxuXG4gIC8vIEFjY2VzcyBhbmQgdmlzaWJpbGl0eSDigJQgc2VlIHRoZSBoZWFkZXIgZm9yIHRoZSBsYWRkZXIuIENvbnN0cmFpbmVkIGF0IHRoZVxuICAvLyBTUUwgbGF5ZXIgdG9vIHZpYSBhIENIRUNLIGluIHBvc3RncmVzLWluaXQuc3FsIHNvIGEgdHlwbyBjYW4ndCBzbmVhayBwYXN0XG4gIC8vIHRoZSBhcHBsaWNhdGlvbiBsYXllci5cbiAgdmlzaWJpbGl0eTogdmFyY2hhcigndmlzaWJpbGl0eScsIHsgbGVuZ3RoOiAxMCB9KVxuICAgIC4kdHlwZTxWaXNpYmlsaXR5PigpXG4gICAgLmRlZmF1bHQoJ3ByaXZhdGUnKVxuICAgIC5ub3ROdWxsKCksXG4gIGlzRGVmYXVsdDogYm9vbGVhbignaXNfZGVmYXVsdCcpLmRlZmF1bHQoZmFsc2UpLm5vdE51bGwoKSxcbiAgaXNBY3RpdmU6IGJvb2xlYW4oJ2lzX2FjdGl2ZScpLmRlZmF1bHQodHJ1ZSkubm90TnVsbCgpLFxuXG4gIC8vIFNvZnQgZGVsZXRlXG4gIGRlbGV0ZWRBdDogdGltZXN0YW1wKCdkZWxldGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGRlbGV0ZWRCeTogdGV4dCgnZGVsZXRlZF9ieScpLFxuICAvLyBTb2Z0LWRlbGV0ZSBwdXJnZSBkZWFkbGluZTogdGhlIHJldGVudGlvbiBzd2VlcCBoYXJkLWRlbGV0ZXMgdG9tYnN0b25lZFxuICAvLyByb3dzIG9uY2UgYHB1cmdlX2FmdGVyYCBoYXMgcGFzc2VkIChzZXQgb24gZGVsZXRlIGFsb25nc2lkZSBkZWxldGVkX2F0KS5cbiAgcHVyZ2VBZnRlcjogdGltZXN0YW1wKCdwdXJnZV9hZnRlcicsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxufSwgKHRhYmxlKSA9PiAoe1xuICAvLyBQYXJ0aWFsIGluZGV4IG92ZXIganVzdCB0aGUgdG9tYnN0b25lcyDigJQgZHJpdmVzIHRoZSByZXRlbnRpb24gcHVyZ2Ugc3dlZXAuXG4gIHB1cmdlSWR4OiBpbmRleCgncGlwZWxpbmVfdGVtcGxhdGVfcHVyZ2VfaWR4Jykub24odGFibGUucHVyZ2VBZnRlcikud2hlcmUoc3FsYGRlbGV0ZWRfYXQgSVMgTk9UIE5VTExgKSxcbiAgb3JnSWRJZHg6IGluZGV4KCdwaXBlbGluZV90ZW1wbGF0ZV9vcmdfaWRfaWR4Jykub24odGFibGUub3JnSWQpLFxuICBhY3RpdmVJZHg6IGluZGV4KCdwaXBlbGluZV90ZW1wbGF0ZV9hY3RpdmVfaWR4Jykub24odGFibGUuaXNBY3RpdmUpLFxuICBjYXRlZ29yeUlkeDogaW5kZXgoJ3BpcGVsaW5lX3RlbXBsYXRlX2NhdGVnb3J5X2lkeCcpLm9uKHRhYmxlLmNhdGVnb3J5KSxcbiAgLy8gTGlzdGluZyBpcyBvcmctc2NvcGVkLCB2aXNpYmlsaXR5LWZpbHRlcmVkIGFuZCBhY3RpdmUtb25seSwgc28gYWxsIHRocmVlIGdvIGluLlxuICBvcmdWaXNpYmlsaXR5QWN0aXZlSWR4OiBpbmRleCgncGlwZWxpbmVfdGVtcGxhdGVfb3JnX3Zpc2liaWxpdHlfYWN0aXZlX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS52aXNpYmlsaXR5LCB0YWJsZS5pc0FjdGl2ZSksXG4gIC8vIERyaXZlcyB0aGUgXCJteSBwcml2YXRlIGRyYWZ0c1wiIGxlZyBvZiB0aGUgdmlzaWJpbGl0eSBwcmVkaWNhdGUuXG4gIGNyZWF0ZWRCeUlkeDogaW5kZXgoJ3BpcGVsaW5lX3RlbXBsYXRlX2NyZWF0ZWRfYnlfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmNyZWF0ZWRCeSksXG4gIG93bmVySWR4OiBpbmRleCgncGlwZWxpbmVfdGVtcGxhdGVfb3duZXJfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLm93bmVySWQpLFxuICBsaWZlY3ljbGVJZHg6IGluZGV4KCdwaXBlbGluZV90ZW1wbGF0ZV9saWZlY3ljbGVfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmxpZmVjeWNsZSksXG4gIC8vIE9uZSB0ZW1wbGF0ZSBuYW1lIHBlciBvcmcuXG4gIG5hbWVPcmdVbmlxdWU6IHVuaXF1ZUluZGV4KCdwaXBlbGluZV90ZW1wbGF0ZV9uYW1lX29yZ191bmlxdWUnKS5vbih0YWJsZS5uYW1lLCB0YWJsZS5vcmdJZCksXG59KSk7XG5cbmV4cG9ydCB0eXBlIFBpcGVsaW5lVGVtcGxhdGUgPSB0eXBlb2YgcGlwZWxpbmVUZW1wbGF0ZS4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBQaXBlbGluZVRlbXBsYXRlSW5zZXJ0ID0gdHlwZW9mIHBpcGVsaW5lVGVtcGxhdGUuJGluZmVySW5zZXJ0O1xuZXhwb3J0IHR5cGUgUGlwZWxpbmVUZW1wbGF0ZVVwZGF0ZSA9IFBhcnRpYWw8T21pdDxQaXBlbGluZVRlbXBsYXRlSW5zZXJ0LCAnaWQnIHwgJ2NyZWF0ZWRBdCcgfCAnY3JlYXRlZEJ5Jz4+O1xuIl19