@pipeline-builder/pipeline-data 3.4.86 → 3.4.87
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/lib/api/crud-service.d.ts +25 -3
- package/lib/api/crud-service.js +40 -11
- package/lib/api/query-builders.js +57 -29
- package/lib/database/drizzle-schema.d.ts +50 -6188
- package/lib/database/drizzle-schema.js +20 -954
- package/lib/database/postgres-connection.d.ts +0 -1
- package/lib/database/postgres-connection.js +1 -6
- package/lib/database/schema/alert.d.ts +554 -0
- package/lib/database/schema/alert.js +120 -0
- package/lib/database/schema/compliance.d.ts +3284 -0
- package/lib/database/schema/compliance.js +348 -0
- package/lib/database/schema/dashboard.d.ts +457 -0
- package/lib/database/schema/dashboard.js +120 -0
- package/lib/database/schema/message.d.ts +379 -0
- package/lib/database/schema/message.js +95 -0
- package/lib/database/schema/pipeline.d.ts +868 -0
- package/lib/database/schema/pipeline.js +166 -0
- package/lib/database/schema/plugin.d.ts +617 -0
- package/lib/database/schema/plugin.js +134 -0
- package/lib/database/tenancy.js +6 -3
- package/package.json +2 -2
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { AccessModifier, SYSTEM_ORG_ID } from '@pipeline-builder/api-core';
|
|
4
|
+
import { sql } from 'drizzle-orm';
|
|
5
|
+
import { boolean, integer, varchar, pgTable, text, timestamp, uuid, jsonb, index, uniqueIndex } from 'drizzle-orm/pg-core';
|
|
6
|
+
/**
|
|
7
|
+
* Table for storing pipeline instances and their full configuration.
|
|
8
|
+
*
|
|
9
|
+
* Features * - Full BuilderProps serialization for reconstruction
|
|
10
|
+
* - Organization-level isolation
|
|
11
|
+
* - Pipeline status tracking
|
|
12
|
+
* - Execution history tracking
|
|
13
|
+
* - Flexible tagging system
|
|
14
|
+
*
|
|
15
|
+
* @table pipelines
|
|
16
|
+
*/
|
|
17
|
+
export const pipeline = pgTable('pipelines', {
|
|
18
|
+
// Primary key
|
|
19
|
+
id: uuid('id').primaryKey().defaultRandom(),
|
|
20
|
+
// Organization and access control
|
|
21
|
+
orgId: varchar('org_id', { length: 255 })
|
|
22
|
+
.default(SYSTEM_ORG_ID)
|
|
23
|
+
.notNull(),
|
|
24
|
+
// Audit fields
|
|
25
|
+
createdBy: text('created_by')
|
|
26
|
+
.default(SYSTEM_ORG_ID)
|
|
27
|
+
.notNull(),
|
|
28
|
+
createdAt: timestamp('created_at', { withTimezone: true })
|
|
29
|
+
.defaultNow()
|
|
30
|
+
.notNull(),
|
|
31
|
+
updatedBy: text('updated_by')
|
|
32
|
+
.default(SYSTEM_ORG_ID)
|
|
33
|
+
.notNull(),
|
|
34
|
+
updatedAt: timestamp('updated_at', { withTimezone: true })
|
|
35
|
+
.defaultNow()
|
|
36
|
+
.notNull(),
|
|
37
|
+
// Core pipeline information
|
|
38
|
+
project: varchar('project', { length: 255 })
|
|
39
|
+
.notNull(),
|
|
40
|
+
organization: varchar('organization', { length: 255 })
|
|
41
|
+
.notNull(),
|
|
42
|
+
pipelineName: varchar('pipeline_name', { length: 255 }),
|
|
43
|
+
description: text('description'),
|
|
44
|
+
keywords: jsonb('keywords')
|
|
45
|
+
.$type()
|
|
46
|
+
.default([])
|
|
47
|
+
.notNull(),
|
|
48
|
+
// Pipeline configuration
|
|
49
|
+
props: jsonb('props')
|
|
50
|
+
.$type()
|
|
51
|
+
.notNull(),
|
|
52
|
+
// Access and visibility
|
|
53
|
+
accessModifier: varchar('access_modifier', { length: 10 })
|
|
54
|
+
.$type()
|
|
55
|
+
.default('private')
|
|
56
|
+
.notNull(),
|
|
57
|
+
isDefault: boolean('is_default')
|
|
58
|
+
.default(false)
|
|
59
|
+
.notNull(),
|
|
60
|
+
isActive: boolean('is_active')
|
|
61
|
+
.default(true)
|
|
62
|
+
.notNull(),
|
|
63
|
+
// Deletion tracking (soft delete)
|
|
64
|
+
deletedAt: timestamp('deleted_at', { withTimezone: true }),
|
|
65
|
+
deletedBy: text('deleted_by'),
|
|
66
|
+
}, (table) => ({
|
|
67
|
+
// Indexes for common queries
|
|
68
|
+
projectIdx: index('pipeline_project_idx').on(table.project),
|
|
69
|
+
organizationIdx: index('pipeline_organization_idx').on(table.organization),
|
|
70
|
+
orgIdIdx: index('pipeline_org_id_idx').on(table.orgId),
|
|
71
|
+
activeIdx: index('pipeline_active_idx').on(table.isActive),
|
|
72
|
+
createdAtIdx: index('pipeline_created_at_idx').on(table.createdAt),
|
|
73
|
+
updatedAtIdx: index('pipeline_updated_at_idx').on(table.updatedAt),
|
|
74
|
+
// Composite index for common access pattern (orgId + isActive)
|
|
75
|
+
orgActiveIdx: index('pipeline_org_active_idx').on(table.orgId, table.isActive),
|
|
76
|
+
// Composite index for filtered queries (orgId + accessModifier + isActive)
|
|
77
|
+
orgAccessActiveIdx: index('pipeline_org_access_active_idx').on(table.orgId, table.accessModifier, table.isActive),
|
|
78
|
+
// Partial index for active-only queries (smaller, faster than full index)
|
|
79
|
+
activeOnlyOrgIdx: index('pipeline_active_only_org_idx').on(table.orgId, table.createdAt).where(sql `is_active = true`),
|
|
80
|
+
// Unique constraint on project + organization + orgId
|
|
81
|
+
projectOrgUnique: uniqueIndex('pipeline_project_org_unique')
|
|
82
|
+
.on(table.project, table.organization, table.orgId),
|
|
83
|
+
}));
|
|
84
|
+
/**
|
|
85
|
+
* Pipeline deployment registry.
|
|
86
|
+
* Maps deployed CodePipeline ARNs back to pipeline records and org IDs.
|
|
87
|
+
* Populated by the deploy command after successful CDK deploy.
|
|
88
|
+
* Used by the pipeline-events Lambda to resolve EventBridge events to org-scoped records.
|
|
89
|
+
*
|
|
90
|
+
* @table pipeline_registry
|
|
91
|
+
*/
|
|
92
|
+
export const pipelineRegistry = pgTable('pipeline_registry', {
|
|
93
|
+
id: uuid('id').primaryKey().defaultRandom(),
|
|
94
|
+
// The platform's pipeline record id — a STABLE uuid created with the pipeline
|
|
95
|
+
// record, known at CDK synth, and applied to the live CodePipeline as the
|
|
96
|
+
// `PIPELINE_EVENT_ID` tag. The events Lambda reads that tag and reports
|
|
97
|
+
// against this id, so it IS the event join key (replacing the masked ARN —
|
|
98
|
+
// it carries no AWS account/region, so no masking is needed). Unique: one
|
|
99
|
+
// registry row per pipeline + the upsert key for (re)registration.
|
|
100
|
+
pipelineId: uuid('pipeline_id').notNull().unique(),
|
|
101
|
+
orgId: varchar('org_id', { length: 255 }).notNull(),
|
|
102
|
+
pipelineName: varchar('pipeline_name', { length: 255 }).notNull(),
|
|
103
|
+
region: varchar('region', { length: 30 }),
|
|
104
|
+
project: varchar('project', { length: 255 }),
|
|
105
|
+
organization: varchar('organization', { length: 255 }),
|
|
106
|
+
lastDeployed: timestamp('last_deployed', { withTimezone: true }),
|
|
107
|
+
stackName: varchar('stack_name', { length: 255 }),
|
|
108
|
+
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
109
|
+
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
110
|
+
}, (table) => ({
|
|
111
|
+
orgIdIdx: index('registry_org_id_idx').on(table.orgId),
|
|
112
|
+
orgRegionIdx: index('registry_org_region_idx').on(table.orgId, table.region),
|
|
113
|
+
}));
|
|
114
|
+
/**
|
|
115
|
+
* Pipeline execution and build events.
|
|
116
|
+
* Captures CodePipeline/CodeBuild state changes from EventBridge
|
|
117
|
+
* and plugin Docker build outcomes from BullMQ.
|
|
118
|
+
* All events are org-scoped for multi-tenant reporting.
|
|
119
|
+
*
|
|
120
|
+
* @table pipeline_events
|
|
121
|
+
*/
|
|
122
|
+
export const pipelineEvent = pgTable('pipeline_events', {
|
|
123
|
+
id: uuid('id').primaryKey().defaultRandom(),
|
|
124
|
+
pipelineId: uuid('pipeline_id'),
|
|
125
|
+
orgId: varchar('org_id', { length: 255 }).notNull(),
|
|
126
|
+
eventSource: varchar('event_source', { length: 50 }).$type().notNull(),
|
|
127
|
+
eventType: varchar('event_type', { length: 50 }).$type().notNull(),
|
|
128
|
+
status: varchar('status', { length: 20 }).notNull(),
|
|
129
|
+
executionId: varchar('execution_id', { length: 255 }),
|
|
130
|
+
stageName: varchar('stage_name', { length: 255 }),
|
|
131
|
+
actionName: varchar('action_name', { length: 255 }),
|
|
132
|
+
errorMessage: text('error_message'),
|
|
133
|
+
startedAt: timestamp('started_at', { withTimezone: true }),
|
|
134
|
+
completedAt: timestamp('completed_at', { withTimezone: true }),
|
|
135
|
+
durationMs: integer('duration_ms'),
|
|
136
|
+
detail: jsonb('detail').$type(),
|
|
137
|
+
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
138
|
+
}, (table) => ({
|
|
139
|
+
pipelineIdIdx: index('event_pipeline_id_idx').on(table.pipelineId),
|
|
140
|
+
orgIdIdx: index('event_org_id_idx').on(table.orgId),
|
|
141
|
+
eventTypeIdx: index('event_type_idx').on(table.eventType),
|
|
142
|
+
statusIdx: index('event_status_idx').on(table.status),
|
|
143
|
+
executionIdIdx: index('event_execution_id_idx').on(table.executionId),
|
|
144
|
+
createdAtIdx: index('event_created_at_idx').on(table.createdAt),
|
|
145
|
+
orgTypeCreatedIdx: index('event_org_type_created_idx').on(table.orgId, table.eventType, table.createdAt),
|
|
146
|
+
orgSourceStatusIdx: index('event_org_source_status_idx').on(table.orgId, table.eventSource, table.status),
|
|
147
|
+
// Idempotency: EventBridge → SQS is at-least-once, so the same state-change
|
|
148
|
+
// can be delivered twice. This partial unique index dedups re-deliveries
|
|
149
|
+
// (paired with `onConflictDoNothing` in reporting-service.ingestEvents).
|
|
150
|
+
// Partial (execution_id IS NOT NULL) because that's the natural per-event
|
|
151
|
+
// key; events without an executionId (rare) aren't deduped, which is safe.
|
|
152
|
+
// Includes pipeline_id so a (theoretical) execution-id reuse across pipelines
|
|
153
|
+
// can't collide now that the ARN is no longer part of the row.
|
|
154
|
+
//
|
|
155
|
+
// COALESCE the nullable parts to sentinels (expression index): PIPELINE/STAGE/
|
|
156
|
+
// BUILD events leave stage_name/action_name NULL (plugin-build also pipeline_id
|
|
157
|
+
// NULL), and Postgres treats NULLs as DISTINCT in a unique index — so the plain
|
|
158
|
+
// column index never matches for those types and onConflictDoNothing can't dedup
|
|
159
|
+
// their at-least-once re-deliveries. Collapsing NULL→'' makes equal events equal.
|
|
160
|
+
// (drizzle's uniqueIndex can't express NULLS NOT DISTINCT on a partial index, so
|
|
161
|
+
// we use the equivalent expression index.) MIGRATION REQUIRED: drizzle-kit generate.
|
|
162
|
+
dedupIdx: uniqueIndex('event_dedup_idx')
|
|
163
|
+
.on(sql `coalesce(${table.pipelineId}::text, '')`, table.executionId, table.eventType, table.status, sql `coalesce(${table.stageName}, '')`, sql `coalesce(${table.actionName}, '')`)
|
|
164
|
+
.where(sql `execution_id IS NOT NULL`),
|
|
165
|
+
}));
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGF0YWJhc2Uvc2NoZW1hL3BpcGVsaW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQXFCLE1BQU0sNEJBQTRCLENBQUM7QUFDOUYsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUEwQjNIOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsRUFBRTtJQUMzQyxjQUFjO0lBQ2QsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxhQUFhLEVBQUU7SUFFM0Msa0NBQWtDO0lBQ2xDLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO1NBQ3RDLE9BQU8sQ0FBQyxhQUFhLENBQUM7U0FDdEIsT0FBTyxFQUFFO0lBRVosZUFBZTtJQUNmLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDO1NBQzFCLE9BQU8sQ0FBQyxhQUFhLENBQUM7U0FDdEIsT0FBTyxFQUFFO0lBQ1osU0FBUyxFQUFFLFNBQVMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDdkQsVUFBVSxFQUFFO1NBQ1osT0FBTyxFQUFFO0lBQ1osU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDMUIsT0FBTyxDQUFDLGFBQWEsQ0FBQztTQUN0QixP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QUFHLENBQUEsMEJBQTBCLENBQUM7Q0FDeEMsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgQWNjZXNzTW9kaWZpZXIsIFNZU1RFTV9PUkdfSUQsIHR5cGUgTWV0YURhdGFUeXBlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgc3FsIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHsgYm9vbGVhbiwgaW50ZWdlciwgdmFyY2hhciwgcGdUYWJsZSwgdGV4dCwgdGltZXN0YW1wLCB1dWlkLCBqc29uYiwgaW5kZXgsIHVuaXF1ZUluZGV4IH0gZnJvbSAnZHJpenpsZS1vcm0vcGctY29yZSc7XG5cbi8qKlxuICogUGlwZWxpbmUgYnVpbGRlciBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgc3RvcmVkIGluIGRhdGFiYXNlLlxuICogTWlycm9ycyB0aGUgY2Fub25pY2FsIEJ1aWxkZXJQcm9wcyBmcm9tIHBpcGVsaW5lLWNvcmUgKEpTT04tc2VyaWFsaXphYmxlIGZvcm0pLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lQnVpbGRlckNvbmZpZyB7XG4gIHJlYWRvbmx5IHByb2plY3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgb3JnYW5pemF0aW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBpcGVsaW5lTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgZ2xvYmFsPzogTWV0YURhdGFUeXBlO1xuICByZWFkb25seSBzeW50aDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJlYWRvbmx5IGRlZmF1bHRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJlYWRvbmx5IHJvbGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmVhZG9ubHkgc3RhZ2VzPzogUGlwZWxpbmVTdGFnZUNvbmZpZ1tdO1xufVxuXG4vKipcbiAqIFN0YWdlIGNvbmZpZ3VyYXRpb24gc3RvcmVkIGluIGRhdGFiYXNlIChKU09OLXNlcmlhbGl6YWJsZSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVTdGFnZUNvbmZpZyB7XG4gIHJlYWRvbmx5IHN0YWdlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhbGlhcz86IHN0cmluZztcbiAgcmVhZG9ubHkgc3RlcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG59XG5cbi8qKlxuICogVGFibGUgZm9yIHN0b3JpbmcgcGlwZWxpbmUgaW5zdGFuY2VzIGFuZCB0aGVpciBmdWxsIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogRmVhdHVyZXMgKiAtIEZ1bGwgQnVpbGRlclByb3BzIHNlcmlhbGl6YXRpb24gZm9yIHJlY29uc3RydWN0aW9uXG4gKiAtIE9yZ2FuaXphdGlvbi1sZXZlbCBpc29sYXRpb25cbiAqIC0gUGlwZWxpbmUgc3RhdHVzIHRyYWNraW5nXG4gKiAtIEV4ZWN1dGlvbiBoaXN0b3J5IHRyYWNraW5nXG4gKiAtIEZsZXhpYmxlIHRhZ2dpbmcgc3lzdGVtXG4gKlxuICogQHRhYmxlIHBpcGVsaW5lc1xuICovXG5leHBvcnQgY29uc3QgcGlwZWxpbmUgPSBwZ1RhYmxlKCdwaXBlbGluZXMnLCB7XG4gIC8vIFByaW1hcnkga2V5XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG5cbiAgLy8gT3JnYW5pemF0aW9uIGFuZCBhY2Nlc3MgY29udHJvbFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KVxuICAgIC5kZWZhdWx0KFNZU1RFTV9PUkdfSUQpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBBdWRpdCBmaWVsZHNcbiAgY3JlYXRlZEJ5OiB0ZXh0KCdjcmVhdGVkX2J5JylcbiAgICAuZGVmYXVsdChTWVNURU1fT1JHX0lEKVxuICAgIC5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSlcbiAgICAuZGVmYXVsdE5vdygpXG4gICAgLm5vdE51bGwoKSxcbiAgdXBkYXRlZEJ5OiB0ZXh0KCd1cGRhdGVkX2J5JylcbiAgICAuZGVmYXVsdChTWVNURU1fT1JHX0lEKVxuICAgIC5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSlcbiAgICAuZGVmYXVsdE5vdygpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBDb3JlIHBpcGVsaW5lIGluZm9ybWF0aW9uXG4gIHByb2plY3Q6IHZhcmNoYXIoJ3Byb2plY3QnLCB7IGxlbmd0aDogMjU1IH0pXG4gICAgLm5vdE51bGwoKSxcbiAgb3JnYW5pemF0aW9uOiB2YXJjaGFyKCdvcmdhbml6YXRpb24nLCB7IGxlbmd0aDogMjU1IH0pXG4gICAgLm5vdE51bGwoKSxcbiAgcGlwZWxpbmVOYW1lOiB2YXJjaGFyKCdwaXBlbGluZV9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgZGVzY3JpcHRpb246IHRleHQoJ2Rlc2NyaXB0aW9uJyksXG4gIGtleXdvcmRzOiBqc29uYigna2V5d29yZHMnKVxuICAgIC4kdHlwZTxzdHJpbmdbXT4oKVxuICAgIC5kZWZhdWx0KFtdKVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gUGlwZWxpbmUgY29uZmlndXJhdGlvblxuICBwcm9wczoganNvbmIoJ3Byb3BzJylcbiAgICAuJHR5cGU8UGlwZWxpbmVCdWlsZGVyQ29uZmlnPigpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBBY2Nlc3MgYW5kIHZpc2liaWxpdHlcbiAgYWNjZXNzTW9kaWZpZXI6IHZhcmNoYXIoJ2FjY2Vzc19tb2RpZmllcicsIHsgbGVuZ3RoOiAxMCB9KVxuICAgIC4kdHlwZTxBY2Nlc3NNb2RpZmllcj4oKVxuICAgIC5kZWZhdWx0KCdwcml2YXRlJyBhcyBBY2Nlc3NNb2RpZmllcilcbiAgICAubm90TnVsbCgpLFxuICBpc0RlZmF1bHQ6IGJvb2xlYW4oJ2lzX2RlZmF1bHQnKVxuICAgIC5kZWZhdWx0KGZhbHNlKVxuICAgIC5ub3ROdWxsKCksXG4gIGlzQWN0aXZlOiBib29sZWFuKCdpc19hY3RpdmUnKVxuICAgIC5kZWZhdWx0KHRydWUpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBEZWxldGlvbiB0cmFja2luZyAoc29mdCBkZWxldGUpXG4gIGRlbGV0ZWRBdDogdGltZXN0YW1wKCdkZWxldGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGRlbGV0ZWRCeTogdGV4dCgnZGVsZXRlZF9ieScpLFxufSwgKHRhYmxlKSA9PiAoe1xuICAvLyBJbmRleGVzIGZvciBjb21tb24gcXVlcmllc1xuICBwcm9qZWN0SWR4OiBpbmRleCgncGlwZWxpbmVfcHJvamVjdF9pZHgnKS5vbih0YWJsZS5wcm9qZWN0KSxcbiAgb3JnYW5pemF0aW9uSWR4OiBpbmRleCgncGlwZWxpbmVfb3JnYW5pemF0aW9uX2lkeCcpLm9uKHRhYmxlLm9yZ2FuaXphdGlvbiksXG4gIG9yZ0lkSWR4OiBpbmRleCgncGlwZWxpbmVfb3JnX2lkX2lkeCcpLm9uKHRhYmxlLm9yZ0lkKSxcbiAgYWN0aXZlSWR4OiBpbmRleCgncGlwZWxpbmVfYWN0aXZlX2lkeCcpLm9uKHRhYmxlLmlzQWN0aXZlKSxcbiAgY3JlYXRlZEF0SWR4OiBpbmRleCgncGlwZWxpbmVfY3JlYXRlZF9hdF9pZHgnKS5vbih0YWJsZS5jcmVhdGVkQXQpLFxuICB1cGRhdGVkQXRJZHg6IGluZGV4KCdwaXBlbGluZV91cGRhdGVkX2F0X2lkeCcpLm9uKHRhYmxlLnVwZGF0ZWRBdCksXG5cbiAgLy8gQ29tcG9zaXRlIGluZGV4IGZvciBjb21tb24gYWNjZXNzIHBhdHRlcm4gKG9yZ0lkICsgaXNBY3RpdmUpXG4gIG9yZ0FjdGl2ZUlkeDogaW5kZXgoJ3BpcGVsaW5lX29yZ19hY3RpdmVfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmlzQWN0aXZlKSxcblxuICAvLyBDb21wb3NpdGUgaW5kZXggZm9yIGZpbHRlcmVkIHF1ZXJpZXMgKG9yZ0lkICsgYWNjZXNzTW9kaWZpZXIgKyBpc0FjdGl2ZSlcbiAgb3JnQWNjZXNzQWN0aXZlSWR4OiBpbmRleCgncGlwZWxpbmVfb3JnX2FjY2Vzc19hY3RpdmVfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmFjY2Vzc01vZGlmaWVyLCB0YWJsZS5pc0FjdGl2ZSksXG5cbiAgLy8gUGFydGlhbCBpbmRleCBmb3IgYWN0aXZlLW9ubHkgcXVlcmllcyAoc21hbGxlciwgZmFzdGVyIHRoYW4gZnVsbCBpbmRleClcbiAgYWN0aXZlT25seU9yZ0lkeDogaW5kZXgoJ3BpcGVsaW5lX2FjdGl2ZV9vbmx5X29yZ19pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuY3JlYXRlZEF0KS53aGVyZShzcWxgaXNfYWN0aXZlID0gdHJ1ZWApLFxuXG4gIC8vIFVuaXF1ZSBjb25zdHJhaW50IG9uIHByb2plY3QgKyBvcmdhbml6YXRpb24gKyBvcmdJZFxuICBwcm9qZWN0T3JnVW5pcXVlOiB1bmlxdWVJbmRleCgncGlwZWxpbmVfcHJvamVjdF9vcmdfdW5pcXVlJylcbiAgICAub24odGFibGUucHJvamVjdCwgdGFibGUub3JnYW5pemF0aW9uLCB0YWJsZS5vcmdJZCksXG59KSk7XG5cbi8qKlxuICogUGlwZWxpbmUgZGVwbG95bWVudCByZWdpc3RyeS5cbiAqIE1hcHMgZGVwbG95ZWQgQ29kZVBpcGVsaW5lIEFSTnMgYmFjayB0byBwaXBlbGluZSByZWNvcmRzIGFuZCBvcmcgSURzLlxuICogUG9wdWxhdGVkIGJ5IHRoZSBkZXBsb3kgY29tbWFuZCBhZnRlciBzdWNjZXNzZnVsIENESyBkZXBsb3kuXG4gKiBVc2VkIGJ5IHRoZSBwaXBlbGluZS1ldmVudHMgTGFtYmRhIHRvIHJlc29sdmUgRXZlbnRCcmlkZ2UgZXZlbnRzIHRvIG9yZy1zY29wZWQgcmVjb3Jkcy5cbiAqXG4gKiBAdGFibGUgcGlwZWxpbmVfcmVnaXN0cnlcbiAqL1xuZXhwb3J0IGNvbnN0IHBpcGVsaW5lUmVnaXN0cnkgPSBwZ1RhYmxlKCdwaXBlbGluZV9yZWdpc3RyeScsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgLy8gVGhlIHBsYXRmb3JtJ3MgcGlwZWxpbmUgcmVjb3JkIGlkIOKAlCBhIFNUQUJMRSB1dWlkIGNyZWF0ZWQgd2l0aCB0aGUgcGlwZWxpbmVcbiAgLy8gcmVjb3JkLCBrbm93biBhdCBDREsgc3ludGgsIGFuZCBhcHBsaWVkIHRvIHRoZSBsaXZlIENvZGVQaXBlbGluZSBhcyB0aGVcbiAgLy8gYFBJUEVMSU5FX0VWRU5UX0lEYCB0YWcuIFRoZSBldmVudHMgTGFtYmRhIHJlYWRzIHRoYXQgdGFnIGFuZCByZXBvcnRzXG4gIC8vIGFnYWluc3QgdGhpcyBpZCwgc28gaXQgSVMgdGhlIGV2ZW50IGpvaW4ga2V5IChyZXBsYWNpbmcgdGhlIG1hc2tlZCBBUk4g4oCUXG4gIC8vIGl0IGNhcnJpZXMgbm8gQVdTIGFjY291bnQvcmVnaW9uLCBzbyBubyBtYXNraW5nIGlzIG5lZWRlZCkuIFVuaXF1ZTogb25lXG4gIC8vIHJlZ2lzdHJ5IHJvdyBwZXIgcGlwZWxpbmUgKyB0aGUgdXBzZXJ0IGtleSBmb3IgKHJlKXJlZ2lzdHJhdGlvbi5cbiAgcGlwZWxpbmVJZDogdXVpZCgncGlwZWxpbmVfaWQnKS5ub3ROdWxsKCkudW5pcXVlKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgcGlwZWxpbmVOYW1lOiB2YXJjaGFyKCdwaXBlbGluZV9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHJlZ2lvbjogdmFyY2hhcigncmVnaW9uJywgeyBsZW5ndGg6IDMwIH0pLFxuICBwcm9qZWN0OiB2YXJjaGFyKCdwcm9qZWN0JywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgb3JnYW5pemF0aW9uOiB2YXJjaGFyKCdvcmdhbml6YXRpb24nLCB7IGxlbmd0aDogMjU1IH0pLFxuICBsYXN0RGVwbG95ZWQ6IHRpbWVzdGFtcCgnbGFzdF9kZXBsb3llZCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBzdGFja05hbWU6IHZhcmNoYXIoJ3N0YWNrX25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgb3JnSWRJZHg6IGluZGV4KCdyZWdpc3RyeV9vcmdfaWRfaWR4Jykub24odGFibGUub3JnSWQpLFxuICBvcmdSZWdpb25JZHg6IGluZGV4KCdyZWdpc3RyeV9vcmdfcmVnaW9uX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5yZWdpb24pLFxufSkpO1xuXG4vKipcbiAqIEV2ZW50IHNvdXJjZSBpZGVudGlmaWVycyBmb3IgcGlwZWxpbmVfZXZlbnRzLlxuICovXG5leHBvcnQgdHlwZSBFdmVudFNvdXJjZSA9ICdjb2RlcGlwZWxpbmUnIHwgJ2NvZGVidWlsZCcgfCAncGx1Z2luLWJ1aWxkJztcblxuLyoqXG4gKiBFdmVudCB0eXBlIGdyYW51bGFyaXR5IGxldmVscyBmb3IgcGlwZWxpbmVfZXZlbnRzLlxuICovXG5leHBvcnQgdHlwZSBFdmVudFR5cGUgPSAnUElQRUxJTkUnIHwgJ1NUQUdFJyB8ICdBQ1RJT04nIHwgJ0JVSUxEJztcblxuLyoqXG4gKiBQaXBlbGluZSBleGVjdXRpb24gYW5kIGJ1aWxkIGV2ZW50cy5cbiAqIENhcHR1cmVzIENvZGVQaXBlbGluZS9Db2RlQnVpbGQgc3RhdGUgY2hhbmdlcyBmcm9tIEV2ZW50QnJpZGdlXG4gKiBhbmQgcGx1Z2luIERvY2tlciBidWlsZCBvdXRjb21lcyBmcm9tIEJ1bGxNUS5cbiAqIEFsbCBldmVudHMgYXJlIG9yZy1zY29wZWQgZm9yIG11bHRpLXRlbmFudCByZXBvcnRpbmcuXG4gKlxuICogQHRhYmxlIHBpcGVsaW5lX2V2ZW50c1xuICovXG5leHBvcnQgY29uc3QgcGlwZWxpbmVFdmVudCA9IHBnVGFibGUoJ3BpcGVsaW5lX2V2ZW50cycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgcGlwZWxpbmVJZDogdXVpZCgncGlwZWxpbmVfaWQnKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBldmVudFNvdXJjZTogdmFyY2hhcignZXZlbnRfc291cmNlJywgeyBsZW5ndGg6IDUwIH0pLiR0eXBlPEV2ZW50U291cmNlPigpLm5vdE51bGwoKSxcbiAgZXZlbnRUeXBlOiB2YXJjaGFyKCdldmVudF90eXBlJywgeyBsZW5ndGg6IDUwIH0pLiR0eXBlPEV2ZW50VHlwZT4oKS5ub3ROdWxsKCksXG4gIHN0YXR1czogdmFyY2hhcignc3RhdHVzJywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSxcbiAgZXhlY3V0aW9uSWQ6IHZhcmNoYXIoJ2V4ZWN1dGlvbl9pZCcsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIHN0YWdlTmFtZTogdmFyY2hhcignc3RhZ2VfbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIGFjdGlvbk5hbWU6IHZhcmNoYXIoJ2FjdGlvbl9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgZXJyb3JNZXNzYWdlOiB0ZXh0KCdlcnJvcl9tZXNzYWdlJyksXG4gIHN0YXJ0ZWRBdDogdGltZXN0YW1wKCdzdGFydGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGNvbXBsZXRlZEF0OiB0aW1lc3RhbXAoJ2NvbXBsZXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBkdXJhdGlvbk1zOiBpbnRlZ2VyKCdkdXJhdGlvbl9tcycpLFxuICBkZXRhaWw6IGpzb25iKCdkZXRhaWwnKS4kdHlwZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBwaXBlbGluZUlkSWR4OiBpbmRleCgnZXZlbnRfcGlwZWxpbmVfaWRfaWR4Jykub24odGFibGUucGlwZWxpbmVJZCksXG4gIG9yZ0lkSWR4OiBpbmRleCgnZXZlbnRfb3JnX2lkX2lkeCcpLm9uKHRhYmxlLm9yZ0lkKSxcbiAgZXZlbnRUeXBlSWR4OiBpbmRleCgnZXZlbnRfdHlwZV9pZHgnKS5vbih0YWJsZS5ldmVudFR5cGUpLFxuICBzdGF0dXNJZHg6IGluZGV4KCdldmVudF9zdGF0dXNfaWR4Jykub24odGFibGUuc3RhdHVzKSxcbiAgZXhlY3V0aW9uSWRJZHg6IGluZGV4KCdldmVudF9leGVjdXRpb25faWRfaWR4Jykub24odGFibGUuZXhlY3V0aW9uSWQpLFxuICBjcmVhdGVkQXRJZHg6IGluZGV4KCdldmVudF9jcmVhdGVkX2F0X2lkeCcpLm9uKHRhYmxlLmNyZWF0ZWRBdCksXG4gIG9yZ1R5cGVDcmVhdGVkSWR4OiBpbmRleCgnZXZlbnRfb3JnX3R5cGVfY3JlYXRlZF9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuZXZlbnRUeXBlLCB0YWJsZS5jcmVhdGVkQXQpLFxuICBvcmdTb3VyY2VTdGF0dXNJZHg6IGluZGV4KCdldmVudF9vcmdfc291cmNlX3N0YXR1c19pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuZXZlbnRTb3VyY2UsIHRhYmxlLnN0YXR1cyksXG4gIC8vIElkZW1wb3RlbmN5OiBFdmVudEJyaWRnZSDihpIgU1FTIGlzIGF0LWxlYXN0LW9uY2UsIHNvIHRoZSBzYW1lIHN0YXRlLWNoYW5nZVxuICAvLyBjYW4gYmUgZGVsaXZlcmVkIHR3aWNlLiBUaGlzIHBhcnRpYWwgdW5pcXVlIGluZGV4IGRlZHVwcyByZS1kZWxpdmVyaWVzXG4gIC8vIChwYWlyZWQgd2l0aCBgb25Db25mbGljdERvTm90aGluZ2AgaW4gcmVwb3J0aW5nLXNlcnZpY2UuaW5nZXN0RXZlbnRzKS5cbiAgLy8gUGFydGlhbCAoZXhlY3V0aW9uX2lkIElTIE5PVCBOVUxMKSBiZWNhdXNlIHRoYXQncyB0aGUgbmF0dXJhbCBwZXItZXZlbnRcbiAgLy8ga2V5OyBldmVudHMgd2l0aG91dCBhbiBleGVjdXRpb25JZCAocmFyZSkgYXJlbid0IGRlZHVwZWQsIHdoaWNoIGlzIHNhZmUuXG4gIC8vIEluY2x1ZGVzIHBpcGVsaW5lX2lkIHNvIGEgKHRoZW9yZXRpY2FsKSBleGVjdXRpb24taWQgcmV1c2UgYWNyb3NzIHBpcGVsaW5lc1xuICAvLyBjYW4ndCBjb2xsaWRlIG5vdyB0aGF0IHRoZSBBUk4gaXMgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIHJvdy5cbiAgLy9cbiAgLy8gQ09BTEVTQ0UgdGhlIG51bGxhYmxlIHBhcnRzIHRvIHNlbnRpbmVscyAoZXhwcmVzc2lvbiBpbmRleCk6IFBJUEVMSU5FL1NUQUdFL1xuICAvLyBCVUlMRCBldmVudHMgbGVhdmUgc3RhZ2VfbmFtZS9hY3Rpb25fbmFtZSBOVUxMIChwbHVnaW4tYnVpbGQgYWxzbyBwaXBlbGluZV9pZFxuICAvLyBOVUxMKSwgYW5kIFBvc3RncmVzIHRyZWF0cyBOVUxMcyBhcyBESVNUSU5DVCBpbiBhIHVuaXF1ZSBpbmRleCDigJQgc28gdGhlIHBsYWluXG4gIC8vIGNvbHVtbiBpbmRleCBuZXZlciBtYXRjaGVzIGZvciB0aG9zZSB0eXBlcyBhbmQgb25Db25mbGljdERvTm90aGluZyBjYW4ndCBkZWR1cFxuICAvLyB0aGVpciBhdC1sZWFzdC1vbmNlIHJlLWRlbGl2ZXJpZXMuIENvbGxhcHNpbmcgTlVMTOKGkicnIG1ha2VzIGVxdWFsIGV2ZW50cyBlcXVhbC5cbiAgLy8gKGRyaXp6bGUncyB1bmlxdWVJbmRleCBjYW4ndCBleHByZXNzIE5VTExTIE5PVCBESVNUSU5DVCBvbiBhIHBhcnRpYWwgaW5kZXgsIHNvXG4gIC8vIHdlIHVzZSB0aGUgZXF1aXZhbGVudCBleHByZXNzaW9uIGluZGV4LikgTUlHUkFUSU9OIFJFUVVJUkVEOiBkcml6emxlLWtpdCBnZW5lcmF0ZS5cbiAgZGVkdXBJZHg6IHVuaXF1ZUluZGV4KCdldmVudF9kZWR1cF9pZHgnKVxuICAgIC5vbihcbiAgICAgIHNxbGBjb2FsZXNjZSgke3RhYmxlLnBpcGVsaW5lSWR9Ojp0ZXh0LCAnJylgLFxuICAgICAgdGFibGUuZXhlY3V0aW9uSWQsXG4gICAgICB0YWJsZS5ldmVudFR5cGUsXG4gICAgICB0YWJsZS5zdGF0dXMsXG4gICAgICBzcWxgY29hbGVzY2UoJHt0YWJsZS5zdGFnZU5hbWV9LCAnJylgLFxuICAgICAgc3FsYGNvYWxlc2NlKCR7dGFibGUuYWN0aW9uTmFtZX0sICcnKWAsXG4gICAgKVxuICAgIC53aGVyZShzcWxgZXhlY3V0aW9uX2lkIElTIE5PVCBOVUxMYCksXG59KSk7XG5cbi8qKlxuICogVHlwZVNjcmlwdCB0eXBlcyByZXByZXNlbnRpbmcgZGF0YWJhc2Ugcm93c1xuICovXG5leHBvcnQgdHlwZSBQaXBlbGluZSA9IHR5cGVvZiBwaXBlbGluZS4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBQaXBlbGluZUluc2VydCA9IHR5cGVvZiBwaXBlbGluZS4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIFBpcGVsaW5lUmVnaXN0cnkgPSB0eXBlb2YgcGlwZWxpbmVSZWdpc3RyeS4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBQaXBlbGluZVJlZ2lzdHJ5SW5zZXJ0ID0gdHlwZW9mIHBpcGVsaW5lUmVnaXN0cnkuJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBQaXBlbGluZUV2ZW50ID0gdHlwZW9mIHBpcGVsaW5lRXZlbnQuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgUGlwZWxpbmVFdmVudEluc2VydCA9IHR5cGVvZiBwaXBlbGluZUV2ZW50LiRpbmZlckluc2VydDtcblxuLyoqXG4gKiBIZWxwZXIgdHlwZXMgZm9yIHdvcmtpbmcgd2l0aCBwYXJ0aWFsIHVwZGF0ZXNcbiAqL1xuZXhwb3J0IHR5cGUgUGlwZWxpbmVVcGRhdGUgPSBQYXJ0aWFsPE9taXQ8UGlwZWxpbmVJbnNlcnQsICdpZCcgfCAnY3JlYXRlZEF0JyB8ICdjcmVhdGVkQnknPj47XG4iXX0=
|