@pipeline-builder/pipeline-data 3.4.86 → 3.4.88

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.
@@ -0,0 +1,348 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { AccessModifier, SYSTEM_ORG_ID } from '@pipeline-builder/api-core';
4
+ import { sql } from 'drizzle-orm';
5
+ import { boolean, integer, varchar, pgTable, text, timestamp, uuid, jsonb, index, uniqueIndex } from 'drizzle-orm/pg-core';
6
+ /**
7
+ * Compliance policies group rules into named sets that can be enabled/disabled together.
8
+ *
9
+ * @table compliance_policies
10
+ */
11
+ export const compliancePolicy = pgTable('compliance_policies', {
12
+ id: uuid('id').primaryKey().defaultRandom(),
13
+ orgId: varchar('org_id', { length: 255 }).default(SYSTEM_ORG_ID).notNull(),
14
+ createdBy: text('created_by').default('system').notNull(),
15
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
16
+ updatedBy: text('updated_by').default('system').notNull(),
17
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
18
+ name: varchar('name', { length: 255 }).notNull(),
19
+ description: text('description'),
20
+ version: varchar('version', { length: 50 }).default('1.0.0').notNull(),
21
+ isTemplate: boolean('is_template').default(false).notNull(),
22
+ accessModifier: varchar('access_modifier', { length: 10 })
23
+ .$type().default('private').notNull(),
24
+ isDefault: boolean('is_default').default(false).notNull(),
25
+ isActive: boolean('is_active').default(true).notNull(),
26
+ deletedAt: timestamp('deleted_at', { withTimezone: true }),
27
+ deletedBy: text('deleted_by'),
28
+ }, (table) => ({
29
+ orgActiveIdx: index('compliance_policy_org_active_idx').on(table.orgId, table.isActive),
30
+ templateIdx: index('compliance_policy_template_idx').on(table.isTemplate),
31
+ nameOrgVersionUnique: uniqueIndex('compliance_policy_name_org_version_unique')
32
+ .on(table.orgId, table.name, table.version),
33
+ }));
34
+ /**
35
+ * Compliance rules define individual checks against plugin/pipeline attributes.
36
+ *
37
+ * @table compliance_rules
38
+ */
39
+ export const complianceRule = pgTable('compliance_rules', {
40
+ id: uuid('id').primaryKey().defaultRandom(),
41
+ orgId: varchar('org_id', { length: 255 }).default(SYSTEM_ORG_ID).notNull(),
42
+ createdBy: text('created_by').default('system').notNull(),
43
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
44
+ updatedBy: text('updated_by').default('system').notNull(),
45
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
46
+ // Rule identity
47
+ name: varchar('name', { length: 255 }).notNull(),
48
+ description: text('description'),
49
+ policyId: uuid('policy_id').references(() => compliancePolicy.id, { onDelete: 'set null' }),
50
+ priority: integer('priority').default(0).notNull(),
51
+ target: varchar('target', { length: 20 }).$type().notNull(),
52
+ severity: varchar('severity', { length: 10 }).$type().default('error').notNull(),
53
+ // Categorization
54
+ tags: jsonb('tags').$type().default([]).notNull(),
55
+ // Scheduling
56
+ effectiveFrom: timestamp('effective_from', { withTimezone: true }),
57
+ effectiveUntil: timestamp('effective_until', { withTimezone: true }),
58
+ // Scope
59
+ scope: varchar('scope', { length: 10 }).$type().default('org').notNull(),
60
+ // Forking tracks which published rule this org rule was copied from
61
+ forkedFromRuleId: uuid('forked_from_rule_id'),
62
+ // Notification override
63
+ suppressNotification: boolean('suppress_notification').default(false).notNull(),
64
+ // Org → team hierarchy: when true, this (parent-org) rule is also enforced on
65
+ // descendant team orgs during their compliance evaluation.
66
+ propagateToChildren: boolean('propagate_to_children').default(false).notNull(),
67
+ // Single-field condition
68
+ field: varchar('field', { length: 100 }),
69
+ operator: varchar('operator', { length: 20 }).$type(),
70
+ value: jsonb('value'),
71
+ // Cross-field conditions (overrides single-field when present)
72
+ conditions: jsonb('conditions').$type(),
73
+ conditionMode: varchar('condition_mode', { length: 5 }).$type().default('all'),
74
+ // Access and visibility
75
+ accessModifier: varchar('access_modifier', { length: 10 })
76
+ .$type().default('private').notNull(),
77
+ isDefault: boolean('is_default').default(false).notNull(),
78
+ isActive: boolean('is_active').default(true).notNull(),
79
+ deletedAt: timestamp('deleted_at', { withTimezone: true }),
80
+ deletedBy: text('deleted_by'),
81
+ }, (table) => ({
82
+ orgTargetActiveIdx: index('compliance_rule_org_target_active_idx')
83
+ .on(table.orgId, table.target, table.isActive),
84
+ orgPolicyIdx: index('compliance_rule_org_policy_idx').on(table.orgId, table.policyId),
85
+ priorityIdx: index('compliance_rule_priority_idx').on(table.priority),
86
+ scopeIdx: index('compliance_rule_scope_idx').on(table.scope),
87
+ effectiveFromIdx: index('compliance_rule_effective_from_idx').on(table.effectiveFrom),
88
+ nameOrgUnique: uniqueIndex('compliance_rule_name_org_unique').on(table.orgId, table.name),
89
+ }));
90
+ /**
91
+ * Tracks every change to compliance rules for versioning and rollback.
92
+ *
93
+ * @table compliance_rule_history
94
+ */
95
+ export const complianceRuleHistory = pgTable('compliance_rule_history', {
96
+ id: uuid('id').primaryKey().defaultRandom(),
97
+ ruleId: uuid('rule_id').notNull().references(() => complianceRule.id, { onDelete: 'cascade' }),
98
+ orgId: varchar('org_id', { length: 255 }).notNull(),
99
+ changeType: varchar('change_type', { length: 20 }).notNull(), // created | updated | deleted | restored
100
+ previousState: jsonb('previous_state'), // full rule snapshot before change
101
+ changedBy: text('changed_by').notNull(),
102
+ changedAt: timestamp('changed_at', { withTimezone: true }).defaultNow().notNull(),
103
+ }, (table) => ({
104
+ ruleChangedAtIdx: index('compliance_rule_history_rule_changed_idx')
105
+ .on(table.ruleId, table.changedAt),
106
+ orgChangedAtIdx: index('compliance_rule_history_org_changed_idx')
107
+ .on(table.orgId, table.changedAt),
108
+ ruleIdIdx: index('compliance_rule_history_rule_id_idx')
109
+ .on(table.ruleId),
110
+ }));
111
+ /**
112
+ * Compliance audit log stores every compliance check result.
113
+ *
114
+ * @table compliance_audit_log
115
+ */
116
+ export const complianceAuditLog = pgTable('compliance_audit_log', {
117
+ id: uuid('id').primaryKey().defaultRandom(),
118
+ orgId: varchar('org_id', { length: 255 }).notNull(),
119
+ userId: text('user_id').notNull(),
120
+ target: varchar('target', { length: 20 }).$type().notNull(),
121
+ action: varchar('action', { length: 20 }).notNull(), // upload | deploy | create | update | scan
122
+ entityId: varchar('entity_id', { length: 255 }),
123
+ entityName: varchar('entity_name', { length: 255 }),
124
+ result: varchar('result', { length: 10 }).notNull(), // pass | warn | block
125
+ violations: jsonb('violations').$type().default([]),
126
+ ruleCount: integer('rule_count').notNull(),
127
+ scanId: uuid('scan_id'), // groups entries from the same bulk scan
128
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
129
+ }, (table) => ({
130
+ orgCreatedAtIdx: index('compliance_audit_org_created_idx').on(table.orgId, table.createdAt),
131
+ // DESC variant for the dominant "latest audit events per org" query
132
+ // pattern (audit log UIs sort newest-first). Postgres can use the asc
133
+ // index for desc scans, but a matching DESC index lets index-only scans
134
+ // satisfy `ORDER BY created_at DESC LIMIT n` without a reverse step.
135
+ // MIGRATION REQUIRED: run `pnpm drizzle-kit generate` after pulling.
136
+ orgCreatedAtDescIdx: index('compliance_audit_org_created_desc_idx')
137
+ .on(table.orgId, sql `${table.createdAt} DESC`),
138
+ orgTargetResultIdx: index('compliance_audit_org_target_result_idx')
139
+ .on(table.orgId, table.target, table.result),
140
+ scanIdIdx: index('compliance_audit_scan_id_idx').on(table.scanId),
141
+ }));
142
+ /**
143
+ * Per-entity exemptions from specific compliance rules.
144
+ *
145
+ * @table compliance_exemptions
146
+ */
147
+ export const complianceExemption = pgTable('compliance_exemptions', {
148
+ id: uuid('id').primaryKey().defaultRandom(),
149
+ orgId: varchar('org_id', { length: 255 }).notNull(),
150
+ ruleId: uuid('rule_id').notNull().references(() => complianceRule.id, { onDelete: 'cascade' }),
151
+ entityType: varchar('entity_type', { length: 20 }).$type().notNull(),
152
+ entityId: uuid('entity_id').notNull(),
153
+ entityName: varchar('entity_name', { length: 255 }),
154
+ reason: text('reason').notNull(),
155
+ approvedBy: text('approved_by'),
156
+ rejectionReason: text('rejection_reason'),
157
+ status: varchar('status', { length: 20 }).default('pending').notNull(), // pending | approved | rejected | expired
158
+ expiresAt: timestamp('expires_at', { withTimezone: true }),
159
+ createdBy: text('created_by').notNull(),
160
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
161
+ updatedBy: text('updated_by').notNull(),
162
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
163
+ }, (table) => ({
164
+ orgRuleEntityUnique: uniqueIndex('compliance_exemption_org_rule_entity_unique')
165
+ .on(table.orgId, table.ruleId, table.entityId),
166
+ orgStatusIdx: index('compliance_exemption_org_status_idx').on(table.orgId, table.status),
167
+ expiresAtIdx: index('compliance_exemption_expires_at_idx').on(table.expiresAt),
168
+ entityIdIdx: index('compliance_exemption_entity_id_idx').on(table.entityId),
169
+ }));
170
+ /**
171
+ * Tracks which orgs have opted into system-org published compliance rules.
172
+ *
173
+ * @table compliance_rule_subscriptions
174
+ */
175
+ export const complianceRuleSubscription = pgTable('compliance_rule_subscriptions', {
176
+ id: uuid('id').primaryKey().defaultRandom(),
177
+ orgId: varchar('org_id', { length: 255 }).notNull(),
178
+ ruleId: uuid('rule_id').notNull().references(() => complianceRule.id, { onDelete: 'cascade' }),
179
+ subscribedBy: text('subscribed_by').notNull(),
180
+ subscribedAt: timestamp('subscribed_at', { withTimezone: true }).defaultNow().notNull(),
181
+ isActive: boolean('is_active').default(true).notNull(),
182
+ pinnedVersion: jsonb('pinned_version').$type(),
183
+ unsubscribedAt: timestamp('unsubscribed_at', { withTimezone: true }),
184
+ unsubscribedBy: text('unsubscribed_by'),
185
+ }, (table) => ({
186
+ orgRuleUnique: uniqueIndex('compliance_rule_sub_org_rule_unique').on(table.orgId, table.ruleId),
187
+ orgActiveIdx: index('compliance_rule_sub_org_active_idx').on(table.orgId, table.isActive),
188
+ ruleIdx: index('compliance_rule_sub_rule_idx').on(table.ruleId),
189
+ }));
190
+ /**
191
+ * Bulk compliance scans tracks scheduled and on-demand scans.
192
+ *
193
+ * @table compliance_scans
194
+ */
195
+ export const complianceScan = pgTable('compliance_scans', {
196
+ id: uuid('id').primaryKey().defaultRandom(),
197
+ orgId: varchar('org_id', { length: 255 }).notNull(),
198
+ target: varchar('target', { length: 20 }).notNull(), // plugin | pipeline | all
199
+ filter: jsonb('filter'), // optional entity filter for partial scans
200
+ status: varchar('status', { length: 20 }).default('pending').notNull(), // pending | running | completed | failed | cancelled
201
+ triggeredBy: varchar('triggered_by', { length: 20 }).notNull(), // manual | scheduled | rule-change | rule-dry-run
202
+ userId: text('user_id').notNull(),
203
+ totalEntities: integer('total_entities').default(0).notNull(),
204
+ processedEntities: integer('processed_entities').default(0).notNull(),
205
+ passCount: integer('pass_count').default(0).notNull(),
206
+ warnCount: integer('warn_count').default(0).notNull(),
207
+ blockCount: integer('block_count').default(0).notNull(),
208
+ // True when the scan stopped early at a configured per-scan cap (so the
209
+ // counts above represent a subset, not the full entity universe). Surfaced
210
+ // in the scan-status UI so users know whether to widen the filter.
211
+ // MIGRATION REQUIRED: run `pnpm drizzle-kit generate` after pulling.
212
+ truncated: boolean('truncated').default(false).notNull(),
213
+ startedAt: timestamp('started_at', { withTimezone: true }),
214
+ completedAt: timestamp('completed_at', { withTimezone: true }),
215
+ cancelledAt: timestamp('cancelled_at', { withTimezone: true }),
216
+ cancelledBy: text('cancelled_by'),
217
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
218
+ }, (table) => ({
219
+ orgCreatedAtIdx: index('compliance_scan_org_created_idx').on(table.orgId, table.createdAt),
220
+ orgStatusIdx: index('compliance_scan_org_status_idx').on(table.orgId, table.status),
221
+ }));
222
+ /**
223
+ * Cron-based recurring scan schedules.
224
+ *
225
+ * @table compliance_scan_schedules
226
+ */
227
+ export const complianceScanSchedule = pgTable('compliance_scan_schedules', {
228
+ id: uuid('id').primaryKey().defaultRandom(),
229
+ orgId: varchar('org_id', { length: 255 }).notNull(),
230
+ target: varchar('target', { length: 20 }).notNull(), // plugin | pipeline | all
231
+ cronExpression: varchar('cron_expression', { length: 100 }).notNull(),
232
+ isActive: boolean('is_active').default(true).notNull(),
233
+ lastRunAt: timestamp('last_run_at', { withTimezone: true }),
234
+ nextRunAt: timestamp('next_run_at', { withTimezone: true }),
235
+ createdBy: text('created_by').notNull(),
236
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
237
+ updatedBy: text('updated_by').notNull(),
238
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
239
+ }, (table) => ({
240
+ activeNextRunIdx: index('compliance_scan_schedule_active_next_idx')
241
+ .on(table.isActive, table.nextRunAt),
242
+ orgIdx: index('compliance_scan_schedule_org_idx').on(table.orgId),
243
+ }));
244
+ /**
245
+ * Per-org notification settings for compliance events.
246
+ *
247
+ * @table compliance_notification_preferences
248
+ */
249
+ export const complianceNotificationPreference = pgTable('compliance_notification_preferences', {
250
+ id: uuid('id').primaryKey().defaultRandom(),
251
+ orgId: varchar('org_id', { length: 255 }).notNull().unique(),
252
+ notifyOnBlock: boolean('notify_on_block').default(true).notNull(),
253
+ notifyOnWarning: boolean('notify_on_warning').default(false).notNull(),
254
+ // Opt-in email delivery (to `targetUsers`, or all org admins when null).
255
+ emailEnabled: boolean('email_enabled').default(false).notNull(),
256
+ digestMode: varchar('digest_mode', { length: 20 }).default('immediate').notNull(), // immediate | daily | weekly
257
+ digestSchedule: varchar('digest_schedule', { length: 100 }),
258
+ lastDigestAt: timestamp('last_digest_at', { withTimezone: true }),
259
+ targetUsers: jsonb('target_users').$type(), // null = all org admins
260
+ webhookUrl: varchar('webhook_url', { length: 500 }),
261
+ webhookSecret: varchar('webhook_secret', { length: 255 }),
262
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
263
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
264
+ });
265
+ /**
266
+ * Log of all compliance notifications sent.
267
+ *
268
+ * @table compliance_notification_log
269
+ */
270
+ export const complianceNotificationLog = pgTable('compliance_notification_log', {
271
+ id: uuid('id').primaryKey().defaultRandom(),
272
+ orgId: varchar('org_id', { length: 255 }).notNull(),
273
+ channel: varchar('channel', { length: 20 }).notNull(), // in-app | webhook | digest
274
+ status: varchar('status', { length: 20 }).notNull(), // sent | failed | pending
275
+ payload: jsonb('payload').$type().notNull(),
276
+ webhookResponseCode: integer('webhook_response_code'),
277
+ webhookError: text('webhook_error'),
278
+ retryCount: integer('retry_count').default(0).notNull(),
279
+ nextRetryAt: timestamp('next_retry_at', { withTimezone: true }),
280
+ relatedAuditId: uuid('related_audit_id'),
281
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
282
+ }, (table) => ({
283
+ orgCreatedAtIdx: index('compliance_notification_org_created_idx')
284
+ .on(table.orgId, table.createdAt),
285
+ statusRetryIdx: index('compliance_notification_status_retry_idx')
286
+ .on(table.status, table.nextRetryAt),
287
+ relatedAuditIdx: index('compliance_notification_related_audit_idx')
288
+ .on(table.relatedAuditId),
289
+ }));
290
+ export const complianceRole = pgTable('compliance_roles', {
291
+ id: uuid('id').primaryKey().defaultRandom(),
292
+ orgId: varchar('org_id', { length: 255 }).notNull(),
293
+ userId: text('user_id').notNull(),
294
+ role: varchar('role', { length: 30 }).$type().notNull(),
295
+ grantedBy: text('granted_by').notNull(),
296
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
297
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
298
+ }, (table) => ({
299
+ orgUserUnique: uniqueIndex('compliance_role_org_user_unique').on(table.orgId, table.userId),
300
+ orgRoleIdx: index('compliance_role_org_role_idx').on(table.orgId, table.role),
301
+ }));
302
+ /**
303
+ * Generated compliance reports.
304
+ *
305
+ * @table compliance_reports
306
+ */
307
+ export const complianceReport = pgTable('compliance_reports', {
308
+ id: uuid('id').primaryKey().defaultRandom(),
309
+ orgId: varchar('org_id', { length: 255 }).notNull(),
310
+ reportType: varchar('report_type', { length: 30 }).notNull(), // summary | detailed | audit-trail | comparison
311
+ target: varchar('target', { length: 20 }).notNull(), // plugin | pipeline | all
312
+ dateFrom: timestamp('date_from', { withTimezone: true }),
313
+ dateTo: timestamp('date_to', { withTimezone: true }),
314
+ compareFrom: timestamp('compare_from', { withTimezone: true }),
315
+ compareTo: timestamp('compare_to', { withTimezone: true }),
316
+ data: jsonb('data').$type().notNull(),
317
+ format: varchar('format', { length: 10 }).default('json').notNull(), // json | csv
318
+ generatedBy: text('generated_by').notNull(),
319
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
320
+ }, (table) => ({
321
+ orgCreatedAtIdx: index('compliance_report_org_created_idx').on(table.orgId, table.createdAt),
322
+ }));
323
+ /**
324
+ * Cron-based recurring report generation schedules.
325
+ *
326
+ * @table compliance_report_schedules
327
+ */
328
+ export const complianceReportSchedule = pgTable('compliance_report_schedules', {
329
+ id: uuid('id').primaryKey().defaultRandom(),
330
+ orgId: varchar('org_id', { length: 255 }).notNull(),
331
+ reportType: varchar('report_type', { length: 30 }).notNull(), // summary | detailed
332
+ target: varchar('target', { length: 20 }).notNull(), // plugin | pipeline | all
333
+ format: varchar('format', { length: 10 }).default('json').notNull(),
334
+ cronExpression: varchar('cron_expression', { length: 100 }).notNull(),
335
+ isActive: boolean('is_active').default(true).notNull(),
336
+ lastRunAt: timestamp('last_run_at', { withTimezone: true }),
337
+ nextRunAt: timestamp('next_run_at', { withTimezone: true }),
338
+ deliverTo: jsonb('deliver_to').$type().default([]).notNull(), // userIds to notify
339
+ createdBy: text('created_by').notNull(),
340
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
341
+ updatedBy: text('updated_by').notNull(),
342
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
343
+ }, (table) => ({
344
+ activeNextRunIdx: index('compliance_report_schedule_active_next_idx')
345
+ .on(table.isActive, table.nextRunAt),
346
+ orgIdx: index('compliance_report_schedule_org_idx').on(table.orgId),
347
+ }));
348
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxpYW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhYmFzZS9zY2hlbWEvY29tcGxpYW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0UsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFpRDNIOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMscUJBQXFCLEVBQUU7SUFDN0QsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxhQUFhLEVBQUU7SUFDM0MsS0FBSyxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxFQUFFO0lBQzFFLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sRUFBRTtJQUN6RCxTQUFTLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRTtJQUNqRixTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLEVBQUU7SUFDekQsU0FBUyxFQUFFLFNBQVMsQ0FBQyxZ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YUFBYSxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzNELFNBQVMsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsS0FBSyxFQUFZLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLG9CQUFvQjtJQUM1RixTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sRUFBRTtJQUN2QyxTQUFTLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRTtJQUNqRixTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sRUFBRTtJQUN2QyxTQUFTLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRTtDQUNsRixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2IsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLDRDQUE0QyxDQUFDO1NBQ2xFLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUM7SUFDdEMsTUFBTSxFQUFFLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO0NBQ3BFLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IEFjY2Vzc01vZGlmaWVyLCBTWVNURU1fT1JHX0lEIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgc3FsIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHsgYm9vbGVhbiwgaW50ZWdlciwgdmFyY2hhciwgcGdUYWJsZSwgdGV4dCwgdGltZXN0YW1wLCB1dWlkLCBqc29uYiwgaW5kZXgsIHVuaXF1ZUluZGV4IH0gZnJvbSAnZHJpenpsZS1vcm0vcGctY29yZSc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbXBsaWFuY2UgU2VydmljZSBUYWJsZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDb21wbGlhbmNlIHJ1bGUgc2V2ZXJpdHkgbGV2ZWxzLlxuICovXG5leHBvcnQgdHlwZSBSdWxlU2V2ZXJpdHkgPSAnd2FybmluZycgfCAnZXJyb3InIHwgJ2NyaXRpY2FsJztcblxuLyoqXG4gKiBDb21wbGlhbmNlIHJ1bGUgdGFyZ2V0IGVudGl0eSB0eXBlcy5cbiAqL1xuZXhwb3J0IHR5cGUgUnVsZVRhcmdldCA9ICdwbHVnaW4nIHwgJ3BpcGVsaW5lJztcblxuLyoqXG4gKiBDb21wbGlhbmNlIHJ1bGUgb3BlcmF0b3JzIGZvciBmaWVsZCBldmFsdWF0aW9uLlxuICovXG5leHBvcnQgdHlwZSBSdWxlT3BlcmF0b3IgPVxuICB8ICdlcScgfCAnbmVxJ1xuICB8ICdjb250YWlucycgfCAnbm90Q29udGFpbnMnXG4gIHwgJ3JlZ2V4J1xuICB8ICdndCcgfCAnZ3RlJyB8ICdsdCcgfCAnbHRlJ1xuICB8ICdpbicgfCAnbm90SW4nXG4gIHwgJ2V4aXN0cycgfCAnbm90RXhpc3RzJyB8ICdub3RFbXB0eSdcbiAgfCAnY291bnRHdCcgfCAnY291bnRMdCdcbiAgfCAnbGVuZ3RoR3QnIHwgJ2xlbmd0aEx0JztcblxuLyoqXG4gKiBDcm9zcy1maWVsZCBjb25kaXRpb24gbW9kZSBmb3IgbXVsdGktY29uZGl0aW9uIHJ1bGVzLlxuICovXG5leHBvcnQgdHlwZSBSdWxlQ29uZGl0aW9uTW9kZSA9ICdhbGwnIHwgJ2FueSc7XG5cbi8qKlxuICogUnVsZSBzY29wZSAgb3JnLWxldmVsIG9yIHB1Ymxpc2hlZCAoc3lzdGVtIG9yZyBvbmx5LCBvcHQtaW4gdmlhIHN1YnNjcmlwdGlvbikuXG4gKi9cbmV4cG9ydCB0eXBlIFJ1bGVTY29wZSA9ICdvcmcnIHwgJ3B1Ymxpc2hlZCc7XG5cbi8qKlxuICogQSBzaW5nbGUgY29uZGl0aW9uIGluIGEgY3Jvc3MtZmllbGQgcnVsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdWxlQ29uZGl0aW9uIHtcbiAgZmllbGQ/OiBzdHJpbmc7XG4gIG9wZXJhdG9yPzogUnVsZU9wZXJhdG9yO1xuICB2YWx1ZT86IHVua25vd247XG4gIGRlcGVuZHNPblJ1bGU/OiBzdHJpbmc7IC8vIHJ1bGUgSUQgIG9ubHkgZXZhbHVhdGUgaWYgcmVmZXJlbmNlZCBydWxlIHBhc3NlZFxufVxuXG4vKipcbiAqIENvbXBsaWFuY2UgcG9saWNpZXMgZ3JvdXAgcnVsZXMgaW50byBuYW1lZCBzZXRzIHRoYXQgY2FuIGJlIGVuYWJsZWQvZGlzYWJsZWQgdG9nZXRoZXIuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2VfcG9saWNpZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBsaWFuY2VQb2xpY3kgPSBwZ1RhYmxlKCdjb21wbGlhbmNlX3BvbGljaWVzJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5kZWZhdWx0KFNZU1RFTV9PUkdfSUQpLm5vdE51bGwoKSxcbiAgY3JlYXRlZEJ5OiB0ZXh0KCdjcmVhdGVkX2J5JykuZGVmYXVsdCgnc3lzdGVtJykubm90TnVsbCgpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRCeTogdGV4dCgndXBkYXRlZF9ieScpLmRlZmF1bHQoJ3N5c3RlbScpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuXG4gIG5hbWU6IHZhcmNoYXIoJ25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgZGVzY3JpcHRpb246IHRleHQoJ2Rlc2NyaXB0aW9uJyksXG4gIHZlcnNpb246IHZhcmNoYXIoJ3ZlcnNpb24nLCB7IGxlbmd0aDogNTAgfSkuZGVmYXVsdCgnMS4wLjAnKS5ub3ROdWxsKCksXG4gIGlzVGVtcGxhdGU6IGJvb2xlYW4oJ2lzX3RlbXBsYXRlJykuZGVmYXVsdChmYWxzZSkubm90TnVsbCgpLFxuXG4gIGFjY2Vzc01vZGlmaWVyOiB2YXJjaGFyKCdhY2Nlc3NfbW9kaWZpZXInLCB7IGxlbmd0aDogMTAgfSlcbiAgICAuJHR5cGU8QWNjZXNzTW9kaWZpZXI+KCkuZGVmYXVsdCgncHJpdmF0ZScgYXMgQWNjZXNzTW9kaWZpZXIpLm5vdE51bGwoKSxcbiAgaXNEZWZhdWx0OiBib29sZWFuKCdpc19kZWZhdWx0JykuZGVmYXVsdChmYWxzZSkubm90TnVsbCgpLFxuICBpc0FjdGl2ZTogYm9vbGVhbignaXNfYWN0aXZlJykuZGVmYXVsdCh0cnVlKS5ub3ROdWxsKCksXG4gIGRlbGV0ZWRBdDogdGltZXN0YW1wKCdkZWxldGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGRlbGV0ZWRCeTogdGV4dCgnZGVsZXRlZF9ieScpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBvcmdBY3RpdmVJZHg6IGluZGV4KCdjb21wbGlhbmNlX3BvbGljeV9vcmdfYWN0aXZlX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5pc0FjdGl2ZSksXG4gIHRlbXBsYXRlSWR4OiBpbmRleCgnY29tcGxpYW5jZV9wb2xpY3lfdGVtcGxhdGVfaWR4Jykub24odGFibGUuaXNUZW1wbGF0ZSksXG4gIG5hbWVPcmdWZXJzaW9uVW5pcXVlOiB1bmlxdWVJbmRleCgnY29tcGxpYW5jZV9wb2xpY3lfbmFtZV9vcmdfdmVyc2lvbl91bmlxdWUnKVxuICAgIC5vbih0YWJsZS5vcmdJZCwgdGFibGUubmFtZSwgdGFibGUudmVyc2lvbiksXG59KSk7XG5cbi8qKlxuICogQ29tcGxpYW5jZSBydWxlcyBkZWZpbmUgaW5kaXZpZHVhbCBjaGVja3MgYWdhaW5zdCBwbHVnaW4vcGlwZWxpbmUgYXR0cmlidXRlcy5cbiAqXG4gKiBAdGFibGUgY29tcGxpYW5jZV9ydWxlc1xuICovXG5leHBvcnQgY29uc3QgY29tcGxpYW5jZVJ1bGUgPSBwZ1RhYmxlKCdjb21wbGlhbmNlX3J1bGVzJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5kZWZhdWx0KFNZU1RFTV9PUkdfSUQpLm5vdE51bGwoKSxcbiAgY3JlYXRlZEJ5OiB0ZXh0KCdjcmVhdGVkX2J5JykuZGVmYXVsdCgnc3lzdGVtJykubm90TnVsbCgpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRCeTogdGV4dCgndXBkYXRlZF9ieScpLmRlZmF1bHQoJ3N5c3RlbScpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuXG4gIC8vIFJ1bGUgaWRlbnRpdHlcbiAgbmFtZTogdmFyY2hhcignbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBkZXNjcmlwdGlvbjogdGV4dCgnZGVzY3JpcHRpb24nKSxcbiAgcG9saWN5SWQ6IHV1aWQoJ3BvbGljeV9pZCcpLnJlZmVyZW5jZXMoKCkgPT4gY29tcGxpYW5jZVBvbGljeS5pZCwgeyBvbkRlbGV0ZTogJ3NldCBudWxsJyB9KSxcbiAgcHJpb3JpdHk6IGludGVnZXIoJ3ByaW9yaXR5JykuZGVmYXVsdCgwKS5ub3ROdWxsKCksXG4gIHRhcmdldDogdmFyY2hhcigndGFyZ2V0JywgeyBsZW5ndGg6IDIwIH0pLiR0eXBlPFJ1bGVUYXJnZXQ+KCkubm90TnVsbCgpLFxuICBzZXZlcml0eTogdmFyY2hhcignc2V2ZXJpdHknLCB7IGxlbmd0aDogMTAgfSkuJHR5cGU8UnVsZVNldmVyaXR5PigpLmRlZmF1bHQoJ2Vycm9yJykubm90TnVsbCgpLFxuXG4gIC8vIENhdGVnb3JpemF0aW9uXG4gIHRhZ3M6IGpzb25iKCd0YWdzJykuJHR5cGU8c3RyaW5nW10+KCkuZGVmYXVsdChbXSkubm90TnVsbCgpLFxuXG4gIC8vIFNjaGVkdWxpbmdcbiAgZWZmZWN0aXZlRnJvbTogdGltZXN0YW1wKCdlZmZlY3RpdmVfZnJvbScsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBlZmZlY3RpdmVVbnRpbDogdGltZXN0YW1wKCdlZmZlY3RpdmVfdW50aWwnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcblxuICAvLyBTY29wZVxuICBzY29wZTogdmFyY2hhcignc2NvcGUnLCB7IGxlbmd0aDogMTAgfSkuJHR5cGU8UnVsZVNjb3BlPigpLmRlZmF1bHQoJ29yZycpLm5vdE51bGwoKSxcblxuICAvLyBGb3JraW5nICB0cmFja3Mgd2hpY2ggcHVibGlzaGVkIHJ1bGUgdGhpcyBvcmcgcnVsZSB3YXMgY29waWVkIGZyb21cbiAgZm9ya2VkRnJvbVJ1bGVJZDogdXVpZCgnZm9ya2VkX2Zyb21fcnVsZV9pZCcpLFxuXG4gIC8vIE5vdGlmaWNhdGlvbiBvdmVycmlkZVxuICBzdXBwcmVzc05vdGlmaWNhdGlvbjogYm9vbGVhbignc3VwcHJlc3Nfbm90aWZpY2F0aW9uJykuZGVmYXVsdChmYWxzZSkubm90TnVsbCgpLFxuXG4gIC8vIE9yZyDihpIgdGVhbSBoaWVyYXJjaHk6IHdoZW4gdHJ1ZSwgdGhpcyAocGFyZW50LW9yZykgcnVsZSBpcyBhbHNvIGVuZm9yY2VkIG9uXG4gIC8vIGRlc2NlbmRhbnQgdGVhbSBvcmdzIGR1cmluZyB0aGVpciBjb21wbGlhbmNlIGV2YWx1YXRpb24uXG4gIHByb3BhZ2F0ZVRvQ2hpbGRyZW46IGJvb2xlYW4oJ3Byb3BhZ2F0ZV90b19jaGlsZHJlbicpLmRlZmF1bHQoZmFsc2UpLm5vdE51bGwoKSxcblxuICAvLyBTaW5nbGUtZmllbGQgY29uZGl0aW9uXG4gIGZpZWxkOiB2YXJjaGFyKCdmaWVsZCcsIHsgbGVuZ3RoOiAxMDAgfSksXG4gIG9wZXJhdG9yOiB2YXJjaGFyKCdvcGVyYXRvcicsIHsgbGVuZ3RoOiAyMCB9KS4kdHlwZTxSdWxlT3BlcmF0b3I+KCksXG4gIHZhbHVlOiBqc29uYigndmFsdWUnKSxcblxuICAvLyBDcm9zcy1maWVsZCBjb25kaXRpb25zIChvdmVycmlkZXMgc2luZ2xlLWZpZWxkIHdoZW4gcHJlc2VudClcbiAgY29uZGl0aW9uczoganNvbmIoJ2NvbmRpdGlvbnMnKS4kdHlwZTxSdWxlQ29uZGl0aW9uW10+KCksXG4gIGNvbmRpdGlvbk1vZGU6IHZhcmNoYXIoJ2NvbmRpdGlvbl9tb2RlJywgeyBsZW5ndGg6IDUgfSkuJHR5cGU8UnVsZUNvbmRpdGlvbk1vZGU+KCkuZGVmYXVsdCgnYWxsJyksXG5cbiAgLy8gQWNjZXNzIGFuZCB2aXNpYmlsaXR5XG4gIGFjY2Vzc01vZGlmaWVyOiB2YXJjaGFyKCdhY2Nlc3NfbW9kaWZpZXInLCB7IGxlbmd0aDogMTAgfSlcbiAgICAuJHR5cGU8QWNjZXNzTW9kaWZpZXI+KCkuZGVmYXVsdCgncHJpdmF0ZScgYXMgQWNjZXNzTW9kaWZpZXIpLm5vdE51bGwoKSxcbiAgaXNEZWZhdWx0OiBib29sZWFuKCdpc19kZWZhdWx0JykuZGVmYXVsdChmYWxzZSkubm90TnVsbCgpLFxuICBpc0FjdGl2ZTogYm9vbGVhbignaXNfYWN0aXZlJykuZGVmYXVsdCh0cnVlKS5ub3ROdWxsKCksXG4gIGRlbGV0ZWRBdDogdGltZXN0YW1wKCdkZWxldGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGRlbGV0ZWRCeTogdGV4dCgnZGVsZXRlZF9ieScpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBvcmdUYXJnZXRBY3RpdmVJZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfb3JnX3RhcmdldF9hY3RpdmVfaWR4JylcbiAgICAub24odGFibGUub3JnSWQsIHRhYmxlLnRhcmdldCwgdGFibGUuaXNBY3RpdmUpLFxuICBvcmdQb2xpY3lJZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfb3JnX3BvbGljeV9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUucG9saWN5SWQpLFxuICBwcmlvcml0eUlkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcnVsZV9wcmlvcml0eV9pZHgnKS5vbih0YWJsZS5wcmlvcml0eSksXG4gIHNjb3BlSWR4OiBpbmRleCgnY29tcGxpYW5jZV9ydWxlX3Njb3BlX2lkeCcpLm9uKHRhYmxlLnNjb3BlKSxcbiAgZWZmZWN0aXZlRnJvbUlkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcnVsZV9lZmZlY3RpdmVfZnJvbV9pZHgnKS5vbih0YWJsZS5lZmZlY3RpdmVGcm9tKSxcbiAgbmFtZU9yZ1VuaXF1ZTogdW5pcXVlSW5kZXgoJ2NvbXBsaWFuY2VfcnVsZV9uYW1lX29yZ191bmlxdWUnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUubmFtZSksXG59KSk7XG5cbi8qKlxuICogVHJhY2tzIGV2ZXJ5IGNoYW5nZSB0byBjb21wbGlhbmNlIHJ1bGVzIGZvciB2ZXJzaW9uaW5nIGFuZCByb2xsYmFjay5cbiAqXG4gKiBAdGFibGUgY29tcGxpYW5jZV9ydWxlX2hpc3RvcnlcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBsaWFuY2VSdWxlSGlzdG9yeSA9IHBnVGFibGUoJ2NvbXBsaWFuY2VfcnVsZV9oaXN0b3J5Jywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBydWxlSWQ6IHV1aWQoJ3J1bGVfaWQnKS5ub3ROdWxsKCkucmVmZXJlbmNlcygoKSA9PiBjb21wbGlhbmNlUnVsZS5pZCwgeyBvbkRlbGV0ZTogJ2Nhc2NhZGUnIH0pLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIGNoYW5nZVR5cGU6IHZhcmNoYXIoJ2NoYW5nZV90eXBlJywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSwgLy8gY3JlYXRlZCB8IHVwZGF0ZWQgfCBkZWxldGVkIHwgcmVzdG9yZWRcbiAgcHJldmlvdXNTdGF0ZToganNvbmIoJ3ByZXZpb3VzX3N0YXRlJyksIC8vIGZ1bGwgcnVsZSBzbmFwc2hvdCBiZWZvcmUgY2hhbmdlXG4gIGNoYW5nZWRCeTogdGV4dCgnY2hhbmdlZF9ieScpLm5vdE51bGwoKSxcbiAgY2hhbmdlZEF0OiB0aW1lc3RhbXAoJ2NoYW5nZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBydWxlQ2hhbmdlZEF0SWR4OiBpbmRleCgnY29tcGxpYW5jZV9ydWxlX2hpc3RvcnlfcnVsZV9jaGFuZ2VkX2lkeCcpXG4gICAgLm9uKHRhYmxlLnJ1bGVJZCwgdGFibGUuY2hhbmdlZEF0KSxcbiAgb3JnQ2hhbmdlZEF0SWR4OiBpbmRleCgnY29tcGxpYW5jZV9ydWxlX2hpc3Rvcnlfb3JnX2NoYW5nZWRfaWR4JylcbiAgICAub24odGFibGUub3JnSWQsIHRhYmxlLmNoYW5nZWRBdCksXG4gIHJ1bGVJZElkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcnVsZV9oaXN0b3J5X3J1bGVfaWRfaWR4JylcbiAgICAub24odGFibGUucnVsZUlkKSxcbn0pKTtcblxuLyoqXG4gKiBDb21wbGlhbmNlIGF1ZGl0IGxvZyAgc3RvcmVzIGV2ZXJ5IGNvbXBsaWFuY2UgY2hlY2sgcmVzdWx0LlxuICpcbiAqIEB0YWJsZSBjb21wbGlhbmNlX2F1ZGl0X2xvZ1xuICovXG5leHBvcnQgY29uc3QgY29tcGxpYW5jZUF1ZGl0TG9nID0gcGdUYWJsZSgnY29tcGxpYW5jZV9hdWRpdF9sb2cnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgdXNlcklkOiB0ZXh0KCd1c2VyX2lkJykubm90TnVsbCgpLFxuICB0YXJnZXQ6IHZhcmNoYXIoJ3RhcmdldCcsIHsgbGVuZ3RoOiAyMCB9KS4kdHlwZTxSdWxlVGFyZ2V0PigpLm5vdE51bGwoKSxcbiAgYWN0aW9uOiB2YXJjaGFyKCdhY3Rpb24nLCB7IGxlbmd0aDogMjAgfSkubm90TnVsbCgpLCAvLyB1cGxvYWQgfCBkZXBsb3kgfCBjcmVhdGUgfCB1cGRhdGUgfCBzY2FuXG4gIGVudGl0eUlkOiB2YXJjaGFyKCdlbnRpdHlfaWQnLCB7IGxlbmd0aDogMjU1IH0pLFxuICBlbnRpdHlOYW1lOiB2YXJjaGFyKCdlbnRpdHlfbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIHJlc3VsdDogdmFyY2hhcigncmVzdWx0JywgeyBsZW5ndGg6IDEwIH0pLm5vdE51bGwoKSwgLy8gcGFzcyB8IHdhcm4gfCBibG9ja1xuICB2aW9sYXRpb25zOiBqc29uYigndmlvbGF0aW9ucycpLiR0eXBlPFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+KCkuZGVmYXVsdChbXSksXG4gIHJ1bGVDb3VudDogaW50ZWdlcigncnVsZV9jb3VudCcpLm5vdE51bGwoKSxcbiAgc2NhbklkOiB1dWlkKCdzY2FuX2lkJyksIC8vIGdyb3VwcyBlbnRyaWVzIGZyb20gdGhlIHNhbWUgYnVsayBzY2FuXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgb3JnQ3JlYXRlZEF0SWR4OiBpbmRleCgnY29tcGxpYW5jZV9hdWRpdF9vcmdfY3JlYXRlZF9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuY3JlYXRlZEF0KSxcbiAgLy8gREVTQyB2YXJpYW50IGZvciB0aGUgZG9taW5hbnQgXCJsYXRlc3QgYXVkaXQgZXZlbnRzIHBlciBvcmdcIiBxdWVyeVxuICAvLyBwYXR0ZXJuIChhdWRpdCBsb2cgVUlzIHNvcnQgbmV3ZXN0LWZpcnN0KS4gUG9zdGdyZXMgY2FuIHVzZSB0aGUgYXNjXG4gIC8vIGluZGV4IGZvciBkZXNjIHNjYW5zLCBidXQgYSBtYXRjaGluZyBERVNDIGluZGV4IGxldHMgaW5kZXgtb25seSBzY2Fuc1xuICAvLyBzYXRpc2Z5IGBPUkRFUiBCWSBjcmVhdGVkX2F0IERFU0MgTElNSVQgbmAgd2l0aG91dCBhIHJldmVyc2Ugc3RlcC5cbiAgLy8gTUlHUkFUSU9OIFJFUVVJUkVEOiBydW4gYHBucG0gZHJpenpsZS1raXQgZ2VuZXJhdGVgIGFmdGVyIHB1bGxpbmcuXG4gIG9yZ0NyZWF0ZWRBdERlc2NJZHg6IGluZGV4KCdjb21wbGlhbmNlX2F1ZGl0X29yZ19jcmVhdGVkX2Rlc2NfaWR4JylcbiAgICAub24odGFibGUub3JnSWQsIHNxbGAke3RhYmxlLmNyZWF0ZWRBdH0gREVTQ2ApLFxuICBvcmdUYXJnZXRSZXN1bHRJZHg6IGluZGV4KCdjb21wbGlhbmNlX2F1ZGl0X29yZ190YXJnZXRfcmVzdWx0X2lkeCcpXG4gICAgLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS50YXJnZXQsIHRhYmxlLnJlc3VsdCksXG4gIHNjYW5JZElkeDogaW5kZXgoJ2NvbXBsaWFuY2VfYXVkaXRfc2Nhbl9pZF9pZHgnKS5vbih0YWJsZS5zY2FuSWQpLFxufSkpO1xuXG4vKipcbiAqIFBlci1lbnRpdHkgZXhlbXB0aW9ucyBmcm9tIHNwZWNpZmljIGNvbXBsaWFuY2UgcnVsZXMuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2VfZXhlbXB0aW9uc1xuICovXG5leHBvcnQgY29uc3QgY29tcGxpYW5jZUV4ZW1wdGlvbiA9IHBnVGFibGUoJ2NvbXBsaWFuY2VfZXhlbXB0aW9ucycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBydWxlSWQ6IHV1aWQoJ3J1bGVfaWQnKS5ub3ROdWxsKCkucmVmZXJlbmNlcygoKSA9PiBjb21wbGlhbmNlUnVsZS5pZCwgeyBvbkRlbGV0ZTogJ2Nhc2NhZGUnIH0pLFxuICBlbnRpdHlUeXBlOiB2YXJjaGFyKCdlbnRpdHlfdHlwZScsIHsgbGVuZ3RoOiAyMCB9KS4kdHlwZTxSdWxlVGFyZ2V0PigpLm5vdE51bGwoKSxcbiAgZW50aXR5SWQ6IHV1aWQoJ2VudGl0eV9pZCcpLm5vdE51bGwoKSxcbiAgZW50aXR5TmFtZTogdmFyY2hhcignZW50aXR5X25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLFxuICByZWFzb246IHRleHQoJ3JlYXNvbicpLm5vdE51bGwoKSxcbiAgYXBwcm92ZWRCeTogdGV4dCgnYXBwcm92ZWRfYnknKSxcbiAgcmVqZWN0aW9uUmVhc29uOiB0ZXh0KCdyZWplY3Rpb25fcmVhc29uJyksXG4gIHN0YXR1czogdmFyY2hhcignc3RhdHVzJywgeyBsZW5ndGg6IDIwIH0pLmRlZmF1bHQoJ3BlbmRpbmcnKS5ub3ROdWxsKCksIC8vIHBlbmRpbmcgfCBhcHByb3ZlZCB8IHJlamVjdGVkIHwgZXhwaXJlZFxuICBleHBpcmVzQXQ6IHRpbWVzdGFtcCgnZXhwaXJlc19hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBjcmVhdGVkQnk6IHRleHQoJ2NyZWF0ZWRfYnknKS5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEJ5OiB0ZXh0KCd1cGRhdGVkX2J5Jykubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIG9yZ1J1bGVFbnRpdHlVbmlxdWU6IHVuaXF1ZUluZGV4KCdjb21wbGlhbmNlX2V4ZW1wdGlvbl9vcmdfcnVsZV9lbnRpdHlfdW5pcXVlJylcbiAgICAub24odGFibGUub3JnSWQsIHRhYmxlLnJ1bGVJZCwgdGFibGUuZW50aXR5SWQpLFxuICBvcmdTdGF0dXNJZHg6IGluZGV4KCdjb21wbGlhbmNlX2V4ZW1wdGlvbl9vcmdfc3RhdHVzX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5zdGF0dXMpLFxuICBleHBpcmVzQXRJZHg6IGluZGV4KCdjb21wbGlhbmNlX2V4ZW1wdGlvbl9leHBpcmVzX2F0X2lkeCcpLm9uKHRhYmxlLmV4cGlyZXNBdCksXG4gIGVudGl0eUlkSWR4OiBpbmRleCgnY29tcGxpYW5jZV9leGVtcHRpb25fZW50aXR5X2lkX2lkeCcpLm9uKHRhYmxlLmVudGl0eUlkKSxcbn0pKTtcblxuLyoqXG4gKiBUcmFja3Mgd2hpY2ggb3JncyBoYXZlIG9wdGVkIGludG8gc3lzdGVtLW9yZyBwdWJsaXNoZWQgY29tcGxpYW5jZSBydWxlcy5cbiAqXG4gKiBAdGFibGUgY29tcGxpYW5jZV9ydWxlX3N1YnNjcmlwdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uID0gcGdUYWJsZSgnY29tcGxpYW5jZV9ydWxlX3N1YnNjcmlwdGlvbnMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgcnVsZUlkOiB1dWlkKCdydWxlX2lkJykubm90TnVsbCgpLnJlZmVyZW5jZXMoKCkgPT4gY29tcGxpYW5jZVJ1bGUuaWQsIHsgb25EZWxldGU6ICdjYXNjYWRlJyB9KSxcbiAgc3Vic2NyaWJlZEJ5OiB0ZXh0KCdzdWJzY3JpYmVkX2J5Jykubm90TnVsbCgpLFxuICBzdWJzY3JpYmVkQXQ6IHRpbWVzdGFtcCgnc3Vic2NyaWJlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIGlzQWN0aXZlOiBib29sZWFuKCdpc19hY3RpdmUnKS5kZWZhdWx0KHRydWUpLm5vdE51bGwoKSxcbiAgcGlubmVkVmVyc2lvbjoganNvbmIoJ3Bpbm5lZF92ZXJzaW9uJykuJHR5cGU8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCksXG4gIHVuc3Vic2NyaWJlZEF0OiB0aW1lc3RhbXAoJ3Vuc3Vic2NyaWJlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICB1bnN1YnNjcmliZWRCeTogdGV4dCgndW5zdWJzY3JpYmVkX2J5JyksXG59LCAodGFibGUpID0+ICh7XG4gIG9yZ1J1bGVVbmlxdWU6IHVuaXF1ZUluZGV4KCdjb21wbGlhbmNlX3J1bGVfc3ViX29yZ19ydWxlX3VuaXF1ZScpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5ydWxlSWQpLFxuICBvcmdBY3RpdmVJZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfc3ViX29yZ19hY3RpdmVfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmlzQWN0aXZlKSxcbiAgcnVsZUlkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcnVsZV9zdWJfcnVsZV9pZHgnKS5vbih0YWJsZS5ydWxlSWQpLFxufSkpO1xuXG4vKipcbiAqIEJ1bGsgY29tcGxpYW5jZSBzY2FucyAgdHJhY2tzIHNjaGVkdWxlZCBhbmQgb24tZGVtYW5kIHNjYW5zLlxuICpcbiAqIEB0YWJsZSBjb21wbGlhbmNlX3NjYW5zXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlU2NhbiA9IHBnVGFibGUoJ2NvbXBsaWFuY2Vfc2NhbnMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgdGFyZ2V0OiB2YXJjaGFyKCd0YXJnZXQnLCB7IGxlbmd0aDogMjAgfSkubm90TnVsbCgpLCAvLyBwbHVnaW4gfCBwaXBlbGluZSB8IGFsbFxuICBmaWx0ZXI6IGpzb25iKCdmaWx0ZXInKSwgLy8gb3B0aW9uYWwgZW50aXR5IGZpbHRlciBmb3IgcGFydGlhbCBzY2Fuc1xuICBzdGF0dXM6IHZhcmNoYXIoJ3N0YXR1cycsIHsgbGVuZ3RoOiAyMCB9KS5kZWZhdWx0KCdwZW5kaW5nJykubm90TnVsbCgpLCAvLyBwZW5kaW5nIHwgcnVubmluZyB8IGNvbXBsZXRlZCB8IGZhaWxlZCB8IGNhbmNlbGxlZFxuICB0cmlnZ2VyZWRCeTogdmFyY2hhcigndHJpZ2dlcmVkX2J5JywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSwgLy8gbWFudWFsIHwgc2NoZWR1bGVkIHwgcnVsZS1jaGFuZ2UgfCBydWxlLWRyeS1ydW5cbiAgdXNlcklkOiB0ZXh0KCd1c2VyX2lkJykubm90TnVsbCgpLFxuICB0b3RhbEVudGl0aWVzOiBpbnRlZ2VyKCd0b3RhbF9lbnRpdGllcycpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICBwcm9jZXNzZWRFbnRpdGllczogaW50ZWdlcigncHJvY2Vzc2VkX2VudGl0aWVzJykuZGVmYXVsdCgwKS5ub3ROdWxsKCksXG4gIHBhc3NDb3VudDogaW50ZWdlcigncGFzc19jb3VudCcpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICB3YXJuQ291bnQ6IGludGVnZXIoJ3dhcm5fY291bnQnKS5kZWZhdWx0KDApLm5vdE51bGwoKSxcbiAgYmxvY2tDb3VudDogaW50ZWdlcignYmxvY2tfY291bnQnKS5kZWZhdWx0KDApLm5vdE51bGwoKSxcbiAgLy8gVHJ1ZSB3aGVuIHRoZSBzY2FuIHN0b3BwZWQgZWFybHkgYXQgYSBjb25maWd1cmVkIHBlci1zY2FuIGNhcCAoc28gdGhlXG4gIC8vIGNvdW50cyBhYm92ZSByZXByZXNlbnQgYSBzdWJzZXQsIG5vdCB0aGUgZnVsbCBlbnRpdHkgdW5pdmVyc2UpLiBTdXJmYWNlZFxuICAvLyBpbiB0aGUgc2Nhbi1zdGF0dXMgVUkgc28gdXNlcnMga25vdyB3aGV0aGVyIHRvIHdpZGVuIHRoZSBmaWx0ZXIuXG4gIC8vIE1JR1JBVElPTiBSRVFVSVJFRDogcnVuIGBwbnBtIGRyaXp6bGUta2l0IGdlbmVyYXRlYCBhZnRlciBwdWxsaW5nLlxuICB0cnVuY2F0ZWQ6IGJvb2xlYW4oJ3RydW5jYXRlZCcpLmRlZmF1bHQoZmFsc2UpLm5vdE51bGwoKSxcbiAgc3RhcnRlZEF0OiB0aW1lc3RhbXAoJ3N0YXJ0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgY29tcGxldGVkQXQ6IHRpbWVzdGFtcCgnY29tcGxldGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGNhbmNlbGxlZEF0OiB0aW1lc3RhbXAoJ2NhbmNlbGxlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBjYW5jZWxsZWRCeTogdGV4dCgnY2FuY2VsbGVkX2J5JyksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgb3JnQ3JlYXRlZEF0SWR4OiBpbmRleCgnY29tcGxpYW5jZV9zY2FuX29yZ19jcmVhdGVkX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5jcmVhdGVkQXQpLFxuICBvcmdTdGF0dXNJZHg6IGluZGV4KCdjb21wbGlhbmNlX3NjYW5fb3JnX3N0YXR1c19pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuc3RhdHVzKSxcbn0pKTtcblxuLyoqXG4gKiBDcm9uLWJhc2VkIHJlY3VycmluZyBzY2FuIHNjaGVkdWxlcy5cbiAqXG4gKiBAdGFibGUgY29tcGxpYW5jZV9zY2FuX3NjaGVkdWxlc1xuICovXG5leHBvcnQgY29uc3QgY29tcGxpYW5jZVNjYW5TY2hlZHVsZSA9IHBnVGFibGUoJ2NvbXBsaWFuY2Vfc2Nhbl9zY2hlZHVsZXMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgdGFyZ2V0OiB2YXJjaGFyKCd0YXJnZXQnLCB7IGxlbmd0aDogMjAgfSkubm90TnVsbCgpLCAvLyBwbHVnaW4gfCBwaXBlbGluZSB8IGFsbFxuICBjcm9uRXhwcmVzc2lvbjogdmFyY2hhcignY3Jvbl9leHByZXNzaW9uJywgeyBsZW5ndGg6IDEwMCB9KS5ub3ROdWxsKCksXG4gIGlzQWN0aXZlOiBib29sZWFuKCdpc19hY3RpdmUnKS5kZWZhdWx0KHRydWUpLm5vdE51bGwoKSxcbiAgbGFzdFJ1bkF0OiB0aW1lc3RhbXAoJ2xhc3RfcnVuX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIG5leHRSdW5BdDogdGltZXN0YW1wKCduZXh0X3J1bl9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBjcmVhdGVkQnk6IHRleHQoJ2NyZWF0ZWRfYnknKS5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEJ5OiB0ZXh0KCd1cGRhdGVkX2J5Jykubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIGFjdGl2ZU5leHRSdW5JZHg6IGluZGV4KCdjb21wbGlhbmNlX3NjYW5fc2NoZWR1bGVfYWN0aXZlX25leHRfaWR4JylcbiAgICAub24odGFibGUuaXNBY3RpdmUsIHRhYmxlLm5leHRSdW5BdCksXG4gIG9yZ0lkeDogaW5kZXgoJ2NvbXBsaWFuY2Vfc2Nhbl9zY2hlZHVsZV9vcmdfaWR4Jykub24odGFibGUub3JnSWQpLFxufSkpO1xuXG4vKipcbiAqIFBlci1vcmcgbm90aWZpY2F0aW9uIHNldHRpbmdzIGZvciBjb21wbGlhbmNlIGV2ZW50cy5cbiAqXG4gKiBAdGFibGUgY29tcGxpYW5jZV9ub3RpZmljYXRpb25fcHJlZmVyZW5jZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBsaWFuY2VOb3RpZmljYXRpb25QcmVmZXJlbmNlID0gcGdUYWJsZSgnY29tcGxpYW5jZV9ub3RpZmljYXRpb25fcHJlZmVyZW5jZXMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKS51bmlxdWUoKSxcbiAgbm90aWZ5T25CbG9jazogYm9vbGVhbignbm90aWZ5X29uX2Jsb2NrJykuZGVmYXVsdCh0cnVlKS5ub3ROdWxsKCksXG4gIG5vdGlmeU9uV2FybmluZzogYm9vbGVhbignbm90aWZ5X29uX3dhcm5pbmcnKS5kZWZhdWx0KGZhbHNlKS5ub3ROdWxsKCksXG4gIC8vIE9wdC1pbiBlbWFpbCBkZWxpdmVyeSAodG8gYHRhcmdldFVzZXJzYCwgb3IgYWxsIG9yZyBhZG1pbnMgd2hlbiBudWxsKS5cbiAgZW1haWxFbmFibGVkOiBib29sZWFuKCdlbWFpbF9lbmFibGVkJykuZGVmYXVsdChmYWxzZSkubm90TnVsbCgpLFxuICBkaWdlc3RNb2RlOiB2YXJjaGFyKCdkaWdlc3RfbW9kZScsIHsgbGVuZ3RoOiAyMCB9KS5kZWZhdWx0KCdpbW1lZGlhdGUnKS5ub3ROdWxsKCksIC8vIGltbWVkaWF0ZSB8IGRhaWx5IHwgd2Vla2x5XG4gIGRpZ2VzdFNjaGVkdWxlOiB2YXJjaGFyKCdkaWdlc3Rfc2NoZWR1bGUnLCB7IGxlbmd0aDogMTAwIH0pLFxuICBsYXN0RGlnZXN0QXQ6IHRpbWVzdGFtcCgnbGFzdF9kaWdlc3RfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgdGFyZ2V0VXNlcnM6IGpzb25iKCd0YXJnZXRfdXNlcnMnKS4kdHlwZTxzdHJpbmdbXT4oKSwgLy8gbnVsbCA9IGFsbCBvcmcgYWRtaW5zXG4gIHdlYmhvb2tVcmw6IHZhcmNoYXIoJ3dlYmhvb2tfdXJsJywgeyBsZW5ndGg6IDUwMCB9KSxcbiAgd2ViaG9va1NlY3JldDogdmFyY2hhcignd2ViaG9va19zZWNyZXQnLCB7IGxlbmd0aDogMjU1IH0pLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0pO1xuXG4vKipcbiAqIExvZyBvZiBhbGwgY29tcGxpYW5jZSBub3RpZmljYXRpb25zIHNlbnQuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2Vfbm90aWZpY2F0aW9uX2xvZ1xuICovXG5leHBvcnQgY29uc3QgY29tcGxpYW5jZU5vdGlmaWNhdGlvbkxvZyA9IHBnVGFibGUoJ2NvbXBsaWFuY2Vfbm90aWZpY2F0aW9uX2xvZycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBjaGFubmVsOiB2YXJjaGFyKCdjaGFubmVsJywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSwgLy8gaW4tYXBwIHwgd2ViaG9vayB8IGRpZ2VzdFxuICBzdGF0dXM6IHZhcmNoYXIoJ3N0YXR1cycsIHsgbGVuZ3RoOiAyMCB9KS5ub3ROdWxsKCksIC8vIHNlbnQgfCBmYWlsZWQgfCBwZW5kaW5nXG4gIHBheWxvYWQ6IGpzb25iKCdwYXlsb2FkJykuJHR5cGU8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCkubm90TnVsbCgpLFxuICB3ZWJob29rUmVzcG9uc2VDb2RlOiBpbnRlZ2VyKCd3ZWJob29rX3Jlc3BvbnNlX2NvZGUnKSxcbiAgd2ViaG9va0Vycm9yOiB0ZXh0KCd3ZWJob29rX2Vycm9yJyksXG4gIHJldHJ5Q291bnQ6IGludGVnZXIoJ3JldHJ5X2NvdW50JykuZGVmYXVsdCgwKS5ub3ROdWxsKCksXG4gIG5leHRSZXRyeUF0OiB0aW1lc3RhbXAoJ25leHRfcmV0cnlfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgcmVsYXRlZEF1ZGl0SWQ6IHV1aWQoJ3JlbGF0ZWRfYXVkaXRfaWQnKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBvcmdDcmVhdGVkQXRJZHg6IGluZGV4KCdjb21wbGlhbmNlX25vdGlmaWNhdGlvbl9vcmdfY3JlYXRlZF9pZHgnKVxuICAgIC5vbih0YWJsZS5vcmdJZCwgdGFibGUuY3JlYXRlZEF0KSxcbiAgc3RhdHVzUmV0cnlJZHg6IGluZGV4KCdjb21wbGlhbmNlX25vdGlmaWNhdGlvbl9zdGF0dXNfcmV0cnlfaWR4JylcbiAgICAub24odGFibGUuc3RhdHVzLCB0YWJsZS5uZXh0UmV0cnlBdCksXG4gIHJlbGF0ZWRBdWRpdElkeDogaW5kZXgoJ2NvbXBsaWFuY2Vfbm90aWZpY2F0aW9uX3JlbGF0ZWRfYXVkaXRfaWR4JylcbiAgICAub24odGFibGUucmVsYXRlZEF1ZGl0SWQpLFxufSkpO1xuXG4vKipcbiAqIENvbXBsaWFuY2Utc3BlY2lmaWMgUkJBQyByb2xlcy5cbiAqXG4gKiBAdGFibGUgY29tcGxpYW5jZV9yb2xlc1xuICovXG5leHBvcnQgdHlwZSBDb21wbGlhbmNlUm9sZVR5cGUgPSAnY29tcGxpYW5jZS12aWV3ZXInIHwgJ2NvbXBsaWFuY2UtZWRpdG9yJyB8ICdjb21wbGlhbmNlLWFkbWluJztcblxuZXhwb3J0IGNvbnN0IGNvbXBsaWFuY2VSb2xlID0gcGdUYWJsZSgnY29tcGxpYW5jZV9yb2xlcycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICB1c2VySWQ6IHRleHQoJ3VzZXJfaWQnKS5ub3ROdWxsKCksXG4gIHJvbGU6IHZhcmNoYXIoJ3JvbGUnLCB7IGxlbmd0aDogMzAgfSkuJHR5cGU8Q29tcGxpYW5jZVJvbGVUeXBlPigpLm5vdE51bGwoKSxcbiAgZ3JhbnRlZEJ5OiB0ZXh0KCdncmFudGVkX2J5Jykubm90TnVsbCgpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgb3JnVXNlclVuaXF1ZTogdW5pcXVlSW5kZXgoJ2NvbXBsaWFuY2Vfcm9sZV9vcmdfdXNlcl91bmlxdWUnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUudXNlcklkKSxcbiAgb3JnUm9sZUlkeDogaW5kZXgoJ2NvbXBsaWFuY2Vfcm9sZV9vcmdfcm9sZV9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUucm9sZSksXG59KSk7XG5cbi8qKlxuICogR2VuZXJhdGVkIGNvbXBsaWFuY2UgcmVwb3J0cy5cbiAqXG4gKiBAdGFibGUgY29tcGxpYW5jZV9yZXBvcnRzXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlUmVwb3J0ID0gcGdUYWJsZSgnY29tcGxpYW5jZV9yZXBvcnRzJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHJlcG9ydFR5cGU6IHZhcmNoYXIoJ3JlcG9ydF90eXBlJywgeyBsZW5ndGg6IDMwIH0pLm5vdE51bGwoKSwgLy8gc3VtbWFyeSB8IGRldGFpbGVkIHwgYXVkaXQtdHJhaWwgfCBjb21wYXJpc29uXG4gIHRhcmdldDogdmFyY2hhcigndGFyZ2V0JywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSwgLy8gcGx1Z2luIHwgcGlwZWxpbmUgfCBhbGxcbiAgZGF0ZUZyb206IHRpbWVzdGFtcCgnZGF0ZV9mcm9tJywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGRhdGVUbzogdGltZXN0YW1wKCdkYXRlX3RvJywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGNvbXBhcmVGcm9tOiB0aW1lc3RhbXAoJ2NvbXBhcmVfZnJvbScsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBjb21wYXJlVG86IHRpbWVzdGFtcCgnY29tcGFyZV90bycsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBkYXRhOiBqc29uYignZGF0YScpLiR0eXBlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpLm5vdE51bGwoKSxcbiAgZm9ybWF0OiB2YXJjaGFyKCdmb3JtYXQnLCB7IGxlbmd0aDogMTAgfSkuZGVmYXVsdCgnanNvbicpLm5vdE51bGwoKSwgLy8ganNvbiB8IGNzdlxuICBnZW5lcmF0ZWRCeTogdGV4dCgnZ2VuZXJhdGVkX2J5Jykubm90TnVsbCgpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIG9yZ0NyZWF0ZWRBdElkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcmVwb3J0X29yZ19jcmVhdGVkX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5jcmVhdGVkQXQpLFxufSkpO1xuXG4vKipcbiAqIENyb24tYmFzZWQgcmVjdXJyaW5nIHJlcG9ydCBnZW5lcmF0aW9uIHNjaGVkdWxlcy5cbiAqXG4gKiBAdGFibGUgY29tcGxpYW5jZV9yZXBvcnRfc2NoZWR1bGVzXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlUmVwb3J0U2NoZWR1bGUgPSBwZ1RhYmxlKCdjb21wbGlhbmNlX3JlcG9ydF9zY2hlZHVsZXMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgcmVwb3J0VHlwZTogdmFyY2hhcigncmVwb3J0X3R5cGUnLCB7IGxlbmd0aDogMzAgfSkubm90TnVsbCgpLCAvLyBzdW1tYXJ5IHwgZGV0YWlsZWRcbiAgdGFyZ2V0OiB2YXJjaGFyKCd0YXJnZXQnLCB7IGxlbmd0aDogMjAgfSkubm90TnVsbCgpLCAvLyBwbHVnaW4gfCBwaXBlbGluZSB8IGFsbFxuICBmb3JtYXQ6IHZhcmNoYXIoJ2Zvcm1hdCcsIHsgbGVuZ3RoOiAxMCB9KS5kZWZhdWx0KCdqc29uJykubm90TnVsbCgpLFxuICBjcm9uRXhwcmVzc2lvbjogdmFyY2hhcignY3Jvbl9leHByZXNzaW9uJywgeyBsZW5ndGg6IDEwMCB9KS5ub3ROdWxsKCksXG4gIGlzQWN0aXZlOiBib29sZWFuKCdpc19hY3RpdmUnKS5kZWZhdWx0KHRydWUpLm5vdE51bGwoKSxcbiAgbGFzdFJ1bkF0OiB0aW1lc3RhbXAoJ2xhc3RfcnVuX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIG5leHRSdW5BdDogdGltZXN0YW1wKCduZXh0X3J1bl9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBkZWxpdmVyVG86IGpzb25iKCdkZWxpdmVyX3RvJykuJHR5cGU8c3RyaW5nW10+KCkuZGVmYXVsdChbXSkubm90TnVsbCgpLCAvLyB1c2VySWRzIHRvIG5vdGlmeVxuICBjcmVhdGVkQnk6IHRleHQoJ2NyZWF0ZWRfYnknKS5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEJ5OiB0ZXh0KCd1cGRhdGVkX2J5Jykubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIGFjdGl2ZU5leHRSdW5JZHg6IGluZGV4KCdjb21wbGlhbmNlX3JlcG9ydF9zY2hlZHVsZV9hY3RpdmVfbmV4dF9pZHgnKVxuICAgIC5vbih0YWJsZS5pc0FjdGl2ZSwgdGFibGUubmV4dFJ1bkF0KSxcbiAgb3JnSWR4OiBpbmRleCgnY29tcGxpYW5jZV9yZXBvcnRfc2NoZWR1bGVfb3JnX2lkeCcpLm9uKHRhYmxlLm9yZ0lkKSxcbn0pKTtcblxuLy8gQ29tcGxpYW5jZSB0eXBlc1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVBvbGljeSA9IHR5cGVvZiBjb21wbGlhbmNlUG9saWN5LiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VQb2xpY3lJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZVBvbGljeS4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VSdWxlID0gdHlwZW9mIGNvbXBsaWFuY2VSdWxlLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VSdWxlSW5zZXJ0ID0gdHlwZW9mIGNvbXBsaWFuY2VSdWxlLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJ1bGVIaXN0b3J5ID0gdHlwZW9mIGNvbXBsaWFuY2VSdWxlSGlzdG9yeS4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBDb21wbGlhbmNlUnVsZUhpc3RvcnlJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZVJ1bGVIaXN0b3J5LiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZUF1ZGl0TG9nID0gdHlwZW9mIGNvbXBsaWFuY2VBdWRpdExvZy4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBDb21wbGlhbmNlQXVkaXRMb2dJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZUF1ZGl0TG9nLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZUV4ZW1wdGlvbiA9IHR5cGVvZiBjb21wbGlhbmNlRXhlbXB0aW9uLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VFeGVtcHRpb25JbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZUV4ZW1wdGlvbi4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uID0gdHlwZW9mIGNvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uSW5zZXJ0ID0gdHlwZW9mIGNvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVNjYW4gPSB0eXBlb2YgY29tcGxpYW5jZVNjYW4uJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVNjYW5JbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZVNjYW4uJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBDb21wbGlhbmNlU2NhblNjaGVkdWxlID0gdHlwZW9mIGNvbXBsaWFuY2VTY2FuU2NoZWR1bGUuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVNjYW5TY2hlZHVsZUluc2VydCA9IHR5cGVvZiBjb21wbGlhbmNlU2NhblNjaGVkdWxlLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZU5vdGlmaWNhdGlvblByZWZlcmVuY2UgPSB0eXBlb2YgY29tcGxpYW5jZU5vdGlmaWNhdGlvblByZWZlcmVuY2UuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZU5vdGlmaWNhdGlvblByZWZlcmVuY2VJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZU5vdGlmaWNhdGlvblByZWZlcmVuY2UuJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBDb21wbGlhbmNlTm90aWZpY2F0aW9uTG9nID0gdHlwZW9mIGNvbXBsaWFuY2VOb3RpZmljYXRpb25Mb2cuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZU5vdGlmaWNhdGlvbkxvZ0luc2VydCA9IHR5cGVvZiBjb21wbGlhbmNlTm90aWZpY2F0aW9uTG9nLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJvbGUgPSB0eXBlb2YgY29tcGxpYW5jZVJvbGUuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJvbGVJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZVJvbGUuJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBDb21wbGlhbmNlUmVwb3J0ID0gdHlwZW9mIGNvbXBsaWFuY2VSZXBvcnQuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJlcG9ydEluc2VydCA9IHR5cGVvZiBjb21wbGlhbmNlUmVwb3J0LiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJlcG9ydFNjaGVkdWxlID0gdHlwZW9mIGNvbXBsaWFuY2VSZXBvcnRTY2hlZHVsZS4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBDb21wbGlhbmNlUmVwb3J0U2NoZWR1bGVJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZVJlcG9ydFNjaGVkdWxlLiRpbmZlckluc2VydDtcbiJdfQ==