@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.
@@ -1,958 +1,24 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- import { AccessModifier, ComputeType, PluginType } from '@pipeline-builder/api-core';
4
- import { sql } from 'drizzle-orm';
5
- import { boolean, integer, varchar, pgTable, text, timestamp, uuid, jsonb, index, uniqueIndex, check } from 'drizzle-orm/pg-core';
6
- /**
7
- * Table for storing reusable plugin configurations.
8
- * Plugins define the behavior of synth/build steps in CDK pipelines.
9
- *
10
- * Features * - Versioning support with semantic versioning
11
- * - Access control via orgId and accessModifier
12
- * - Full audit trail (created/updated by/at)
13
- * - Flexible metadata storage via JSONB
14
- * - Support for both ShellStep and CodeBuildStep types
15
- *
16
- * @table plugins
17
- */
18
- export const plugin = pgTable('plugins', {
19
- // Primary key
20
- id: uuid('id').primaryKey().defaultRandom(),
21
- // Organization and access control
22
- orgId: varchar('org_id', { length: 255 })
23
- .default('system')
24
- .notNull(),
25
- // Audit fields
26
- createdBy: text('created_by')
27
- .default('system')
28
- .notNull(),
29
- createdAt: timestamp('created_at', { withTimezone: true })
30
- .defaultNow()
31
- .notNull(),
32
- updatedBy: text('updated_by')
33
- .default('system')
34
- .notNull(),
35
- updatedAt: timestamp('updated_at', { withTimezone: true })
36
- .defaultNow()
37
- .notNull(),
38
- // Core plugin information
39
- name: varchar('name', { length: 255 })
40
- .notNull(),
41
- description: text('description'),
42
- keywords: jsonb('keywords')
43
- .$type()
44
- .default([])
45
- .notNull(),
46
- version: varchar('version', { length: 50 })
47
- .default('1.0.0')
48
- .notNull(),
49
- // Plugin classification
50
- category: varchar('category', { length: 50 })
51
- .default('unknown')
52
- .notNull(),
53
- // Plugin configuration
54
- metadata: jsonb('metadata')
55
- .$type()
56
- .default({})
57
- .notNull(),
58
- pluginType: varchar('plugin_type', { length: 50 })
59
- .$type()
60
- .default('CodeBuildStep')
61
- .notNull(),
62
- computeType: varchar('compute_type', { length: 50 })
63
- .$type()
64
- .default('SMALL')
65
- .notNull(),
66
- timeout: integer('timeout'),
67
- failureBehavior: varchar('failure_behavior', { length: 10 })
68
- .$type()
69
- .default('fail')
70
- .notNull(),
71
- secrets: jsonb('secrets')
72
- .$type()
73
- .default([])
74
- .notNull(),
75
- primaryOutputDirectory: varchar('primary_output_directory', { length: 28 }),
76
- // Build configuration
77
- env: jsonb('env')
78
- .$type()
79
- .default({})
80
- .notNull(),
81
- buildArgs: jsonb('build_args')
82
- .$type()
83
- .default({})
84
- .notNull(),
85
- installCommands: text('install_commands')
86
- .array()
87
- .default([])
88
- .notNull(),
89
- commands: text('commands')
90
- .array()
91
- .default([])
92
- .notNull(),
93
- // Docker configuration
94
- dockerfile: text('dockerfile'),
95
- buildType: varchar('build_type', { length: 20 })
96
- .default('build_image')
97
- .notNull(),
98
- // Access and visibility
99
- accessModifier: varchar('access_modifier', { length: 10 })
100
- .$type()
101
- .default('private')
102
- .notNull(),
103
- isDefault: boolean('is_default')
104
- .default(false)
105
- .notNull(),
106
- isActive: boolean('is_active')
107
- .default(true)
108
- .notNull(),
109
- // Deletion tracking (soft delete)
110
- deletedAt: timestamp('deleted_at', { withTimezone: true }),
111
- deletedBy: text('deleted_by'),
112
- }, (table) => ({
113
- // Indexes for common queries
114
- nameIdx: index('plugin_name_idx').on(table.name),
115
- orgIdIdx: index('plugin_org_id_idx').on(table.orgId),
116
- versionIdx: index('plugin_version_idx').on(table.version),
117
- activeIdx: index('plugin_active_idx').on(table.isActive),
118
- createdAtIdx: index('plugin_created_at_idx').on(table.createdAt),
119
- updatedAtIdx: index('plugin_updated_at_idx').on(table.updatedAt),
120
- // Category index for filtering
121
- categoryIdx: index('plugin_category_idx').on(table.category),
122
- // Composite index for common access pattern (orgId + isActive)
123
- orgActiveIdx: index('plugin_org_active_idx').on(table.orgId, table.isActive),
124
- // Composite index for filtered queries (orgId + accessModifier + isActive)
125
- orgAccessActiveIdx: index('plugin_org_access_active_idx').on(table.orgId, table.accessModifier, table.isActive),
126
- // Partial index for active-only queries (smaller, faster than full index)
127
- activeOnlyOrgIdx: index('plugin_active_only_org_idx').on(table.orgId, table.createdAt).where(sql `is_active = true`),
128
- // Unique constraint on name + version + orgId
129
- nameVersionOrgUnique: uniqueIndex('plugin_name_version_org_unique')
130
- .on(table.name, table.version, table.orgId),
131
- // Check constraints
132
- versionCheck: check('plugin_version_check', sql `${table.version} ~ '^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.-]+)?(\+[a-zA-Z0-9.-]+)?$'`),
133
- }));
134
- /**
135
- * Table for storing pipeline instances and their full configuration.
136
- *
137
- * Features * - Full BuilderProps serialization for reconstruction
138
- * - Organization-level isolation
139
- * - Pipeline status tracking
140
- * - Execution history tracking
141
- * - Flexible tagging system
142
- *
143
- * @table pipelines
144
- */
145
- export const pipeline = pgTable('pipelines', {
146
- // Primary key
147
- id: uuid('id').primaryKey().defaultRandom(),
148
- // Organization and access control
149
- orgId: varchar('org_id', { length: 255 })
150
- .default('system')
151
- .notNull(),
152
- // Audit fields
153
- createdBy: text('created_by')
154
- .default('system')
155
- .notNull(),
156
- createdAt: timestamp('created_at', { withTimezone: true })
157
- .defaultNow()
158
- .notNull(),
159
- updatedBy: text('updated_by')
160
- .default('system')
161
- .notNull(),
162
- updatedAt: timestamp('updated_at', { withTimezone: true })
163
- .defaultNow()
164
- .notNull(),
165
- // Core pipeline information
166
- project: varchar('project', { length: 255 })
167
- .notNull(),
168
- organization: varchar('organization', { length: 255 })
169
- .notNull(),
170
- pipelineName: varchar('pipeline_name', { length: 255 }),
171
- description: text('description'),
172
- keywords: jsonb('keywords')
173
- .$type()
174
- .default([])
175
- .notNull(),
176
- // Pipeline configuration
177
- props: jsonb('props')
178
- .$type()
179
- .notNull(),
180
- // Access and visibility
181
- accessModifier: varchar('access_modifier', { length: 10 })
182
- .$type()
183
- .default('private')
184
- .notNull(),
185
- isDefault: boolean('is_default')
186
- .default(false)
187
- .notNull(),
188
- isActive: boolean('is_active')
189
- .default(true)
190
- .notNull(),
191
- // Deletion tracking (soft delete)
192
- deletedAt: timestamp('deleted_at', { withTimezone: true }),
193
- deletedBy: text('deleted_by'),
194
- }, (table) => ({
195
- // Indexes for common queries
196
- projectIdx: index('pipeline_project_idx').on(table.project),
197
- organizationIdx: index('pipeline_organization_idx').on(table.organization),
198
- orgIdIdx: index('pipeline_org_id_idx').on(table.orgId),
199
- activeIdx: index('pipeline_active_idx').on(table.isActive),
200
- createdAtIdx: index('pipeline_created_at_idx').on(table.createdAt),
201
- updatedAtIdx: index('pipeline_updated_at_idx').on(table.updatedAt),
202
- // Composite index for common access pattern (orgId + isActive)
203
- orgActiveIdx: index('pipeline_org_active_idx').on(table.orgId, table.isActive),
204
- // Composite index for filtered queries (orgId + accessModifier + isActive)
205
- orgAccessActiveIdx: index('pipeline_org_access_active_idx').on(table.orgId, table.accessModifier, table.isActive),
206
- // Partial index for active-only queries (smaller, faster than full index)
207
- activeOnlyOrgIdx: index('pipeline_active_only_org_idx').on(table.orgId, table.createdAt).where(sql `is_active = true`),
208
- // Unique constraint on project + organization + orgId
209
- projectOrgUnique: uniqueIndex('pipeline_project_org_unique')
210
- .on(table.project, table.organization, table.orgId),
211
- }));
212
- /**
213
- * Table for storing internal messages between organizations and the system org.
214
- *
215
- * Features * - Announcements: System org broadcasts to all orgs (recipientOrgId = '*')
216
- * - Conversations: Two-way threaded messaging between an org and system org
217
- * - Thread support via threadId (null for root messages, references root for replies)
218
- * - Read tracking per message
219
- * - Priority levels (normal, high, urgent)
220
- * - Soft delete support
221
- *
222
- * @table messages
223
- */
224
- export const message = pgTable('messages', {
225
- // Primary key
226
- id: uuid('id').primaryKey().defaultRandom(),
227
- // Organization and access control
228
- orgId: varchar('org_id', { length: 255 })
229
- .default('system')
230
- .notNull(),
231
- // Audit fields
232
- createdBy: text('created_by')
233
- .default('system')
234
- .notNull(),
235
- createdAt: timestamp('created_at', { withTimezone: true })
236
- .defaultNow()
237
- .notNull(),
238
- updatedBy: text('updated_by')
239
- .default('system')
240
- .notNull(),
241
- updatedAt: timestamp('updated_at', { withTimezone: true })
242
- .defaultNow()
243
- .notNull(),
244
- // Threading
245
- threadId: uuid('thread_id'),
246
- // Message routing
247
- recipientOrgId: varchar('recipient_org_id', { length: 255 })
248
- .notNull(),
249
- // Message content
250
- messageType: varchar('message_type', { length: 20 })
251
- .$type()
252
- .default('conversation')
253
- .notNull(),
254
- // Logical channel/inbox bucket — 'support', 'help', etc. Nullable so
255
- // org-to-org conversations (which aren't channel-scoped) can omit it.
256
- channel: varchar('channel', { length: 50 }),
257
- subject: varchar('subject', { length: 500 })
258
- .notNull(),
259
- content: text('content')
260
- .notNull(),
261
- // Status
262
- // `readBy` is the per-participant read-receipt map: orgId → ISO timestamp.
263
- // Recipient marking the thread does NOT flip sender's view. Empty `{}`
264
- // means nobody has read it yet.
265
- readBy: jsonb('read_by')
266
- .$type()
267
- .default({})
268
- .notNull(),
269
- priority: varchar('priority', { length: 20 })
270
- .$type()
271
- .default('normal')
272
- .notNull(),
273
- // Access and visibility
274
- accessModifier: varchar('access_modifier', { length: 10 })
275
- .$type()
276
- .default('private')
277
- .notNull(),
278
- isDefault: boolean('is_default')
279
- .default(false)
280
- .notNull(),
281
- isActive: boolean('is_active')
282
- .default(true)
283
- .notNull(),
284
- // Deletion tracking (soft delete)
285
- deletedAt: timestamp('deleted_at', { withTimezone: true }),
286
- deletedBy: text('deleted_by'),
287
- }, (table) => ({
288
- // Indexes for common queries
289
- orgIdIdx: index('message_org_id_idx').on(table.orgId),
290
- recipientOrgIdIdx: index('message_recipient_org_id_idx').on(table.recipientOrgId),
291
- threadIdIdx: index('message_thread_id_idx').on(table.threadId),
292
- messageTypeIdx: index('message_message_type_idx').on(table.messageType),
293
- channelIdx: index('message_channel_idx').on(table.channel),
294
- createdAtIdx: index('message_created_at_idx').on(table.createdAt),
295
- activeIdx: index('message_active_idx').on(table.isActive),
296
- // Composite index for inbox queries (recipient + active + created)
297
- recipientActiveCreatedIdx: index('message_recipient_active_created_idx')
298
- .on(table.recipientOrgId, table.isActive, table.createdAt),
299
- // Composite index for org inbox (orgId + active)
300
- orgActiveIdx: index('message_org_active_idx').on(table.orgId, table.isActive),
301
- }));
302
- /**
303
- * Pipeline deployment registry.
304
- * Maps deployed CodePipeline ARNs back to pipeline records and org IDs.
305
- * Populated by the deploy command after successful CDK deploy.
306
- * Used by the pipeline-events Lambda to resolve EventBridge events to org-scoped records.
307
- *
308
- * @table pipeline_registry
309
- */
310
- export const pipelineRegistry = pgTable('pipeline_registry', {
311
- id: uuid('id').primaryKey().defaultRandom(),
312
- // The platform's pipeline record id — a STABLE uuid created with the pipeline
313
- // record, known at CDK synth, and applied to the live CodePipeline as the
314
- // `PIPELINE_EVENT_ID` tag. The events Lambda reads that tag and reports
315
- // against this id, so it IS the event join key (replacing the masked ARN —
316
- // it carries no AWS account/region, so no masking is needed). Unique: one
317
- // registry row per pipeline + the upsert key for (re)registration.
318
- pipelineId: uuid('pipeline_id').notNull().unique(),
319
- orgId: varchar('org_id', { length: 255 }).notNull(),
320
- pipelineName: varchar('pipeline_name', { length: 255 }).notNull(),
321
- region: varchar('region', { length: 30 }),
322
- project: varchar('project', { length: 255 }),
323
- organization: varchar('organization', { length: 255 }),
324
- lastDeployed: timestamp('last_deployed', { withTimezone: true }),
325
- stackName: varchar('stack_name', { length: 255 }),
326
- createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
327
- updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
328
- }, (table) => ({
329
- orgIdIdx: index('registry_org_id_idx').on(table.orgId),
330
- orgRegionIdx: index('registry_org_region_idx').on(table.orgId, table.region),
331
- }));
332
- /**
333
- * Pipeline execution and build events.
334
- * Captures CodePipeline/CodeBuild state changes from EventBridge
335
- * and plugin Docker build outcomes from BullMQ.
336
- * All events are org-scoped for multi-tenant reporting.
337
- *
338
- * @table pipeline_events
339
- */
340
- export const pipelineEvent = pgTable('pipeline_events', {
341
- id: uuid('id').primaryKey().defaultRandom(),
342
- pipelineId: uuid('pipeline_id'),
343
- orgId: varchar('org_id', { length: 255 }).notNull(),
344
- eventSource: varchar('event_source', { length: 50 }).$type().notNull(),
345
- eventType: varchar('event_type', { length: 50 }).$type().notNull(),
346
- status: varchar('status', { length: 20 }).notNull(),
347
- executionId: varchar('execution_id', { length: 255 }),
348
- stageName: varchar('stage_name', { length: 255 }),
349
- actionName: varchar('action_name', { length: 255 }),
350
- errorMessage: text('error_message'),
351
- startedAt: timestamp('started_at', { withTimezone: true }),
352
- completedAt: timestamp('completed_at', { withTimezone: true }),
353
- durationMs: integer('duration_ms'),
354
- detail: jsonb('detail').$type(),
355
- createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
356
- }, (table) => ({
357
- pipelineIdIdx: index('event_pipeline_id_idx').on(table.pipelineId),
358
- orgIdIdx: index('event_org_id_idx').on(table.orgId),
359
- eventTypeIdx: index('event_type_idx').on(table.eventType),
360
- statusIdx: index('event_status_idx').on(table.status),
361
- executionIdIdx: index('event_execution_id_idx').on(table.executionId),
362
- createdAtIdx: index('event_created_at_idx').on(table.createdAt),
363
- orgTypeCreatedIdx: index('event_org_type_created_idx').on(table.orgId, table.eventType, table.createdAt),
364
- orgSourceStatusIdx: index('event_org_source_status_idx').on(table.orgId, table.eventSource, table.status),
365
- // Idempotency: EventBridge → SQS is at-least-once, so the same state-change
366
- // can be delivered twice. This partial unique index dedups re-deliveries
367
- // (paired with `onConflictDoNothing` in reporting-service.ingestEvents).
368
- // Partial (execution_id IS NOT NULL) because that's the natural per-event
369
- // key; events without an executionId (rare) aren't deduped, which is safe.
370
- // Includes pipeline_id so a (theoretical) execution-id reuse across pipelines
371
- // can't collide now that the ARN is no longer part of the row.
372
- //
373
- // COALESCE the nullable parts to sentinels (expression index): PIPELINE/STAGE/
374
- // BUILD events leave stage_name/action_name NULL (plugin-build also pipeline_id
375
- // NULL), and Postgres treats NULLs as DISTINCT in a unique index — so the plain
376
- // column index never matches for those types and onConflictDoNothing can't dedup
377
- // their at-least-once re-deliveries. Collapsing NULL→'' makes equal events equal.
378
- // (drizzle's uniqueIndex can't express NULLS NOT DISTINCT on a partial index, so
379
- // we use the equivalent expression index.) MIGRATION REQUIRED: drizzle-kit generate.
380
- dedupIdx: uniqueIndex('event_dedup_idx')
381
- .on(sql `coalesce(${table.pipelineId}::text, '')`, table.executionId, table.eventType, table.status, sql `coalesce(${table.stageName}, '')`, sql `coalesce(${table.actionName}, '')`)
382
- .where(sql `execution_id IS NOT NULL`),
383
- }));
384
- /**
385
- * Compliance policies group rules into named sets that can be enabled/disabled together.
386
- *
387
- * @table compliance_policies
388
- */
389
- export const compliancePolicy = pgTable('compliance_policies', {
390
- id: uuid('id').primaryKey().defaultRandom(),
391
- orgId: varchar('org_id', { length: 255 }).default('system').notNull(),
392
- createdBy: text('created_by').default('system').notNull(),
393
- createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
394
- updatedBy: text('updated_by').default('system').notNull(),
395
- updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
396
- name: varchar('name', { length: 255 }).notNull(),
397
- description: text('description'),
398
- version: varchar('version', { length: 50 }).default('1.0.0').notNull(),
399
- isTemplate: boolean('is_template').default(false).notNull(),
400
- accessModifier: varchar('access_modifier', { length: 10 })
401
- .$type().default('private').notNull(),
402
- isDefault: boolean('is_default').default(false).notNull(),
403
- isActive: boolean('is_active').default(true).notNull(),
404
- deletedAt: timestamp('deleted_at', { withTimezone: true }),
405
- deletedBy: text('deleted_by'),
406
- }, (table) => ({
407
- orgActiveIdx: index('compliance_policy_org_active_idx').on(table.orgId, table.isActive),
408
- templateIdx: index('compliance_policy_template_idx').on(table.isTemplate),
409
- nameOrgVersionUnique: uniqueIndex('compliance_policy_name_org_version_unique')
410
- .on(table.orgId, table.name, table.version),
411
- }));
412
- /**
413
- * Compliance rules define individual checks against plugin/pipeline attributes.
414
- *
415
- * @table compliance_rules
416
- */
417
- export const complianceRule = pgTable('compliance_rules', {
418
- id: uuid('id').primaryKey().defaultRandom(),
419
- orgId: varchar('org_id', { length: 255 }).default('system').notNull(),
420
- createdBy: text('created_by').default('system').notNull(),
421
- createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
422
- updatedBy: text('updated_by').default('system').notNull(),
423
- updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
424
- // Rule identity
425
- name: varchar('name', { length: 255 }).notNull(),
426
- description: text('description'),
427
- policyId: uuid('policy_id').references(() => compliancePolicy.id, { onDelete: 'set null' }),
428
- priority: integer('priority').default(0).notNull(),
429
- target: varchar('target', { length: 20 }).$type().notNull(),
430
- severity: varchar('severity', { length: 10 }).$type().default('error').notNull(),
431
- // Categorization
432
- tags: jsonb('tags').$type().default([]).notNull(),
433
- // Scheduling
434
- effectiveFrom: timestamp('effective_from', { withTimezone: true }),
435
- effectiveUntil: timestamp('effective_until', { withTimezone: true }),
436
- // Scope
437
- scope: varchar('scope', { length: 10 }).$type().default('org').notNull(),
438
- // Forking tracks which published rule this org rule was copied from
439
- forkedFromRuleId: uuid('forked_from_rule_id'),
440
- // Notification override
441
- suppressNotification: boolean('suppress_notification').default(false).notNull(),
442
- // Org → team hierarchy: when true, this (parent-org) rule is also enforced on
443
- // descendant team orgs during their compliance evaluation.
444
- propagateToChildren: boolean('propagate_to_children').default(false).notNull(),
445
- // Single-field condition
446
- field: varchar('field', { length: 100 }),
447
- operator: varchar('operator', { length: 20 }).$type(),
448
- value: jsonb('value'),
449
- // Cross-field conditions (overrides single-field when present)
450
- conditions: jsonb('conditions').$type(),
451
- conditionMode: varchar('condition_mode', { length: 5 }).$type().default('all'),
452
- // Access and visibility
453
- accessModifier: varchar('access_modifier', { length: 10 })
454
- .$type().default('private').notNull(),
455
- isDefault: boolean('is_default').default(false).notNull(),
456
- isActive: boolean('is_active').default(true).notNull(),
457
- deletedAt: timestamp('deleted_at', { withTimezone: true }),
458
- deletedBy: text('deleted_by'),
459
- }, (table) => ({
460
- orgTargetActiveIdx: index('compliance_rule_org_target_active_idx')
461
- .on(table.orgId, table.target, table.isActive),
462
- orgPolicyIdx: index('compliance_rule_org_policy_idx').on(table.orgId, table.policyId),
463
- priorityIdx: index('compliance_rule_priority_idx').on(table.priority),
464
- scopeIdx: index('compliance_rule_scope_idx').on(table.scope),
465
- effectiveFromIdx: index('compliance_rule_effective_from_idx').on(table.effectiveFrom),
466
- nameOrgUnique: uniqueIndex('compliance_rule_name_org_unique').on(table.orgId, table.name),
467
- }));
468
- /**
469
- * Tracks every change to compliance rules for versioning and rollback.
470
- *
471
- * @table compliance_rule_history
472
- */
473
- export const complianceRuleHistory = pgTable('compliance_rule_history', {
474
- id: uuid('id').primaryKey().defaultRandom(),
475
- ruleId: uuid('rule_id').notNull().references(() => complianceRule.id, { onDelete: 'cascade' }),
476
- orgId: varchar('org_id', { length: 255 }).notNull(),
477
- changeType: varchar('change_type', { length: 20 }).notNull(), // created | updated | deleted | restored
478
- previousState: jsonb('previous_state'), // full rule snapshot before change
479
- changedBy: text('changed_by').notNull(),
480
- changedAt: timestamp('changed_at', { withTimezone: true }).defaultNow().notNull(),
481
- }, (table) => ({
482
- ruleChangedAtIdx: index('compliance_rule_history_rule_changed_idx')
483
- .on(table.ruleId, table.changedAt),
484
- orgChangedAtIdx: index('compliance_rule_history_org_changed_idx')
485
- .on(table.orgId, table.changedAt),
486
- ruleIdIdx: index('compliance_rule_history_rule_id_idx')
487
- .on(table.ruleId),
488
- }));
489
- /**
490
- * Compliance audit log stores every compliance check result.
491
- *
492
- * @table compliance_audit_log
493
- */
494
- export const complianceAuditLog = pgTable('compliance_audit_log', {
495
- id: uuid('id').primaryKey().defaultRandom(),
496
- orgId: varchar('org_id', { length: 255 }).notNull(),
497
- userId: text('user_id').notNull(),
498
- target: varchar('target', { length: 20 }).$type().notNull(),
499
- action: varchar('action', { length: 20 }).notNull(), // upload | deploy | create | update | scan
500
- entityId: varchar('entity_id', { length: 255 }),
501
- entityName: varchar('entity_name', { length: 255 }),
502
- result: varchar('result', { length: 10 }).notNull(), // pass | warn | block
503
- violations: jsonb('violations').$type().default([]),
504
- ruleCount: integer('rule_count').notNull(),
505
- scanId: uuid('scan_id'), // groups entries from the same bulk scan
506
- createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
507
- }, (table) => ({
508
- orgCreatedAtIdx: index('compliance_audit_org_created_idx').on(table.orgId, table.createdAt),
509
- // DESC variant for the dominant "latest audit events per org" query
510
- // pattern (audit log UIs sort newest-first). Postgres can use the asc
511
- // index for desc scans, but a matching DESC index lets index-only scans
512
- // satisfy `ORDER BY created_at DESC LIMIT n` without a reverse step.
513
- // MIGRATION REQUIRED: run `pnpm drizzle-kit generate` after pulling.
514
- orgCreatedAtDescIdx: index('compliance_audit_org_created_desc_idx')
515
- .on(table.orgId, sql `${table.createdAt} DESC`),
516
- orgTargetResultIdx: index('compliance_audit_org_target_result_idx')
517
- .on(table.orgId, table.target, table.result),
518
- scanIdIdx: index('compliance_audit_scan_id_idx').on(table.scanId),
519
- }));
520
- /**
521
- * Per-entity exemptions from specific compliance rules.
522
- *
523
- * @table compliance_exemptions
524
- */
525
- export const complianceExemption = pgTable('compliance_exemptions', {
526
- id: uuid('id').primaryKey().defaultRandom(),
527
- orgId: varchar('org_id', { length: 255 }).notNull(),
528
- ruleId: uuid('rule_id').notNull().references(() => complianceRule.id, { onDelete: 'cascade' }),
529
- entityType: varchar('entity_type', { length: 20 }).$type().notNull(),
530
- entityId: uuid('entity_id').notNull(),
531
- entityName: varchar('entity_name', { length: 255 }),
532
- reason: text('reason').notNull(),
533
- approvedBy: text('approved_by'),
534
- rejectionReason: text('rejection_reason'),
535
- status: varchar('status', { length: 20 }).default('pending').notNull(), // pending | approved | rejected | expired
536
- expiresAt: timestamp('expires_at', { withTimezone: true }),
537
- createdBy: text('created_by').notNull(),
538
- createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
539
- updatedBy: text('updated_by').notNull(),
540
- updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
541
- }, (table) => ({
542
- orgRuleEntityUnique: uniqueIndex('compliance_exemption_org_rule_entity_unique')
543
- .on(table.orgId, table.ruleId, table.entityId),
544
- orgStatusIdx: index('compliance_exemption_org_status_idx').on(table.orgId, table.status),
545
- expiresAtIdx: index('compliance_exemption_expires_at_idx').on(table.expiresAt),
546
- entityIdIdx: index('compliance_exemption_entity_id_idx').on(table.entityId),
547
- }));
548
- /**
549
- * Tracks which orgs have opted into system-org published compliance rules.
550
- *
551
- * @table compliance_rule_subscriptions
552
- */
553
- export const complianceRuleSubscription = pgTable('compliance_rule_subscriptions', {
554
- id: uuid('id').primaryKey().defaultRandom(),
555
- orgId: varchar('org_id', { length: 255 }).notNull(),
556
- ruleId: uuid('rule_id').notNull().references(() => complianceRule.id, { onDelete: 'cascade' }),
557
- subscribedBy: text('subscribed_by').notNull(),
558
- subscribedAt: timestamp('subscribed_at', { withTimezone: true }).defaultNow().notNull(),
559
- isActive: boolean('is_active').default(true).notNull(),
560
- pinnedVersion: jsonb('pinned_version').$type(),
561
- unsubscribedAt: timestamp('unsubscribed_at', { withTimezone: true }),
562
- unsubscribedBy: text('unsubscribed_by'),
563
- }, (table) => ({
564
- orgRuleUnique: uniqueIndex('compliance_rule_sub_org_rule_unique').on(table.orgId, table.ruleId),
565
- orgActiveIdx: index('compliance_rule_sub_org_active_idx').on(table.orgId, table.isActive),
566
- ruleIdx: index('compliance_rule_sub_rule_idx').on(table.ruleId),
567
- }));
568
- /**
569
- * Bulk compliance scans tracks scheduled and on-demand scans.
570
- *
571
- * @table compliance_scans
572
- */
573
- export const complianceScan = pgTable('compliance_scans', {
574
- id: uuid('id').primaryKey().defaultRandom(),
575
- orgId: varchar('org_id', { length: 255 }).notNull(),
576
- target: varchar('target', { length: 20 }).notNull(), // plugin | pipeline | all
577
- filter: jsonb('filter'), // optional entity filter for partial scans
578
- status: varchar('status', { length: 20 }).default('pending').notNull(), // pending | running | completed | failed | cancelled
579
- triggeredBy: varchar('triggered_by', { length: 20 }).notNull(), // manual | scheduled | rule-change | rule-dry-run
580
- userId: text('user_id').notNull(),
581
- totalEntities: integer('total_entities').default(0).notNull(),
582
- processedEntities: integer('processed_entities').default(0).notNull(),
583
- passCount: integer('pass_count').default(0).notNull(),
584
- warnCount: integer('warn_count').default(0).notNull(),
585
- blockCount: integer('block_count').default(0).notNull(),
586
- // True when the scan stopped early at a configured per-scan cap (so the
587
- // counts above represent a subset, not the full entity universe). Surfaced
588
- // in the scan-status UI so users know whether to widen the filter.
589
- // MIGRATION REQUIRED: run `pnpm drizzle-kit generate` after pulling.
590
- truncated: boolean('truncated').default(false).notNull(),
591
- startedAt: timestamp('started_at', { withTimezone: true }),
592
- completedAt: timestamp('completed_at', { withTimezone: true }),
593
- cancelledAt: timestamp('cancelled_at', { withTimezone: true }),
594
- cancelledBy: text('cancelled_by'),
595
- createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
596
- }, (table) => ({
597
- orgCreatedAtIdx: index('compliance_scan_org_created_idx').on(table.orgId, table.createdAt),
598
- orgStatusIdx: index('compliance_scan_org_status_idx').on(table.orgId, table.status),
599
- }));
600
- /**
601
- * Cron-based recurring scan schedules.
602
- *
603
- * @table compliance_scan_schedules
604
- */
605
- export const complianceScanSchedule = pgTable('compliance_scan_schedules', {
606
- id: uuid('id').primaryKey().defaultRandom(),
607
- orgId: varchar('org_id', { length: 255 }).notNull(),
608
- target: varchar('target', { length: 20 }).notNull(), // plugin | pipeline | all
609
- cronExpression: varchar('cron_expression', { length: 100 }).notNull(),
610
- isActive: boolean('is_active').default(true).notNull(),
611
- lastRunAt: timestamp('last_run_at', { withTimezone: true }),
612
- nextRunAt: timestamp('next_run_at', { withTimezone: true }),
613
- createdBy: text('created_by').notNull(),
614
- createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
615
- updatedBy: text('updated_by').notNull(),
616
- updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
617
- }, (table) => ({
618
- activeNextRunIdx: index('compliance_scan_schedule_active_next_idx')
619
- .on(table.isActive, table.nextRunAt),
620
- orgIdx: index('compliance_scan_schedule_org_idx').on(table.orgId),
621
- }));
622
- /**
623
- * Per-org notification settings for compliance events.
624
- *
625
- * @table compliance_notification_preferences
626
- */
627
- export const complianceNotificationPreference = pgTable('compliance_notification_preferences', {
628
- id: uuid('id').primaryKey().defaultRandom(),
629
- orgId: varchar('org_id', { length: 255 }).notNull().unique(),
630
- notifyOnBlock: boolean('notify_on_block').default(true).notNull(),
631
- notifyOnWarning: boolean('notify_on_warning').default(false).notNull(),
632
- // Opt-in email delivery (to `targetUsers`, or all org admins when null).
633
- emailEnabled: boolean('email_enabled').default(false).notNull(),
634
- digestMode: varchar('digest_mode', { length: 20 }).default('immediate').notNull(), // immediate | daily | weekly
635
- digestSchedule: varchar('digest_schedule', { length: 100 }),
636
- lastDigestAt: timestamp('last_digest_at', { withTimezone: true }),
637
- targetUsers: jsonb('target_users').$type(), // null = all org admins
638
- webhookUrl: varchar('webhook_url', { length: 500 }),
639
- webhookSecret: varchar('webhook_secret', { length: 255 }),
640
- createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
641
- updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
642
- });
643
- /**
644
- * Log of all compliance notifications sent.
645
- *
646
- * @table compliance_notification_log
647
- */
648
- export const complianceNotificationLog = pgTable('compliance_notification_log', {
649
- id: uuid('id').primaryKey().defaultRandom(),
650
- orgId: varchar('org_id', { length: 255 }).notNull(),
651
- channel: varchar('channel', { length: 20 }).notNull(), // in-app | webhook | digest
652
- status: varchar('status', { length: 20 }).notNull(), // sent | failed | pending
653
- payload: jsonb('payload').$type().notNull(),
654
- webhookResponseCode: integer('webhook_response_code'),
655
- webhookError: text('webhook_error'),
656
- retryCount: integer('retry_count').default(0).notNull(),
657
- nextRetryAt: timestamp('next_retry_at', { withTimezone: true }),
658
- relatedAuditId: uuid('related_audit_id'),
659
- createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
660
- }, (table) => ({
661
- orgCreatedAtIdx: index('compliance_notification_org_created_idx')
662
- .on(table.orgId, table.createdAt),
663
- statusRetryIdx: index('compliance_notification_status_retry_idx')
664
- .on(table.status, table.nextRetryAt),
665
- relatedAuditIdx: index('compliance_notification_related_audit_idx')
666
- .on(table.relatedAuditId),
667
- }));
668
- export const complianceRole = pgTable('compliance_roles', {
669
- id: uuid('id').primaryKey().defaultRandom(),
670
- orgId: varchar('org_id', { length: 255 }).notNull(),
671
- userId: text('user_id').notNull(),
672
- role: varchar('role', { length: 30 }).$type().notNull(),
673
- grantedBy: text('granted_by').notNull(),
674
- createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
675
- updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
676
- }, (table) => ({
677
- orgUserUnique: uniqueIndex('compliance_role_org_user_unique').on(table.orgId, table.userId),
678
- orgRoleIdx: index('compliance_role_org_role_idx').on(table.orgId, table.role),
679
- }));
680
- /**
681
- * Generated compliance reports.
682
- *
683
- * @table compliance_reports
684
- */
685
- export const complianceReport = pgTable('compliance_reports', {
686
- id: uuid('id').primaryKey().defaultRandom(),
687
- orgId: varchar('org_id', { length: 255 }).notNull(),
688
- reportType: varchar('report_type', { length: 30 }).notNull(), // summary | detailed | audit-trail | comparison
689
- target: varchar('target', { length: 20 }).notNull(), // plugin | pipeline | all
690
- dateFrom: timestamp('date_from', { withTimezone: true }),
691
- dateTo: timestamp('date_to', { withTimezone: true }),
692
- compareFrom: timestamp('compare_from', { withTimezone: true }),
693
- compareTo: timestamp('compare_to', { withTimezone: true }),
694
- data: jsonb('data').$type().notNull(),
695
- format: varchar('format', { length: 10 }).default('json').notNull(), // json | csv
696
- generatedBy: text('generated_by').notNull(),
697
- createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
698
- }, (table) => ({
699
- orgCreatedAtIdx: index('compliance_report_org_created_idx').on(table.orgId, table.createdAt),
700
- }));
701
- /**
702
- * Cron-based recurring report generation schedules.
703
- *
704
- * @table compliance_report_schedules
705
- */
706
- export const complianceReportSchedule = pgTable('compliance_report_schedules', {
707
- id: uuid('id').primaryKey().defaultRandom(),
708
- orgId: varchar('org_id', { length: 255 }).notNull(),
709
- reportType: varchar('report_type', { length: 30 }).notNull(), // summary | detailed
710
- target: varchar('target', { length: 20 }).notNull(), // plugin | pipeline | all
711
- format: varchar('format', { length: 10 }).default('json').notNull(),
712
- cronExpression: varchar('cron_expression', { length: 100 }).notNull(),
713
- isActive: boolean('is_active').default(true).notNull(),
714
- lastRunAt: timestamp('last_run_at', { withTimezone: true }),
715
- nextRunAt: timestamp('next_run_at', { withTimezone: true }),
716
- deliverTo: jsonb('deliver_to').$type().default([]).notNull(), // userIds to notify
717
- createdBy: text('created_by').notNull(),
718
- createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
719
- updatedBy: text('updated_by').notNull(),
720
- updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
721
- }, (table) => ({
722
- activeNextRunIdx: index('compliance_report_schedule_active_next_idx')
723
- .on(table.isActive, table.nextRunAt),
724
- orgIdx: index('compliance_report_schedule_org_idx').on(table.orgId),
725
- }));
726
- /**
727
- * User-editable observability dashboard. Replaces the code-defined dashboards
728
- * under `frontend/src/lib/dashboards/*.ts` so operators can add panels and
729
- * customize layout per-org without a redeploy.
730
- *
731
- * `layoutJson` carries the react-grid-layout coordinate set keyed by panel id;
732
- * `dashboard_panels` holds the panel-content rows so an N-panel dashboard
733
- * doesn't bloat one row's JSON to several KB. The catalog query is referenced
734
- * by key only (see platform/src/observability/catalog.ts) the dashboard
735
- * record never carries raw PromQL/LogQL, keeping the catalog as the security
736
- * boundary for upstream query execution.
737
- *
738
- * Visibility ladder * - `private` only the creator can read/write
739
- * - `org` anyone in the same org can read; org admins + creator can write
740
- * - `public` every authenticated user can read; only sysadmins can write.
741
- * Used for the 5 default dashboards (`org_id='system'`) so the
742
- * existing system-org visibility rule covers them by default.
743
- *
744
- * @table dashboards
745
- */
746
- export const dashboard = pgTable('dashboards', {
747
- id: uuid('id').primaryKey().defaultRandom(),
748
- // Org + creator
749
- orgId: varchar('org_id', { length: 255 })
750
- .default('system')
751
- .notNull(),
752
- createdBy: text('created_by')
753
- .default('system')
754
- .notNull(),
755
- createdAt: timestamp('created_at', { withTimezone: true })
756
- .defaultNow()
757
- .notNull(),
758
- updatedBy: text('updated_by')
759
- .default('system')
760
- .notNull(),
761
- updatedAt: timestamp('updated_at', { withTimezone: true })
762
- .defaultNow()
763
- .notNull(),
764
- // Identity
765
- name: varchar('name', { length: 150 })
766
- .notNull(),
767
- description: text('description'),
768
- // react-grid-layout coordinate set keyed by panel id.
769
- // Shape: { [panelId]: { x, y, w, h, minW?, minH? } }
770
- layoutJson: jsonb('layout_json')
771
- .$type()
772
- .default({})
773
- .notNull(),
774
- // Visibility see header for ladder semantics. Constrained at the SQL
775
- // layer too via a CHECK in postgres-init.sql to keep typos from sneaking
776
- // past the application layer.
777
- visibility: varchar('visibility', { length: 10 })
778
- .$type()
779
- .default('private')
780
- .notNull(),
781
- // Soft delete (matches the rest of the schema's convention)
782
- deletedAt: timestamp('deleted_at', { withTimezone: true }),
783
- deletedBy: text('deleted_by'),
784
- }, (table) => ({
785
- // Listing is org-scoped and visibility-filtered, so both go in the index.
786
- orgVisibilityIdx: index('dashboard_org_visibility_idx').on(table.orgId, table.visibility),
787
- // Convenience for "all my dashboards" listing
788
- createdByIdx: index('dashboard_created_by_idx').on(table.createdBy),
789
- // Same-org duplicate-name guard. The (orgId, name) tuple is unique among
790
- // non-deleted rows; soft-deleted rows are excluded so name reuse after
791
- // deletion works.
792
- nameUnique: uniqueIndex('dashboard_org_name_unique').on(table.orgId, table.name),
793
- }));
794
- /**
795
- * A single panel inside a dashboard. The catalog `queryKey` is the only thing
796
- * the panel carries from the query side substitution + execution happens
797
- * server-side via the existing catalog, so no PromQL/LogQL travels with the
798
- * panel record.
799
- *
800
- * @table dashboard_panels
801
- */
802
- export const dashboardPanel = pgTable('dashboard_panels', {
803
- id: uuid('id').primaryKey().defaultRandom(),
804
- dashboardId: uuid('dashboard_id')
805
- .notNull(),
806
- // Catalog key (e.g. `plugin_builds_per_min`). The server validates this
807
- // against QUERIES at render time.
808
- queryKey: varchar('query_key', { length: 100 })
809
- .notNull(),
810
- // 'stat' | 'line' | 'table' | 'stacked-bar' kept stringly-typed for
811
- // forward compatibility; the renderer falls back to 'line' on unknown.
812
- vizKind: varchar('viz_kind', { length: 30 })
813
- .default('line')
814
- .notNull(),
815
- title: varchar('title', { length: 200 })
816
- .notNull(),
817
- // Tailwind col-span tier (1-12, but only 3/4/6/8/9/12 are renderable).
818
- span: integer('span')
819
- .default(6)
820
- .notNull(),
821
- // Optional: label key for series grouping (e.g. 'status', 'state').
822
- groupBy: varchar('group_by', { length: 50 }),
823
- // Optional: catalog format key ('percent' | 'seconds' |...).
824
- format: varchar('format', { length: 20 }),
825
- // 0-based render order within the dashboard. Editor reassigns on drag.
826
- position: integer('position')
827
- .default(0)
828
- .notNull(),
829
- // Optional template var values bound at panel level (e.g. `plugin=X` for
830
- // the per-plugin drill-down panel). Sanitized server-side via the catalog
831
- // substituteVars allow-list.
832
- vars: jsonb('vars')
833
- .$type()
834
- .default({})
835
- .notNull(),
836
- }, (table) => ({
837
- // The render path is "fetch all panels for dashboard X in order".
838
- dashboardPositionIdx: index('dashboard_panel_dashboard_position_idx')
839
- .on(table.dashboardId, table.position),
840
- }));
841
- /**
842
- * Per-org alert notification destination. Multi-tenant alerting routes
843
- * Alertmanager webhooks to the platform; the platform looks the firing
844
- * alert's `org_id` label up here and forwards to each enabled destination.
845
- *
846
- * Channels * - `slack` `target` is the incoming-webhook URL
847
- * - `webhook` `target` is any HTTPS URL; the relay posts the
848
- * Alertmanager v2 webhook payload verbatim
849
- * - `in-app` `target` ignored; surfaces as an in-app message via
850
- * the existing `messages` table
851
- *
852
- * Secrets * - For `slack`/`webhook` channels, the URL itself is the secret. We don't
853
- * log it on `dashboard.update` or surface the full URL on GET endpoints
854
- * after write; just a masked preview (last 12 chars). Stored in clear
855
- * text same posture as `compliance_notification_preferences.webhook_url`
856
- * and consistent with the rest of the app's secret handling for org-level
857
- * integrations. If we add a KMS-encryption tier for any secret column,
858
- * this is one of the first to migrate.
859
- *
860
- * @table org_alert_destinations
861
- */
862
- export const orgAlertDestination = pgTable('org_alert_destinations', {
863
- id: uuid('id').primaryKey().defaultRandom(),
864
- orgId: varchar('org_id', { length: 255 }).notNull(),
865
- createdBy: text('created_by').notNull(),
866
- createdAt: timestamp('created_at', { withTimezone: true })
867
- .defaultNow()
868
- .notNull(),
869
- updatedBy: text('updated_by').notNull(),
870
- updatedAt: timestamp('updated_at', { withTimezone: true })
871
- .defaultNow()
872
- .notNull(),
873
- /** 'slack' | 'webhook' | 'in-app' | 'email' kept stringly so future channels
874
- * (PagerDuty, …) can be added without a schema migration. */
875
- channel: varchar('channel', { length: 20 })
876
- .$type()
877
- .notNull(),
878
- /** Channel-specific target. Slack/webhook: URL. Email: address. In-app: ignored. */
879
- target: text('target').default('').notNull(),
880
- /** Friendly label shown in the settings UI. */
881
- label: varchar('label', { length: 100 }).notNull(),
882
- /** Lowest severity that triggers this destination ('warning' = warning+critical,
883
- * 'critical' = critical only). Mirrors Alertmanager severity ordering. */
884
- minSeverity: varchar('min_severity', { length: 10 })
885
- .$type()
886
- .default('warning')
887
- .notNull(),
888
- enabled: boolean('enabled').default(true).notNull(),
889
- /** Soft delete so we keep audit history of who-deleted-what. */
890
- deletedAt: timestamp('deleted_at', { withTimezone: true }),
891
- deletedBy: text('deleted_by'),
892
- }, (table) => ({
893
- // Per-org listing the only access path.
894
- orgIdx: index('org_alert_destination_org_idx')
895
- .on(table.orgId, table.enabled),
896
- }));
897
- /**
898
- * Per-org alert rules authored by operators.
899
- *
900
- * Each row materializes into a `groups[].rules[]` entry in a Prometheus
901
- * `rule_files` YAML. The materializer endpoint
902
- * `GET /api/observability/alert-rules/materialized.yml` renders all enabled
903
- * rules across all orgs (deleted=null) into one document; Prometheus polls
904
- * or a sidecar copies it into the rules dir.
905
- *
906
- * Tenancy + safety * - `expr` is user-authored PromQL. The CRUD route enforces that the
907
- * expression substring-contains `org_id="<orgId>"` so an operator can't
908
- * write rules that fire on other orgs' metrics. This is a coarse gate
909
- * (a malformed expression can still be syntactically wrong) but it
910
- * closes the cross-tenant data leak. Real PromQL parsing + automatic
911
- * org_id injection is a follow-on.
912
- * - The materialized rule carries `labels.org_id = <orgId>` so the
913
- * alertmanager-relay routes firing alerts to the right org's
914
- * destinations (matches the alert-relay model).
915
- *
916
- * @table org_alert_rules
917
- */
918
- export const orgAlertRule = pgTable('org_alert_rules', {
919
- id: uuid('id').primaryKey().defaultRandom(),
920
- orgId: varchar('org_id', { length: 255 }).notNull(),
921
- createdBy: text('created_by').notNull(),
922
- createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
923
- updatedBy: text('updated_by').notNull(),
924
- updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
925
- /** Operator-supplied rule name. Sanitized into a valid Prom alert name at
926
- * materialization time (becomes `OrgRule_<orgId>_<slug>` to avoid name
927
- * collisions across orgs). */
928
- name: varchar('name', { length: 100 }).notNull(),
929
- /** PromQL expression. MUST substring-contain `org_id="<orgId>"`. */
930
- expr: text('expr').notNull(),
931
- /** `for: 5m` style duration. Validated against Prom's duration regex. */
932
- forDuration: varchar('for_duration', { length: 20 }).default('5m').notNull(),
933
- /** 'warning' | 'critical' matches the platform-wide severity ladder. */
934
- severity: varchar('severity', { length: 20 })
935
- .$type()
936
- .default('warning')
937
- .notNull(),
938
- /** Alertmanager `summary` annotation. Supports `{{ $value }}`. */
939
- summary: text('summary').notNull(),
940
- /** Alertmanager `description` annotation. Optional; '' is fine. */
941
- description: text('description').default('').notNull(),
942
- /** Disabled rules don't materialize. Lets operators stage rules without firing. */
943
- enabled: boolean('enabled').default(true).notNull(),
944
- /** Soft delete so we keep audit of who-deleted-what. */
945
- deletedAt: timestamp('deleted_at', { withTimezone: true }),
946
- deletedBy: text('deleted_by'),
947
- }, (table) => ({
948
- // Per-org listing + materializer's enabled-only scan.
949
- orgEnabledIdx: index('org_alert_rule_org_enabled_idx')
950
- .on(table.orgId, table.enabled),
951
- // Unique within an org so operators can't accidentally clone a rule.
952
- orgNameUq: uniqueIndex('org_alert_rule_org_name_uq')
953
- .on(table.orgId, table.name)
954
- .where(sql `deleted_at IS NULL`),
955
- }));
3
+ //
4
+ // Barrel for the Drizzle schema. The table/type definitions live in per-domain
5
+ // files under `./schema/*`; this module re-exports every one of them so the
6
+ // public API is byte-identical to the previous single-file schema. Existing
7
+ // `import { ... } from '.../drizzle-schema'` sites and the aggregate `schema`
8
+ // object below both continue to resolve exactly as before.
9
+ //
10
+ export * from './schema/plugin.js';
11
+ export * from './schema/pipeline.js';
12
+ export * from './schema/message.js';
13
+ export * from './schema/compliance.js';
14
+ export * from './schema/dashboard.js';
15
+ export * from './schema/alert.js';
16
+ import { orgAlertDestination, orgAlertRule } from './schema/alert.js';
17
+ import { compliancePolicy, complianceRule, complianceRuleHistory, complianceAuditLog, complianceExemption, complianceRuleSubscription, complianceScan, complianceScanSchedule, complianceNotificationPreference, complianceNotificationLog, complianceRole, complianceReport, complianceReportSchedule, } from './schema/compliance.js';
18
+ import { dashboard, dashboardPanel } from './schema/dashboard.js';
19
+ import { message } from './schema/message.js';
20
+ import { pipeline, pipelineRegistry, pipelineEvent } from './schema/pipeline.js';
21
+ import { plugin } from './schema/plugin.js';
956
22
  /**
957
23
  * Complete Drizzle schema export
958
24
  */
