@pipeline-builder/pipeline-data 3.4.85 → 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.
@@ -0,0 +1,379 @@
1
+ import { AccessModifier } from '@pipeline-builder/api-core';
2
+ /**
3
+ * Message type identifiers
4
+ */
5
+ export type MessageType = 'announcement' | 'conversation';
6
+ /**
7
+ * Message priority levels
8
+ */
9
+ export type MessagePriority = 'normal' | 'high' | 'urgent';
10
+ /**
11
+ * Table for storing internal messages between organizations and the system org.
12
+ *
13
+ * Features * - Announcements: System org broadcasts to all orgs (recipientOrgId = '*')
14
+ * - Conversations: Two-way threaded messaging between an org and system org
15
+ * - Thread support via threadId (null for root messages, references root for replies)
16
+ * - Read tracking per message
17
+ * - Priority levels (normal, high, urgent)
18
+ * - Soft delete support
19
+ *
20
+ * @table messages
21
+ */
22
+ export declare const message: import("drizzle-orm/pg-core").PgTableWithColumns<{
23
+ name: "messages";
24
+ schema: undefined;
25
+ columns: {
26
+ id: import("drizzle-orm/pg-core").PgColumn<{
27
+ name: "id";
28
+ tableName: "messages";
29
+ dataType: "string";
30
+ columnType: "PgUUID";
31
+ data: string;
32
+ driverParam: string;
33
+ notNull: true;
34
+ hasDefault: true;
35
+ isPrimaryKey: true;
36
+ isAutoincrement: false;
37
+ hasRuntimeDefault: false;
38
+ enumValues: undefined;
39
+ baseColumn: never;
40
+ identity: undefined;
41
+ generated: undefined;
42
+ }, {}, {}>;
43
+ orgId: import("drizzle-orm/pg-core").PgColumn<{
44
+ name: "org_id";
45
+ tableName: "messages";
46
+ dataType: "string";
47
+ columnType: "PgVarchar";
48
+ data: string;
49
+ driverParam: string;
50
+ notNull: true;
51
+ hasDefault: true;
52
+ isPrimaryKey: false;
53
+ isAutoincrement: false;
54
+ hasRuntimeDefault: false;
55
+ enumValues: [string, ...string[]];
56
+ baseColumn: never;
57
+ identity: undefined;
58
+ generated: undefined;
59
+ }, {}, {
60
+ length: 255;
61
+ }>;
62
+ createdBy: import("drizzle-orm/pg-core").PgColumn<{
63
+ name: "created_by";
64
+ tableName: "messages";
65
+ dataType: "string";
66
+ columnType: "PgText";
67
+ data: string;
68
+ driverParam: string;
69
+ notNull: true;
70
+ hasDefault: true;
71
+ isPrimaryKey: false;
72
+ isAutoincrement: false;
73
+ hasRuntimeDefault: false;
74
+ enumValues: [string, ...string[]];
75
+ baseColumn: never;
76
+ identity: undefined;
77
+ generated: undefined;
78
+ }, {}, {}>;
79
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
80
+ name: "created_at";
81
+ tableName: "messages";
82
+ dataType: "date";
83
+ columnType: "PgTimestamp";
84
+ data: Date;
85
+ driverParam: string;
86
+ notNull: true;
87
+ hasDefault: true;
88
+ isPrimaryKey: false;
89
+ isAutoincrement: false;
90
+ hasRuntimeDefault: false;
91
+ enumValues: undefined;
92
+ baseColumn: never;
93
+ identity: undefined;
94
+ generated: undefined;
95
+ }, {}, {}>;
96
+ updatedBy: import("drizzle-orm/pg-core").PgColumn<{
97
+ name: "updated_by";
98
+ tableName: "messages";
99
+ dataType: "string";
100
+ columnType: "PgText";
101
+ data: string;
102
+ driverParam: string;
103
+ notNull: true;
104
+ hasDefault: true;
105
+ isPrimaryKey: false;
106
+ isAutoincrement: false;
107
+ hasRuntimeDefault: false;
108
+ enumValues: [string, ...string[]];
109
+ baseColumn: never;
110
+ identity: undefined;
111
+ generated: undefined;
112
+ }, {}, {}>;
113
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
114
+ name: "updated_at";
115
+ tableName: "messages";
116
+ dataType: "date";
117
+ columnType: "PgTimestamp";
118
+ data: Date;
119
+ driverParam: string;
120
+ notNull: true;
121
+ hasDefault: true;
122
+ isPrimaryKey: false;
123
+ isAutoincrement: false;
124
+ hasRuntimeDefault: false;
125
+ enumValues: undefined;
126
+ baseColumn: never;
127
+ identity: undefined;
128
+ generated: undefined;
129
+ }, {}, {}>;
130
+ threadId: import("drizzle-orm/pg-core").PgColumn<{
131
+ name: "thread_id";
132
+ tableName: "messages";
133
+ dataType: "string";
134
+ columnType: "PgUUID";
135
+ data: string;
136
+ driverParam: string;
137
+ notNull: false;
138
+ hasDefault: false;
139
+ isPrimaryKey: false;
140
+ isAutoincrement: false;
141
+ hasRuntimeDefault: false;
142
+ enumValues: undefined;
143
+ baseColumn: never;
144
+ identity: undefined;
145
+ generated: undefined;
146
+ }, {}, {}>;
147
+ recipientOrgId: import("drizzle-orm/pg-core").PgColumn<{
148
+ name: "recipient_org_id";
149
+ tableName: "messages";
150
+ dataType: "string";
151
+ columnType: "PgVarchar";
152
+ data: string;
153
+ driverParam: string;
154
+ notNull: true;
155
+ hasDefault: false;
156
+ isPrimaryKey: false;
157
+ isAutoincrement: false;
158
+ hasRuntimeDefault: false;
159
+ enumValues: [string, ...string[]];
160
+ baseColumn: never;
161
+ identity: undefined;
162
+ generated: undefined;
163
+ }, {}, {
164
+ length: 255;
165
+ }>;
166
+ messageType: import("drizzle-orm/pg-core").PgColumn<{
167
+ name: "message_type";
168
+ tableName: "messages";
169
+ dataType: "string";
170
+ columnType: "PgVarchar";
171
+ data: MessageType;
172
+ driverParam: string;
173
+ notNull: true;
174
+ hasDefault: true;
175
+ isPrimaryKey: false;
176
+ isAutoincrement: false;
177
+ hasRuntimeDefault: false;
178
+ enumValues: [string, ...string[]];
179
+ baseColumn: never;
180
+ identity: undefined;
181
+ generated: undefined;
182
+ }, {}, {
183
+ length: 20;
184
+ $type: MessageType;
185
+ }>;
186
+ channel: import("drizzle-orm/pg-core").PgColumn<{
187
+ name: "channel";
188
+ tableName: "messages";
189
+ dataType: "string";
190
+ columnType: "PgVarchar";
191
+ data: string;
192
+ driverParam: string;
193
+ notNull: false;
194
+ hasDefault: false;
195
+ isPrimaryKey: false;
196
+ isAutoincrement: false;
197
+ hasRuntimeDefault: false;
198
+ enumValues: [string, ...string[]];
199
+ baseColumn: never;
200
+ identity: undefined;
201
+ generated: undefined;
202
+ }, {}, {
203
+ length: 50;
204
+ }>;
205
+ subject: import("drizzle-orm/pg-core").PgColumn<{
206
+ name: "subject";
207
+ tableName: "messages";
208
+ dataType: "string";
209
+ columnType: "PgVarchar";
210
+ data: string;
211
+ driverParam: string;
212
+ notNull: true;
213
+ hasDefault: false;
214
+ isPrimaryKey: false;
215
+ isAutoincrement: false;
216
+ hasRuntimeDefault: false;
217
+ enumValues: [string, ...string[]];
218
+ baseColumn: never;
219
+ identity: undefined;
220
+ generated: undefined;
221
+ }, {}, {
222
+ length: 500;
223
+ }>;
224
+ content: import("drizzle-orm/pg-core").PgColumn<{
225
+ name: "content";
226
+ tableName: "messages";
227
+ dataType: "string";
228
+ columnType: "PgText";
229
+ data: string;
230
+ driverParam: string;
231
+ notNull: true;
232
+ hasDefault: false;
233
+ isPrimaryKey: false;
234
+ isAutoincrement: false;
235
+ hasRuntimeDefault: false;
236
+ enumValues: [string, ...string[]];
237
+ baseColumn: never;
238
+ identity: undefined;
239
+ generated: undefined;
240
+ }, {}, {}>;
241
+ readBy: import("drizzle-orm/pg-core").PgColumn<{
242
+ name: "read_by";
243
+ tableName: "messages";
244
+ dataType: "json";
245
+ columnType: "PgJsonb";
246
+ data: Record<string, string>;
247
+ driverParam: unknown;
248
+ notNull: true;
249
+ hasDefault: true;
250
+ isPrimaryKey: false;
251
+ isAutoincrement: false;
252
+ hasRuntimeDefault: false;
253
+ enumValues: undefined;
254
+ baseColumn: never;
255
+ identity: undefined;
256
+ generated: undefined;
257
+ }, {}, {
258
+ $type: Record<string, string>;
259
+ }>;
260
+ priority: import("drizzle-orm/pg-core").PgColumn<{
261
+ name: "priority";
262
+ tableName: "messages";
263
+ dataType: "string";
264
+ columnType: "PgVarchar";
265
+ data: MessagePriority;
266
+ driverParam: string;
267
+ notNull: true;
268
+ hasDefault: true;
269
+ isPrimaryKey: false;
270
+ isAutoincrement: false;
271
+ hasRuntimeDefault: false;
272
+ enumValues: [string, ...string[]];
273
+ baseColumn: never;
274
+ identity: undefined;
275
+ generated: undefined;
276
+ }, {}, {
277
+ length: 20;
278
+ $type: MessagePriority;
279
+ }>;
280
+ accessModifier: import("drizzle-orm/pg-core").PgColumn<{
281
+ name: "access_modifier";
282
+ tableName: "messages";
283
+ dataType: "string";
284
+ columnType: "PgVarchar";
285
+ data: AccessModifier;
286
+ driverParam: string;
287
+ notNull: true;
288
+ hasDefault: true;
289
+ isPrimaryKey: false;
290
+ isAutoincrement: false;
291
+ hasRuntimeDefault: false;
292
+ enumValues: [string, ...string[]];
293
+ baseColumn: never;
294
+ identity: undefined;
295
+ generated: undefined;
296
+ }, {}, {
297
+ length: 10;
298
+ $type: AccessModifier;
299
+ }>;
300
+ isDefault: import("drizzle-orm/pg-core").PgColumn<{
301
+ name: "is_default";
302
+ tableName: "messages";
303
+ dataType: "boolean";
304
+ columnType: "PgBoolean";
305
+ data: boolean;
306
+ driverParam: boolean;
307
+ notNull: true;
308
+ hasDefault: true;
309
+ isPrimaryKey: false;
310
+ isAutoincrement: false;
311
+ hasRuntimeDefault: false;
312
+ enumValues: undefined;
313
+ baseColumn: never;
314
+ identity: undefined;
315
+ generated: undefined;
316
+ }, {}, {}>;
317
+ isActive: import("drizzle-orm/pg-core").PgColumn<{
318
+ name: "is_active";
319
+ tableName: "messages";
320
+ dataType: "boolean";
321
+ columnType: "PgBoolean";
322
+ data: boolean;
323
+ driverParam: boolean;
324
+ notNull: true;
325
+ hasDefault: true;
326
+ isPrimaryKey: false;
327
+ isAutoincrement: false;
328
+ hasRuntimeDefault: false;
329
+ enumValues: undefined;
330
+ baseColumn: never;
331
+ identity: undefined;
332
+ generated: undefined;
333
+ }, {}, {}>;
334
+ deletedAt: import("drizzle-orm/pg-core").PgColumn<{
335
+ name: "deleted_at";
336
+ tableName: "messages";
337
+ dataType: "date";
338
+ columnType: "PgTimestamp";
339
+ data: Date;
340
+ driverParam: string;
341
+ notNull: false;
342
+ hasDefault: false;
343
+ isPrimaryKey: false;
344
+ isAutoincrement: false;
345
+ hasRuntimeDefault: false;
346
+ enumValues: undefined;
347
+ baseColumn: never;
348
+ identity: undefined;
349
+ generated: undefined;
350
+ }, {}, {}>;
351
+ deletedBy: import("drizzle-orm/pg-core").PgColumn<{
352
+ name: "deleted_by";
353
+ tableName: "messages";
354
+ dataType: "string";
355
+ columnType: "PgText";
356
+ data: string;
357
+ driverParam: string;
358
+ notNull: false;
359
+ hasDefault: false;
360
+ isPrimaryKey: false;
361
+ isAutoincrement: false;
362
+ hasRuntimeDefault: false;
363
+ enumValues: [string, ...string[]];
364
+ baseColumn: never;
365
+ identity: undefined;
366
+ generated: undefined;
367
+ }, {}, {}>;
368
+ };
369
+ dialect: "pg";
370
+ }>;
371
+ /**
372
+ * TypeScript types representing database rows
373
+ */
374
+ export type Message = typeof message.$inferSelect;
375
+ export type MessageInsert = typeof message.$inferInsert;
376
+ /**
377
+ * Helper types for working with partial updates
378
+ */
379
+ export type MessageUpdate = Partial<Omit<MessageInsert, 'id' | 'createdAt' | 'createdBy'>>;
@@ -0,0 +1,95 @@
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 { boolean, varchar, pgTable, text, timestamp, uuid, jsonb, index } from 'drizzle-orm/pg-core';
5
+ /**
6
+ * Table for storing internal messages between organizations and the system org.
7
+ *
8
+ * Features * - Announcements: System org broadcasts to all orgs (recipientOrgId = '*')
9
+ * - Conversations: Two-way threaded messaging between an org and system org
10
+ * - Thread support via threadId (null for root messages, references root for replies)
11
+ * - Read tracking per message
12
+ * - Priority levels (normal, high, urgent)
13
+ * - Soft delete support
14
+ *
15
+ * @table messages
16
+ */
17
+ export const message = pgTable('messages', {
18
+ // Primary key
19
+ id: uuid('id').primaryKey().defaultRandom(),
20
+ // Organization and access control
21
+ orgId: varchar('org_id', { length: 255 })
22
+ .default(SYSTEM_ORG_ID)
23
+ .notNull(),
24
+ // Audit fields
25
+ createdBy: text('created_by')
26
+ .default(SYSTEM_ORG_ID)
27
+ .notNull(),
28
+ createdAt: timestamp('created_at', { withTimezone: true })
29
+ .defaultNow()
30
+ .notNull(),
31
+ updatedBy: text('updated_by')
32
+ .default(SYSTEM_ORG_ID)
33
+ .notNull(),
34
+ updatedAt: timestamp('updated_at', { withTimezone: true })
35
+ .defaultNow()
36
+ .notNull(),
37
+ // Threading
38
+ threadId: uuid('thread_id'),
39
+ // Message routing
40
+ recipientOrgId: varchar('recipient_org_id', { length: 255 })
41
+ .notNull(),
42
+ // Message content
43
+ messageType: varchar('message_type', { length: 20 })
44
+ .$type()
45
+ .default('conversation')
46
+ .notNull(),
47
+ // Logical channel/inbox bucket — 'support', 'help', etc. Nullable so
48
+ // org-to-org conversations (which aren't channel-scoped) can omit it.
49
+ channel: varchar('channel', { length: 50 }),
50
+ subject: varchar('subject', { length: 500 })
51
+ .notNull(),
52
+ content: text('content')
53
+ .notNull(),
54
+ // Status
55
+ // `readBy` is the per-participant read-receipt map: orgId → ISO timestamp.
56
+ // Recipient marking the thread does NOT flip sender's view. Empty `{}`
57
+ // means nobody has read it yet.
58
+ readBy: jsonb('read_by')
59
+ .$type()
60
+ .default({})
61
+ .notNull(),
62
+ priority: varchar('priority', { length: 20 })
63
+ .$type()
64
+ .default('normal')
65
+ .notNull(),
66
+ // Access and visibility
67
+ accessModifier: varchar('access_modifier', { length: 10 })
68
+ .$type()
69
+ .default('private')
70
+ .notNull(),
71
+ isDefault: boolean('is_default')
72
+ .default(false)
73
+ .notNull(),
74
+ isActive: boolean('is_active')
75
+ .default(true)
76
+ .notNull(),
77
+ // Deletion tracking (soft delete)
78
+ deletedAt: timestamp('deleted_at', { withTimezone: true }),
79
+ deletedBy: text('deleted_by'),
80
+ }, (table) => ({
81
+ // Indexes for common queries
82
+ orgIdIdx: index('message_org_id_idx').on(table.orgId),
83
+ recipientOrgIdIdx: index('message_recipient_org_id_idx').on(table.recipientOrgId),
84
+ threadIdIdx: index('message_thread_id_idx').on(table.threadId),
85
+ messageTypeIdx: index('message_message_type_idx').on(table.messageType),
86
+ channelIdx: index('message_channel_idx').on(table.channel),
87
+ createdAtIdx: index('message_created_at_idx').on(table.createdAt),
88
+ activeIdx: index('message_active_idx').on(table.isActive),
89
+ // Composite index for inbox queries (recipient + active + created)
90
+ recipientActiveCreatedIdx: index('message_recipient_active_created_idx')
91
+ .on(table.recipientOrgId, table.isActive, table.createdAt),
92
+ // Composite index for org inbox (orgId + active)
93
+ orgActiveIdx: index('message_org_active_idx').on(table.orgId, table.isActive),
94
+ }));
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhYmFzZS9zY2hlbWEvbWVzc2FnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQVlyRzs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFO0lBQ3pDLGNBQWM7SUFDZCxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLGFBQWEsRUFBRTtJQUUzQyxrQ0FBa0M7SUFDbEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7U0FDdEMsT0FBTyxDQUFDLGFBQWEsQ0FBQztTQUN0QixPQUFPLEVBQUU7SUFFWixlQUFlO0lBQ2YsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDMUIsT0FBTyxDQUFDLGFBQWEsQ0FBQztTQUN0QixPQUFPLEVBQUU7SUFDWixTQUFTLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztTQUN2RCxVQUFVLEVBQUU7U0FDWixPQUFPLEVBQUU7SUFDWixTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQztTQUMxQixPQUFPLENBQUMsYUFBYSxDQUFDO1NBQ3RCLE9BQU8sRUFBRTtJQUNaLFNBQVMsRUFBRSxTQUFTLENBQUMsWUFBWSxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO1NBQ3ZELFVBQVUsRUFBRTtTQUNaLE9BQU8sRUFBRTtJQUVaLFlBQVk7SUFDWixRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUUzQixrQkFBa0I7SUFDbEIsY0FBYyxFQUFFLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztTQUN6RCxPQUFPLEVBQUU7SUFFWixrQkFBa0I7SUFDbEIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7U0FDakQsS0FBSyxFQUFlO1NBQ3BCLE9BQU8sQ0FBQyxjQUE2QixDQUFDO1NBQ3RDLE9BQU8sRUFBRTtJQUNaLHFFQUFxRTtJQUNyRSxzRUFBc0U7SUFDdEUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDM0MsT0FBTyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7U0FDekMsT0FBTyxFQUFFO0lBQ1osT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7U0FDckIsT0FBTyxFQUFFO0lBRVosU0FBUztJQUNULDJFQUEyRTtJQUMzRSx1RUFBdUU7SUFDdkUsZ0NBQWdDO0lBQ2hDLE1BQU0sRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDO1NBQ3JCLEtBQUssRUFBMEI7U0FDL0IsT0FBTyxDQUFDLEVBQUUsQ0FBQztTQUNYLE9BQU8sRUFBRTtJQUNaLFFBQVEsRUFBRSxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDO1NBQzFDLEtBQUssRUFBbUI7U0FDeEIsT0FBTyxDQUFDLFFBQTJCLENBQUM7U0FDcEMsT0FBTyxFQUFFO0lBRVosd0JBQXdCO0lBQ3hCLGNBQWMsRUFBRSxPQUFPLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7U0FDdkQsS0FBSyxFQUFrQjtTQUN2QixPQUFPLENBQUMsU0FBMkIsQ0FBQztTQUNwQyxPQUFPLEVBQUU7SUFDWixTQUFTLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQztTQUM3QixPQUFPLENBQUMsS0FBSyxDQUFDO1NBQ2QsT0FBTyxFQUFFO0lBQ1osUUFBUSxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUM7U0FDM0IsT0FBTyxDQUFDLElBQUksQ0FBQztTQUNiLE9BQU8sRUFBRTtJQUVaLGtDQUFrQztJQUNsQyxTQUFTLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUMxRCxTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQztDQUM5QixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2IsNkJBQTZCO0lBQzdCLFFBQVEsRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUNyRCxpQkFBaUIsRUFBRSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztJQUNqRixXQUFXLEVBQUUsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7SUFDOUQsY0FBYyxFQUFFLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO0lBQ3ZFLFVBQVUsRUFBRSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztJQUMxRCxZQUFZLEVBQUUsS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7SUFDakUsU0FBUyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO0lBRXpELG1FQUFtRTtJQUNuRSx5QkFBeUIsRUFBRSxLQUFLLENBQUMsc0NBQXNDLENBQUM7U0FDckUsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDO0lBRTVELGlEQUFpRDtJQUNqRCxZQUFZLEVBQUUsS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQztDQUM5RSxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBBY2Nlc3NNb2RpZmllciwgU1lTVEVNX09SR19JRCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGJvb2xlYW4sIHZhcmNoYXIsIHBnVGFibGUsIHRleHQsIHRpbWVzdGFtcCwgdXVpZCwganNvbmIsIGluZGV4IH0gZnJvbSAnZHJpenpsZS1vcm0vcGctY29yZSc7XG5cbi8qKlxuICogTWVzc2FnZSB0eXBlIGlkZW50aWZpZXJzXG4gKi9cbmV4cG9ydCB0eXBlIE1lc3NhZ2VUeXBlID0gJ2Fubm91bmNlbWVudCcgfCAnY29udmVyc2F0aW9uJztcblxuLyoqXG4gKiBNZXNzYWdlIHByaW9yaXR5IGxldmVsc1xuICovXG5leHBvcnQgdHlwZSBNZXNzYWdlUHJpb3JpdHkgPSAnbm9ybWFsJyB8ICdoaWdoJyB8ICd1cmdlbnQnO1xuXG4vKipcbiAqIFRhYmxlIGZvciBzdG9yaW5nIGludGVybmFsIG1lc3NhZ2VzIGJldHdlZW4gb3JnYW5pemF0aW9ucyBhbmQgdGhlIHN5c3RlbSBvcmcuXG4gKlxuICogRmVhdHVyZXMgKiAtIEFubm91bmNlbWVudHM6IFN5c3RlbSBvcmcgYnJvYWRjYXN0cyB0byBhbGwgb3JncyAocmVjaXBpZW50T3JnSWQgPSAnKicpXG4gKiAtIENvbnZlcnNhdGlvbnM6IFR3by13YXkgdGhyZWFkZWQgbWVzc2FnaW5nIGJldHdlZW4gYW4gb3JnIGFuZCBzeXN0ZW0gb3JnXG4gKiAtIFRocmVhZCBzdXBwb3J0IHZpYSB0aHJlYWRJZCAobnVsbCBmb3Igcm9vdCBtZXNzYWdlcywgcmVmZXJlbmNlcyByb290IGZvciByZXBsaWVzKVxuICogLSBSZWFkIHRyYWNraW5nIHBlciBtZXNzYWdlXG4gKiAtIFByaW9yaXR5IGxldmVscyAobm9ybWFsLCBoaWdoLCB1cmdlbnQpXG4gKiAtIFNvZnQgZGVsZXRlIHN1cHBvcnRcbiAqXG4gKiBAdGFibGUgbWVzc2FnZXNcbiAqL1xuZXhwb3J0IGNvbnN0IG1lc3NhZ2UgPSBwZ1RhYmxlKCdtZXNzYWdlcycsIHtcbiAgLy8gUHJpbWFyeSBrZXlcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcblxuICAvLyBPcmdhbml6YXRpb24gYW5kIGFjY2VzcyBjb250cm9sXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pXG4gICAgLmRlZmF1bHQoU1lTVEVNX09SR19JRClcbiAgICAubm90TnVsbCgpLFxuXG4gIC8vIEF1ZGl0IGZpZWxkc1xuICBjcmVhdGVkQnk6IHRleHQoJ2NyZWF0ZWRfYnknKVxuICAgIC5kZWZhdWx0KFNZU1RFTV9PUkdfSUQpXG4gICAgLm5vdE51bGwoKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KVxuICAgIC5kZWZhdWx0Tm93KClcbiAgICAubm90TnVsbCgpLFxuICB1cGRhdGVkQnk6IHRleHQoJ3VwZGF0ZWRfYnknKVxuICAgIC5kZWZhdWx0KFNZU1RFTV9PUkdfSUQpXG4gICAgLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KVxuICAgIC5kZWZhdWx0Tm93KClcbiAgICAubm90TnVsbCgpLFxuXG4gIC8vIFRocmVhZGluZ1xuICB0aHJlYWRJZDogdXVpZCgndGhyZWFkX2lkJyksXG5cbiAgLy8gTWVzc2FnZSByb3V0aW5nXG4gIHJlY2lwaWVudE9yZ0lkOiB2YXJjaGFyKCdyZWNpcGllbnRfb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gTWVzc2FnZSBjb250ZW50XG4gIG1lc3NhZ2VUeXBlOiB2YXJjaGFyKCdtZXNzYWdlX3R5cGUnLCB7IGxlbmd0aDogMjAgfSlcbiAgICAuJHR5cGU8TWVzc2FnZVR5cGU+KClcbiAgICAuZGVmYXVsdCgnY29udmVyc2F0aW9uJyBhcyBNZXNzYWdlVHlwZSlcbiAgICAubm90TnVsbCgpLFxuICAvLyBMb2dpY2FsIGNoYW5uZWwvaW5ib3ggYnVja2V0IOKAlCAnc3VwcG9ydCcsICdoZWxwJywgZXRjLiBOdWxsYWJsZSBzb1xuICAvLyBvcmctdG8tb3JnIGNvbnZlcnNhdGlvbnMgKHdoaWNoIGFyZW4ndCBjaGFubmVsLXNjb3BlZCkgY2FuIG9taXQgaXQuXG4gIGNoYW5uZWw6IHZhcmNoYXIoJ2NoYW5uZWwnLCB7IGxlbmd0aDogNTAgfSksXG4gIHN1YmplY3Q6IHZhcmNoYXIoJ3N1YmplY3QnLCB7IGxlbmd0aDogNTAwIH0pXG4gICAgLm5vdE51bGwoKSxcbiAgY29udGVudDogdGV4dCgnY29udGVudCcpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBTdGF0dXNcbiAgLy8gYHJlYWRCeWAgaXMgdGhlIHBlci1wYXJ0aWNpcGFudCByZWFkLXJlY2VpcHQgbWFwOiBvcmdJZCDihpIgSVNPIHRpbWVzdGFtcC5cbiAgLy8gUmVjaXBpZW50IG1hcmtpbmcgdGhlIHRocmVhZCBkb2VzIE5PVCBmbGlwIHNlbmRlcidzIHZpZXcuIEVtcHR5IGB7fWBcbiAgLy8gbWVhbnMgbm9ib2R5IGhhcyByZWFkIGl0IHlldC5cbiAgcmVhZEJ5OiBqc29uYigncmVhZF9ieScpXG4gICAgLiR0eXBlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KClcbiAgICAuZGVmYXVsdCh7fSlcbiAgICAubm90TnVsbCgpLFxuICBwcmlvcml0eTogdmFyY2hhcigncHJpb3JpdHknLCB7IGxlbmd0aDogMjAgfSlcbiAgICAuJHR5cGU8TWVzc2FnZVByaW9yaXR5PigpXG4gICAgLmRlZmF1bHQoJ25vcm1hbCcgYXMgTWVzc2FnZVByaW9yaXR5KVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gQWNjZXNzIGFuZCB2aXNpYmlsaXR5XG4gIGFjY2Vzc01vZGlmaWVyOiB2YXJjaGFyKCdhY2Nlc3NfbW9kaWZpZXInLCB7IGxlbmd0aDogMTAgfSlcbiAgICAuJHR5cGU8QWNjZXNzTW9kaWZpZXI+KClcbiAgICAuZGVmYXVsdCgncHJpdmF0ZScgYXMgQWNjZXNzTW9kaWZpZXIpXG4gICAgLm5vdE51bGwoKSxcbiAgaXNEZWZhdWx0OiBib29sZWFuKCdpc19kZWZhdWx0JylcbiAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAubm90TnVsbCgpLFxuICBpc0FjdGl2ZTogYm9vbGVhbignaXNfYWN0aXZlJylcbiAgICAuZGVmYXVsdCh0cnVlKVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gRGVsZXRpb24gdHJhY2tpbmcgKHNvZnQgZGVsZXRlKVxuICBkZWxldGVkQXQ6IHRpbWVzdGFtcCgnZGVsZXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBkZWxldGVkQnk6IHRleHQoJ2RlbGV0ZWRfYnknKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgLy8gSW5kZXhlcyBmb3IgY29tbW9uIHF1ZXJpZXNcbiAgb3JnSWRJZHg6IGluZGV4KCdtZXNzYWdlX29yZ19pZF9pZHgnKS5vbih0YWJsZS5vcmdJZCksXG4gIHJlY2lwaWVudE9yZ0lkSWR4OiBpbmRleCgnbWVzc2FnZV9yZWNpcGllbnRfb3JnX2lkX2lkeCcpLm9uKHRhYmxlLnJlY2lwaWVudE9yZ0lkKSxcbiAgdGhyZWFkSWRJZHg6IGluZGV4KCdtZXNzYWdlX3RocmVhZF9pZF9pZHgnKS5vbih0YWJsZS50aHJlYWRJZCksXG4gIG1lc3NhZ2VUeXBlSWR4OiBpbmRleCgnbWVzc2FnZV9tZXNzYWdlX3R5cGVfaWR4Jykub24odGFibGUubWVzc2FnZVR5cGUpLFxuICBjaGFubmVsSWR4OiBpbmRleCgnbWVzc2FnZV9jaGFubmVsX2lkeCcpLm9uKHRhYmxlLmNoYW5uZWwpLFxuICBjcmVhdGVkQXRJZHg6IGluZGV4KCdtZXNzYWdlX2NyZWF0ZWRfYXRfaWR4Jykub24odGFibGUuY3JlYXRlZEF0KSxcbiAgYWN0aXZlSWR4OiBpbmRleCgnbWVzc2FnZV9hY3RpdmVfaWR4Jykub24odGFibGUuaXNBY3RpdmUpLFxuXG4gIC8vIENvbXBvc2l0ZSBpbmRleCBmb3IgaW5ib3ggcXVlcmllcyAocmVjaXBpZW50ICsgYWN0aXZlICsgY3JlYXRlZClcbiAgcmVjaXBpZW50QWN0aXZlQ3JlYXRlZElkeDogaW5kZXgoJ21lc3NhZ2VfcmVjaXBpZW50X2FjdGl2ZV9jcmVhdGVkX2lkeCcpXG4gICAgLm9uKHRhYmxlLnJlY2lwaWVudE9yZ0lkLCB0YWJsZS5pc0FjdGl2ZSwgdGFibGUuY3JlYXRlZEF0KSxcblxuICAvLyBDb21wb3NpdGUgaW5kZXggZm9yIG9yZyBpbmJveCAob3JnSWQgKyBhY3RpdmUpXG4gIG9yZ0FjdGl2ZUlkeDogaW5kZXgoJ21lc3NhZ2Vfb3JnX2FjdGl2ZV9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuaXNBY3RpdmUpLFxufSkpO1xuXG4vKipcbiAqIFR5cGVTY3JpcHQgdHlwZXMgcmVwcmVzZW50aW5nIGRhdGFiYXNlIHJvd3NcbiAqL1xuZXhwb3J0IHR5cGUgTWVzc2FnZSA9IHR5cGVvZiBtZXNzYWdlLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIE1lc3NhZ2VJbnNlcnQgPSB0eXBlb2YgbWVzc2FnZS4kaW5mZXJJbnNlcnQ7XG5cbi8qKlxuICogSGVscGVyIHR5cGVzIGZvciB3b3JraW5nIHdpdGggcGFydGlhbCB1cGRhdGVzXG4gKi9cbmV4cG9ydCB0eXBlIE1lc3NhZ2VVcGRhdGUgPSBQYXJ0aWFsPE9taXQ8TWVzc2FnZUluc2VydCwgJ2lkJyB8ICdjcmVhdGVkQXQnIHwgJ2NyZWF0ZWRCeSc+PjtcbiJdfQ==