@@ -984,4 +50,4 @@ export const schema = {
984
50
  complianceReport,
985
51
  complianceReportSchedule,
986
52
  };
987
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpenpsZS1zY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQXFCLE1BQU0sNEJBQTRCLENBQUM7QUFDeEcsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBb0NsSTs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsU0FBUyxFQUFFO0lBQ3ZDLGNBQWM7SUFDZCxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLGFBQWEsRUFBRTtJQUUzQyxrQ0FBa0M7SUFDbEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7U0FDdEMsT0FBTyxDQUFDLFFBQVEsQ0FBQztTQUNqQixPQUFPLEVBQUU7SUFFWixlQUFlO0lBQ2YsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDMUIsT0FBTyxDQUFDLFFBQVEsQ0FBQztTQUNqQixPQUFPLEVBQUU7SUFDWixTQUFTLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztTQUN2RCxVQUFVLEVBQUU7U0FDWixPQUFPLEVBQUU7SUFDWixTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQztTQUMxQixPQUFP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Q0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUU7SUFDbkQsV0FBVyxFQUFFLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQWUsQ0FBQyxPQUFPLEVBQUU7SUFDbkYsU0FBUyxFQUFFLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQWEsQ0FBQyxPQUFPLEVBQUU7SUFDN0UsTUFBTSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUU7SUFDbkQsV0FBVyxFQUFFLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDckQsU0FBUyxFQUFFLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDakQsVUFBVSxFQUFFLE9BQU8sQ0FBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDbkQsWUFBWSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDbkMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDMUQsV0FBVyxFQUFFLFNBQVMsQ0FBQyxjQUFjLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDOUQsVUFBVSxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUM7SUFDbEMsTUFBTSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQTJCO0lBQ3hELFNBQVMsRUFBRSxTQUFTLENBQUMsWUFBWSxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFO0NBQ2xGLEVBQUUsQ0FBQyxL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QjtJQUNuQixzRUFBc0U7SUFDdEUsWUFBWTtJQUNaLG9CQUFvQjtJQUNwQixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLHFCQUFxQjtJQUNyQixrQkFBa0I7SUFDbEIsbUJBQW1CO0lBQ25CLDBCQUEwQjtJQUMxQixjQUFjO0lBQ2Qsc0JBQXNCO0lBQ3RCLGdDQUFnQztJQUNoQyx5QkFBeUI7SUFDekIsY0FBYztJQUNkLGdCQUFnQjtJQUNoQix3QkFBd0I7Q0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBBY2Nlc3NNb2RpZmllciwgQ29tcHV0ZVR5cGUsIFBsdWdpblR5cGUsIHR5cGUgTWV0YURhdGFUeXBlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgc3FsIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHsgYm9vbGVhbiwgaW50ZWdlciwgdmFyY2hhciwgcGdUYWJsZSwgdGV4dCwgdGltZXN0YW1wLCB1dWlkLCBqc29uYiwgaW5kZXgsIHVuaXF1ZUluZGV4LCBjaGVjayB9IGZyb20gJ2RyaXp6bGUtb3JtL3BnLWNvcmUnO1xuXG4vKipcbiAqIFBpcGVsaW5lIGJ1aWxkZXIgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIHN0b3JlZCBpbiBkYXRhYmFzZS5cbiAqIE1pcnJvcnMgdGhlIGNhbm9uaWNhbCBCdWlsZGVyUHJvcHMgZnJvbSBwaXBlbGluZS1jb3JlIChKU09OLXNlcmlhbGl6YWJsZSBmb3JtKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZUJ1aWxkZXJDb25maWcge1xuICByZWFkb25seSBwcm9qZWN0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9yZ2FuaXphdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBwaXBlbGluZU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGdsb2JhbD86IE1ldGFEYXRhVHlwZTtcbiAgcmVhZG9ubHkgc3ludGg6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZWFkb25seSBkZWZhdWx0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZWFkb25seSByb2xlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJlYWRvbmx5IHN0YWdlcz86IFBpcGVsaW5lU3RhZ2VDb25maWdbXTtcbn1cblxuLyoqXG4gKiBTdGFnZSBjb25maWd1cmF0aW9uIHN0b3JlZCBpbiBkYXRhYmFzZSAoSlNPTi1zZXJpYWxpemFibGUpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lU3RhZ2VDb25maWcge1xuICByZWFkb25seSBzdGFnZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0ZXBzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xufVxuXG4vKipcbiAqIFNlY3JldCByZXF1aXJlbWVudCBmb3IgYSBwbHVnaW4uXG4gKiBEZWNsYXJlcyBuYW1lZCBzZWNyZXRzIHRoZSBwbHVnaW4gZXhwZWN0cyBhdCBidWlsZCB0aW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblNlY3JldCB7XG4gIG5hbWU6IHN0cmluZztcbiAgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRhYmxlIGZvciBzdG9yaW5nIHJldXNhYmxlIHBsdWdpbiBjb25maWd1cmF0aW9ucy5cbiAqIFBsdWdpbnMgZGVmaW5lIHRoZSBiZWhhdmlvciBvZiBzeW50aC9idWlsZCBzdGVwcyBpbiBDREsgcGlwZWxpbmVzLlxuICpcbiAqIEZlYXR1cmVzICogLSBWZXJzaW9uaW5nIHN1cHBvcnQgd2l0aCBzZW1hbnRpYyB2ZXJzaW9uaW5nXG4gKiAtIEFjY2VzcyBjb250cm9sIHZpYSBvcmdJZCBhbmQgYWNjZXNzTW9kaWZpZXJcbiAqIC0gRnVsbCBhdWRpdCB0cmFpbCAoY3JlYXRlZC91cGRhdGVkIGJ5L2F0KVxuICogLSBGbGV4aWJsZSBtZXRhZGF0YSBzdG9yYWdlIHZpYSBKU09OQlxuICogLSBTdXBwb3J0IGZvciBib3RoIFNoZWxsU3RlcCBhbmQgQ29kZUJ1aWxkU3RlcCB0eXBlc1xuICpcbiAqIEB0YWJsZSBwbHVnaW5zXG4gKi9cbmV4cG9ydCBjb25zdCBwbHVnaW4gPSBwZ1RhYmxlKCdwbHVnaW5zJywge1xuICAvLyBQcmltYXJ5IGtleVxuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuXG4gIC8vIE9yZ2FuaXphdGlvbiBhbmQgYWNjZXNzIGNvbnRyb2xcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSlcbiAgICAuZGVmYXVsdCgnc3lzdGVtJylcbiAgICAubm90TnVsbCgpLFxuXG4gIC8vIEF1ZGl0IGZpZWxkc1xuICBjcmVhdGVkQnk6IHRleHQoJ2NyZWF0ZWRfYnknKVxuICAgIC5kZWZhdWx0KCdzeXN0ZW0nKVxuICAgIC5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSlcbiAgICAuZGVmYXVsdE5vdygpXG4gICAgLm5vdE51bGwoKSxcbiAgdXBkYXRlZEJ5OiB0ZXh0KCd1cGRhdGVkX2J5JylcbiAgICAuZGVmYXVsdCgnc3lzdGVtJylcbiAgICAubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pXG4gICAgLmRlZmF1bHROb3coKVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gQ29yZSBwbHVnaW4gaW5mb3JtYXRpb25cbiAgbmFtZTogdmFyY2hhcignbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSlcbiAgICAubm90TnVsbCgpLFxuICBkZXNjcmlwdGlvbjogdGV4dCgnZGVzY3JpcHRpb24nKSxcbiAga2V5d29yZHM6IGpzb25iKCdrZXl3b3JkcycpXG4gICAgLiR0eXBlPHN0cmluZ1tdPigpXG4gICAgLmRlZmF1bHQoW10pXG4gICAgLm5vdE51bGwoKSxcbiAgdmVyc2lvbjogdmFyY2hhcigndmVyc2lvbicsIHsgbGVuZ3RoOiA1MCB9KVxuICAgIC5kZWZhdWx0KCcxLjAuMCcpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBQbHVnaW4gY2xhc3NpZmljYXRpb25cbiAgY2F0ZWdvcnk6IHZhcmNoYXIoJ2NhdGVnb3J5JywgeyBsZW5ndGg6IDUwIH0pXG4gICAgLmRlZmF1bHQoJ3Vua25vd24nKVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gUGx1Z2luIGNvbmZpZ3VyYXRpb25cbiAgbWV0YWRhdGE6IGpzb25iKCdtZXRhZGF0YScpXG4gICAgLiR0eXBlPFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+PigpXG4gICAgLmRlZmF1bHQoe30pXG4gICAgLm5vdE51bGwoKSxcbiAgcGx1Z2luVHlwZTogdmFyY2hhcigncGx1Z2luX3R5cGUnLCB7IGxlbmd0aDogNTAgfSlcbiAgICAuJHR5cGU8UGx1Z2luVHlwZT4oKVxuICAgIC5kZWZhdWx0KCdDb2RlQnVpbGRTdGVwJyBhcyBQbHVnaW5UeXBlKVxuICAgIC5ub3ROdWxsKCksXG4gIGNvbXB1dGVUeXBlOiB2YXJjaGFyKCdjb21wdXRlX3R5cGUnLCB7IGxlbmd0aDogNTAgfSlcbiAgICAuJHR5cGU8Q29tcHV0ZVR5cGU+KClcbiAgICAuZGVmYXVsdCgnU01BTEwnIGFzIENvbXB1dGVUeXBlKVxuICAgIC5ub3ROdWxsKCksXG4gIHRpbWVvdXQ6IGludGVnZXIoJ3RpbWVvdXQnKSxcbiAgZmFpbHVyZUJlaGF2aW9yOiB2YXJjaGFyKCdmYWlsdXJlX2JlaGF2aW9yJywgeyBsZW5ndGg6IDEwIH0pXG4gICAgLiR0eXBlPCdmYWlsJyB8ICd3YXJuJyB8ICdpZ25vcmUnPigpXG4gICAgLmRlZmF1bHQoJ2ZhaWwnKVxuICAgIC5ub3ROdWxsKCksXG4gIHNlY3JldHM6IGpzb25iKCdzZWNyZXRzJylcbiAgICAuJHR5cGU8UGx1Z2luU2VjcmV0W10+KClcbiAgICAuZGVmYXVsdChbXSlcbiAgICAubm90TnVsbCgpLFxuICBwcmltYXJ5T3V0cHV0RGlyZWN0b3J5OiB2YXJjaGFyKCdwcmltYXJ5X291dHB1dF9kaXJlY3RvcnknLCB7IGxlbmd0aDogMjggfSksXG5cbiAgLy8gQnVpbGQgY29uZmlndXJhdGlvblxuICBlbnY6IGpzb25iKCdlbnYnKVxuICAgIC4kdHlwZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpXG4gICAgLmRlZmF1bHQoe30pXG4gICAgLm5vdE51bGwoKSxcbiAgYnVpbGRBcmdzOiBqc29uYignYnVpbGRfYXJncycpXG4gICAgLiR0eXBlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KClcbiAgICAuZGVmYXVsdCh7fSlcbiAgICAubm90TnVsbCgpLFxuICBpbnN0YWxsQ29tbWFuZHM6IHRleHQoJ2luc3RhbGxfY29tbWFuZHMnKVxuICAgIC5hcnJheSgpXG4gICAgLmRlZmF1bHQoW10pXG4gICAgLm5vdE51bGwoKSxcbiAgY29tbWFuZHM6IHRleHQoJ2NvbW1hbmRzJylcbiAgICAuYXJyYXkoKVxuICAgIC5kZWZhdWx0KFtdKVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gRG9ja2VyIGNvbmZpZ3VyYXRpb25cbiAgZG9ja2VyZmlsZTogdGV4dCgnZG9ja2VyZmlsZScpLFxuICBidWlsZFR5cGU6IHZhcmNoYXIoJ2J1aWxkX3R5cGUnLCB7IGxlbmd0aDogMjAgfSlcbiAgICAuZGVmYXVsdCgnYnVpbGRfaW1hZ2UnKVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gQWNjZXNzIGFuZCB2aXNpYmlsaXR5XG4gIGFjY2Vzc01vZGlmaWVyOiB2YXJjaGFyKCdhY2Nlc3NfbW9kaWZpZXInLCB7IGxlbmd0aDogMTAgfSlcbiAgICAuJHR5cGU8QWNjZXNzTW9kaWZpZXI+KClcbiAgICAuZGVmYXVsdCgncHJpdmF0ZScgYXMgQWNjZXNzTW9kaWZpZXIpXG4gICAgLm5vdE51bGwoKSxcbiAgaXNEZWZhdWx0OiBib29sZWFuKCdpc19kZWZhdWx0JylcbiAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAubm90TnVsbCgpLFxuICBpc0FjdGl2ZTogYm9vbGVhbignaXNfYWN0aXZlJylcbiAgICAuZGVmYXVsdCh0cnVlKVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gRGVsZXRpb24gdHJhY2tpbmcgKHNvZnQgZGVsZXRlKVxuICBkZWxldGVkQXQ6IHRpbWVzdGFtcCgnZGVsZXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBkZWxldGVkQnk6IHRleHQoJ2RlbGV0ZWRfYnknKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgLy8gSW5kZXhlcyBmb3IgY29tbW9uIHF1ZXJpZXNcbiAgbmFtZUlkeDogaW5kZXgoJ3BsdWdpbl9uYW1lX2lkeCcpLm9uKHRhYmxlLm5hbWUpLFxuICBvcmdJZElkeDogaW5kZXgoJ3BsdWdpbl9vcmdfaWRfaWR4Jykub24odGFibGUub3JnSWQpLFxuICB2ZXJzaW9uSWR4OiBpbmRleCgncGx1Z2luX3ZlcnNpb25faWR4Jykub24odGFibGUudmVyc2lvbiksXG4gIGFjdGl2ZUlkeDogaW5kZXgoJ3BsdWdpbl9hY3RpdmVfaWR4Jykub24odGFibGUuaXNBY3RpdmUpLFxuICBjcmVhdGVkQXRJZHg6IGluZGV4KCdwbHVnaW5fY3JlYXRlZF9hdF9pZHgnKS5vbih0YWJsZS5jcmVhdGVkQXQpLFxuICB1cGRhdGVkQXRJZHg6IGluZGV4KCdwbHVnaW5fdXBkYXRlZF9hdF9pZHgnKS5vbih0YWJsZS51cGRhdGVkQXQpLFxuXG4gIC8vIENhdGVnb3J5IGluZGV4IGZvciBmaWx0ZXJpbmdcbiAgY2F0ZWdvcnlJZHg6IGluZGV4KCdwbHVnaW5fY2F0ZWdvcnlfaWR4Jykub24odGFibGUuY2F0ZWdvcnkpLFxuXG4gIC8vIENvbXBvc2l0ZSBpbmRleCBmb3IgY29tbW9uIGFjY2VzcyBwYXR0ZXJuIChvcmdJZCArIGlzQWN0aXZlKVxuICBvcmdBY3RpdmVJZHg6IGluZGV4KCdwbHVnaW5fb3JnX2FjdGl2ZV9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuaXNBY3RpdmUpLFxuXG4gIC8vIENvbXBvc2l0ZSBpbmRleCBmb3IgZmlsdGVyZWQgcXVlcmllcyAob3JnSWQgKyBhY2Nlc3NNb2RpZmllciArIGlzQWN0aXZlKVxuICBvcmdBY2Nlc3NBY3RpdmVJZHg6IGluZGV4KCdwbHVnaW5fb3JnX2FjY2Vzc19hY3RpdmVfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmFjY2Vzc01vZGlmaWVyLCB0YWJsZS5pc0FjdGl2ZSksXG5cbiAgLy8gUGFydGlhbCBpbmRleCBmb3IgYWN0aXZlLW9ubHkgcXVlcmllcyAoc21hbGxlciwgZmFzdGVyIHRoYW4gZnVsbCBpbmRleClcbiAgYWN0aXZlT25seU9yZ0lkeDogaW5kZXgoJ3BsdWdpbl9hY3RpdmVfb25seV9vcmdfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmNyZWF0ZWRBdCkud2hlcmUoc3FsYGlzX2FjdGl2ZSA9IHRydWVgKSxcblxuICAvLyBVbmlxdWUgY29uc3RyYWludCBvbiBuYW1lICsgdmVyc2lvbiArIG9yZ0lkXG4gIG5hbWVWZXJzaW9uT3JnVW5pcXVlOiB1bmlxdWVJbmRleCgncGx1Z2luX25hbWVfdmVyc2lvbl9vcmdfdW5pcXVlJylcbiAgICAub24odGFibGUubmFtZSwgdGFibGUudmVyc2lvbiwgdGFibGUub3JnSWQpLFxuXG4gIC8vIENoZWNrIGNvbnN0cmFpbnRzXG4gIHZlcnNpb25DaGVjazogY2hlY2soICdwbHVnaW5fdmVyc2lvbl9jaGVjaycsXG4gICAgc3FsYCR7dGFibGUudmVyc2lvbn0gfiAnXlswLTldK1xcLlswLTldK1xcLlswLTldKygtW2EtekEtWjAtOS4tXSspPyhcXCtbYS16QS1aMC05Li1dKyk/JCdgLFxuICApLFxufSkpO1xuXG4vKipcbiAqIFRhYmxlIGZvciBzdG9yaW5nIHBpcGVsaW5lIGluc3RhbmNlcyBhbmQgdGhlaXIgZnVsbCBjb25maWd1cmF0aW9uLlxuICpcbiAqIEZlYXR1cmVzICogLSBGdWxsIEJ1aWxkZXJQcm9wcyBzZXJpYWxpemF0aW9uIGZvciByZWNvbnN0cnVjdGlvblxuICogLSBPcmdhbml6YXRpb24tbGV2ZWwgaXNvbGF0aW9uXG4gKiAtIFBpcGVsaW5lIHN0YXR1cyB0cmFja2luZ1xuICogLSBFeGVjdXRpb24gaGlzdG9yeSB0cmFja2luZ1xuICogLSBGbGV4aWJsZSB0YWdnaW5nIHN5c3RlbVxuICpcbiAqIEB0YWJsZSBwaXBlbGluZXNcbiAqL1xuZXhwb3J0IGNvbnN0IHBpcGVsaW5lID0gcGdUYWJsZSgncGlwZWxpbmVzJywge1xuICAvLyBQcmltYXJ5IGtleVxuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuXG4gIC8vIE9yZ2FuaXphdGlvbiBhbmQgYWNjZXNzIGNvbnRyb2xcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSlcbiAgICAuZGVmYXVsdCgnc3lzdGVtJylcbiAgICAubm90TnVsbCgpLFxuXG4gIC8vIEF1ZGl0IGZpZWxkc1xuICBjcmVhdGVkQnk6IHRleHQoJ2NyZWF0ZWRfYnknKVxuICAgIC5kZWZhdWx0KCdzeXN0ZW0nKVxuICAgIC5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSlcbiAgICAuZGVmYXVsdE5vdygpXG4gICAgLm5vdE51bGwoKSxcbiAgdXBkYXRlZEJ5OiB0ZXh0KCd1cGRhdGVkX2J5JylcbiAgICAuZGVmYXVsdCgnc3lzdGVtJylcbiAgICAubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pXG4gICAgLmRlZmF1bHROb3coKVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gQ29yZSBwaXBlbGluZSBpbmZvcm1hdGlvblxuICBwcm9qZWN0OiB2YXJjaGFyKCdwcm9qZWN0JywgeyBsZW5ndGg6IDI1NSB9KVxuICAgIC5ub3ROdWxsKCksXG4gIG9yZ2FuaXphdGlvbjogdmFyY2hhcignb3JnYW5pemF0aW9uJywgeyBsZW5ndGg6IDI1NSB9KVxuICAgIC5ub3ROdWxsKCksXG4gIHBpcGVsaW5lTmFtZTogdmFyY2hhcigncGlwZWxpbmVfbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIGRlc2NyaXB0aW9uOiB0ZXh0KCdkZXNjcmlwdGlvbicpLFxuICBrZXl3b3JkczoganNvbmIoJ2tleXdvcmRzJylcbiAgICAuJHR5cGU8c3RyaW5nW10+KClcbiAgICAuZGVmYXVsdChbXSlcbiAgICAubm90TnVsbCgpLFxuXG4gIC8vIFBpcGVsaW5lIGNvbmZpZ3VyYXRpb25cbiAgcHJvcHM6IGpzb25iKCdwcm9wcycpXG4gICAgLiR0eXBlPFBpcGVsaW5lQnVpbGRlckNvbmZpZz4oKVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gQWNjZXNzIGFuZCB2aXNpYmlsaXR5XG4gIGFjY2Vzc01vZGlmaWVyOiB2YXJjaGFyKCdhY2Nlc3NfbW9kaWZpZXInLCB7IGxlbmd0aDogMTAgfSlcbiAgICAuJHR5cGU8QWNjZXNzTW9kaWZpZXI+KClcbiAgICAuZGVmYXVsdCgncHJpdmF0ZScgYXMgQWNjZXNzTW9kaWZpZXIpXG4gICAgLm5vdE51bGwoKSxcbiAgaXNEZWZhdWx0OiBib29sZWFuKCdpc19kZWZhdWx0JylcbiAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAubm90TnVsbCgpLFxuICBpc0FjdGl2ZTogYm9vbGVhbignaXNfYWN0aXZlJylcbiAgICAuZGVmYXVsdCh0cnVlKVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gRGVsZXRpb24gdHJhY2tpbmcgKHNvZnQgZGVsZXRlKVxuICBkZWxldGVkQXQ6IHRpbWVzdGFtcCgnZGVsZXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBkZWxldGVkQnk6IHRleHQoJ2RlbGV0ZWRfYnknKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgLy8gSW5kZXhlcyBmb3IgY29tbW9uIHF1ZXJpZXNcbiAgcHJvamVjdElkeDogaW5kZXgoJ3BpcGVsaW5lX3Byb2plY3RfaWR4Jykub24odGFibGUucHJvamVjdCksXG4gIG9yZ2FuaXphdGlvbklkeDogaW5kZXgoJ3BpcGVsaW5lX29yZ2FuaXphdGlvbl9pZHgnKS5vbih0YWJsZS5vcmdhbml6YXRpb24pLFxuICBvcmdJZElkeDogaW5kZXgoJ3BpcGVsaW5lX29yZ19pZF9pZHgnKS5vbih0YWJsZS5vcmdJZCksXG4gIGFjdGl2ZUlkeDogaW5kZXgoJ3BpcGVsaW5lX2FjdGl2ZV9pZHgnKS5vbih0YWJsZS5pc0FjdGl2ZSksXG4gIGNyZWF0ZWRBdElkeDogaW5kZXgoJ3BpcGVsaW5lX2NyZWF0ZWRfYXRfaWR4Jykub24odGFibGUuY3JlYXRlZEF0KSxcbiAgdXBkYXRlZEF0SWR4OiBpbmRleCgncGlwZWxpbmVfdXBkYXRlZF9hdF9pZHgnKS5vbih0YWJsZS51cGRhdGVkQXQpLFxuXG4gIC8vIENvbXBvc2l0ZSBpbmRleCBmb3IgY29tbW9uIGFjY2VzcyBwYXR0ZXJuIChvcmdJZCArIGlzQWN0aXZlKVxuICBvcmdBY3RpdmVJZHg6IGluZGV4KCdwaXBlbGluZV9vcmdfYWN0aXZlX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5pc0FjdGl2ZSksXG5cbiAgLy8gQ29tcG9zaXRlIGluZGV4IGZvciBmaWx0ZXJlZCBxdWVyaWVzIChvcmdJZCArIGFjY2Vzc01vZGlmaWVyICsgaXNBY3RpdmUpXG4gIG9yZ0FjY2Vzc0FjdGl2ZUlkeDogaW5kZXgoJ3BpcGVsaW5lX29yZ19hY2Nlc3NfYWN0aXZlX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5hY2Nlc3NNb2RpZmllciwgdGFibGUuaXNBY3RpdmUpLFxuXG4gIC8vIFBhcnRpYWwgaW5kZXggZm9yIGFjdGl2ZS1vbmx5IHF1ZXJpZXMgKHNtYWxsZXIsIGZhc3RlciB0aGFuIGZ1bGwgaW5kZXgpXG4gIGFjdGl2ZU9ubHlPcmdJZHg6IGluZGV4KCdwaXBlbGluZV9hY3RpdmVfb25seV9vcmdfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmNyZWF0ZWRBdCkud2hlcmUoc3FsYGlzX2FjdGl2ZSA9IHRydWVgKSxcblxuICAvLyBVbmlxdWUgY29uc3RyYWludCBvbiBwcm9qZWN0ICsgb3JnYW5pemF0aW9uICsgb3JnSWRcbiAgcHJvamVjdE9yZ1VuaXF1ZTogdW5pcXVlSW5kZXgoJ3BpcGVsaW5lX3Byb2plY3Rfb3JnX3VuaXF1ZScpXG4gICAgLm9uKHRhYmxlLnByb2plY3QsIHRhYmxlLm9yZ2FuaXphdGlvbiwgdGFibGUub3JnSWQpLFxufSkpO1xuXG4vKipcbiAqIE1lc3NhZ2UgdHlwZSBpZGVudGlmaWVyc1xuICovXG5leHBvcnQgdHlwZSBNZXNzYWdlVHlwZSA9ICdhbm5vdW5jZW1lbnQnIHwgJ2NvbnZlcnNhdGlvbic7XG5cbi8qKlxuICogTWVzc2FnZSBwcmlvcml0eSBsZXZlbHNcbiAqL1xuZXhwb3J0IHR5cGUgTWVzc2FnZVByaW9yaXR5ID0gJ25vcm1hbCcgfCAnaGlnaCcgfCAndXJnZW50JztcblxuLyoqXG4gKiBUYWJsZSBmb3Igc3RvcmluZyBpbnRlcm5hbCBtZXNzYWdlcyBiZXR3ZWVuIG9yZ2FuaXphdGlvbnMgYW5kIHRoZSBzeXN0ZW0gb3JnLlxuICpcbiAqIEZlYXR1cmVzICogLSBBbm5vdW5jZW1lbnRzOiBTeXN0ZW0gb3JnIGJyb2FkY2FzdHMgdG8gYWxsIG9yZ3MgKHJlY2lwaWVudE9yZ0lkID0gJyonKVxuICogLSBDb252ZXJzYXRpb25zOiBUd28td2F5IHRocmVhZGVkIG1lc3NhZ2luZyBiZXR3ZWVuIGFuIG9yZyBhbmQgc3lzdGVtIG9yZ1xuICogLSBUaHJlYWQgc3VwcG9ydCB2aWEgdGhyZWFkSWQgKG51bGwgZm9yIHJvb3QgbWVzc2FnZXMsIHJlZmVyZW5jZXMgcm9vdCBmb3IgcmVwbGllcylcbiAqIC0gUmVhZCB0cmFja2luZyBwZXIgbWVzc2FnZVxuICogLSBQcmlvcml0eSBsZXZlbHMgKG5vcm1hbCwgaGlnaCwgdXJnZW50KVxuICogLSBTb2Z0IGRlbGV0ZSBzdXBwb3J0XG4gKlxuICogQHRhYmxlIG1lc3NhZ2VzXG4gKi9cbmV4cG9ydCBjb25zdCBtZXNzYWdlID0gcGdUYWJsZSgnbWVzc2FnZXMnLCB7XG4gIC8vIFByaW1hcnkga2V5XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG5cbiAgLy8gT3JnYW5pemF0aW9uIGFuZCBhY2Nlc3MgY29udHJvbFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KVxuICAgIC5kZWZhdWx0KCdzeXN0ZW0nKVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gQXVkaXQgZmllbGRzXG4gIGNyZWF0ZWRCeTogdGV4dCgnY3JlYXRlZF9ieScpXG4gICAgLmRlZmF1bHQoJ3N5c3RlbScpXG4gICAgLm5vdE51bGwoKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KVxuICAgIC5kZWZhdWx0Tm93KClcbiAgICAubm90TnVsbCgpLFxuICB1cGRhdGVkQnk6IHRleHQoJ3VwZGF0ZWRfYnknKVxuICAgIC5kZWZhdWx0KCdzeXN0ZW0nKVxuICAgIC5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSlcbiAgICAuZGVmYXVsdE5vdygpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBUaHJlYWRpbmdcbiAgdGhyZWFkSWQ6IHV1aWQoJ3RocmVhZF9pZCcpLFxuXG4gIC8vIE1lc3NhZ2Ugcm91dGluZ1xuICByZWNpcGllbnRPcmdJZDogdmFyY2hhcigncmVjaXBpZW50X29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSlcbiAgICAubm90TnVsbCgpLFxuXG4gIC8vIE1lc3NhZ2UgY29udGVudFxuICBtZXNzYWdlVHlwZTogdmFyY2hhcignbWVzc2FnZV90eXBlJywgeyBsZW5ndGg6IDIwIH0pXG4gICAgLiR0eXBlPE1lc3NhZ2VUeXBlPigpXG4gICAgLmRlZmF1bHQoJ2NvbnZlcnNhdGlvbicgYXMgTWVzc2FnZVR5cGUpXG4gICAgLm5vdE51bGwoKSxcbiAgLy8gTG9naWNhbCBjaGFubmVsL2luYm94IGJ1Y2tldCDigJQgJ3N1cHBvcnQnLCAnaGVscCcsIGV0Yy4gTnVsbGFibGUgc29cbiAgLy8gb3JnLXRvLW9yZyBjb252ZXJzYXRpb25zICh3aGljaCBhcmVuJ3QgY2hhbm5lbC1zY29wZWQpIGNhbiBvbWl0IGl0LlxuICBjaGFubmVsOiB2YXJjaGFyKCdjaGFubmVsJywgeyBsZW5ndGg6IDUwIH0pLFxuICBzdWJqZWN0OiB2YXJjaGFyKCdzdWJqZWN0JywgeyBsZW5ndGg6IDUwMCB9KVxuICAgIC5ub3ROdWxsKCksXG4gIGNvbnRlbnQ6IHRleHQoJ2NvbnRlbnQnKVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gU3RhdHVzXG4gIC8vIGByZWFkQnlgIGlzIHRoZSBwZXItcGFydGljaXBhbnQgcmVhZC1yZWNlaXB0IG1hcDogb3JnSWQg4oaSIElTTyB0aW1lc3RhbXAuXG4gIC8vIFJlY2lwaWVudCBtYXJraW5nIHRoZSB0aHJlYWQgZG9lcyBOT1QgZmxpcCBzZW5kZXIncyB2aWV3LiBFbXB0eSBge31gXG4gIC8vIG1lYW5zIG5vYm9keSBoYXMgcmVhZCBpdCB5ZXQuXG4gIHJlYWRCeToganNvbmIoJ3JlYWRfYnknKVxuICAgIC4kdHlwZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpXG4gICAgLmRlZmF1bHQoe30pXG4gICAgLm5vdE51bGwoKSxcbiAgcHJpb3JpdHk6IHZhcmNoYXIoJ3ByaW9yaXR5JywgeyBsZW5ndGg6IDIwIH0pXG4gICAgLiR0eXBlPE1lc3NhZ2VQcmlvcml0eT4oKVxuICAgIC5kZWZhdWx0KCdub3JtYWwnIGFzIE1lc3NhZ2VQcmlvcml0eSlcbiAgICAubm90TnVsbCgpLFxuXG4gIC8vIEFjY2VzcyBhbmQgdmlzaWJpbGl0eVxuICBhY2Nlc3NNb2RpZmllcjogdmFyY2hhcignYWNjZXNzX21vZGlmaWVyJywgeyBsZW5ndGg6IDEwIH0pXG4gICAgLiR0eXBlPEFjY2Vzc01vZGlmaWVyPigpXG4gICAgLmRlZmF1bHQoJ3ByaXZhdGUnIGFzIEFjY2Vzc01vZGlmaWVyKVxuICAgIC5ub3ROdWxsKCksXG4gIGlzRGVmYXVsdDogYm9vbGVhbignaXNfZGVmYXVsdCcpXG4gICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgLm5vdE51bGwoKSxcbiAgaXNBY3RpdmU6IGJvb2xlYW4oJ2lzX2FjdGl2ZScpXG4gICAgLmRlZmF1bHQodHJ1ZSlcbiAgICAubm90TnVsbCgpLFxuXG4gIC8vIERlbGV0aW9uIHRyYWNraW5nIChzb2Z0IGRlbGV0ZSlcbiAgZGVsZXRlZEF0OiB0aW1lc3RhbXAoJ2RlbGV0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgZGVsZXRlZEJ5OiB0ZXh0KCdkZWxldGVkX2J5JyksXG59LCAodGFibGUpID0+ICh7XG4gIC8vIEluZGV4ZXMgZm9yIGNvbW1vbiBxdWVyaWVzXG4gIG9yZ0lkSWR4OiBpbmRleCgnbWVzc2FnZV9vcmdfaWRfaWR4Jykub24odGFibGUub3JnSWQpLFxuICByZWNpcGllbnRPcmdJZElkeDogaW5kZXgoJ21lc3NhZ2VfcmVjaXBpZW50X29yZ19pZF9pZHgnKS5vbih0YWJsZS5yZWNpcGllbnRPcmdJZCksXG4gIHRocmVhZElkSWR4OiBpbmRleCgnbWVzc2FnZV90aHJlYWRfaWRfaWR4Jykub24odGFibGUudGhyZWFkSWQpLFxuICBtZXNzYWdlVHlwZUlkeDogaW5kZXgoJ21lc3NhZ2VfbWVzc2FnZV90eXBlX2lkeCcpLm9uKHRhYmxlLm1lc3NhZ2VUeXBlKSxcbiAgY2hhbm5lbElkeDogaW5kZXgoJ21lc3NhZ2VfY2hhbm5lbF9pZHgnKS5vbih0YWJsZS5jaGFubmVsKSxcbiAgY3JlYXRlZEF0SWR4OiBpbmRleCgnbWVzc2FnZV9jcmVhdGVkX2F0X2lkeCcpLm9uKHRhYmxlLmNyZWF0ZWRBdCksXG4gIGFjdGl2ZUlkeDogaW5kZXgoJ21lc3NhZ2VfYWN0aXZlX2lkeCcpLm9uKHRhYmxlLmlzQWN0aXZlKSxcblxuICAvLyBDb21wb3NpdGUgaW5kZXggZm9yIGluYm94IHF1ZXJpZXMgKHJlY2lwaWVudCArIGFjdGl2ZSArIGNyZWF0ZWQpXG4gIHJlY2lwaWVudEFjdGl2ZUNyZWF0ZWRJZHg6IGluZGV4KCdtZXNzYWdlX3JlY2lwaWVudF9hY3RpdmVfY3JlYXRlZF9pZHgnKVxuICAgIC5vbih0YWJsZS5yZWNpcGllbnRPcmdJZCwgdGFibGUuaXNBY3RpdmUsIHRhYmxlLmNyZWF0ZWRBdCksXG5cbiAgLy8gQ29tcG9zaXRlIGluZGV4IGZvciBvcmcgaW5ib3ggKG9yZ0lkICsgYWN0aXZlKVxuICBvcmdBY3RpdmVJZHg6IGluZGV4KCdtZXNzYWdlX29yZ19hY3RpdmVfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmlzQWN0aXZlKSxcbn0pKTtcblxuLyoqXG4gKiBQaXBlbGluZSBkZXBsb3ltZW50IHJlZ2lzdHJ5LlxuICogTWFwcyBkZXBsb3llZCBDb2RlUGlwZWxpbmUgQVJOcyBiYWNrIHRvIHBpcGVsaW5lIHJlY29yZHMgYW5kIG9yZyBJRHMuXG4gKiBQb3B1bGF0ZWQgYnkgdGhlIGRlcGxveSBjb21tYW5kIGFmdGVyIHN1Y2Nlc3NmdWwgQ0RLIGRlcGxveS5cbiAqIFVzZWQgYnkgdGhlIHBpcGVsaW5lLWV2ZW50cyBMYW1iZGEgdG8gcmVzb2x2ZSBFdmVudEJyaWRnZSBldmVudHMgdG8gb3JnLXNjb3BlZCByZWNvcmRzLlxuICpcbiAqIEB0YWJsZSBwaXBlbGluZV9yZWdpc3RyeVxuICovXG5leHBvcnQgY29uc3QgcGlwZWxpbmVSZWdpc3RyeSA9IHBnVGFibGUoJ3BpcGVsaW5lX3JlZ2lzdHJ5Jywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICAvLyBUaGUgcGxhdGZvcm0ncyBwaXBlbGluZSByZWNvcmQgaWQg4oCUIGEgU1RBQkxFIHV1aWQgY3JlYXRlZCB3aXRoIHRoZSBwaXBlbGluZVxuICAvLyByZWNvcmQsIGtub3duIGF0IENESyBzeW50aCwgYW5kIGFwcGxpZWQgdG8gdGhlIGxpdmUgQ29kZVBpcGVsaW5lIGFzIHRoZVxuICAvLyBgUElQRUxJTkVfRVZFTlRfSURgIHRhZy4gVGhlIGV2ZW50cyBMYW1iZGEgcmVhZHMgdGhhdCB0YWcgYW5kIHJlcG9ydHNcbiAgLy8gYWdhaW5zdCB0aGlzIGlkLCBzbyBpdCBJUyB0aGUgZXZlbnQgam9pbiBrZXkgKHJlcGxhY2luZyB0aGUgbWFza2VkIEFSTiDigJRcbiAgLy8gaXQgY2FycmllcyBubyBBV1MgYWNjb3VudC9yZWdpb24sIHNvIG5vIG1hc2tpbmcgaXMgbmVlZGVkKS4gVW5pcXVlOiBvbmVcbiAgLy8gcmVnaXN0cnkgcm93IHBlciBwaXBlbGluZSArIHRoZSB1cHNlcnQga2V5IGZvciAocmUpcmVnaXN0cmF0aW9uLlxuICBwaXBlbGluZUlkOiB1dWlkKCdwaXBlbGluZV9pZCcpLm5vdE51bGwoKS51bmlxdWUoKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBwaXBlbGluZU5hbWU6IHZhcmNoYXIoJ3BpcGVsaW5lX25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgcmVnaW9uOiB2YXJjaGFyKCdyZWdpb24nLCB7IGxlbmd0aDogMzAgfSksXG4gIHByb2plY3Q6IHZhcmNoYXIoJ3Byb2plY3QnLCB7IGxlbmd0aDogMjU1IH0pLFxuICBvcmdhbml6YXRpb246IHZhcmNoYXIoJ29yZ2FuaXphdGlvbicsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIGxhc3REZXBsb3llZDogdGltZXN0YW1wKCdsYXN0X2RlcGxveWVkJywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIHN0YWNrTmFtZTogdmFyY2hhcignc3RhY2tfbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBvcmdJZElkeDogaW5kZXgoJ3JlZ2lzdHJ5X29yZ19pZF9pZHgnKS5vbih0YWJsZS5vcmdJZCksXG4gIG9yZ1JlZ2lvbklkeDogaW5kZXgoJ3JlZ2lzdHJ5X29yZ19yZWdpb25faWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLnJlZ2lvbiksXG59KSk7XG5cbi8qKlxuICogRXZlbnQgc291cmNlIGlkZW50aWZpZXJzIGZvciBwaXBlbGluZV9ldmVudHMuXG4gKi9cbmV4cG9ydCB0eXBlIEV2ZW50U291cmNlID0gJ2NvZGVwaXBlbGluZScgfCAnY29kZWJ1aWxkJyB8ICdwbHVnaW4tYnVpbGQnO1xuXG4vKipcbiAqIEV2ZW50IHR5cGUgZ3JhbnVsYXJpdHkgbGV2ZWxzIGZvciBwaXBlbGluZV9ldmVudHMuXG4gKi9cbmV4cG9ydCB0eXBlIEV2ZW50VHlwZSA9ICdQSVBFTElORScgfCAnU1RBR0UnIHwgJ0FDVElPTicgfCAnQlVJTEQnO1xuXG4vKipcbiAqIFBpcGVsaW5lIGV4ZWN1dGlvbiBhbmQgYnVpbGQgZXZlbnRzLlxuICogQ2FwdHVyZXMgQ29kZVBpcGVsaW5lL0NvZGVCdWlsZCBzdGF0ZSBjaGFuZ2VzIGZyb20gRXZlbnRCcmlkZ2VcbiAqIGFuZCBwbHVnaW4gRG9ja2VyIGJ1aWxkIG91dGNvbWVzIGZyb20gQnVsbE1RLlxuICogQWxsIGV2ZW50cyBhcmUgb3JnLXNjb3BlZCBmb3IgbXVsdGktdGVuYW50IHJlcG9ydGluZy5cbiAqXG4gKiBAdGFibGUgcGlwZWxpbmVfZXZlbnRzXG4gKi9cbmV4cG9ydCBjb25zdCBwaXBlbGluZUV2ZW50ID0gcGdUYWJsZSgncGlwZWxpbmVfZXZlbnRzJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBwaXBlbGluZUlkOiB1dWlkKCdwaXBlbGluZV9pZCcpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIGV2ZW50U291cmNlOiB2YXJjaGFyKCdldmVudF9zb3VyY2UnLCB7IGxlbmd0aDogNTAgfSkuJHR5cGU8RXZlbnRTb3VyY2U+KCkubm90TnVsbCgpLFxuICBldmVudFR5cGU6IHZhcmNoYXIoJ2V2ZW50X3R5cGUnLCB7IGxlbmd0aDogNTAgfSkuJHR5cGU8RXZlbnRUeXBlPigpLm5vdE51bGwoKSxcbiAgc3RhdHVzOiB2YXJjaGFyKCdzdGF0dXMnLCB7IGxlbmd0aDogMjAgfSkubm90TnVsbCgpLFxuICBleGVjdXRpb25JZDogdmFyY2hhcignZXhlY3V0aW9uX2lkJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgc3RhZ2VOYW1lOiB2YXJjaGFyKCdzdGFnZV9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgYWN0aW9uTmFtZTogdmFyY2hhcignYWN0aW9uX25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLFxuICBlcnJvck1lc3NhZ2U6IHRleHQoJ2Vycm9yX21lc3NhZ2UnKSxcbiAgc3RhcnRlZEF0OiB0aW1lc3RhbXAoJ3N0YXJ0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgY29tcGxldGVkQXQ6IHRpbWVzdGFtcCgnY29tcGxldGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGR1cmF0aW9uTXM6IGludGVnZXIoJ2R1cmF0aW9uX21zJyksXG4gIGRldGFpbDoganNvbmIoJ2RldGFpbCcpLiR0eXBlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIHBpcGVsaW5lSWRJZHg6IGluZGV4KCdldmVudF9waXBlbGluZV9pZF9pZHgnKS5vbih0YWJsZS5waXBlbGluZUlkKSxcbiAgb3JnSWRJZHg6IGluZGV4KCdldmVudF9vcmdfaWRfaWR4Jykub24odGFibGUub3JnSWQpLFxuICBldmVudFR5cGVJZHg6IGluZGV4KCdldmVudF90eXBlX2lkeCcpLm9uKHRhYmxlLmV2ZW50VHlwZSksXG4gIHN0YXR1c0lkeDogaW5kZXgoJ2V2ZW50X3N0YXR1c19pZHgnKS5vbih0YWJsZS5zdGF0dXMpLFxuICBleGVjdXRpb25JZElkeDogaW5kZXgoJ2V2ZW50X2V4ZWN1dGlvbl9pZF9pZHgnKS5vbih0YWJsZS5leGVjdXRpb25JZCksXG4gIGNyZWF0ZWRBdElkeDogaW5kZXgoJ2V2ZW50X2NyZWF0ZWRfYXRfaWR4Jykub24odGFibGUuY3JlYXRlZEF0KSxcbiAgb3JnVHlwZUNyZWF0ZWRJZHg6IGluZGV4KCdldmVudF9vcmdfdHlwZV9jcmVhdGVkX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5ldmVudFR5cGUsIHRhYmxlLmNyZWF0ZWRBdCksXG4gIG9yZ1NvdXJjZVN0YXR1c0lkeDogaW5kZXgoJ2V2ZW50X29yZ19zb3VyY2Vfc3RhdHVzX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5ldmVudFNvdXJjZSwgdGFibGUuc3RhdHVzKSxcbiAgLy8gSWRlbXBvdGVuY3k6IEV2ZW50QnJpZGdlIOKGkiBTUVMgaXMgYXQtbGVhc3Qtb25jZSwgc28gdGhlIHNhbWUgc3RhdGUtY2hhbmdlXG4gIC8vIGNhbiBiZSBkZWxpdmVyZWQgdHdpY2UuIFRoaXMgcGFydGlhbCB1bmlxdWUgaW5kZXggZGVkdXBzIHJlLWRlbGl2ZXJpZXNcbiAgLy8gKHBhaXJlZCB3aXRoIGBvbkNvbmZsaWN0RG9Ob3RoaW5nYCBpbiByZXBvcnRpbmctc2VydmljZS5pbmdlc3RFdmVudHMpLlxuICAvLyBQYXJ0aWFsIChleGVjdXRpb25faWQgSVMgTk9UIE5VTEwpIGJlY2F1c2UgdGhhdCdzIHRoZSBuYXR1cmFsIHBlci1ldmVudFxuICAvLyBrZXk7IGV2ZW50cyB3aXRob3V0IGFuIGV4ZWN1dGlvbklkIChyYXJlKSBhcmVuJ3QgZGVkdXBlZCwgd2hpY2ggaXMgc2FmZS5cbiAgLy8gSW5jbHVkZXMgcGlwZWxpbmVfaWQgc28gYSAodGhlb3JldGljYWwpIGV4ZWN1dGlvbi1pZCByZXVzZSBhY3Jvc3MgcGlwZWxpbmVzXG4gIC8vIGNhbid0IGNvbGxpZGUgbm93IHRoYXQgdGhlIEFSTiBpcyBubyBsb25nZXIgcGFydCBvZiB0aGUgcm93LlxuICAvL1xuICAvLyBDT0FMRVNDRSB0aGUgbnVsbGFibGUgcGFydHMgdG8gc2VudGluZWxzIChleHByZXNzaW9uIGluZGV4KTogUElQRUxJTkUvU1RBR0UvXG4gIC8vIEJVSUxEIGV2ZW50cyBsZWF2ZSBzdGFnZV9uYW1lL2FjdGlvbl9uYW1lIE5VTEwgKHBsdWdpbi1idWlsZCBhbHNvIHBpcGVsaW5lX2lkXG4gIC8vIE5VTEwpLCBhbmQgUG9zdGdyZXMgdHJlYXRzIE5VTExzIGFzIERJU1RJTkNUIGluIGEgdW5pcXVlIGluZGV4IOKAlCBzbyB0aGUgcGxhaW5cbiAgLy8gY29sdW1uIGluZGV4IG5ldmVyIG1hdGNoZXMgZm9yIHRob3NlIHR5cGVzIGFuZCBvbkNvbmZsaWN0RG9Ob3RoaW5nIGNhbid0IGRlZHVwXG4gIC8vIHRoZWlyIGF0LWxlYXN0LW9uY2UgcmUtZGVsaXZlcmllcy4gQ29sbGFwc2luZyBOVUxM4oaSJycgbWFrZXMgZXF1YWwgZXZlbnRzIGVxdWFsLlxuICAvLyAoZHJpenpsZSdzIHVuaXF1ZUluZGV4IGNhbid0IGV4cHJlc3MgTlVMTFMgTk9UIERJU1RJTkNUIG9uIGEgcGFydGlhbCBpbmRleCwgc29cbiAgLy8gd2UgdXNlIHRoZSBlcXVpdmFsZW50IGV4cHJlc3Npb24gaW5kZXguKSBNSUdSQVRJT04gUkVRVUlSRUQ6IGRyaXp6bGUta2l0IGdlbmVyYXRlLlxuICBkZWR1cElkeDogdW5pcXVlSW5kZXgoJ2V2ZW50X2RlZHVwX2lkeCcpXG4gICAgLm9uKFxuICAgICAgc3FsYGNvYWxlc2NlKCR7dGFibGUucGlwZWxpbmVJZH06OnRleHQsICcnKWAsXG4gICAgICB0YWJsZS5leGVjdXRpb25JZCxcbiAgICAgIHRhYmxlLmV2ZW50VHlwZSxcbiAgICAgIHRhYmxlLnN0YXR1cyxcbiAgICAgIHNxbGBjb2FsZXNjZSgke3RhYmxlLnN0YWdlTmFtZX0sICcnKWAsXG4gICAgICBzcWxgY29hbGVzY2UoJHt0YWJsZS5hY3Rpb25OYW1lfSwgJycpYCxcbiAgICApXG4gICAgLndoZXJlKHNxbGBleGVjdXRpb25faWQgSVMgTk9UIE5VTExgKSxcbn0pKTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29tcGxpYW5jZSBTZXJ2aWNlIFRhYmxlc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENvbXBsaWFuY2UgcnVsZSBzZXZlcml0eSBsZXZlbHMuXG4gKi9cbmV4cG9ydCB0eXBlIFJ1bGVTZXZlcml0eSA9ICd3YXJuaW5nJyB8ICdlcnJvcicgfCAnY3JpdGljYWwnO1xuXG4vKipcbiAqIENvbXBsaWFuY2UgcnVsZSB0YXJnZXQgZW50aXR5IHR5cGVzLlxuICovXG5leHBvcnQgdHlwZSBSdWxlVGFyZ2V0ID0gJ3BsdWdpbicgfCAncGlwZWxpbmUnO1xuXG4vKipcbiAqIENvbXBsaWFuY2UgcnVsZSBvcGVyYXRvcnMgZm9yIGZpZWxkIGV2YWx1YXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFJ1bGVPcGVyYXRvciA9XG4gIHwgJ2VxJyB8ICduZXEnXG4gIHwgJ2NvbnRhaW5zJyB8ICdub3RDb250YWlucydcbiAgfCAncmVnZXgnXG4gIHwgJ2d0JyB8ICdndGUnIHwgJ2x0JyB8ICdsdGUnXG4gIHwgJ2luJyB8ICdub3RJbidcbiAgfCAnZXhpc3RzJyB8ICdub3RFeGlzdHMnIHwgJ25vdEVtcHR5J1xuICB8ICdjb3VudEd0JyB8ICdjb3VudEx0J1xuICB8ICdsZW5ndGhHdCcgfCAnbGVuZ3RoTHQnO1xuXG4vKipcbiAqIENyb3NzLWZpZWxkIGNvbmRpdGlvbiBtb2RlIGZvciBtdWx0aS1jb25kaXRpb24gcnVsZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFJ1bGVDb25kaXRpb25Nb2RlID0gJ2FsbCcgfCAnYW55JztcblxuLyoqXG4gKiBSdWxlIHNjb3BlICBvcmctbGV2ZWwgb3IgcHVibGlzaGVkIChzeXN0ZW0gb3JnIG9ubHksIG9wdC1pbiB2aWEgc3Vic2NyaXB0aW9uKS5cbiAqL1xuZXhwb3J0IHR5cGUgUnVsZVNjb3BlID0gJ29yZycgfCAncHVibGlzaGVkJztcblxuLyoqXG4gKiBBIHNpbmdsZSBjb25kaXRpb24gaW4gYSBjcm9zcy1maWVsZCBydWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bGVDb25kaXRpb24ge1xuICBmaWVsZD86IHN0cmluZztcbiAgb3BlcmF0b3I/OiBSdWxlT3BlcmF0b3I7XG4gIHZhbHVlPzogdW5rbm93bjtcbiAgZGVwZW5kc09uUnVsZT86IHN0cmluZzsgLy8gcnVsZSBJRCAgb25seSBldmFsdWF0ZSBpZiByZWZlcmVuY2VkIHJ1bGUgcGFzc2VkXG59XG5cbi8qKlxuICogQ29tcGxpYW5jZSBwb2xpY2llcyBncm91cCBydWxlcyBpbnRvIG5hbWVkIHNldHMgdGhhdCBjYW4gYmUgZW5hYmxlZC9kaXNhYmxlZCB0b2dldGhlci5cbiAqXG4gKiBAdGFibGUgY29tcGxpYW5jZV9wb2xpY2llc1xuICovXG5leHBvcnQgY29uc3QgY29tcGxpYW5jZVBvbGljeSA9IHBnVGFibGUoJ2NvbXBsaWFuY2VfcG9saWNpZXMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLmRlZmF1bHQoJ3N5c3RlbScpLm5vdE51bGwoKSxcbiAgY3JlYXRlZEJ5OiB0ZXh0KCdjcmVhdGVkX2J5JykuZGVmYXVsdCgnc3lzdGVtJykubm90TnVsbCgpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRCeTogdGV4dCgndXBkYXRlZF9ieScpLmRlZmF1bHQoJ3N5c3RlbScpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuXG4gIG5hbWU6IHZhcmNoYXIoJ25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgZGVzY3JpcHRpb246IHRleHQoJ2Rlc2NyaXB0aW9uJyksXG4gIHZlcnNpb246IHZhcmNoYXIoJ3ZlcnNpb24nLCB7IGxlbmd0aDogNTAgfSkuZGVmYXVsdCgnMS4wLjAnKS5ub3ROdWxsKCksXG4gIGlzVGVtcGxhdGU6IGJvb2xlYW4oJ2lzX3RlbXBsYXRlJykuZGVmYXVsdChmYWxzZSkubm90TnVsbCgpLFxuXG4gIGFjY2Vzc01vZGlmaWVyOiB2YXJjaGFyKCdhY2Nlc3NfbW9kaWZpZXInLCB7IGxlbmd0aDogMTAgfSlcbiAgICAuJHR5cGU8QWNjZXNzTW9kaWZpZXI+KCkuZGVmYXVsdCgncHJpdmF0ZScgYXMgQWNjZXNzTW9kaWZpZXIpLm5vdE51bGwoKSxcbiAgaXNEZWZhdWx0OiBib29sZWFuKCdpc19kZWZhdWx0JykuZGVmYXVsdChmYWxzZSkubm90TnVsbCgpLFxuICBpc0FjdGl2ZTogYm9vbGVhbignaXNfYWN0aXZlJykuZGVmYXVsdCh0cnVlKS5ub3ROdWxsKCksXG4gIGRlbGV0ZWRBdDogdGltZXN0YW1wKCdkZWxldGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGRlbGV0ZWRCeTogdGV4dCgnZGVsZXRlZF9ieScpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBvcmdBY3RpdmVJZHg6IGluZGV4KCdjb21wbGlhbmNlX3BvbGljeV9vcmdfYWN0aXZlX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5pc0FjdGl2ZSksXG4gIHRlbXBsYXRlSWR4OiBpbmRleCgnY29tcGxpYW5jZV9wb2xpY3lfdGVtcGxhdGVfaWR4Jykub24odGFibGUuaXNUZW1wbGF0ZSksXG4gIG5hbWVPcmdWZXJzaW9uVW5pcXVlOiB1bmlxdWVJbmRleCgnY29tcGxpYW5jZV9wb2xpY3lfbmFtZV9vcmdfdmVyc2lvbl91bmlxdWUnKVxuICAgIC5vbih0YWJsZS5vcmdJZCwgdGFibGUubmFtZSwgdGFibGUudmVyc2lvbiksXG59KSk7XG5cbi8qKlxuICogQ29tcGxpYW5jZSBydWxlcyBkZWZpbmUgaW5kaXZpZHVhbCBjaGVja3MgYWdhaW5zdCBwbHVnaW4vcGlwZWxpbmUgYXR0cmlidXRlcy5cbiAqXG4gKiBAdGFibGUgY29tcGxpYW5jZV9ydWxlc1xuICovXG5leHBvcnQgY29uc3QgY29tcGxpYW5jZVJ1bGUgPSBwZ1RhYmxlKCdjb21wbGlhbmNlX3J1bGVzJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5kZWZhdWx0KCdzeXN0ZW0nKS5ub3ROdWxsKCksXG4gIGNyZWF0ZWRCeTogdGV4dCgnY3JlYXRlZF9ieScpLmRlZmF1bHQoJ3N5c3RlbScpLm5vdE51bGwoKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICB1cGRhdGVkQnk6IHRleHQoJ3VwZGF0ZWRfYnknKS5kZWZhdWx0KCdzeXN0ZW0nKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcblxuICAvLyBSdWxlIGlkZW50aXR5XG4gIG5hbWU6IHZhcmNoYXIoJ25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgZGVzY3JpcHRpb246IHRleHQoJ2Rlc2NyaXB0aW9uJyksXG4gIHBvbGljeUlkOiB1dWlkKCdwb2xpY3lfaWQnKS5yZWZlcmVuY2VzKCgpID0+IGNvbXBsaWFuY2VQb2xpY3kuaWQsIHsgb25EZWxldGU6ICdzZXQgbnVsbCcgfSksXG4gIHByaW9yaXR5OiBpbnRlZ2VyKCdwcmlvcml0eScpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICB0YXJnZXQ6IHZhcmNoYXIoJ3RhcmdldCcsIHsgbGVuZ3RoOiAyMCB9KS4kdHlwZTxSdWxlVGFyZ2V0PigpLm5vdE51bGwoKSxcbiAgc2V2ZXJpdHk6IHZhcmNoYXIoJ3NldmVyaXR5JywgeyBsZW5ndGg6IDEwIH0pLiR0eXBlPFJ1bGVTZXZlcml0eT4oKS5kZWZhdWx0KCdlcnJvcicpLm5vdE51bGwoKSxcblxuICAvLyBDYXRlZ29yaXphdGlvblxuICB0YWdzOiBqc29uYigndGFncycpLiR0eXBlPHN0cmluZ1tdPigpLmRlZmF1bHQoW10pLm5vdE51bGwoKSxcblxuICAvLyBTY2hlZHVsaW5nXG4gIGVmZmVjdGl2ZUZyb206IHRpbWVzdGFtcCgnZWZmZWN0aXZlX2Zyb20nLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgZWZmZWN0aXZlVW50aWw6IHRpbWVzdGFtcCgnZWZmZWN0aXZlX3VudGlsJywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG5cbiAgLy8gU2NvcGVcbiAgc2NvcGU6IHZhcmNoYXIoJ3Njb3BlJywgeyBsZW5ndGg6IDEwIH0pLiR0eXBlPFJ1bGVTY29wZT4oKS5kZWZhdWx0KCdvcmcnKS5ub3ROdWxsKCksXG5cbiAgLy8gRm9ya2luZyAgdHJhY2tzIHdoaWNoIHB1Ymxpc2hlZCBydWxlIHRoaXMgb3JnIHJ1bGUgd2FzIGNvcGllZCBmcm9tXG4gIGZvcmtlZEZyb21SdWxlSWQ6IHV1aWQoJ2ZvcmtlZF9mcm9tX3J1bGVfaWQnKSxcblxuICAvLyBOb3RpZmljYXRpb24gb3ZlcnJpZGVcbiAgc3VwcHJlc3NOb3RpZmljYXRpb246IGJvb2xlYW4oJ3N1cHByZXNzX25vdGlmaWNhdGlvbicpLmRlZmF1bHQoZmFsc2UpLm5vdE51bGwoKSxcblxuICAvLyBPcmcg4oaSIHRlYW0gaGllcmFyY2h5OiB3aGVuIHRydWUsIHRoaXMgKHBhcmVudC1vcmcpIHJ1bGUgaXMgYWxzbyBlbmZvcmNlZCBvblxuICAvLyBkZXNjZW5kYW50IHRlYW0gb3JncyBkdXJpbmcgdGhlaXIgY29tcGxpYW5jZSBldmFsdWF0aW9uLlxuICBwcm9wYWdhdGVUb0NoaWxkcmVuOiBib29sZWFuKCdwcm9wYWdhdGVfdG9fY2hpbGRyZW4nKS5kZWZhdWx0KGZhbHNlKS5ub3ROdWxsKCksXG5cbiAgLy8gU2luZ2xlLWZpZWxkIGNvbmRpdGlvblxuICBmaWVsZDogdmFyY2hhcignZmllbGQnLCB7IGxlbmd0aDogMTAwIH0pLFxuICBvcGVyYXRvcjogdmFyY2hhcignb3BlcmF0b3InLCB7IGxlbmd0aDogMjAgfSkuJHR5cGU8UnVsZU9wZXJhdG9yPigpLFxuICB2YWx1ZToganNvbmIoJ3ZhbHVlJyksXG5cbiAgLy8gQ3Jvc3MtZmllbGQgY29uZGl0aW9ucyAob3ZlcnJpZGVzIHNpbmdsZS1maWVsZCB3aGVuIHByZXNlbnQpXG4gIGNvbmRpdGlvbnM6IGpzb25iKCdjb25kaXRpb25zJykuJHR5cGU8UnVsZUNvbmRpdGlvbltdPigpLFxuICBjb25kaXRpb25Nb2RlOiB2YXJjaGFyKCdjb25kaXRpb25fbW9kZScsIHsgbGVuZ3RoOiA1IH0pLiR0eXBlPFJ1bGVDb25kaXRpb25Nb2RlPigpLmRlZmF1bHQoJ2FsbCcpLFxuXG4gIC8vIEFjY2VzcyBhbmQgdmlzaWJpbGl0eVxuICBhY2Nlc3NNb2RpZmllcjogdmFyY2hhcignYWNjZXNzX21vZGlmaWVyJywgeyBsZW5ndGg6IDEwIH0pXG4gICAgLiR0eXBlPEFjY2Vzc01vZGlmaWVyPigpLmRlZmF1bHQoJ3ByaXZhdGUnIGFzIEFjY2Vzc01vZGlmaWVyKS5ub3ROdWxsKCksXG4gIGlzRGVmYXVsdDogYm9vbGVhbignaXNfZGVmYXVsdCcpLmRlZmF1bHQoZmFsc2UpLm5vdE51bGwoKSxcbiAgaXNBY3RpdmU6IGJvb2xlYW4oJ2lzX2FjdGl2ZScpLmRlZmF1bHQodHJ1ZSkubm90TnVsbCgpLFxuICBkZWxldGVkQXQ6IHRpbWVzdGFtcCgnZGVsZXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBkZWxldGVkQnk6IHRleHQoJ2RlbGV0ZWRfYnknKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgb3JnVGFyZ2V0QWN0aXZlSWR4OiBpbmRleCgnY29tcGxpYW5jZV9ydWxlX29yZ190YXJnZXRfYWN0aXZlX2lkeCcpXG4gICAgLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS50YXJnZXQsIHRhYmxlLmlzQWN0aXZlKSxcbiAgb3JnUG9saWN5SWR4OiBpbmRleCgnY29tcGxpYW5jZV9ydWxlX29yZ19wb2xpY3lfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLnBvbGljeUlkKSxcbiAgcHJpb3JpdHlJZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfcHJpb3JpdHlfaWR4Jykub24odGFibGUucHJpb3JpdHkpLFxuICBzY29wZUlkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcnVsZV9zY29wZV9pZHgnKS5vbih0YWJsZS5zY29wZSksXG4gIGVmZmVjdGl2ZUZyb21JZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfZWZmZWN0aXZlX2Zyb21faWR4Jykub24odGFibGUuZWZmZWN0aXZlRnJvbSksXG4gIG5hbWVPcmdVbmlxdWU6IHVuaXF1ZUluZGV4KCdjb21wbGlhbmNlX3J1bGVfbmFtZV9vcmdfdW5pcXVlJykub24odGFibGUub3JnSWQsIHRhYmxlLm5hbWUpLFxufSkpO1xuXG4vKipcbiAqIFRyYWNrcyBldmVyeSBjaGFuZ2UgdG8gY29tcGxpYW5jZSBydWxlcyBmb3IgdmVyc2lvbmluZyBhbmQgcm9sbGJhY2suXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2VfcnVsZV9oaXN0b3J5XG4gKi9cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlUnVsZUhpc3RvcnkgPSBwZ1RhYmxlKCdjb21wbGlhbmNlX3J1bGVfaGlzdG9yeScsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgcnVsZUlkOiB1dWlkKCdydWxlX2lkJykubm90TnVsbCgpLnJlZmVyZW5jZXMoKCkgPT4gY29tcGxpYW5jZVJ1bGUuaWQsIHsgb25EZWxldGU6ICdjYXNjYWRlJyB9KSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBjaGFuZ2VUeXBlOiB2YXJjaGFyKCdjaGFuZ2VfdHlwZScsIHsgbGVuZ3RoOiAyMCB9KS5ub3ROdWxsKCksIC8vIGNyZWF0ZWQgfCB1cGRhdGVkIHwgZGVsZXRlZCB8IHJlc3RvcmVkXG4gIHByZXZpb3VzU3RhdGU6IGpzb25iKCdwcmV2aW91c19zdGF0ZScpLCAvLyBmdWxsIHJ1bGUgc25hcHNob3QgYmVmb3JlIGNoYW5nZVxuICBjaGFuZ2VkQnk6IHRleHQoJ2NoYW5nZWRfYnknKS5ub3ROdWxsKCksXG4gIGNoYW5nZWRBdDogdGltZXN0YW1wKCdjaGFuZ2VkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgcnVsZUNoYW5nZWRBdElkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcnVsZV9oaXN0b3J5X3J1bGVfY2hhbmdlZF9pZHgnKVxuICAgIC5vbih0YWJsZS5ydWxlSWQsIHRhYmxlLmNoYW5nZWRBdCksXG4gIG9yZ0NoYW5nZWRBdElkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcnVsZV9oaXN0b3J5X29yZ19jaGFuZ2VkX2lkeCcpXG4gICAgLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5jaGFuZ2VkQXQpLFxuICBydWxlSWRJZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfaGlzdG9yeV9ydWxlX2lkX2lkeCcpXG4gICAgLm9uKHRhYmxlLnJ1bGVJZCksXG59KSk7XG5cbi8qKlxuICogQ29tcGxpYW5jZSBhdWRpdCBsb2cgIHN0b3JlcyBldmVyeSBjb21wbGlhbmNlIGNoZWNrIHJlc3VsdC5cbiAqXG4gKiBAdGFibGUgY29tcGxpYW5jZV9hdWRpdF9sb2dcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBsaWFuY2VBdWRpdExvZyA9IHBnVGFibGUoJ2NvbXBsaWFuY2VfYXVkaXRfbG9nJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHVzZXJJZDogdGV4dCgndXNlcl9pZCcpLm5vdE51bGwoKSxcbiAgdGFyZ2V0OiB2YXJjaGFyKCd0YXJnZXQnLCB7IGxlbmd0aDogMjAgfSkuJHR5cGU8UnVsZVRhcmdldD4oKS5ub3ROdWxsKCksXG4gIGFjdGlvbjogdmFyY2hhcignYWN0aW9uJywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSwgLy8gdXBsb2FkIHwgZGVwbG95IHwgY3JlYXRlIHwgdXBkYXRlIHwgc2NhblxuICBlbnRpdHlJZDogdmFyY2hhcignZW50aXR5X2lkJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgZW50aXR5TmFtZTogdmFyY2hhcignZW50aXR5X25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLFxuICByZXN1bHQ6IHZhcmNoYXIoJ3Jlc3VsdCcsIHsgbGVuZ3RoOiAxMCB9KS5ub3ROdWxsKCksIC8vIHBhc3MgfCB3YXJuIHwgYmxvY2tcbiAgdmlvbGF0aW9uczoganNvbmIoJ3Zpb2xhdGlvbnMnKS4kdHlwZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPigpLmRlZmF1bHQoW10pLFxuICBydWxlQ291bnQ6IGludGVnZXIoJ3J1bGVfY291bnQnKS5ub3ROdWxsKCksXG4gIHNjYW5JZDogdXVpZCgnc2Nhbl9pZCcpLCAvLyBncm91cHMgZW50cmllcyBmcm9tIHRoZSBzYW1lIGJ1bGsgc2NhblxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIG9yZ0NyZWF0ZWRBdElkeDogaW5kZXgoJ2NvbXBsaWFuY2VfYXVkaXRfb3JnX2NyZWF0ZWRfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmNyZWF0ZWRBdCksXG4gIC8vIERFU0MgdmFyaWFudCBmb3IgdGhlIGRvbWluYW50IFwibGF0ZXN0IGF1ZGl0IGV2ZW50cyBwZXIgb3JnXCIgcXVlcnlcbiAgLy8gcGF0dGVybiAoYXVkaXQgbG9nIFVJcyBzb3J0IG5ld2VzdC1maXJzdCkuIFBvc3RncmVzIGNhbiB1c2UgdGhlIGFzY1xuICAvLyBpbmRleCBmb3IgZGVzYyBzY2FucywgYnV0IGEgbWF0Y2hpbmcgREVTQyBpbmRleCBsZXRzIGluZGV4LW9ubHkgc2NhbnNcbiAgLy8gc2F0aXNmeSBgT1JERVIgQlkgY3JlYXRlZF9hdCBERVNDIExJTUlUIG5gIHdpdGhvdXQgYSByZXZlcnNlIHN0ZXAuXG4gIC8vIE1JR1JBVElPTiBSRVFVSVJFRDogcnVuIGBwbnBtIGRyaXp6bGUta2l0IGdlbmVyYXRlYCBhZnRlciBwdWxsaW5nLlxuICBvcmdDcmVhdGVkQXREZXNjSWR4OiBpbmRleCgnY29tcGxpYW5jZV9hdWRpdF9vcmdfY3JlYXRlZF9kZXNjX2lkeCcpXG4gICAgLm9uKHRhYmxlLm9yZ0lkLCBzcWxgJHt0YWJsZS5jcmVhdGVkQXR9IERFU0NgKSxcbiAgb3JnVGFyZ2V0UmVzdWx0SWR4OiBpbmRleCgnY29tcGxpYW5jZV9hdWRpdF9vcmdfdGFyZ2V0X3Jlc3VsdF9pZHgnKVxuICAgIC5vbih0YWJsZS5vcmdJZCwgdGFibGUudGFyZ2V0LCB0YWJsZS5yZXN1bHQpLFxuICBzY2FuSWRJZHg6IGluZGV4KCdjb21wbGlhbmNlX2F1ZGl0X3NjYW5faWRfaWR4Jykub24odGFibGUuc2NhbklkKSxcbn0pKTtcblxuLyoqXG4gKiBQZXItZW50aXR5IGV4ZW1wdGlvbnMgZnJvbSBzcGVjaWZpYyBjb21wbGlhbmNlIHJ1bGVzLlxuICpcbiAqIEB0YWJsZSBjb21wbGlhbmNlX2V4ZW1wdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBsaWFuY2VFeGVtcHRpb24gPSBwZ1RhYmxlKCdjb21wbGlhbmNlX2V4ZW1wdGlvbnMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgcnVsZUlkOiB1dWlkKCdydWxlX2lkJykubm90TnVsbCgpLnJlZmVyZW5jZXMoKCkgPT4gY29tcGxpYW5jZVJ1bGUuaWQsIHsgb25EZWxldGU6ICdjYXNjYWRlJyB9KSxcbiAgZW50aXR5VHlwZTogdmFyY2hhcignZW50aXR5X3R5cGUnLCB7IGxlbmd0aDogMjAgfSkuJHR5cGU8UnVsZVRhcmdldD4oKS5ub3ROdWxsKCksXG4gIGVudGl0eUlkOiB1dWlkKCdlbnRpdHlfaWQnKS5ub3ROdWxsKCksXG4gIGVudGl0eU5hbWU6IHZhcmNoYXIoJ2VudGl0eV9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgcmVhc29uOiB0ZXh0KCdyZWFzb24nKS5ub3ROdWxsKCksXG4gIGFwcHJvdmVkQnk6IHRleHQoJ2FwcHJvdmVkX2J5JyksXG4gIHJlamVjdGlvblJlYXNvbjogdGV4dCgncmVqZWN0aW9uX3JlYXNvbicpLFxuICBzdGF0dXM6IHZhcmNoYXIoJ3N0YXR1cycsIHsgbGVuZ3RoOiAyMCB9KS5kZWZhdWx0KCdwZW5kaW5nJykubm90TnVsbCgpLCAvLyBwZW5kaW5nIHwgYXBwcm92ZWQgfCByZWplY3RlZCB8IGV4cGlyZWRcbiAgZXhwaXJlc0F0OiB0aW1lc3RhbXAoJ2V4cGlyZXNfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgY3JlYXRlZEJ5OiB0ZXh0KCdjcmVhdGVkX2J5Jykubm90TnVsbCgpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRCeTogdGV4dCgndXBkYXRlZF9ieScpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBvcmdSdWxlRW50aXR5VW5pcXVlOiB1bmlxdWVJbmRleCgnY29tcGxpYW5jZV9leGVtcHRpb25fb3JnX3J1bGVfZW50aXR5X3VuaXF1ZScpXG4gICAgLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5ydWxlSWQsIHRhYmxlLmVudGl0eUlkKSxcbiAgb3JnU3RhdHVzSWR4OiBpbmRleCgnY29tcGxpYW5jZV9leGVtcHRpb25fb3JnX3N0YXR1c19pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuc3RhdHVzKSxcbiAgZXhwaXJlc0F0SWR4OiBpbmRleCgnY29tcGxpYW5jZV9leGVtcHRpb25fZXhwaXJlc19hdF9pZHgnKS5vbih0YWJsZS5leHBpcmVzQXQpLFxuICBlbnRpdHlJZElkeDogaW5kZXgoJ2NvbXBsaWFuY2VfZXhlbXB0aW9uX2VudGl0eV9pZF9pZHgnKS5vbih0YWJsZS5lbnRpdHlJZCksXG59KSk7XG5cbi8qKlxuICogVHJhY2tzIHdoaWNoIG9yZ3MgaGF2ZSBvcHRlZCBpbnRvIHN5c3RlbS1vcmcgcHVibGlzaGVkIGNvbXBsaWFuY2UgcnVsZXMuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2VfcnVsZV9zdWJzY3JpcHRpb25zXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbiA9IHBnVGFibGUoJ2NvbXBsaWFuY2VfcnVsZV9zdWJzY3JpcHRpb25zJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHJ1bGVJZDogdXVpZCgncnVsZV9pZCcpLm5vdE51bGwoKS5yZWZlcmVuY2VzKCgpID0+IGNvbXBsaWFuY2VSdWxlLmlkLCB7IG9uRGVsZXRlOiAnY2FzY2FkZScgfSksXG4gIHN1YnNjcmliZWRCeTogdGV4dCgnc3Vic2NyaWJlZF9ieScpLm5vdE51bGwoKSxcbiAgc3Vic2NyaWJlZEF0OiB0aW1lc3RhbXAoJ3N1YnNjcmliZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICBpc0FjdGl2ZTogYm9vbGVhbignaXNfYWN0aXZlJykuZGVmYXVsdCh0cnVlKS5ub3ROdWxsKCksXG4gIHBpbm5lZFZlcnNpb246IGpzb25iKCdwaW5uZWRfdmVyc2lvbicpLiR0eXBlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpLFxuICB1bnN1YnNjcmliZWRBdDogdGltZXN0YW1wKCd1bnN1YnNjcmliZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgdW5zdWJzY3JpYmVkQnk6IHRleHQoJ3Vuc3Vic2NyaWJlZF9ieScpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBvcmdSdWxlVW5pcXVlOiB1bmlxdWVJbmRleCgnY29tcGxpYW5jZV9ydWxlX3N1Yl9vcmdfcnVsZV91bmlxdWUnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUucnVsZUlkKSxcbiAgb3JnQWN0aXZlSWR4OiBpbmRleCgnY29tcGxpYW5jZV9ydWxlX3N1Yl9vcmdfYWN0aXZlX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5pc0FjdGl2ZSksXG4gIHJ1bGVJZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfc3ViX3J1bGVfaWR4Jykub24odGFibGUucnVsZUlkKSxcbn0pKTtcblxuLyoqXG4gKiBCdWxrIGNvbXBsaWFuY2Ugc2NhbnMgIHRyYWNrcyBzY2hlZHVsZWQgYW5kIG9uLWRlbWFuZCBzY2Fucy5cbiAqXG4gKiBAdGFibGUgY29tcGxpYW5jZV9zY2Fuc1xuICovXG5leHBvcnQgY29uc3QgY29tcGxpYW5jZVNjYW4gPSBwZ1RhYmxlKCdjb21wbGlhbmNlX3NjYW5zJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHRhcmdldDogdmFyY2hhcigndGFyZ2V0JywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSwgLy8gcGx1Z2luIHwgcGlwZWxpbmUgfCBhbGxcbiAgZmlsdGVyOiBqc29uYignZmlsdGVyJyksIC8vIG9wdGlvbmFsIGVudGl0eSBmaWx0ZXIgZm9yIHBhcnRpYWwgc2NhbnNcbiAgc3RhdHVzOiB2YXJjaGFyKCdzdGF0dXMnLCB7IGxlbmd0aDogMjAgfSkuZGVmYXVsdCgncGVuZGluZycpLm5vdE51bGwoKSwgLy8gcGVuZGluZyB8IHJ1bm5pbmcgfCBjb21wbGV0ZWQgfCBmYWlsZWQgfCBjYW5jZWxsZWRcbiAgdHJpZ2dlcmVkQnk6IHZhcmNoYXIoJ3RyaWdnZXJlZF9ieScsIHsgbGVuZ3RoOiAyMCB9KS5ub3ROdWxsKCksIC8vIG1hbnVhbCB8IHNjaGVkdWxlZCB8IHJ1bGUtY2hhbmdlIHwgcnVsZS1kcnktcnVuXG4gIHVzZXJJZDogdGV4dCgndXNlcl9pZCcpLm5vdE51bGwoKSxcbiAgdG90YWxFbnRpdGllczogaW50ZWdlcigndG90YWxfZW50aXRpZXMnKS5kZWZhdWx0KDApLm5vdE51bGwoKSxcbiAgcHJvY2Vzc2VkRW50aXRpZXM6IGludGVnZXIoJ3Byb2Nlc3NlZF9lbnRpdGllcycpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICBwYXNzQ291bnQ6IGludGVnZXIoJ3Bhc3NfY291bnQnKS5kZWZhdWx0KDApLm5vdE51bGwoKSxcbiAgd2FybkNvdW50OiBpbnRlZ2VyKCd3YXJuX2NvdW50JykuZGVmYXVsdCgwKS5ub3ROdWxsKCksXG4gIGJsb2NrQ291bnQ6IGludGVnZXIoJ2Jsb2NrX2NvdW50JykuZGVmYXVsdCgwKS5ub3ROdWxsKCksXG4gIC8vIFRydWUgd2hlbiB0aGUgc2NhbiBzdG9wcGVkIGVhcmx5IGF0IGEgY29uZmlndXJlZCBwZXItc2NhbiBjYXAgKHNvIHRoZVxuICAvLyBjb3VudHMgYWJvdmUgcmVwcmVzZW50IGEgc3Vic2V0LCBub3QgdGhlIGZ1bGwgZW50aXR5IHVuaXZlcnNlKS4gU3VyZmFjZWRcbiAgLy8gaW4gdGhlIHNjYW4tc3RhdHVzIFVJIHNvIHVzZXJzIGtub3cgd2hldGhlciB0byB3aWRlbiB0aGUgZmlsdGVyLlxuICAvLyBNSUdSQVRJT04gUkVRVUlSRUQ6IHJ1biBgcG5wbSBkcml6emxlLWtpdCBnZW5lcmF0ZWAgYWZ0ZXIgcHVsbGluZy5cbiAgdHJ1bmNhdGVkOiBib29sZWFuKCd0cnVuY2F0ZWQnKS5kZWZhdWx0KGZhbHNlKS5ub3ROdWxsKCksXG4gIHN0YXJ0ZWRBdDogdGltZXN0YW1wKCdzdGFydGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGNvbXBsZXRlZEF0OiB0aW1lc3RhbXAoJ2NvbXBsZXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBjYW5jZWxsZWRBdDogdGltZXN0YW1wKCdjYW5jZWxsZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgY2FuY2VsbGVkQnk6IHRleHQoJ2NhbmNlbGxlZF9ieScpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIG9yZ0NyZWF0ZWRBdElkeDogaW5kZXgoJ2NvbXBsaWFuY2Vfc2Nhbl9vcmdfY3JlYXRlZF9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuY3JlYXRlZEF0KSxcbiAgb3JnU3RhdHVzSWR4OiBpbmRleCgnY29tcGxpYW5jZV9zY2FuX29yZ19zdGF0dXNfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLnN0YXR1cyksXG59KSk7XG5cbi8qKlxuICogQ3Jvbi1iYXNlZCByZWN1cnJpbmcgc2NhbiBzY2hlZHVsZXMuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2Vfc2Nhbl9zY2hlZHVsZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBsaWFuY2VTY2FuU2NoZWR1bGUgPSBwZ1RhYmxlKCdjb21wbGlhbmNlX3NjYW5fc2NoZWR1bGVzJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHRhcmdldDogdmFyY2hhcigndGFyZ2V0JywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSwgLy8gcGx1Z2luIHwgcGlwZWxpbmUgfCBhbGxcbiAgY3JvbkV4cHJlc3Npb246IHZhcmNoYXIoJ2Nyb25fZXhwcmVzc2lvbicsIHsgbGVuZ3RoOiAxMDAgfSkubm90TnVsbCgpLFxuICBpc0FjdGl2ZTogYm9vbGVhbignaXNfYWN0aXZlJykuZGVmYXVsdCh0cnVlKS5ub3ROdWxsKCksXG4gIGxhc3RSdW5BdDogdGltZXN0YW1wKCdsYXN0X3J1bl9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBuZXh0UnVuQXQ6IHRpbWVzdGFtcCgnbmV4dF9ydW5fYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgY3JlYXRlZEJ5OiB0ZXh0KCdjcmVhdGVkX2J5Jykubm90TnVsbCgpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRCeTogdGV4dCgndXBkYXRlZF9ieScpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBhY3RpdmVOZXh0UnVuSWR4OiBpbmRleCgnY29tcGxpYW5jZV9zY2FuX3NjaGVkdWxlX2FjdGl2ZV9uZXh0X2lkeCcpXG4gICAgLm9uKHRhYmxlLmlzQWN0aXZlLCB0YWJsZS5uZXh0UnVuQXQpLFxuICBvcmdJZHg6IGluZGV4KCdjb21wbGlhbmNlX3NjYW5fc2NoZWR1bGVfb3JnX2lkeCcpLm9uKHRhYmxlLm9yZ0lkKSxcbn0pKTtcblxuLyoqXG4gKiBQZXItb3JnIG5vdGlmaWNhdGlvbiBzZXR0aW5ncyBmb3IgY29tcGxpYW5jZSBldmVudHMuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2Vfbm90aWZpY2F0aW9uX3ByZWZlcmVuY2VzXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlTm90aWZpY2F0aW9uUHJlZmVyZW5jZSA9IHBnVGFibGUoJ2NvbXBsaWFuY2Vfbm90aWZpY2F0aW9uX3ByZWZlcmVuY2VzJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCkudW5pcXVlKCksXG4gIG5vdGlmeU9uQmxvY2s6IGJvb2xlYW4oJ25vdGlmeV9vbl9ibG9jaycpLmRlZmF1bHQodHJ1ZSkubm90TnVsbCgpLFxuICBub3RpZnlPbldhcm5pbmc6IGJvb2xlYW4oJ25vdGlmeV9vbl93YXJuaW5nJykuZGVmYXVsdChmYWxzZSkubm90TnVsbCgpLFxuICAvLyBPcHQtaW4gZW1haWwgZGVsaXZlcnkgKHRvIGB0YXJnZXRVc2Vyc2AsIG9yIGFsbCBvcmcgYWRtaW5zIHdoZW4gbnVsbCkuXG4gIGVtYWlsRW5hYmxlZDogYm9vbGVhbignZW1haWxfZW5hYmxlZCcpLmRlZmF1bHQoZmFsc2UpLm5vdE51bGwoKSxcbiAgZGlnZXN0TW9kZTogdmFyY2hhcignZGlnZXN0X21vZGUnLCB7IGxlbmd0aDogMjAgfSkuZGVmYXVsdCgnaW1tZWRpYXRlJykubm90TnVsbCgpLCAvLyBpbW1lZGlhdGUgfCBkYWlseSB8IHdlZWtseVxuICBkaWdlc3RTY2hlZHVsZTogdmFyY2hhcignZGlnZXN0X3NjaGVkdWxlJywgeyBsZW5ndGg6IDEwMCB9KSxcbiAgbGFzdERpZ2VzdEF0OiB0aW1lc3RhbXAoJ2xhc3RfZGlnZXN0X2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIHRhcmdldFVzZXJzOiBqc29uYigndGFyZ2V0X3VzZXJzJykuJHR5cGU8c3RyaW5nW10+KCksIC8vIG51bGwgPSBhbGwgb3JnIGFkbWluc1xuICB3ZWJob29rVXJsOiB2YXJjaGFyKCd3ZWJob29rX3VybCcsIHsgbGVuZ3RoOiA1MDAgfSksXG4gIHdlYmhvb2tTZWNyZXQ6IHZhcmNoYXIoJ3dlYmhvb2tfc2VjcmV0JywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59KTtcblxuLyoqXG4gKiBMb2cgb2YgYWxsIGNvbXBsaWFuY2Ugbm90aWZpY2F0aW9ucyBzZW50LlxuICpcbiAqIEB0YWJsZSBjb21wbGlhbmNlX25vdGlmaWNhdGlvbl9sb2dcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBsaWFuY2VOb3RpZmljYXRpb25Mb2cgPSBwZ1RhYmxlKCdjb21wbGlhbmNlX25vdGlmaWNhdGlvbl9sb2cnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgY2hhbm5lbDogdmFyY2hhcignY2hhbm5lbCcsIHsgbGVuZ3RoOiAyMCB9KS5ub3ROdWxsKCksIC8vIGluLWFwcCB8IHdlYmhvb2sgfCBkaWdlc3RcbiAgc3RhdHVzOiB2YXJjaGFyKCdzdGF0dXMnLCB7IGxlbmd0aDogMjAgfSkubm90TnVsbCgpLCAvLyBzZW50IHwgZmFpbGVkIHwgcGVuZGluZ1xuICBwYXlsb2FkOiBqc29uYigncGF5bG9hZCcpLiR0eXBlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpLm5vdE51bGwoKSxcbiAgd2ViaG9va1Jlc3BvbnNlQ29kZTogaW50ZWdlcignd2ViaG9va19yZXNwb25zZV9jb2RlJyksXG4gIHdlYmhvb2tFcnJvcjogdGV4dCgnd2ViaG9va19lcnJvcicpLFxuICByZXRyeUNvdW50OiBpbnRlZ2VyKCdyZXRyeV9jb3VudCcpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICBuZXh0UmV0cnlBdDogdGltZXN0YW1wKCduZXh0X3JldHJ5X2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIHJlbGF0ZWRBdWRpdElkOiB1dWlkKCdyZWxhdGVkX2F1ZGl0X2lkJyksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgb3JnQ3JlYXRlZEF0SWR4OiBpbmRleCgnY29tcGxpYW5jZV9ub3RpZmljYXRpb25fb3JnX2NyZWF0ZWRfaWR4JylcbiAgICAub24odGFibGUub3JnSWQsIHRhYmxlLmNyZWF0ZWRBdCksXG4gIHN0YXR1c1JldHJ5SWR4OiBpbmRleCgnY29tcGxpYW5jZV9ub3RpZmljYXRpb25fc3RhdHVzX3JldHJ5X2lkeCcpXG4gICAgLm9uKHRhYmxlLnN0YXR1cywgdGFibGUubmV4dFJldHJ5QXQpLFxuICByZWxhdGVkQXVkaXRJZHg6IGluZGV4KCdjb21wbGlhbmNlX25vdGlmaWNhdGlvbl9yZWxhdGVkX2F1ZGl0X2lkeCcpXG4gICAgLm9uKHRhYmxlLnJlbGF0ZWRBdWRpdElkKSxcbn0pKTtcblxuLyoqXG4gKiBDb21wbGlhbmNlLXNwZWNpZmljIFJCQUMgcm9sZXMuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2Vfcm9sZXNcbiAqL1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJvbGVUeXBlID0gJ2NvbXBsaWFuY2Utdmlld2VyJyB8ICdjb21wbGlhbmNlLWVkaXRvcicgfCAnY29tcGxpYW5jZS1hZG1pbic7XG5cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlUm9sZSA9IHBnVGFibGUoJ2NvbXBsaWFuY2Vfcm9sZXMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgdXNlcklkOiB0ZXh0KCd1c2VyX2lkJykubm90TnVsbCgpLFxuICByb2xlOiB2YXJjaGFyKCdyb2xlJywgeyBsZW5ndGg6IDMwIH0pLiR0eXBlPENvbXBsaWFuY2VSb2xlVHlwZT4oKS5ub3ROdWxsKCksXG4gIGdyYW50ZWRCeTogdGV4dCgnZ3JhbnRlZF9ieScpLm5vdE51bGwoKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIG9yZ1VzZXJVbmlxdWU6IHVuaXF1ZUluZGV4KCdjb21wbGlhbmNlX3JvbGVfb3JnX3VzZXJfdW5pcXVlJykub24odGFibGUub3JnSWQsIHRhYmxlLnVzZXJJZCksXG4gIG9yZ1JvbGVJZHg6IGluZGV4KCdjb21wbGlhbmNlX3JvbGVfb3JnX3JvbGVfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLnJvbGUpLFxufSkpO1xuXG4vKipcbiAqIEdlbmVyYXRlZCBjb21wbGlhbmNlIHJlcG9ydHMuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2VfcmVwb3J0c1xuICovXG5leHBvcnQgY29uc3QgY29tcGxpYW5jZVJlcG9ydCA9IHBnVGFibGUoJ2NvbXBsaWFuY2VfcmVwb3J0cycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICByZXBvcnRUeXBlOiB2YXJjaGFyKCdyZXBvcnRfdHlwZScsIHsgbGVuZ3RoOiAzMCB9KS5ub3ROdWxsKCksIC8vIHN1bW1hcnkgfCBkZXRhaWxlZCB8IGF1ZGl0LXRyYWlsIHwgY29tcGFyaXNvblxuICB0YXJnZXQ6IHZhcmNoYXIoJ3RhcmdldCcsIHsgbGVuZ3RoOiAyMCB9KS5ub3ROdWxsKCksIC8vIHBsdWdpbiB8IHBpcGVsaW5lIHwgYWxsXG4gIGRhdGVGcm9tOiB0aW1lc3RhbXAoJ2RhdGVfZnJvbScsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBkYXRlVG86IHRpbWVzdGFtcCgnZGF0ZV90bycsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBjb21wYXJlRnJvbTogdGltZXN0YW1wKCdjb21wYXJlX2Zyb20nLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgY29tcGFyZVRvOiB0aW1lc3RhbXAoJ2NvbXBhcmVfdG8nLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgZGF0YToganNvbmIoJ2RhdGEnKS4kdHlwZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKS5ub3ROdWxsKCksXG4gIGZvcm1hdDogdmFyY2hhcignZm9ybWF0JywgeyBsZW5ndGg6IDEwIH0pLmRlZmF1bHQoJ2pzb24nKS5ub3ROdWxsKCksIC8vIGpzb24gfCBjc3ZcbiAgZ2VuZXJhdGVkQnk6IHRleHQoJ2dlbmVyYXRlZF9ieScpLm5vdE51bGwoKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBvcmdDcmVhdGVkQXRJZHg6IGluZGV4KCdjb21wbGlhbmNlX3JlcG9ydF9vcmdfY3JlYXRlZF9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuY3JlYXRlZEF0KSxcbn0pKTtcblxuLyoqXG4gKiBDcm9uLWJhc2VkIHJlY3VycmluZyByZXBvcnQgZ2VuZXJhdGlvbiBzY2hlZHVsZXMuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2VfcmVwb3J0X3NjaGVkdWxlc1xuICovXG5leHBvcnQgY29uc3QgY29tcGxpYW5jZVJlcG9ydFNjaGVkdWxlID0gcGdUYWJsZSgnY29tcGxpYW5jZV9yZXBvcnRfc2NoZWR1bGVzJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHJlcG9ydFR5cGU6IHZhcmNoYXIoJ3JlcG9ydF90eXBlJywgeyBsZW5ndGg6IDMwIH0pLm5vdE51bGwoKSwgLy8gc3VtbWFyeSB8IGRldGFpbGVkXG4gIHRhcmdldDogdmFyY2hhcigndGFyZ2V0JywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSwgLy8gcGx1Z2luIHwgcGlwZWxpbmUgfCBhbGxcbiAgZm9ybWF0OiB2YXJjaGFyKCdmb3JtYXQnLCB7IGxlbmd0aDogMTAgfSkuZGVmYXVsdCgnanNvbicpLm5vdE51bGwoKSxcbiAgY3JvbkV4cHJlc3Npb246IHZhcmNoYXIoJ2Nyb25fZXhwcmVzc2lvbicsIHsgbGVuZ3RoOiAxMDAgfSkubm90TnVsbCgpLFxuICBpc0FjdGl2ZTogYm9vbGVhbignaXNfYWN0aXZlJykuZGVmYXVsdCh0cnVlKS5ub3ROdWxsKCksXG4gIGxhc3RSdW5BdDogdGltZXN0YW1wKCdsYXN0X3J1bl9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBuZXh0UnVuQXQ6IHRpbWVzdGFtcCgnbmV4dF9ydW5fYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgZGVsaXZlclRvOiBqc29uYignZGVsaXZlcl90bycpLiR0eXBlPHN0cmluZ1tdPigpLmRlZmF1bHQoW10pLm5vdE51bGwoKSwgLy8gdXNlcklkcyB0byBub3RpZnlcbiAgY3JlYXRlZEJ5OiB0ZXh0KCdjcmVhdGVkX2J5Jykubm90TnVsbCgpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRCeTogdGV4dCgndXBkYXRlZF9ieScpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBhY3RpdmVOZXh0UnVuSWR4OiBpbmRleCgnY29tcGxpYW5jZV9yZXBvcnRfc2NoZWR1bGVfYWN0aXZlX25leHRfaWR4JylcbiAgICAub24odGFibGUuaXNBY3RpdmUsIHRhYmxlLm5leHRSdW5BdCksXG4gIG9yZ0lkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcmVwb3J0X3NjaGVkdWxlX29yZ19pZHgnKS5vbih0YWJsZS5vcmdJZCksXG59KSk7XG5cbi8qKlxuICogVXNlci1lZGl0YWJsZSBvYnNlcnZhYmlsaXR5IGRhc2hib2FyZC4gUmVwbGFjZXMgdGhlIGNvZGUtZGVmaW5lZCBkYXNoYm9hcmRzXG4gKiB1bmRlciBgZnJvbnRlbmQvc3JjL2xpYi9kYXNoYm9hcmRzLyoudHNgIHNvIG9wZXJhdG9ycyBjYW4gYWRkIHBhbmVscyBhbmRcbiAqIGN1c3RvbWl6ZSBsYXlvdXQgcGVyLW9yZyB3aXRob3V0IGEgcmVkZXBsb3kuXG4gKlxuICogYGxheW91dEpzb25gIGNhcnJpZXMgdGhlIHJlYWN0LWdyaWQtbGF5b3V0IGNvb3JkaW5hdGUgc2V0IGtleWVkIGJ5IHBhbmVsIGlkO1xuICogYGRhc2hib2FyZF9wYW5lbHNgIGhvbGRzIHRoZSBwYW5lbC1jb250ZW50IHJvd3Mgc28gYW4gTi1wYW5lbCBkYXNoYm9hcmRcbiAqIGRvZXNuJ3QgYmxvYXQgb25lIHJvdydzIEpTT04gdG8gc2V2ZXJhbCBLQi4gVGhlIGNhdGFsb2cgcXVlcnkgaXMgcmVmZXJlbmNlZFxuICogYnkga2V5IG9ubHkgKHNlZSBwbGF0Zm9ybS9zcmMvb2JzZXJ2YWJpbGl0eS9jYXRhbG9nLnRzKSAgdGhlIGRhc2hib2FyZFxuICogcmVjb3JkIG5ldmVyIGNhcnJpZXMgcmF3IFByb21RTC9Mb2dRTCwga2VlcGluZyB0aGUgY2F0YWxvZyBhcyB0aGUgc2VjdXJpdHlcbiAqIGJvdW5kYXJ5IGZvciB1cHN0cmVhbSBxdWVyeSBleGVjdXRpb24uXG4gKlxuICogVmlzaWJpbGl0eSBsYWRkZXIgKiAtIGBwcml2YXRlYCAgb25seSB0aGUgY3JlYXRvciBjYW4gcmVhZC93cml0ZVxuICogLSBgb3JnYCAgYW55b25lIGluIHRoZSBzYW1lIG9yZyBjYW4gcmVhZDsgb3JnIGFkbWlucyArIGNyZWF0b3IgY2FuIHdyaXRlXG4gKiAtIGBwdWJsaWNgICBldmVyeSBhdXRoZW50aWNhdGVkIHVzZXIgY2FuIHJlYWQ7IG9ubHkgc3lzYWRtaW5zIGNhbiB3cml0ZS5cbiAqIFVzZWQgZm9yIHRoZSA1IGRlZmF1bHQgZGFzaGJvYXJkcyAoYG9yZ19pZD0nc3lzdGVtJ2ApIHNvIHRoZVxuICogZXhpc3Rpbmcgc3lzdGVtLW9yZyB2aXNpYmlsaXR5IHJ1bGUgY292ZXJzIHRoZW0gYnkgZGVmYXVsdC5cbiAqXG4gKiBAdGFibGUgZGFzaGJvYXJkc1xuICovXG5leHBvcnQgY29uc3QgZGFzaGJvYXJkID0gcGdUYWJsZSgnZGFzaGJvYXJkcycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcblxuICAvLyBPcmcgKyBjcmVhdG9yXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pXG4gICAgLmRlZmF1bHQoJ3N5c3RlbScpXG4gICAgLm5vdE51bGwoKSxcbiAgY3JlYXRlZEJ5OiB0ZXh0KCdjcmVhdGVkX2J5JylcbiAgICAuZGVmYXVsdCgnc3lzdGVtJylcbiAgICAubm90TnVsbCgpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pXG4gICAgLmRlZmF1bHROb3coKVxuICAgIC5ub3ROdWxsKCksXG4gIHVwZGF0ZWRCeTogdGV4dCgndXBkYXRlZF9ieScpXG4gICAgLmRlZmF1bHQoJ3N5c3RlbScpXG4gICAgLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KVxuICAgIC5kZWZhdWx0Tm93KClcbiAgICAubm90TnVsbCgpLFxuXG4gIC8vIElkZW50aXR5XG4gIG5hbWU6IHZhcmNoYXIoJ25hbWUnLCB7IGxlbmd0aDogMTUwIH0pXG4gICAgLm5vdE51bGwoKSxcbiAgZGVzY3JpcHRpb246IHRleHQoJ2Rlc2NyaXB0aW9uJyksXG5cbiAgLy8gcmVhY3QtZ3JpZC1sYXlvdXQgY29vcmRpbmF0ZSBzZXQga2V5ZWQgYnkgcGFuZWwgaWQuXG4gIC8vIFNoYXBlOiB7IFtwYW5lbElkXTogeyB4LCB5LCB3LCBoLCBtaW5XPywgbWluSD8gfSB9XG4gIGxheW91dEpzb246IGpzb25iKCdsYXlvdXRfanNvbicpXG4gICAgLiR0eXBlPFJlY29yZDxzdHJpbmcsIHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyOyBtaW5XPzogbnVtYmVyOyBtaW5IPzogbnVtYmVyIH0+PigpXG4gICAgLmRlZmF1bHQoe30pXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBWaXNpYmlsaXR5ICBzZWUgaGVhZGVyIGZvciBsYWRkZXIgc2VtYW50aWNzLiBDb25zdHJhaW5lZCBhdCB0aGUgU1FMXG4gIC8vIGxheWVyIHRvbyB2aWEgYSBDSEVDSyBpbiBwb3N0Z3Jlcy1pbml0LnNxbCB0byBrZWVwIHR5cG9zIGZyb20gc25lYWtpbmdcbiAgLy8gcGFzdCB0aGUgYXBwbGljYXRpb24gbGF5ZXIuXG4gIHZpc2liaWxpdHk6IHZhcmNoYXIoJ3Zpc2liaWxpdHknLCB7IGxlbmd0aDogMTAgfSlcbiAgICAuJHR5cGU8J3ByaXZhdGUnIHwgJ29yZycgfCAncHVibGljJz4oKVxuICAgIC5kZWZhdWx0KCdwcml2YXRlJylcbiAgICAubm90TnVsbCgpLFxuXG4gIC8vIFNvZnQgZGVsZXRlIChtYXRjaGVzIHRoZSByZXN0IG9mIHRoZSBzY2hlbWEncyBjb252ZW50aW9uKVxuICBkZWxldGVkQXQ6IHRpbWVzdGFtcCgnZGVsZXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBkZWxldGVkQnk6IHRleHQoJ2RlbGV0ZWRfYnknKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgLy8gTGlzdGluZyBpcyBvcmctc2NvcGVkIGFuZCB2aXNpYmlsaXR5LWZpbHRlcmVkLCBzbyBib3RoIGdvIGluIHRoZSBpbmRleC5cbiAgb3JnVmlzaWJpbGl0eUlkeDogaW5kZXgoJ2Rhc2hib2FyZF9vcmdfdmlzaWJpbGl0eV9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUudmlzaWJpbGl0eSksXG4gIC8vIENvbnZlbmllbmNlIGZvciBcImFsbCBteSBkYXNoYm9hcmRzXCIgbGlzdGluZ1xuICBjcmVhdGVkQnlJZHg6IGluZGV4KCdkYXNoYm9hcmRfY3JlYXRlZF9ieV9pZHgnKS5vbih0YWJsZS5jcmVhdGVkQnkpLFxuICAvLyBTYW1lLW9yZyBkdXBsaWNhdGUtbmFtZSBndWFyZC4gVGhlIChvcmdJZCwgbmFtZSkgdHVwbGUgaXMgdW5pcXVlIGFtb25nXG4gIC8vIG5vbi1kZWxldGVkIHJvd3M7IHNvZnQtZGVsZXRlZCByb3dzIGFyZSBleGNsdWRlZCBzbyBuYW1lIHJldXNlIGFmdGVyXG4gIC8vIGRlbGV0aW9uIHdvcmtzLlxuICBuYW1lVW5pcXVlOiB1bmlxdWVJbmRleCgnZGFzaGJvYXJkX29yZ19uYW1lX3VuaXF1ZScpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5uYW1lKSxcbn0pKTtcblxuLyoqXG4gKiBBIHNpbmdsZSBwYW5lbCBpbnNpZGUgYSBkYXNoYm9hcmQuIFRoZSBjYXRhbG9nIGBxdWVyeUtleWAgaXMgdGhlIG9ubHkgdGhpbmdcbiAqIHRoZSBwYW5lbCBjYXJyaWVzIGZyb20gdGhlIHF1ZXJ5IHNpZGUgIHN1YnN0aXR1dGlvbiArIGV4ZWN1dGlvbiBoYXBwZW5zXG4gKiBzZXJ2ZXItc2lkZSB2aWEgdGhlIGV4aXN0aW5nIGNhdGFsb2csIHNvIG5vIFByb21RTC9Mb2dRTCB0cmF2ZWxzIHdpdGggdGhlXG4gKiBwYW5lbCByZWNvcmQuXG4gKlxuICogQHRhYmxlIGRhc2hib2FyZF9wYW5lbHNcbiAqL1xuZXhwb3J0IGNvbnN0IGRhc2hib2FyZFBhbmVsID0gcGdUYWJsZSgnZGFzaGJvYXJkX3BhbmVscycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgZGFzaGJvYXJkSWQ6IHV1aWQoJ2Rhc2hib2FyZF9pZCcpXG4gICAgLm5vdE51bGwoKSxcbiAgLy8gQ2F0YWxvZyBrZXkgKGUuZy4gYHBsdWdpbl9idWlsZHNfcGVyX21pbmApLiBUaGUgc2VydmVyIHZhbGlkYXRlcyB0aGlzXG4gIC8vIGFnYWluc3QgUVVFUklFUyBhdCByZW5kZXIgdGltZS5cbiAgcXVlcnlLZXk6IHZhcmNoYXIoJ3F1ZXJ5X2tleScsIHsgbGVuZ3RoOiAxMDAgfSlcbiAgICAubm90TnVsbCgpLFxuICAvLyAnc3RhdCcgfCAnbGluZScgfCAndGFibGUnIHwgJ3N0YWNrZWQtYmFyJyAga2VwdCBzdHJpbmdseS10eXBlZCBmb3JcbiAgLy8gZm9yd2FyZCBjb21wYXRpYmlsaXR5OyB0aGUgcmVuZGVyZXIgZmFsbHMgYmFjayB0byAnbGluZScgb24gdW5rbm93bi5cbiAgdml6S2luZDogdmFyY2hhcigndml6X2tpbmQnLCB7IGxlbmd0aDogMzAgfSlcbiAgICAuZGVmYXVsdCgnbGluZScpXG4gICAgLm5vdE51bGwoKSxcbiAgdGl0bGU6IHZhcmNoYXIoJ3RpdGxlJywgeyBsZW5ndGg6IDIwMCB9KVxuICAgIC5ub3ROdWxsKCksXG4gIC8vIFRhaWx3aW5kIGNvbC1zcGFuIHRpZXIgKDEtMTIsIGJ1dCBvbmx5IDMvNC82LzgvOS8xMiBhcmUgcmVuZGVyYWJsZSkuXG4gIHNwYW46IGludGVnZXIoJ3NwYW4nKVxuICAgIC5kZWZhdWx0KDYpXG4gICAgLm5vdE51bGwoKSxcbiAgLy8gT3B0aW9uYWw6IGxhYmVsIGtleSBmb3Igc2VyaWVzIGdyb3VwaW5nIChlLmcuICdzdGF0dXMnLCAnc3RhdGUnKS5cbiAgZ3JvdXBCeTogdmFyY2hhcignZ3JvdXBfYnknLCB7IGxlbmd0aDogNTAgfSksXG4gIC8vIE9wdGlvbmFsOiBjYXRhbG9nIGZvcm1hdCBrZXkgKCdwZXJjZW50JyB8ICdzZWNvbmRzJyB8Li4uKS5cbiAgZm9ybWF0OiB2YXJjaGFyKCdmb3JtYXQnLCB7IGxlbmd0aDogMjAgfSksXG4gIC8vIDAtYmFzZWQgcmVuZGVyIG9yZGVyIHdpdGhpbiB0aGUgZGFzaGJvYXJkLiBFZGl0b3IgcmVhc3NpZ25zIG9uIGRyYWcuXG4gIHBvc2l0aW9uOiBpbnRlZ2VyKCdwb3NpdGlvbicpXG4gICAgLmRlZmF1bHQoMClcbiAgICAubm90TnVsbCgpLFxuICAvLyBPcHRpb25hbCB0ZW1wbGF0ZSB2YXIgdmFsdWVzIGJvdW5kIGF0IHBhbmVsIGxldmVsIChlLmcuIGBwbHVnaW49WGAgZm9yXG4gIC8vIHRoZSBwZXItcGx1Z2luIGRyaWxsLWRvd24gcGFuZWwpLiBTYW5pdGl6ZWQgc2VydmVyLXNpZGUgdmlhIHRoZSBjYXRhbG9nXG4gIC8vIHN1YnN0aXR1dGVWYXJzIGFsbG93LWxpc3QuXG4gIHZhcnM6IGpzb25iKCd2YXJzJylcbiAgICAuJHR5cGU8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKVxuICAgIC5kZWZhdWx0KHt9KVxuICAgIC5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIC8vIFRoZSByZW5kZXIgcGF0aCBpcyBcImZldGNoIGFsbCBwYW5lbHMgZm9yIGRhc2hib2FyZCBYIGluIG9yZGVyXCIuXG4gIGRhc2hib2FyZFBvc2l0aW9uSWR4OiBpbmRleCgnZGFzaGJvYXJkX3BhbmVsX2Rhc2hib2FyZF9wb3NpdGlvbl9pZHgnKVxuICAgIC5vbih0YWJsZS5kYXNoYm9hcmRJZCwgdGFibGUucG9zaXRpb24pLFxufSkpO1xuXG4vKipcbiAqIFBlci1vcmcgYWxlcnQgbm90aWZpY2F0aW9uIGRlc3RpbmF0aW9uLiBNdWx0aS10ZW5hbnQgYWxlcnRpbmcgcm91dGVzXG4gKiBBbGVydG1hbmFnZXIgd2ViaG9va3MgdG8gdGhlIHBsYXRmb3JtOyB0aGUgcGxhdGZvcm0gbG9va3MgdGhlIGZpcmluZ1xuICogYWxlcnQncyBgb3JnX2lkYCBsYWJlbCB1cCBoZXJlIGFuZCBmb3J3YXJkcyB0byBlYWNoIGVuYWJsZWQgZGVzdGluYXRpb24uXG4gKlxuICogQ2hhbm5lbHMgKiAtIGBzbGFja2AgIGB0YXJnZXRgIGlzIHRoZSBpbmNvbWluZy13ZWJob29rIFVSTFxuICogLSBgd2ViaG9va2AgIGB0YXJnZXRgIGlzIGFueSBIVFRQUyBVUkw7IHRoZSByZWxheSBwb3N0cyB0aGVcbiAqIEFsZXJ0bWFuYWdlciB2MiB3ZWJob29rIHBheWxvYWQgdmVyYmF0aW1cbiAqIC0gYGluLWFwcGAgIGB0YXJnZXRgIGlnbm9yZWQ7IHN1cmZhY2VzIGFzIGFuIGluLWFwcCBtZXNzYWdlIHZpYVxuICogdGhlIGV4aXN0aW5nIGBtZXNzYWdlc2AgdGFibGVcbiAqXG4gKiBTZWNyZXRzICogLSBGb3IgYHNsYWNrYC9gd2ViaG9va2AgY2hhbm5lbHMsIHRoZSBVUkwgaXRzZWxmIGlzIHRoZSBzZWNyZXQuIFdlIGRvbid0XG4gKiBsb2cgaXQgb24gYGRhc2hib2FyZC51cGRhdGVgIG9yIHN1cmZhY2UgdGhlIGZ1bGwgVVJMIG9uIEdFVCBlbmRwb2ludHNcbiAqIGFmdGVyIHdyaXRlOyBqdXN0IGEgbWFza2VkIHByZXZpZXcgKGxhc3QgMTIgY2hhcnMpLiBTdG9yZWQgaW4gY2xlYXJcbiAqIHRleHQgIHNhbWUgcG9zdHVyZSBhcyBgY29tcGxpYW5jZV9ub3RpZmljYXRpb25fcHJlZmVyZW5jZXMud2ViaG9va191cmxgXG4gKiBhbmQgY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIHRoZSBhcHAncyBzZWNyZXQgaGFuZGxpbmcgZm9yIG9yZy1sZXZlbFxuICogaW50ZWdyYXRpb25zLiBJZiB3ZSBhZGQgYSBLTVMtZW5jcnlwdGlvbiB0aWVyIGZvciBhbnkgc2VjcmV0IGNvbHVtbixcbiAqIHRoaXMgaXMgb25lIG9mIHRoZSBmaXJzdCB0byBtaWdyYXRlLlxuICpcbiAqIEB0YWJsZSBvcmdfYWxlcnRfZGVzdGluYXRpb25zXG4gKi9cbmV4cG9ydCBjb25zdCBvcmdBbGVydERlc3RpbmF0aW9uID0gcGdUYWJsZSgnb3JnX2FsZXJ0X2Rlc3RpbmF0aW9ucycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuXG4gIGNyZWF0ZWRCeTogdGV4dCgnY3JlYXRlZF9ieScpLm5vdE51bGwoKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KVxuICAgIC5kZWZhdWx0Tm93KClcbiAgICAubm90TnVsbCgpLFxuICB1cGRhdGVkQnk6IHRleHQoJ3VwZGF0ZWRfYnknKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSlcbiAgICAuZGVmYXVsdE5vdygpXG4gICAgLm5vdE51bGwoKSxcblxuICAvKiogJ3NsYWNrJyB8ICd3ZWJob29rJyB8ICdpbi1hcHAnIHwgJ2VtYWlsJyAga2VwdCBzdHJpbmdseSBzbyBmdXR1cmUgY2hhbm5lbHNcbiAgICogKFBhZ2VyRHV0eSwg4oCmKSBjYW4gYmUgYWRkZWQgd2l0aG91dCBhIHNjaGVtYSBtaWdyYXRpb24uICovXG4gIGNoYW5uZWw6IHZhcmNoYXIoJ2NoYW5uZWwnLCB7IGxlbmd0aDogMjAgfSlcbiAgICAuJHR5cGU8J3NsYWNrJyB8ICd3ZWJob29rJyB8ICdpbi1hcHAnIHwgJ2VtYWlsJz4oKVxuICAgIC5ub3ROdWxsKCksXG4gIC8qKiBDaGFubmVsLXNwZWNpZmljIHRhcmdldC4gU2xhY2svd2ViaG9vazogVVJMLiBFbWFpbDogYWRkcmVzcy4gSW4tYXBwOiBpZ25vcmVkLiAqL1xuICB0YXJnZXQ6IHRleHQoJ3RhcmdldCcpLmRlZmF1bHQoJycpLm5vdE51bGwoKSxcbiAgLyoqIEZyaWVuZGx5IGxhYmVsIHNob3duIGluIHRoZSBzZXR0aW5ncyBVSS4gKi9cbiAgbGFiZWw6IHZhcmNoYXIoJ2xhYmVsJywgeyBsZW5ndGg6IDEwMCB9KS5ub3ROdWxsKCksXG5cbiAgLyoqIExvd2VzdCBzZXZlcml0eSB0aGF0IHRyaWdnZXJzIHRoaXMgZGVzdGluYXRpb24gKCd3YXJuaW5nJyA9IHdhcm5pbmcrY3JpdGljYWwsXG4gICAqICdjcml0aWNhbCcgPSBjcml0aWNhbCBvbmx5KS4gTWlycm9ycyBBbGVydG1hbmFnZXIgc2V2ZXJpdHkgb3JkZXJpbmcuICovXG4gIG1pblNldmVyaXR5OiB2YXJjaGFyKCdtaW5fc2V2ZXJpdHknLCB7IGxlbmd0aDogMTAgfSlcbiAgICAuJHR5cGU8J3dhcm5pbmcnIHwgJ2NyaXRpY2FsJz4oKVxuICAgIC5kZWZhdWx0KCd3YXJuaW5nJylcbiAgICAubm90TnVsbCgpLFxuICBlbmFibGVkOiBib29sZWFuKCdlbmFibGVkJykuZGVmYXVsdCh0cnVlKS5ub3ROdWxsKCksXG5cbiAgLyoqIFNvZnQgZGVsZXRlIHNvIHdlIGtlZXAgYXVkaXQgaGlzdG9yeSBvZiB3aG8tZGVsZXRlZC13aGF0LiAqL1xuICBkZWxldGVkQXQ6IHRpbWVzdGFtcCgnZGVsZXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBkZWxldGVkQnk6IHRleHQoJ2RlbGV0ZWRfYnknKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgLy8gUGVyLW9yZyBsaXN0aW5nICB0aGUgb25seSBhY2Nlc3MgcGF0aC5cbiAgb3JnSWR4OiBpbmRleCgnb3JnX2FsZXJ0X2Rlc3RpbmF0aW9uX29yZ19pZHgnKVxuICAgIC5vbih0YWJsZS5vcmdJZCwgdGFibGUuZW5hYmxlZCksXG59KSk7XG5cbi8qKlxuICogIFBlci1vcmcgYWxlcnQgcnVsZXMgYXV0aG9yZWQgYnkgb3BlcmF0b3JzLlxuICpcbiAqIEVhY2ggcm93IG1hdGVyaWFsaXplcyBpbnRvIGEgYGdyb3Vwc1tdLnJ1bGVzW11gIGVudHJ5IGluIGEgUHJvbWV0aGV1c1xuICogYHJ1bGVfZmlsZXNgIFlBTUwuIFRoZSBtYXRlcmlhbGl6ZXIgZW5kcG9pbnRcbiAqIGBHRVQgL2FwaS9vYnNlcnZhYmlsaXR5L2FsZXJ0LXJ1bGVzL21hdGVyaWFsaXplZC55bWxgIHJlbmRlcnMgYWxsIGVuYWJsZWRcbiAqIHJ1bGVzIGFjcm9zcyBhbGwgb3JncyAoZGVsZXRlZD1udWxsKSBpbnRvIG9uZSBkb2N1bWVudDsgUHJvbWV0aGV1cyBwb2xsc1xuICogb3IgYSBzaWRlY2FyIGNvcGllcyBpdCBpbnRvIHRoZSBydWxlcyBkaXIuXG4gKlxuICogVGVuYW5jeSArIHNhZmV0eSAqIC0gYGV4cHJgIGlzIHVzZXItYXV0aG9yZWQgUHJvbVFMLiBUaGUgQ1JVRCByb3V0ZSBlbmZvcmNlcyB0aGF0IHRoZVxuICogZXhwcmVzc2lvbiBzdWJzdHJpbmctY29udGFpbnMgYG9yZ19pZD1cIjxvcmdJZD5cImAgc28gYW4gb3BlcmF0b3IgY2FuJ3RcbiAqIHdyaXRlIHJ1bGVzIHRoYXQgZmlyZSBvbiBvdGhlciBvcmdzJyBtZXRyaWNzLiBUaGlzIGlzIGEgY29hcnNlIGdhdGVcbiAqIChhIG1hbGZvcm1lZCBleHByZXNzaW9uIGNhbiBzdGlsbCBiZSBzeW50YWN0aWNhbGx5IHdyb25nKSBidXQgaXRcbiAqIGNsb3NlcyB0aGUgY3Jvc3MtdGVuYW50IGRhdGEgbGVhay4gUmVhbCBQcm9tUUwgcGFyc2luZyArIGF1dG9tYXRpY1xuICogb3JnX2lkIGluamVjdGlvbiBpcyBhIGZvbGxvdy1vbi5cbiAqIC0gVGhlIG1hdGVyaWFsaXplZCBydWxlIGNhcnJpZXMgYGxhYmVscy5vcmdfaWQgPSA8b3JnSWQ+YCBzbyB0aGVcbiAqIGFsZXJ0bWFuYWdlci1yZWxheSByb3V0ZXMgZmlyaW5nIGFsZXJ0cyB0byB0aGUgcmlnaHQgb3JnJ3NcbiAqIGRlc3RpbmF0aW9ucyAobWF0Y2hlcyB0aGUgYWxlcnQtcmVsYXkgbW9kZWwpLlxuICpcbiAqIEB0YWJsZSBvcmdfYWxlcnRfcnVsZXNcbiAqL1xuZXhwb3J0IGNvbnN0IG9yZ0FsZXJ0UnVsZSA9IHBnVGFibGUoJ29yZ19hbGVydF9ydWxlcycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuXG4gIGNyZWF0ZWRCeTogdGV4dCgnY3JlYXRlZF9ieScpLm5vdE51bGwoKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICB1cGRhdGVkQnk6IHRleHQoJ3VwZGF0ZWRfYnknKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcblxuICAvKiogT3BlcmF0b3Itc3VwcGxpZWQgcnVsZSBuYW1lLiBTYW5pdGl6ZWQgaW50byBhIHZhbGlkIFByb20gYWxlcnQgbmFtZSBhdFxuICAgKiBtYXRlcmlhbGl6YXRpb24gdGltZSAoYmVjb21lcyBgT3JnUnVsZV88b3JnSWQ+XzxzbHVnPmAgdG8gYXZvaWQgbmFtZVxuICAgKiBjb2xsaXNpb25zIGFjcm9zcyBvcmdzKS4gKi9cbiAgbmFtZTogdmFyY2hhcignbmFtZScsIHsgbGVuZ3RoOiAxMDAgfSkubm90TnVsbCgpLFxuICAvKiogUHJvbVFMIGV4cHJlc3Npb24uIE1VU1Qgc3Vic3RyaW5nLWNvbnRhaW4gYG9yZ19pZD1cIjxvcmdJZD5cImAuICovXG4gIGV4cHI6IHRleHQoJ2V4cHInKS5ub3ROdWxsKCksXG4gIC8qKiBgZm9yOiA1bWAgc3R5bGUgZHVyYXRpb24uIFZhbGlkYXRlZCBhZ2FpbnN0IFByb20ncyBkdXJhdGlvbiByZWdleC4gKi9cbiAgZm9yRHVyYXRpb246IHZhcmNoYXIoJ2Zvcl9kdXJhdGlvbicsIHsgbGVuZ3RoOiAyMCB9KS5kZWZhdWx0KCc1bScpLm5vdE51bGwoKSxcbiAgLyoqICd3YXJuaW5nJyB8ICdjcml0aWNhbCcgIG1hdGNoZXMgdGhlIHBsYXRmb3JtLXdpZGUgc2V2ZXJpdHkgbGFkZGVyLiAqL1xuICBzZXZlcml0eTogdmFyY2hhcignc2V2ZXJpdHknLCB7IGxlbmd0aDogMjAgfSlcbiAgICAuJHR5cGU8J3dhcm5pbmcnIHwgJ2NyaXRpY2FsJz4oKVxuICAgIC5kZWZhdWx0KCd3YXJuaW5nJylcbiAgICAubm90TnVsbCgpLFxuICAvKiogQWxlcnRtYW5hZ2VyIGBzdW1tYXJ5YCBhbm5vdGF0aW9uLiBTdXBwb3J0cyBge3sgJHZhbHVlIH19YC4gKi9cbiAgc3VtbWFyeTogdGV4dCgnc3VtbWFyeScpLm5vdE51bGwoKSxcbiAgLyoqIEFsZXJ0bWFuYWdlciBgZGVzY3JpcHRpb25gIGFubm90YXRpb24uIE9wdGlvbmFsOyAnJyBpcyBmaW5lLiAqL1xuICBkZXNjcmlwdGlvbjogdGV4dCgnZGVzY3JpcHRpb24nKS5kZWZhdWx0KCcnKS5ub3ROdWxsKCksXG5cbiAgLyoqIERpc2FibGVkIHJ1bGVzIGRvbid0IG1hdGVyaWFsaXplLiBMZXRzIG9wZXJhdG9ycyBzdGFnZSBydWxlcyB3aXRob3V0IGZpcmluZy4gKi9cbiAgZW5hYmxlZDogYm9vbGVhbignZW5hYmxlZCcpLmRlZmF1bHQodHJ1ZSkubm90TnVsbCgpLFxuXG4gIC8qKiBTb2Z0IGRlbGV0ZSBzbyB3ZSBrZWVwIGF1ZGl0IG9mIHdoby1kZWxldGVkLXdoYXQuICovXG4gIGRlbGV0ZWRBdDogdGltZXN0YW1wKCdkZWxldGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGRlbGV0ZWRCeTogdGV4dCgnZGVsZXRlZF9ieScpLFxufSwgKHRhYmxlKSA9PiAoe1xuICAvLyBQZXItb3JnIGxpc3RpbmcgKyBtYXRlcmlhbGl6ZXIncyBlbmFibGVkLW9ubHkgc2Nhbi5cbiAgb3JnRW5hYmxlZElkeDogaW5kZXgoJ29yZ19hbGVydF9ydWxlX29yZ19lbmFibGVkX2lkeCcpXG4gICAgLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5lbmFibGVkKSxcbiAgLy8gVW5pcXVlIHdpdGhpbiBhbiBvcmcgc28gb3BlcmF0b3JzIGNhbid0IGFjY2lkZW50YWxseSBjbG9uZSBhIHJ1bGUuXG4gIG9yZ05hbWVVcTogdW5pcXVlSW5kZXgoJ29yZ19hbGVydF9ydWxlX29yZ19uYW1lX3VxJylcbiAgICAub24odGFibGUub3JnSWQsIHRhYmxlLm5hbWUpXG4gICAgLndoZXJlKHNxbGBkZWxldGVkX2F0IElTIE5VTExgKSxcbn0pKTtcblxuLyoqXG4gKiBDb21wbGV0ZSBEcml6emxlIHNjaGVtYSBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNjaGVtYSA9IHtcbiAgcGx1Z2luLFxuICBwaXBlbGluZSxcbiAgbWVzc2FnZSxcbiAgcGlwZWxpbmVSZWdpc3RyeSxcbiAgcGlwZWxpbmVFdmVudCxcbiAgLy8gT2JzZXJ2YWJpbGl0eSBkYXNoYm9hcmRzICh1c2VyLWVkaXRhYmxlIHJlcGxhY2VtZW50IGZvciBjb2RlLWRlZmluZWQgZGFzaGJvYXJkcylcbiAgZGFzaGJvYXJkLFxuICBkYXNoYm9hcmRQYW5lbCxcbiAgLy8gUGVyLW9yZyBhbGVydCBub3RpZmljYXRpb24gZGVzdGluYXRpb25zIChtdWx0aS10ZW5hbnQgYWxlcnRpbmcpXG4gIG9yZ0FsZXJ0RGVzdGluYXRpb24sXG4gIC8vIHBlci1vcmcgb3BlcmF0b3ItYXV0aG9yZWQgYWxlcnQgcnVsZXMgIG1hdGVyaWFsaXplZCBpbnRvIFByb20gWUFNTC5cbiAgb3JnQWxlcnRSdWxlLFxuICAvLyBDb21wbGlhbmNlIHRhYmxlc1xuICBjb21wbGlhbmNlUG9saWN5LFxuICBjb21wbGlhbmNlUnVsZSxcbiAgY29tcGxpYW5jZVJ1bGVIaXN0b3J5LFxuICBjb21wbGlhbmNlQXVkaXRMb2csXG4gIGNvbXBsaWFuY2VFeGVtcHRpb24sXG4gIGNvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uLFxuICBjb21wbGlhbmNlU2NhbixcbiAgY29tcGxpYW5jZVNjYW5TY2hlZHVsZSxcbiAgY29tcGxpYW5jZU5vdGlmaWNhdGlvblByZWZlcmVuY2UsXG4gIGNvbXBsaWFuY2VOb3RpZmljYXRpb25Mb2csXG4gIGNvbXBsaWFuY2VSb2xlLFxuICBjb21wbGlhbmNlUmVwb3J0LFxuICBjb21wbGlhbmNlUmVwb3J0U2NoZWR1bGUsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIFR5cGVTY3JpcHQgdHlwZXMgcmVwcmVzZW50aW5nIGRhdGFiYXNlIHJvd3NcbiAqL1xuZXhwb3J0IHR5cGUgUGx1Z2luID0gdHlwZW9mIHBsdWdpbi4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBQbHVnaW5JbnNlcnQgPSB0eXBlb2YgcGx1Z2luLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgUGlwZWxpbmUgPSB0eXBlb2YgcGlwZWxpbmUuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgUGlwZWxpbmVJbnNlcnQgPSB0eXBlb2YgcGlwZWxpbmUuJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlID0gdHlwZW9mIG1lc3NhZ2UuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgTWVzc2FnZUluc2VydCA9IHR5cGVvZiBtZXNzYWdlLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgUGlwZWxpbmVSZWdpc3RyeSA9IHR5cGVvZiBwaXBlbGluZVJlZ2lzdHJ5LiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIFBpcGVsaW5lUmVnaXN0cnlJbnNlcnQgPSB0eXBlb2YgcGlwZWxpbmVSZWdpc3RyeS4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIFBpcGVsaW5lRXZlbnQgPSB0eXBlb2YgcGlwZWxpbmVFdmVudC4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBQaXBlbGluZUV2ZW50SW5zZXJ0ID0gdHlwZW9mIHBpcGVsaW5lRXZlbnQuJGluZmVySW5zZXJ0O1xuXG4vLyBPYnNlcnZhYmlsaXR5IGRhc2hib2FyZHNcbmV4cG9ydCB0eXBlIERhc2hib2FyZCA9IHR5cGVvZiBkYXNoYm9hcmQuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgRGFzaGJvYXJkSW5zZXJ0ID0gdHlwZW9mIGRhc2hib2FyZC4kaW5mZXJJbnNlcnQ7XG5leHBvcnQgdHlwZSBEYXNoYm9hcmRVcGRhdGUgPSBQYXJ0aWFsPE9taXQ8RGFzaGJvYXJkSW5zZXJ0LCAnaWQnIHwgJ2NyZWF0ZWRBdCcgfCAnY3JlYXRlZEJ5Jz4+O1xuXG5leHBvcnQgdHlwZSBEYXNoYm9hcmRQYW5lbCA9IHR5cGVvZiBkYXNoYm9hcmRQYW5lbC4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBEYXNoYm9hcmRQYW5lbEluc2VydCA9IHR5cGVvZiBkYXNoYm9hcmRQYW5lbC4kaW5mZXJJbnNlcnQ7XG5leHBvcnQgdHlwZSBEYXNoYm9hcmRQYW5lbFVwZGF0ZSA9IFBhcnRpYWw8T21pdDxEYXNoYm9hcmRQYW5lbEluc2VydCwgJ2lkJz4+O1xuXG5leHBvcnQgdHlwZSBPcmdBbGVydERlc3RpbmF0aW9uID0gdHlwZW9mIG9yZ0FsZXJ0RGVzdGluYXRpb24uJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgT3JnQWxlcnREZXN0aW5hdGlvbkluc2VydCA9IHR5cGVvZiBvcmdBbGVydERlc3RpbmF0aW9uLiRpbmZlckluc2VydDtcbmV4cG9ydCB0eXBlIE9yZ0FsZXJ0RGVzdGluYXRpb25VcGRhdGUgPSBQYXJ0aWFsPE9taXQ8T3JnQWxlcnREZXN0aW5hdGlvbkluc2VydCwgJ2lkJyB8ICdjcmVhdGVkQXQnIHwgJ2NyZWF0ZWRCeScgfCAnb3JnSWQnPj47XG5cbi8qKlxuICogSGVscGVyIHR5cGVzIGZvciB3b3JraW5nIHdpdGggcGFydGlhbCB1cGRhdGVzXG4gKi9cbmV4cG9ydCB0eXBlIFBsdWdpblVwZGF0ZSA9IFBhcnRpYWw8T21pdDxQbHVnaW5JbnNlcnQsICdpZCcgfCAnY3JlYXRlZEF0JyB8ICdjcmVhdGVkQnknPj47XG5leHBvcnQgdHlwZSBQaXBlbGluZVVwZGF0ZSA9IFBhcnRpYWw8T21pdDxQaXBlbGluZUluc2VydCwgJ2lkJyB8ICdjcmVhdGVkQXQnIHwgJ2NyZWF0ZWRCeSc+PjtcbmV4cG9ydCB0eXBlIE1lc3NhZ2VVcGRhdGUgPSBQYXJ0aWFsPE9taXQ8TWVzc2FnZUluc2VydCwgJ2lkJyB8ICdjcmVhdGVkQXQnIHwgJ2NyZWF0ZWRCeSc+PjtcblxuLy8gQ29tcGxpYW5jZSB0eXBlc1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVBvbGljeSA9IHR5cGVvZiBjb21wbGlhbmNlUG9saWN5LiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VQb2xpY3lJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZVBvbGljeS4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VSdWxlID0gdHlwZW9mIGNvbXBsaWFuY2VSdWxlLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VSdWxlSW5zZXJ0ID0gdHlwZW9mIGNvbXBsaWFuY2VSdWxlLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJ1bGVIaXN0b3J5ID0gdHlwZW9mIGNvbXBsaWFuY2VSdWxlSGlzdG9yeS4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBDb21wbGlhbmNlUnVsZUhpc3RvcnlJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZVJ1bGVIaXN0b3J5LiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZUF1ZGl0TG9nID0gdHlwZW9mIGNvbXBsaWFuY2VBdWRpdExvZy4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBDb21wbGlhbmNlQXVkaXRMb2dJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZUF1ZGl0TG9nLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZUV4ZW1wdGlvbiA9IHR5cGVvZiBjb21wbGlhbmNlRXhlbXB0aW9uLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VFeGVtcHRpb25JbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZUV4ZW1wdGlvbi4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uID0gdHlwZW9mIGNvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uSW5zZXJ0ID0gdHlwZW9mIGNvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVNjYW4gPSB0eXBlb2YgY29tcGxpYW5jZVNjYW4uJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVNjYW5JbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZVNjYW4uJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBDb21wbGlhbmNlU2NhblNjaGVkdWxlID0gdHlwZW9mIGNvbXBsaWFuY2VTY2FuU2NoZWR1bGUuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVNjYW5TY2hlZHVsZUluc2VydCA9IHR5cGVvZiBjb21wbGlhbmNlU2NhblNjaGVkdWxlLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZU5vdGlmaWNhdGlvblByZWZlcmVuY2UgPSB0eXBlb2YgY29tcGxpYW5jZU5vdGlmaWNhdGlvblByZWZlcmVuY2UuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZU5vdGlmaWNhdGlvblByZWZlcmVuY2VJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZU5vdGlmaWNhdGlvblByZWZlcmVuY2UuJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBDb21wbGlhbmNlTm90aWZpY2F0aW9uTG9nID0gdHlwZW9mIGNvbXBsaWFuY2VOb3RpZmljYXRpb25Mb2cuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZU5vdGlmaWNhdGlvbkxvZ0luc2VydCA9IHR5cGVvZiBjb21wbGlhbmNlTm90aWZpY2F0aW9uTG9nLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJvbGUgPSB0eXBlb2YgY29tcGxpYW5jZVJvbGUuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJvbGVJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZVJvbGUuJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBDb21wbGlhbmNlUmVwb3J0ID0gdHlwZW9mIGNvbXBsaWFuY2VSZXBvcnQuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJlcG9ydEluc2VydCA9IHR5cGVvZiBjb21wbGlhbmNlUmVwb3J0LiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJlcG9ydFNjaGVkdWxlID0gdHlwZW9mIGNvbXBsaWFuY2VSZXBvcnRTY2hlZHVsZS4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBDb21wbGlhbmNlUmVwb3J0U2NoZWR1bGVJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZVJlcG9ydFNjaGVkdWxlLiRpbmZlckluc2VydDtcbiJdfQ==
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpenpsZS1zY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLDJEQUEyRDtBQUMzRCxFQUFFO0FBRUYsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsbUJBQW1CLENBQUM7QUFFbEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RFLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsY0FBYyxFQUNkLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQixjQUFjLEVBQ2Qsc0JBQXNCLEVBQ3RCLGdDQUFnQyxFQUNoQyx5QkFBeUIsRUFDekIsY0FBYyxFQUNkLGdCQUFnQixFQUNoQix3QkFBd0IsR0FDekIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU1Qzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRztJQUNwQixNQUFNO0lBQ04sUUFBUTtJQUNSLE9BQU87SUFDUCxnQkFBZ0I7SUFDaEIsYUFBYTtJQUNiLG1GQUFtRjtJQUNuRixTQUFTO0lBQ1QsY0FBYztJQUNkLGtFQUFrRTtJQUNsRSxtQkFBbUI7SUFDbkIsc0VBQXNFO0lBQ3RFLFlBQVk7SUFDWixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLGNBQWM7SUFDZCxxQkFBcUI7SUFDckIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQiwwQkFBMEI7SUFDMUIsY0FBYztJQUNkLHNCQUFzQjtJQUN0QixnQ0FBZ0M7SUFDaEMseUJBQXlCO0lBQ3pCLGNBQWM7SUFDZCxnQkFBZ0I7SUFDaEIsd0JBQXdCO0NBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLy9cbi8vIEJhcnJlbCBmb3IgdGhlIERyaXp6bGUgc2NoZW1hLiBUaGUgdGFibGUvdHlwZSBkZWZpbml0aW9ucyBsaXZlIGluIHBlci1kb21haW5cbi8vIGZpbGVzIHVuZGVyIGAuL3NjaGVtYS8qYDsgdGhpcyBtb2R1bGUgcmUtZXhwb3J0cyBldmVyeSBvbmUgb2YgdGhlbSBzbyB0aGVcbi8vIHB1YmxpYyBBUEkgaXMgYnl0ZS1pZGVudGljYWwgdG8gdGhlIHByZXZpb3VzIHNpbmdsZS1maWxlIHNjaGVtYS4gRXhpc3Rpbmdcbi8vIGBpbXBvcnQgeyAuLi4gfSBmcm9tICcuLi4vZHJpenpsZS1zY2hlbWEnYCBzaXRlcyBhbmQgdGhlIGFnZ3JlZ2F0ZSBgc2NoZW1hYFxuLy8gb2JqZWN0IGJlbG93IGJvdGggY29udGludWUgdG8gcmVzb2x2ZSBleGFjdGx5IGFzIGJlZm9yZS5cbi8vXG5cbmV4cG9ydCAqIGZyb20gJy4vc2NoZW1hL3BsdWdpbi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NjaGVtYS9waXBlbGluZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NjaGVtYS9tZXNzYWdlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc2NoZW1hL2NvbXBsaWFuY2UuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zY2hlbWEvZGFzaGJvYXJkLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc2NoZW1hL2FsZXJ0LmpzJztcblxuaW1wb3J0IHsgb3JnQWxlcnREZXN0aW5hdGlvbiwgb3JnQWxlcnRSdWxlIH0gZnJvbSAnLi9zY2hlbWEvYWxlcnQuanMnO1xuaW1wb3J0IHtcbiAgY29tcGxpYW5jZVBvbGljeSxcbiAgY29tcGxpYW5jZVJ1bGUsXG4gIGNvbXBsaWFuY2VSdWxlSGlzdG9yeSxcbiAgY29tcGxpYW5jZUF1ZGl0TG9nLFxuICBjb21wbGlhbmNlRXhlbXB0aW9uLFxuICBjb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbixcbiAgY29tcGxpYW5jZVNjYW4sXG4gIGNvbXBsaWFuY2VTY2FuU2NoZWR1bGUsXG4gIGNvbXBsaWFuY2VOb3RpZmljYXRpb25QcmVmZXJlbmNlLFxuICBjb21wbGlhbmNlTm90aWZpY2F0aW9uTG9nLFxuICBjb21wbGlhbmNlUm9sZSxcbiAgY29tcGxpYW5jZVJlcG9ydCxcbiAgY29tcGxpYW5jZVJlcG9ydFNjaGVkdWxlLFxufSBmcm9tICcuL3NjaGVtYS9jb21wbGlhbmNlLmpzJztcbmltcG9ydCB7IGRhc2hib2FyZCwgZGFzaGJvYXJkUGFuZWwgfSBmcm9tICcuL3NjaGVtYS9kYXNoYm9hcmQuanMnO1xuaW1wb3J0IHsgbWVzc2FnZSB9IGZyb20gJy4vc2NoZW1hL21lc3NhZ2UuanMnO1xuaW1wb3J0IHsgcGlwZWxpbmUsIHBpcGVsaW5lUmVnaXN0cnksIHBpcGVsaW5lRXZlbnQgfSBmcm9tICcuL3NjaGVtYS9waXBlbGluZS5qcyc7XG5pbXBvcnQgeyBwbHVnaW4gfSBmcm9tICcuL3NjaGVtYS9wbHVnaW4uanMnO1xuXG4vKipcbiAqIENvbXBsZXRlIERyaXp6bGUgc2NoZW1hIGV4cG9ydFxuICovXG5leHBvcnQgY29uc3Qgc2NoZW1hID0ge1xuICBwbHVnaW4sXG4gIHBpcGVsaW5lLFxuICBtZXNzYWdlLFxuICBwaXBlbGluZVJlZ2lzdHJ5LFxuICBwaXBlbGluZUV2ZW50LFxuICAvLyBPYnNlcnZhYmlsaXR5IGRhc2hib2FyZHMgKHVzZXItZWRpdGFibGUgcmVwbGFjZW1lbnQgZm9yIGNvZGUtZGVmaW5lZCBkYXNoYm9hcmRzKVxuICBkYXNoYm9hcmQsXG4gIGRhc2hib2FyZFBhbmVsLFxuICAvLyBQZXItb3JnIGFsZXJ0IG5vdGlmaWNhdGlvbiBkZXN0aW5hdGlvbnMgKG11bHRpLXRlbmFudCBhbGVydGluZylcbiAgb3JnQWxlcnREZXN0aW5hdGlvbixcbiAgLy8gcGVyLW9yZyBvcGVyYXRvci1hdXRob3JlZCBhbGVydCBydWxlcyAgbWF0ZXJpYWxpemVkIGludG8gUHJvbSBZQU1MLlxuICBvcmdBbGVydFJ1bGUsXG4gIC8vIENvbXBsaWFuY2UgdGFibGVzXG4gIGNvbXBsaWFuY2VQb2xpY3ksXG4gIGNvbXBsaWFuY2VSdWxlLFxuICBjb21wbGlhbmNlUnVsZUhpc3RvcnksXG4gIGNvbXBsaWFuY2VBdWRpdExvZyxcbiAgY29tcGxpYW5jZUV4ZW1wdGlvbixcbiAgY29tcGxpYW5jZVJ1bGVTdWJzY3JpcHRpb24sXG4gIGNvbXBsaWFuY2VTY2FuLFxuICBjb21wbGlhbmNlU2NhblNjaGVkdWxlLFxuICBjb21wbGlhbmNlTm90aWZpY2F0aW9uUHJlZmVyZW5jZSxcbiAgY29tcGxpYW5jZU5vdGlmaWNhdGlvbkxvZyxcbiAgY29tcGxpYW5jZVJvbGUsXG4gIGNvbXBsaWFuY2VSZXBvcnQsXG4gIGNvbXBsaWFuY2VSZXBvcnRTY2hlZHVsZSxcbn0gYXMgY29uc3Q7XG4iXX0=