@dbx-tools/shared-genie 0.3.44 → 0.4.0

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,445 @@
1
+ /**
2
+ * Wire-format zod schemas + types and high-level event vocabulary
3
+ * for the Genie chat driver.
4
+ *
5
+ * Two related layers live here:
6
+ *
7
+ * 1. Genie wire shapes derived from `@dbx-tools/shared-sdk-model`'s
8
+ * generated `dashboards` schemas (regenerated from the upstream
9
+ * `@databricks/sdk-experimental` `apis/dashboards/model.d.ts`
10
+ * by the engine's codegen on synth). We extend the SDK schemas where Genie
11
+ * ships fields on the wire that the SDK doesn't currently type:
12
+ *
13
+ * - `GenieMessage.auto_regenerate_count: number` (stamped
14
+ * on every wire message, omitted from the SDK shape).
15
+ * - `GenieQueryAttachment.thoughts: GenieThought[]` (the
16
+ * streamed reasoning payload with `DESCRIPTION`,
17
+ * `DATA_SOURCING`, `STEPS`, and `UNDERSTANDING` thought
18
+ * kinds).
19
+ * - `GenieAttachment.attachment_type: AttachmentType`
20
+ * (an optional discriminator literal so callers can
21
+ * `switch (att.attachment_type)` instead of probing
22
+ * which sub-key is populated; compute it with
23
+ * {@link detectAttachmentType}).
24
+ *
25
+ * 2. Event vocabulary for the high-level `genieEventChat`
26
+ * driver. Each event is a flat `z.object` with a `type`
27
+ * literal discriminator and snake_case payload fields hoisted
28
+ * to the top level (no `payload` wrapper). Events that share
29
+ * the attachment-scoped location use
30
+ * {@link GenieChatLocationSchema} as a base; events that
31
+ * don't carry an `attachment_id` (status, result) omit it.
32
+ * {@link GenieChatEventSchema} bundles the variants into one
33
+ * discriminated union.
34
+ *
35
+ * Pure types: no runtime imports beyond zod + the generated
36
+ * sdk-type schemas, no Node-only code, safe for browser bundles.
37
+ *
38
+ * @module
39
+ */
40
+ import { string } from "@dbx-tools/shared-core";
41
+ import { dashboards } from "@dbx-tools/shared-sdk-model";
42
+ import { z } from "zod";
43
+ // The generated SDK schemas live under the `dashboards` namespace of
44
+ // @dbx-tools/shared-sdk-model. Alias the handful Genie extends so the
45
+ // widened schemas below read against short, local names.
46
+ const { messageStatusSchema: MessageStatusSchema, genieAttachmentSchema: SDKGenieAttachmentSchema, genieMessageSchema: SDKGenieMessageSchema, genieQueryAttachmentSchema: SDKGenieQueryAttachmentSchema, genieSpaceSchema: SDKGenieSpaceSchema, } = dashboards;
47
+ // Re-export the SDK's `MessageStatus` schema so callers can parse a
48
+ // raw status without reaching back into the generated namespace.
49
+ export { MessageStatusSchema };
50
+ /**
51
+ * One reasoning step on a query attachment. See
52
+ * {@link GenieThoughtType} for the known `thought_type` values.
53
+ */
54
+ export const GenieThoughtSchema = z.object({
55
+ thought_type: z.custom((v) => typeof v === "string"),
56
+ content: z.string(),
57
+ });
58
+ /* ----------------------- attachment discriminator ---------------------- */
59
+ /**
60
+ * Discriminator for what's inside a `GenieAttachment`. Genie only
61
+ * ever populates one of `query` / `text` / `suggested_questions`
62
+ * per attachment. Open via `(string & {})` so a new server-side
63
+ * type doesn't break compilation; the three known types still
64
+ * narrow correctly under `switch`.
65
+ *
66
+ * Lifted into the schema as the optional
67
+ * {@link GenieAttachmentSchema}.`attachment_type` field (compute
68
+ * it with {@link detectAttachmentType}) so consumers can branch
69
+ * on a literal instead of probing which sub-object key is
70
+ * present. Also surfaced on {@link AttachmentEvent}'s payload as
71
+ * `attachment_type` (vs a bare `type`) to keep the field clear of
72
+ * the event-union discriminator key.
73
+ */
74
+ export const ATTACHMENT_TYPES = [
75
+ "query",
76
+ "text",
77
+ "suggested_questions",
78
+ ];
79
+ /* ------------------- widened wire schemas + types ------------------ */
80
+ /**
81
+ * `GenieQueryAttachment` widened with the `thoughts[]` field the
82
+ * Genie wire exposes but the SDK doesn't currently type. Every
83
+ * other field (`description`, `query`, `statement_id`,
84
+ * `query_result_metadata`, `title`, `parameters`,
85
+ * `last_updated_timestamp`, `id`) flows through verbatim from
86
+ * the SDK schema.
87
+ */
88
+ export const GenieQueryAttachmentSchema = SDKGenieQueryAttachmentSchema.extend({
89
+ thoughts: z.array(GenieThoughtSchema).optional(),
90
+ });
91
+ /**
92
+ * `GenieAttachment` with:
93
+ *
94
+ * - `query` re-typed to the thoughts-aware
95
+ * {@link GenieQueryAttachmentSchema}.
96
+ * - `attachment_type` discriminator literal
97
+ * ({@link AttachmentType}) so consumers can `switch
98
+ * (att.attachment_type)` to narrow which sub-object is
99
+ * populated. Optional on the wire (Genie doesn't send it);
100
+ * callers compute it with {@link detectAttachmentType} when
101
+ * they want the literal up-front.
102
+ *
103
+ * `attachment_id`, `text`, and `suggested_questions` pass through
104
+ * unchanged. `attachment_id` is genuinely optional on the wire:
105
+ * the first text attachment Genie emits per turn (the "main
106
+ * answer text") arrives with no id, only the follow-up text
107
+ * attachment gets one.
108
+ */
109
+ export const GenieAttachmentSchema = SDKGenieAttachmentSchema.extend({
110
+ query: GenieQueryAttachmentSchema.optional(),
111
+ attachment_type: z.custom((v) => typeof v === "string").optional(),
112
+ });
113
+ /**
114
+ * `GenieMessage` widened with:
115
+ *
116
+ * - `auto_regenerate_count`: number stamped on every wire
117
+ * message that the SDK type omits at v0.17.
118
+ * - `attachments`: re-typed to the local
119
+ * {@link GenieAttachmentSchema} so
120
+ * `attachment.query?.thoughts` (and the
121
+ * `attachment_type` discriminator) is reachable without a
122
+ * cast.
123
+ *
124
+ * Every other field (`id`, `space_id`, `conversation_id`,
125
+ * `user_id`, `created_timestamp`, `last_updated_timestamp`,
126
+ * `status`, `content`, `message_id`, `query_result`, `error`,
127
+ * `feedback`) passes through from the SDK schema.
128
+ */
129
+ export const GenieMessageSchema = SDKGenieMessageSchema.extend({
130
+ attachments: z.array(GenieAttachmentSchema).optional(),
131
+ auto_regenerate_count: z.number().optional(),
132
+ });
133
+ /**
134
+ * Domain projection of {@link GenieMessageSchema} that drops every
135
+ * turn-level field (`id`, `status`, `created_timestamp`,
136
+ * `query_result`, ...) and yields just the response payload as a
137
+ * flat `GenieAttachment[]`. Parses the same wire shape as
138
+ * {@link GenieMessageSchema}; missing `attachments` defaults to
139
+ * `[]` so the output is always an array.
140
+ *
141
+ * Use when consumers only care about the model's response
142
+ * attachments and not the surrounding message envelope.
143
+ */
144
+ export const GenieResponseSchema = GenieMessageSchema.transform((m) => m.attachments ?? []);
145
+ /**
146
+ * `GenieSpace` widened with an optional `serialized_space` field
147
+ * carrying a JSON-string representation of the space's full
148
+ * definition (catalogs, schemas, tables, sample questions, prompts,
149
+ * etc.) as exported by the workspace export endpoint.
150
+ *
151
+ * The base SDK shape (`description`, `space_id`, `title`,
152
+ * `warehouse_id`) covers the directory-listing surface - enough to
153
+ * route a chat. `serialized_space` is opt-in so callers that need
154
+ * the full space schema (e.g. to seed a system prompt or to ship
155
+ * the definition to an agent) can attach it without a second type.
156
+ */
157
+ export const GenieSpaceSchema = SDKGenieSpaceSchema.extend({
158
+ serialized_space: z
159
+ .string()
160
+ .optional()
161
+ .describe("The contents of the Genie Space in serialized string form. This field is excluded in List Genie spaces responses. This field provides the structure of the JSON string that represents the space's layout and components."),
162
+ });
163
+ /* ------------------------ terminal helpers ------------------------- */
164
+ /**
165
+ * Terminal Genie message statuses. The polling loop in the chat
166
+ * driver stops as soon as the latest message has one of these
167
+ * statuses.
168
+ */
169
+ export const TERMINAL_STATUSES = ["COMPLETED", "FAILED", "CANCELLED"];
170
+ /** Narrow `MessageStatus | undefined` to a {@link TerminalStatus}. */
171
+ export function isTerminalStatus(s) {
172
+ return s !== undefined && TERMINAL_STATUSES.includes(s);
173
+ }
174
+ /**
175
+ * Convert a raw Genie wire status (`FETCHING_METADATA`,
176
+ * `ASKING_AI`, `EXECUTING_QUERY`, ...) into a short, sentence-cased
177
+ * label safe to drop into a UI pill. Known states get a curated
178
+ * label; unknown states fall back to `string.tokenizeWithOptions`
179
+ * so new states still render cleanly without code changes.
180
+ *
181
+ * Pure (no Node-only deps), safe for browser bundles. Both the
182
+ * Genie agent (server) and any UI that subscribes to status events
183
+ * call this so labels stay in lock-step across the wire.
184
+ */
185
+ export function humanizeStatus(status) {
186
+ switch (status) {
187
+ case "FETCHING_METADATA":
188
+ return "Fetching metadata";
189
+ case "ASKING_AI":
190
+ return "Asking Genie";
191
+ case "EXECUTING_QUERY":
192
+ return "Running SQL query";
193
+ case "FILTERING_CONTEXT":
194
+ return "Filtering context";
195
+ case "PENDING_WAREHOUSE":
196
+ return "Waiting for warehouse";
197
+ case "COMPLETED":
198
+ return "Completed";
199
+ case "FAILED":
200
+ return "Failed";
201
+ case "CANCELLED":
202
+ return "Cancelled";
203
+ default:
204
+ return [...string.tokenizeWithOptions({ capitalize: true, lowerCase: true }, status)].join(" ");
205
+ }
206
+ }
207
+ /* ----------------------- attachment type helper ---------------------- */
208
+ /**
209
+ * Inspect a {@link GenieAttachment} and return the
210
+ * {@link AttachmentType} of payload it carries. Returns the first
211
+ * known sub-object that's present; if none of the known ones are
212
+ * populated, falls back to the first non-bookkeeping key
213
+ * (forward-compat for types we don't model yet), else `"unknown"`.
214
+ *
215
+ * Honors a pre-set `attachment_type` if one is already on the
216
+ * value, so this is idempotent across re-detections.
217
+ */
218
+ export function detectAttachmentType(att) {
219
+ if (att.attachment_type)
220
+ return att.attachment_type;
221
+ if (att.query)
222
+ return "query";
223
+ if (att.text)
224
+ return "text";
225
+ if (att.suggested_questions)
226
+ return "suggested_questions";
227
+ for (const k of Object.keys(att)) {
228
+ if (k !== "attachment_id" && k !== "attachment_type")
229
+ return k;
230
+ }
231
+ return "unknown";
232
+ }
233
+ /* ------------------------- GenieChat events ------------------------ */
234
+ /**
235
+ * Where on the wire an event was observed. Spread into every
236
+ * attachment-scoped event payload so subscribers can route, log,
237
+ * or correlate without re-walking the message.
238
+ *
239
+ * Fields:
240
+ * - `space_id`: the Genie space the conversation lives in.
241
+ * - `conversation_id`: conversation id once Genie has assigned one.
242
+ * - `message_id`: Genie message id for the active turn.
243
+ * - `attachment_id`: attachment the event came from. Optional
244
+ * because Genie sometimes emits an anonymous main-answer
245
+ * attachment without an id; those still get events, just with
246
+ * `attachment_id` undefined.
247
+ */
248
+ export const GenieChatLocationSchema = z.object({
249
+ space_id: z.string(),
250
+ conversation_id: z.string().optional(),
251
+ message_id: z.string().optional(),
252
+ attachment_id: z.string().optional(),
253
+ });
254
+ /**
255
+ * Lifecycle event: the question this turn is asking Genie. Fires
256
+ * once per `genieEventChat` call, the first time the underlying
257
+ * `genieChat` loop yields a `GenieMessage`. Carries the prompt
258
+ * text Genie echoed back on `message.content` and the assigned
259
+ * `message_id` so subscribers can group every subsequent event
260
+ * for this turn under one stable key. `conversation_id` is
261
+ * populated for both opening and follow-up turns (Genie assigns
262
+ * it on `startConversation`).
263
+ *
264
+ * Deferred (instead of fired synchronously on entry) so the
265
+ * `message_id` is available when the event lands - that one round
266
+ * trip costs ~200ms but lets UIs render question / thinking /
267
+ * query / text as a single grouped block per Genie call instead
268
+ * of a flat stream.
269
+ *
270
+ * `attachment_id` is intentionally absent - questions are turn
271
+ * scoped, not attachment scoped.
272
+ */
273
+ export const QuestionEventSchema = GenieChatLocationSchema.omit({
274
+ attachment_id: true,
275
+ }).extend({
276
+ type: z.literal("question"),
277
+ content: z.string(),
278
+ });
279
+ /**
280
+ * Lifecycle event: raw `GenieMessage` snapshot for the active
281
+ * turn. Fires once per poll yield. The full message shape
282
+ * (including the widened thought / regen / attachment-type
283
+ * fields) is exposed inline as `message`; consumers narrow on
284
+ * `event.type === "message"` and reach for `event.message`.
285
+ */
286
+ export const MessageEventSchema = GenieChatLocationSchema.omit({
287
+ attachment_id: true,
288
+ }).extend({
289
+ type: z.literal("message"),
290
+ message: GenieMessageSchema,
291
+ });
292
+ /**
293
+ * Top-level `message.status` transitioned. Fires for every
294
+ * distinct status seen on the wire (e.g. `SUBMITTED` ->
295
+ * `FILTERING_CONTEXT` -> `ASKING_AI` -> `PENDING_WAREHOUSE` ->
296
+ * `ASKING_AI` -> `COMPLETED`).
297
+ */
298
+ export const StatusEventSchema = GenieChatLocationSchema.omit({
299
+ attachment_id: true,
300
+ }).extend({
301
+ type: z.literal("status"),
302
+ status: MessageStatusSchema,
303
+ previous_status: MessageStatusSchema.optional(),
304
+ });
305
+ /**
306
+ * A new attachment slot appeared in `message.attachments[]`.
307
+ * Fires exactly once per attachment (matched by `attachment_id`,
308
+ * positionally for anonymous attachments) the first time we see
309
+ * it. The slot's payload kind lands in `attachment_type` so the
310
+ * outer `type` discriminator stays unambiguous.
311
+ */
312
+ export const AttachmentEventSchema = GenieChatLocationSchema.extend({
313
+ type: z.literal("attachment"),
314
+ index: z.number(),
315
+ attachment_type: z.custom((v) => typeof v === "string"),
316
+ });
317
+ /**
318
+ * A new reasoning step appeared on a query attachment
319
+ * (`attachments[i].query.thoughts[i]`). Deduplicated per
320
+ * `(thought_type, content)` tuple within an attachment so
321
+ * subscribers don't see the same thought multiple times - Genie
322
+ * sometimes mutates existing thought slots in place, so the diff
323
+ * is value-based rather than positional.
324
+ */
325
+ export const ThinkingEventSchema = GenieChatLocationSchema.extend({
326
+ type: z.literal("thinking"),
327
+ text: z.string(),
328
+ thought_type: z.custom((v) => typeof v === "string"),
329
+ });
330
+ /**
331
+ * A text-attachment `content` field appeared or changed
332
+ * (`attachments[i].text.content`). Fires whenever the snapshot
333
+ * value differs from the previous one for the same attachment.
334
+ */
335
+ export const TextEventSchema = GenieChatLocationSchema.extend({
336
+ type: z.literal("text"),
337
+ text: z.string(),
338
+ });
339
+ /**
340
+ * SQL was finalized on a query attachment
341
+ * (`attachments[i].query.query`). Fires once when the SQL string
342
+ * transitions from undefined to defined, and again if Genie ever
343
+ * rewrites it. `title` and `description` are denormalised off the
344
+ * attachment's `query.title` / `query.description` so consumers
345
+ * can label the SQL pill without re-walking the message.
346
+ */
347
+ export const QueryEventSchema = GenieChatLocationSchema.extend({
348
+ type: z.literal("query"),
349
+ sql: z.string(),
350
+ title: z.string().optional(),
351
+ description: z.string().optional(),
352
+ });
353
+ /**
354
+ * SQL was submitted to a SQL warehouse and a statement id was
355
+ * assigned (`attachments[i].query.statement_id`). Fires when the
356
+ * statement id transitions from undefined to defined - this is the
357
+ * point at which `client.statementExecution.getStatement({ statement_id })`
358
+ * becomes a valid call.
359
+ */
360
+ export const StatementEventSchema = GenieChatLocationSchema.extend({
361
+ type: z.literal("statement"),
362
+ statement_id: z.string(),
363
+ });
364
+ /**
365
+ * Row count for a query attachment's result changed
366
+ * (`attachments[i].query.query_result_metadata.row_count`). Fires
367
+ * on every change, including the initial `undefined -> 0` and the
368
+ * later `0 -> N` once the warehouse finishes execution.
369
+ */
370
+ export const RowsEventSchema = GenieChatLocationSchema.extend({
371
+ type: z.literal("rows"),
372
+ row_count: z.number(),
373
+ previous_row_count: z.number().optional(),
374
+ statement_id: z.string().optional(),
375
+ });
376
+ /**
377
+ * Genie produced a follow-up suggested-questions list
378
+ * (`attachments[i].suggested_questions.questions[]`). Fires once
379
+ * when the list appears, and again if Genie rewrites it.
380
+ */
381
+ export const SuggestedQuestionsEventSchema = GenieChatLocationSchema.extend({
382
+ type: z.literal("suggested_questions"),
383
+ questions: z.array(z.string()),
384
+ });
385
+ /**
386
+ * The active turn reached a terminal status. Always fires once
387
+ * per turn (immediately after the terminal `message` event).
388
+ * Carries the final `GenieMessage` snapshot inline so subscribers
389
+ * don't need to keep their own copy of the last message.
390
+ */
391
+ export const ResultEventSchema = GenieChatLocationSchema.omit({
392
+ attachment_id: true,
393
+ }).extend({
394
+ type: z.literal("result"),
395
+ status: z.enum(TERMINAL_STATUSES),
396
+ message: GenieMessageSchema,
397
+ });
398
+ /**
399
+ * Discriminated union yielded by `genieEventChat`. Each variant
400
+ * is a single flat object with `type` as the discriminator and
401
+ * the payload fields hoisted directly to the top level - no
402
+ * `payload` wrapper. Consumers narrow on `type` and read fields
403
+ * inline:
404
+ *
405
+ * @example
406
+ * for await (const event of genieEventChat(spaceId, "Top stores?")) {
407
+ * switch (event.type) {
408
+ * case "thinking":
409
+ * console.log(event.thought_type, event.text);
410
+ * break;
411
+ * case "result":
412
+ * console.log("done:", event.status);
413
+ * break;
414
+ * }
415
+ * }
416
+ *
417
+ * Stream order per turn:
418
+ *
419
+ * 1. `question`, emitted with the first `message` yield (deferred so
420
+ * the assigned `message_id` is available), carrying the prompt
421
+ * this turn sent to Genie.
422
+ * 2. `message` for every poll yield (raw `GenieMessage` on
423
+ * `event.message`).
424
+ * 3. Any derived events the snapshot diff produced (`status`,
425
+ * `attachment`, `thinking`, `text`, `query`, `statement`,
426
+ * `rows`, `suggested_questions`) in that fixed order.
427
+ * 4. On the terminal snapshot, a final `result` event.
428
+ *
429
+ * Errors propagate via the generator throwing (`try`/`catch` the
430
+ * `for await`), not via an `error` variant on this union.
431
+ */
432
+ export const GenieChatEventSchema = z.discriminatedUnion("type", [
433
+ QuestionEventSchema,
434
+ MessageEventSchema,
435
+ StatusEventSchema,
436
+ AttachmentEventSchema,
437
+ ThinkingEventSchema,
438
+ TextEventSchema,
439
+ QueryEventSchema,
440
+ StatementEventSchema,
441
+ RowsEventSchema,
442
+ SuggestedQuestionsEventSchema,
443
+ ResultEventSchema,
444
+ ]);
445
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuaWUtbW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuaWUtbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0NHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLHFFQUFxRTtBQUNyRSxzRUFBc0U7QUFDdEUseURBQXlEO0FBQ3pELE1BQU0sRUFDSixtQkFBbUIsRUFBRSxtQkFBbUIsRUFDeEMscUJBQXFCLEVBQUUsd0JBQXdCLEVBQy9DLGtCQUFrQixFQUFFLHFCQUFxQixFQUN6QywwQkFBMEIsRUFBRSw2QkFBNkIsRUFDekQsZ0JBQWdCLEVBQUUsbUJBQW1CLEdBQ3RDLEdBQUcsVUFBVSxDQUFDO0FBVWYsb0VBQW9FO0FBQ3BFLGlFQUFpRTtBQUNqRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQztBQWlDL0I7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN6QyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBbUIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQztJQUN0RSxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtDQUNwQixDQUFDLENBQUM7QUFHSCw2RUFBNkU7QUFFN0U7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRztJQUM5QixPQUFPO0lBQ1AsTUFBTTtJQUNOLHFCQUFxQjtDQUNlLENBQUM7QUFJdkMseUVBQXlFO0FBRXpFOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENB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LENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDO0lBQ3RDLFNBQVMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztDQUMvQixDQUFDLENBQUM7QUFHSDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQztJQUM1RCxhQUFhLEVBQUUsSUFBSTtDQUNwQixDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ1IsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO0lBQ3pCLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2pDLE9BQU8sRUFBRSxrQkFBa0I7Q0FDNUIsQ0FBQyxDQUFDO0FBR0g7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlDRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUU7SUFDL0QsbUJBQW1CO0lBQ25CLGtCQUFrQjtJQUNsQixpQkFBaUI7SUFDakIscUJBQXFCO0lBQ3JCLG1CQUFtQjtJQUNuQixlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLG9CQUFvQjtJQUNwQixlQUFlO0lBQ2YsNkJBQTZCO0lBQzdCLGlCQUFpQjtDQUNsQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdpcmUtZm9ybWF0IHpvZCBzY2hlbWFzICsgdHlwZXMgYW5kIGhpZ2gtbGV2ZWwgZXZlbnQgdm9jYWJ1bGFyeVxuICogZm9yIHRoZSBHZW5pZSBjaGF0IGRyaXZlci5cbiAqXG4gKiBUd28gcmVsYXRlZCBsYXllcnMgbGl2ZSBoZXJlOlxuICpcbiAqICAgMS4gR2VuaWUgd2lyZSBzaGFwZXMgZGVyaXZlZCBmcm9tIGBAZGJ4LXRvb2xzL3NoYXJlZC1zZGstbW9kZWxgJ3NcbiAqICAgICAgZ2VuZXJhdGVkIGBkYXNoYm9hcmRzYCBzY2hlbWFzIChyZWdlbmVyYXRlZCBmcm9tIHRoZSB1cHN0cmVhbVxuICogICAgICBgQGRhdGFicmlja3Mvc2RrLWV4cGVyaW1lbnRhbGAgYGFwaXMvZGFzaGJvYXJkcy9tb2RlbC5kLnRzYFxuICogICAgICBieSB0aGUgZW5naW5lJ3MgY29kZWdlbiBvbiBzeW50aCkuIFdlIGV4dGVuZCB0aGUgU0RLIHNjaGVtYXMgd2hlcmUgR2VuaWVcbiAqICAgICAgc2hpcHMgZmllbGRzIG9uIHRoZSB3aXJlIHRoYXQgdGhlIFNESyBkb2Vzbid0IGN1cnJlbnRseSB0eXBlOlxuICpcbiAqICAgICAgICAtIGBHZW5pZU1lc3NhZ2UuYXV0b19yZWdlbmVyYXRlX2NvdW50OiBudW1iZXJgIChzdGFtcGVkXG4gKiAgICAgICAgICBvbiBldmVyeSB3aXJlIG1lc3NhZ2UsIG9taXR0ZWQgZnJvbSB0aGUgU0RLIHNoYXBlKS5cbiAqICAgICAgICAtIGBHZW5pZVF1ZXJ5QXR0YWNobWVudC50aG91Z2h0czogR2VuaWVUaG91Z2h0W11gICh0aGVcbiAqICAgICAgICAgIHN0cmVhbWVkIHJlYXNvbmluZyBwYXlsb2FkIHdpdGggYERFU0NSSVBUSU9OYCxcbiAqICAgICAgICAgIGBEQVRBX1NPVVJDSU5HYCwgYFNURVBTYCwgYW5kIGBVTkRFUlNUQU5ESU5HYCB0aG91Z2h0XG4gKiAgICAgICAgICBraW5kcykuXG4gKiAgICAgICAgLSBgR2VuaWVBdHRhY2htZW50LmF0dGFjaG1lbnRfdHlwZTogQXR0YWNobWVudFR5cGVgXG4gKiAgICAgICAgICAoYW4gb3B0aW9uYWwgZGlzY3JpbWluYXRvciBsaXRlcmFsIHNvIGNhbGxlcnMgY2FuXG4gKiAgICAgICAgICBgc3dpdGNoIChhdHQuYXR0YWNobWVudF90eXBlKWAgaW5zdGVhZCBvZiBwcm9iaW5nXG4gKiAgICAgICAgICB3aGljaCBzdWIta2V5IGlzIHBvcHVsYXRlZDsgY29tcHV0ZSBpdCB3aXRoXG4gKiAgICAgICAgICB7QGxpbmsgZGV0ZWN0QXR0YWNobWVudFR5cGV9KS5cbiAqXG4gKiAgIDIuIEV2ZW50IHZvY2FidWxhcnkgZm9yIHRoZSBoaWdoLWxldmVsIGBnZW5pZUV2ZW50Q2hhdGBcbiAqICAgICAgZHJpdmVyLiBFYWNoIGV2ZW50IGlzIGEgZmxhdCBgei5vYmplY3RgIHdpdGggYSBgdHlwZWBcbiAqICAgICAgbGl0ZXJhbCBkaXNjcmltaW5hdG9yIGFuZCBzbmFrZV9jYXNlIHBheWxvYWQgZmllbGRzIGhvaXN0ZWRcbiAqICAgICAgdG8gdGhlIHRvcCBsZXZlbCAobm8gYHBheWxvYWRgIHdyYXBwZXIpLiBFdmVudHMgdGhhdCBzaGFyZVxuICogICAgICB0aGUgYXR0YWNobWVudC1zY29wZWQgbG9jYXRpb24gdXNlXG4gKiAgICAgIHtAbGluayBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYX0gYXMgYSBiYXNlOyBldmVudHMgdGhhdFxuICogICAgICBkb24ndCBjYXJyeSBhbiBgYXR0YWNobWVudF9pZGAgKHN0YXR1cywgcmVzdWx0KSBvbWl0IGl0LlxuICogICAgICB7QGxpbmsgR2VuaWVDaGF0RXZlbnRTY2hlbWF9IGJ1bmRsZXMgdGhlIHZhcmlhbnRzIGludG8gb25lXG4gKiAgICAgIGRpc2NyaW1pbmF0ZWQgdW5pb24uXG4gKlxuICogUHVyZSB0eXBlczogbm8gcnVudGltZSBpbXBvcnRzIGJleW9uZCB6b2QgKyB0aGUgZ2VuZXJhdGVkXG4gKiBzZGstdHlwZSBzY2hlbWFzLCBubyBOb2RlLW9ubHkgY29kZSwgc2FmZSBmb3IgYnJvd3NlciBidW5kbGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgZGFzaGJvYXJkcyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1zZGstbW9kZWxcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbi8vIFRoZSBnZW5lcmF0ZWQgU0RLIHNjaGVtYXMgbGl2ZSB1bmRlciB0aGUgYGRhc2hib2FyZHNgIG5hbWVzcGFjZSBvZlxuLy8gQGRieC10b29scy9zaGFyZWQtc2RrLW1vZGVsLiBBbGlhcyB0aGUgaGFuZGZ1bCBHZW5pZSBleHRlbmRzIHNvIHRoZVxuLy8gd2lkZW5lZCBzY2hlbWFzIGJlbG93IHJlYWQgYWdhaW5zdCBzaG9ydCwgbG9jYWwgbmFtZXMuXG5jb25zdCB7XG4gIG1lc3NhZ2VTdGF0dXNTY2hlbWE6IE1lc3NhZ2VTdGF0dXNTY2hlbWEsXG4gIGdlbmllQXR0YWNobWVudFNjaGVtYTogU0RLR2VuaWVBdHRhY2htZW50U2NoZW1hLFxuICBnZW5pZU1lc3NhZ2VTY2hlbWE6IFNES0dlbmllTWVzc2FnZVNjaGVtYSxcbiAgZ2VuaWVRdWVyeUF0dGFjaG1lbnRTY2hlbWE6IFNES0dlbmllUXVlcnlBdHRhY2htZW50U2NoZW1hLFxuICBnZW5pZVNwYWNlU2NoZW1hOiBTREtHZW5pZVNwYWNlU2NoZW1hLFxufSA9IGRhc2hib2FyZHM7XG5cbi8qKlxuICogVGhlIFNESydzIGBNZXNzYWdlU3RhdHVzYCB0eXBlLCByZS1leHBvcnRlZCBzbyBjb25zdW1lcnMgb2YgdGhlXG4gKiBHZW5pZSBjb250cmFjdCBnZXQgdGhlIGZ1bGwgd2lyZSB2b2NhYnVsYXJ5IGZyb20gYSBzaW5nbGUgaW1wb3J0XG4gKiBwYXRoIC0gbWlycm9ycyB0aGUgcmUtZXhwb3J0cyBvZiB0aGUgb3RoZXIgU0RLLWRlcml2ZWQgc2NoZW1hc1xuICogYmVsb3cuXG4gKi9cbmV4cG9ydCB0eXBlIE1lc3NhZ2VTdGF0dXMgPSBkYXNoYm9hcmRzLk1lc3NhZ2VTdGF0dXM7XG5cbi8vIFJlLWV4cG9ydCB0aGUgU0RLJ3MgYE1lc3NhZ2VTdGF0dXNgIHNjaGVtYSBzbyBjYWxsZXJzIGNhbiBwYXJzZSBhXG4vLyByYXcgc3RhdHVzIHdpdGhvdXQgcmVhY2hpbmcgYmFjayBpbnRvIHRoZSBnZW5lcmF0ZWQgbmFtZXNwYWNlLlxuZXhwb3J0IHsgTWVzc2FnZVN0YXR1c1NjaGVtYSB9O1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0aG91Z2h0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogR2VuaWUncyBwZXItcXVlcnkgXCJ0aG91Z2h0c1wiIHN1cmZhY2UuIFRoZXNlIGFwcGVhciBvbiB0aGVcbiAqIGAvbWVzc2FnZXMve2lkfWAgd2lyZSB1bmRlciBgYXR0YWNobWVudHNbaV0ucXVlcnkudGhvdWdodHNbXWAgYnV0XG4gKiBhcmUgbm90IHR5cGVkIG9uIHRoZSBTREsncyBgR2VuaWVRdWVyeUF0dGFjaG1lbnRgIGF0IHYwLjE3LlxuICpcbiAqIEtub3duIHRob3VnaHQgdHlwZXMgb2JzZXJ2ZWQgaW4gcHJvZHVjdGlvbiBwb2xsczpcbiAqXG4gKiAgIC0gYFRIT1VHSFRfVFlQRV9ERVNDUklQVElPTmA6IGEgb25lLXBhcmFncmFwaCByZXN0YXRlbWVudCBvZlxuICogICAgIHdoYXQgdGhlIHVzZXIgYXNrZWQuIFRoZSBmaW5hbCBgcXVlcnkuZGVzY3JpcHRpb25gIGZpZWxkIG9uXG4gKiAgICAgdGhlIGF0dGFjaG1lbnQgY2FycmllcyB0aGUgc2FtZSB0ZXh0LlxuICogICAtIGBUSE9VR0hUX1RZUEVfREFUQV9TT1VSQ0lOR2A6IG1hcmtkb3duIGJ1bGxldHMgb2YgdGhlXG4gKiAgICAgZnVsbHktcXVhbGlmaWVkIGBjYXRhbG9nLnNjaGVtYS50YWJsZWAgc291cmNlcyBHZW5pZSBjaG9zZS5cbiAqICAgLSBgVEhPVUdIVF9UWVBFX1NURVBTYDogdGhlIGhpZ2gtbGV2ZWwgcGxhbiBHZW5pZSB3cm90ZSBiZWZvcmVcbiAqICAgICBydW5uaW5nIFNRTCAob25lIGJ1bGxldCBwZXIgc3RlcCkuXG4gKiAgIC0gYFRIT1VHSFRfVFlQRV9VTkRFUlNUQU5ESU5HYDogYW1iaWd1aXR5IC8gaW50ZXJwcmV0YXRpb25cbiAqICAgICBub3RlcyAoZS5nLiBcIidyZXZlbnVlJyBjb3VsZCBiZSBpbnRlcnByZXRlZCBhcyBncm9zcyxcbiAqICAgICBuZXQsIG9yIHJlY29nbml6ZWQgcmV2ZW51ZS4uLlwiKS5cbiAqXG4gKiBPcGVuIGF0IHRoZSB0eXBlIGxldmVsIChgfCAoc3RyaW5nICYge30pYCkgc28gYSBuZXcgc2VydmVyLXNpZGVcbiAqIHRob3VnaHQgdHlwZSBkb2Vzbid0IGJyZWFrIGNvbXBpbGF0aW9uOyB0aGUgZm91ciBrbm93biB0eXBlc1xuICogc3RpbGwgbmFycm93IGNvcnJlY3RseSB1bmRlciBgc3dpdGNoYC5cbiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVUaG91Z2h0VHlwZSA9XG4gIHwgXCJUSE9VR0hUX1RZUEVfREVTQ1JJUFRJT05cIlxuICB8IFwiVEhPVUdIVF9UWVBFX0RBVEFfU09VUkNJTkdcIlxuICB8IFwiVEhPVUdIVF9UWVBFX1NURVBTXCJcbiAgfCBcIlRIT1VHSFRfVFlQRV9VTkRFUlNUQU5ESU5HXCJcbiAgfCAoc3RyaW5nICYge30pO1xuXG4vKipcbiAqIE9uZSByZWFzb25pbmcgc3RlcCBvbiBhIHF1ZXJ5IGF0dGFjaG1lbnQuIFNlZVxuICoge0BsaW5rIEdlbmllVGhvdWdodFR5cGV9IGZvciB0aGUga25vd24gYHRob3VnaHRfdHlwZWAgdmFsdWVzLlxuICovXG5leHBvcnQgY29uc3QgR2VuaWVUaG91Z2h0U2NoZW1hID0gei5vYmplY3Qoe1xuICB0aG91Z2h0X3R5cGU6IHouY3VzdG9tPEdlbmllVGhvdWdodFR5cGU+KCh2KSA9PiB0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiksXG4gIGNvbnRlbnQ6IHouc3RyaW5nKCksXG59KTtcbmV4cG9ydCB0eXBlIEdlbmllVGhvdWdodCA9IHouaW5mZXI8dHlwZW9mIEdlbmllVGhvdWdodFNjaGVtYT47XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGF0dGFjaG1lbnQgZGlzY3JpbWluYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRGlzY3JpbWluYXRvciBmb3Igd2hhdCdzIGluc2lkZSBhIGBHZW5pZUF0dGFjaG1lbnRgLiBHZW5pZSBvbmx5XG4gKiBldmVyIHBvcHVsYXRlcyBvbmUgb2YgYHF1ZXJ5YCAvIGB0ZXh0YCAvIGBzdWdnZXN0ZWRfcXVlc3Rpb25zYFxuICogcGVyIGF0dGFjaG1lbnQuIE9wZW4gdmlhIGAoc3RyaW5nICYge30pYCBzbyBhIG5ldyBzZXJ2ZXItc2lkZVxuICogdHlwZSBkb2Vzbid0IGJyZWFrIGNvbXBpbGF0aW9uOyB0aGUgdGhyZWUga25vd24gdHlwZXMgc3RpbGxcbiAqIG5hcnJvdyBjb3JyZWN0bHkgdW5kZXIgYHN3aXRjaGAuXG4gKlxuICogTGlmdGVkIGludG8gdGhlIHNjaGVtYSBhcyB0aGUgb3B0aW9uYWxcbiAqIHtAbGluayBHZW5pZUF0dGFjaG1lbnRTY2hlbWF9LmBhdHRhY2htZW50X3R5cGVgIGZpZWxkIChjb21wdXRlXG4gKiBpdCB3aXRoIHtAbGluayBkZXRlY3RBdHRhY2htZW50VHlwZX0pIHNvIGNvbnN1bWVycyBjYW4gYnJhbmNoXG4gKiBvbiBhIGxpdGVyYWwgaW5zdGVhZCBvZiBwcm9iaW5nIHdoaWNoIHN1Yi1vYmplY3Qga2V5IGlzXG4gKiBwcmVzZW50LiBBbHNvIHN1cmZhY2VkIG9uIHtAbGluayBBdHRhY2htZW50RXZlbnR9J3MgcGF5bG9hZCBhc1xuICogYGF0dGFjaG1lbnRfdHlwZWAgKHZzIGEgYmFyZSBgdHlwZWApIHRvIGtlZXAgdGhlIGZpZWxkIGNsZWFyIG9mXG4gKiB0aGUgZXZlbnQtdW5pb24gZGlzY3JpbWluYXRvciBrZXkuXG4gKi9cbmV4cG9ydCBjb25zdCBBVFRBQ0hNRU5UX1RZUEVTID0gW1xuICBcInF1ZXJ5XCIsXG4gIFwidGV4dFwiLFxuICBcInN1Z2dlc3RlZF9xdWVzdGlvbnNcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IHN0cmluZ1tdO1xuZXhwb3J0IHR5cGUgS25vd25BdHRhY2htZW50VHlwZSA9ICh0eXBlb2YgQVRUQUNITUVOVF9UWVBFUylbbnVtYmVyXTtcbmV4cG9ydCB0eXBlIEF0dGFjaG1lbnRUeXBlID0gS25vd25BdHRhY2htZW50VHlwZSB8IChzdHJpbmcgJiB7fSk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gd2lkZW5lZCB3aXJlIHNjaGVtYXMgKyB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBgR2VuaWVRdWVyeUF0dGFjaG1lbnRgIHdpZGVuZWQgd2l0aCB0aGUgYHRob3VnaHRzW11gIGZpZWxkIHRoZVxuICogR2VuaWUgd2lyZSBleHBvc2VzIGJ1dCB0aGUgU0RLIGRvZXNuJ3QgY3VycmVudGx5IHR5cGUuIEV2ZXJ5XG4gKiBvdGhlciBmaWVsZCAoYGRlc2NyaXB0aW9uYCwgYHF1ZXJ5YCwgYHN0YXRlbWVudF9pZGAsXG4gKiBgcXVlcnlfcmVzdWx0X21ldGFkYXRhYCwgYHRpdGxlYCwgYHBhcmFtZXRlcnNgLFxuICogYGxhc3RfdXBkYXRlZF90aW1lc3RhbXBgLCBgaWRgKSBmbG93cyB0aHJvdWdoIHZlcmJhdGltIGZyb21cbiAqIHRoZSBTREsgc2NoZW1hLlxuICovXG5leHBvcnQgY29uc3QgR2VuaWVRdWVyeUF0dGFjaG1lbnRTY2hlbWEgPSBTREtHZW5pZVF1ZXJ5QXR0YWNobWVudFNjaGVtYS5leHRlbmQoe1xuICB0aG91Z2h0czogei5hcnJheShHZW5pZVRob3VnaHRTY2hlbWEpLm9wdGlvbmFsKCksXG59KTtcbmV4cG9ydCB0eXBlIEdlbmllUXVlcnlBdHRhY2htZW50ID0gei5pbmZlcjx0eXBlb2YgR2VuaWVRdWVyeUF0dGFjaG1lbnRTY2hlbWE+O1xuXG4vKipcbiAqIGBHZW5pZUF0dGFjaG1lbnRgIHdpdGg6XG4gKlxuICogICAtIGBxdWVyeWAgcmUtdHlwZWQgdG8gdGhlIHRob3VnaHRzLWF3YXJlXG4gKiAgICAge0BsaW5rIEdlbmllUXVlcnlBdHRhY2htZW50U2NoZW1hfS5cbiAqICAgLSBgYXR0YWNobWVudF90eXBlYCBkaXNjcmltaW5hdG9yIGxpdGVyYWxcbiAqICAgICAoe0BsaW5rIEF0dGFjaG1lbnRUeXBlfSkgc28gY29uc3VtZXJzIGNhbiBgc3dpdGNoXG4gKiAgICAgKGF0dC5hdHRhY2htZW50X3R5cGUpYCB0byBuYXJyb3cgd2hpY2ggc3ViLW9iamVjdCBpc1xuICogICAgIHBvcHVsYXRlZC4gT3B0aW9uYWwgb24gdGhlIHdpcmUgKEdlbmllIGRvZXNuJ3Qgc2VuZCBpdCk7XG4gKiAgICAgY2FsbGVycyBjb21wdXRlIGl0IHdpdGgge0BsaW5rIGRldGVjdEF0dGFjaG1lbnRUeXBlfSB3aGVuXG4gKiAgICAgdGhleSB3YW50IHRoZSBsaXRlcmFsIHVwLWZyb250LlxuICpcbiAqIGBhdHRhY2htZW50X2lkYCwgYHRleHRgLCBhbmQgYHN1Z2dlc3RlZF9xdWVzdGlvbnNgIHBhc3MgdGhyb3VnaFxuICogdW5jaGFuZ2VkLiBgYXR0YWNobWVudF9pZGAgaXMgZ2VudWluZWx5IG9wdGlvbmFsIG9uIHRoZSB3aXJlOlxuICogdGhlIGZpcnN0IHRleHQgYXR0YWNobWVudCBHZW5pZSBlbWl0cyBwZXIgdHVybiAodGhlIFwibWFpblxuICogYW5zd2VyIHRleHRcIikgYXJyaXZlcyB3aXRoIG5vIGlkLCBvbmx5IHRoZSBmb2xsb3ctdXAgdGV4dFxuICogYXR0YWNobWVudCBnZXRzIG9uZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEdlbmllQXR0YWNobWVudFNjaGVtYSA9IFNES0dlbmllQXR0YWNobWVudFNjaGVtYS5leHRlbmQoe1xuICBxdWVyeTogR2VuaWVRdWVyeUF0dGFjaG1lbnRTY2hlbWEub3B0aW9uYWwoKSxcbiAgYXR0YWNobWVudF90eXBlOiB6LmN1c3RvbTxBdHRhY2htZW50VHlwZT4oKHYpID0+IHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKS5vcHRpb25hbCgpLFxufSk7XG5leHBvcnQgdHlwZSBHZW5pZUF0dGFjaG1lbnQgPSB6LmluZmVyPHR5cGVvZiBHZW5pZUF0dGFjaG1lbnRTY2hlbWE+O1xuXG4vKipcbiAqIGBHZW5pZU1lc3NhZ2VgIHdpZGVuZWQgd2l0aDpcbiAqXG4gKiAgIC0gYGF1dG9fcmVnZW5lcmF0ZV9jb3VudGA6IG51bWJlciBzdGFtcGVkIG9uIGV2ZXJ5IHdpcmVcbiAqICAgICBtZXNzYWdlIHRoYXQgdGhlIFNESyB0eXBlIG9taXRzIGF0IHYwLjE3LlxuICogICAtIGBhdHRhY2htZW50c2A6IHJlLXR5cGVkIHRvIHRoZSBsb2NhbFxuICogICAgIHtAbGluayBHZW5pZUF0dGFjaG1lbnRTY2hlbWF9IHNvXG4gKiAgICAgYGF0dGFjaG1lbnQucXVlcnk/LnRob3VnaHRzYCAoYW5kIHRoZVxuICogICAgIGBhdHRhY2htZW50X3R5cGVgIGRpc2NyaW1pbmF0b3IpIGlzIHJlYWNoYWJsZSB3aXRob3V0IGFcbiAqICAgICBjYXN0LlxuICpcbiAqIEV2ZXJ5IG90aGVyIGZpZWxkIChgaWRgLCBgc3BhY2VfaWRgLCBgY29udmVyc2F0aW9uX2lkYCxcbiAqIGB1c2VyX2lkYCwgYGNyZWF0ZWRfdGltZXN0YW1wYCwgYGxhc3RfdXBkYXRlZF90aW1lc3RhbXBgLFxuICogYHN0YXR1c2AsIGBjb250ZW50YCwgYG1lc3NhZ2VfaWRgLCBgcXVlcnlfcmVzdWx0YCwgYGVycm9yYCxcbiAqIGBmZWVkYmFja2ApIHBhc3NlcyB0aHJvdWdoIGZyb20gdGhlIFNESyBzY2hlbWEuXG4gKi9cbmV4cG9ydCBjb25zdCBHZW5pZU1lc3NhZ2VTY2hlbWEgPSBTREtHZW5pZU1lc3NhZ2VTY2hlbWEuZXh0ZW5kKHtcbiAgYXR0YWNobWVudHM6IHouYXJyYXkoR2VuaWVBdHRhY2htZW50U2NoZW1hKS5vcHRpb25hbCgpLFxuICBhdXRvX3JlZ2VuZXJhdGVfY291bnQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbn0pO1xuZXhwb3J0IHR5cGUgR2VuaWVNZXNzYWdlID0gei5pbmZlcjx0eXBlb2YgR2VuaWVNZXNzYWdlU2NoZW1hPjtcblxuLyoqXG4gKiBEb21haW4gcHJvamVjdGlvbiBvZiB7QGxpbmsgR2VuaWVNZXNzYWdlU2NoZW1hfSB0aGF0IGRyb3BzIGV2ZXJ5XG4gKiB0dXJuLWxldmVsIGZpZWxkIChgaWRgLCBgc3RhdHVzYCwgYGNyZWF0ZWRfdGltZXN0YW1wYCxcbiAqIGBxdWVyeV9yZXN1bHRgLCAuLi4pIGFuZCB5aWVsZHMganVzdCB0aGUgcmVzcG9uc2UgcGF5bG9hZCBhcyBhXG4gKiBmbGF0IGBHZW5pZUF0dGFjaG1lbnRbXWAuIFBhcnNlcyB0aGUgc2FtZSB3aXJlIHNoYXBlIGFzXG4gKiB7QGxpbmsgR2VuaWVNZXNzYWdlU2NoZW1hfTsgbWlzc2luZyBgYXR0YWNobWVudHNgIGRlZmF1bHRzIHRvXG4gKiBgW11gIHNvIHRoZSBvdXRwdXQgaXMgYWx3YXlzIGFuIGFycmF5LlxuICpcbiAqIFVzZSB3aGVuIGNvbnN1bWVycyBvbmx5IGNhcmUgYWJvdXQgdGhlIG1vZGVsJ3MgcmVzcG9uc2VcbiAqIGF0dGFjaG1lbnRzIGFuZCBub3QgdGhlIHN1cnJvdW5kaW5nIG1lc3NhZ2UgZW52ZWxvcGUuXG4gKi9cbmV4cG9ydCBjb25zdCBHZW5pZVJlc3BvbnNlU2NoZW1hID0gR2VuaWVNZXNzYWdlU2NoZW1hLnRyYW5zZm9ybSgobSkgPT4gbS5hdHRhY2htZW50cyA/PyBbXSk7XG5leHBvcnQgdHlwZSBHZW5pZVJlc3BvbnNlID0gei5pbmZlcjx0eXBlb2YgR2VuaWVSZXNwb25zZVNjaGVtYT47XG5cbi8qKlxuICogYEdlbmllU3BhY2VgIHdpZGVuZWQgd2l0aCBhbiBvcHRpb25hbCBgc2VyaWFsaXplZF9zcGFjZWAgZmllbGRcbiAqIGNhcnJ5aW5nIGEgSlNPTi1zdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwYWNlJ3MgZnVsbFxuICogZGVmaW5pdGlvbiAoY2F0YWxvZ3MsIHNjaGVtYXMsIHRhYmxlcywgc2FtcGxlIHF1ZXN0aW9ucywgcHJvbXB0cyxcbiAqIGV0Yy4pIGFzIGV4cG9ydGVkIGJ5IHRoZSB3b3Jrc3BhY2UgZXhwb3J0IGVuZHBvaW50LlxuICpcbiAqIFRoZSBiYXNlIFNESyBzaGFwZSAoYGRlc2NyaXB0aW9uYCwgYHNwYWNlX2lkYCwgYHRpdGxlYCxcbiAqIGB3YXJlaG91c2VfaWRgKSBjb3ZlcnMgdGhlIGRpcmVjdG9yeS1saXN0aW5nIHN1cmZhY2UgLSBlbm91Z2ggdG9cbiAqIHJvdXRlIGEgY2hhdC4gYHNlcmlhbGl6ZWRfc3BhY2VgIGlzIG9wdC1pbiBzbyBjYWxsZXJzIHRoYXQgbmVlZFxuICogdGhlIGZ1bGwgc3BhY2Ugc2NoZW1hIChlLmcuIHRvIHNlZWQgYSBzeXN0ZW0gcHJvbXB0IG9yIHRvIHNoaXBcbiAqIHRoZSBkZWZpbml0aW9uIHRvIGFuIGFnZW50KSBjYW4gYXR0YWNoIGl0IHdpdGhvdXQgYSBzZWNvbmQgdHlwZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEdlbmllU3BhY2VTY2hlbWEgPSBTREtHZW5pZVNwYWNlU2NoZW1hLmV4dGVuZCh7XG4gIHNlcmlhbGl6ZWRfc3BhY2U6IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIFwiVGhlIGNvbnRlbnRzIG9mIHRoZSBHZW5pZSBTcGFjZSBpbiBzZXJpYWxpemVkIHN0cmluZyBmb3JtLiBUaGlzIGZpZWxkIGlzIGV4Y2x1ZGVkIGluIExpc3QgR2VuaWUgc3BhY2VzIHJlc3BvbnNlcy4gVGhpcyBmaWVsZCBwcm92aWRlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBKU09OIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIHNwYWNlJ3MgbGF5b3V0IGFuZCBjb21wb25lbnRzLlwiLFxuICAgICksXG59KTtcbmV4cG9ydCB0eXBlIEdlbmllU3BhY2UgPSB6LmluZmVyPHR5cGVvZiBHZW5pZVNwYWNlU2NoZW1hPjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHRlcm1pbmFsIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFRlcm1pbmFsIEdlbmllIG1lc3NhZ2Ugc3RhdHVzZXMuIFRoZSBwb2xsaW5nIGxvb3AgaW4gdGhlIGNoYXRcbiAqIGRyaXZlciBzdG9wcyBhcyBzb29uIGFzIHRoZSBsYXRlc3QgbWVzc2FnZSBoYXMgb25lIG9mIHRoZXNlXG4gKiBzdGF0dXNlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFRFUk1JTkFMX1NUQVRVU0VTID0gW1wiQ09NUExFVEVEXCIsIFwiRkFJTEVEXCIsIFwiQ0FOQ0VMTEVEXCJdIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgVGVybWluYWxTdGF0dXMgPSAodHlwZW9mIFRFUk1JTkFMX1NUQVRVU0VTKVtudW1iZXJdO1xuXG4vKiogTmFycm93IGBNZXNzYWdlU3RhdHVzIHwgdW5kZWZpbmVkYCB0byBhIHtAbGluayBUZXJtaW5hbFN0YXR1c30uICovXG5leHBvcnQgZnVuY3Rpb24gaXNUZXJtaW5hbFN0YXR1cyhzOiBNZXNzYWdlU3RhdHVzIHwgdW5kZWZpbmVkKTogcyBpcyBUZXJtaW5hbFN0YXR1cyB7XG4gIHJldHVybiBzICE9PSB1bmRlZmluZWQgJiYgKFRFUk1JTkFMX1NUQVRVU0VTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyhzKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgcmF3IEdlbmllIHdpcmUgc3RhdHVzIChgRkVUQ0hJTkdfTUVUQURBVEFgLFxuICogYEFTS0lOR19BSWAsIGBFWEVDVVRJTkdfUVVFUllgLCAuLi4pIGludG8gYSBzaG9ydCwgc2VudGVuY2UtY2FzZWRcbiAqIGxhYmVsIHNhZmUgdG8gZHJvcCBpbnRvIGEgVUkgcGlsbC4gS25vd24gc3RhdGVzIGdldCBhIGN1cmF0ZWRcbiAqIGxhYmVsOyB1bmtub3duIHN0YXRlcyBmYWxsIGJhY2sgdG8gYHN0cmluZy50b2tlbml6ZVdpdGhPcHRpb25zYFxuICogc28gbmV3IHN0YXRlcyBzdGlsbCByZW5kZXIgY2xlYW5seSB3aXRob3V0IGNvZGUgY2hhbmdlcy5cbiAqXG4gKiBQdXJlIChubyBOb2RlLW9ubHkgZGVwcyksIHNhZmUgZm9yIGJyb3dzZXIgYnVuZGxlcy4gQm90aCB0aGVcbiAqIEdlbmllIGFnZW50IChzZXJ2ZXIpIGFuZCBhbnkgVUkgdGhhdCBzdWJzY3JpYmVzIHRvIHN0YXR1cyBldmVudHNcbiAqIGNhbGwgdGhpcyBzbyBsYWJlbHMgc3RheSBpbiBsb2NrLXN0ZXAgYWNyb3NzIHRoZSB3aXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaHVtYW5pemVTdGF0dXMoc3RhdHVzOiBNZXNzYWdlU3RhdHVzKTogc3RyaW5nIHtcbiAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICBjYXNlIFwiRkVUQ0hJTkdfTUVUQURBVEFcIjpcbiAgICAgIHJldHVybiBcIkZldGNoaW5nIG1ldGFkYXRhXCI7XG4gICAgY2FzZSBcIkFTS0lOR19BSVwiOlxuICAgICAgcmV0dXJuIFwiQXNraW5nIEdlbmllXCI7XG4gICAgY2FzZSBcIkVYRUNVVElOR19RVUVSWVwiOlxuICAgICAgcmV0dXJuIFwiUnVubmluZyBTUUwgcXVlcnlcIjtcbiAgICBjYXNlIFwiRklMVEVSSU5HX0NPTlRFWFRcIjpcbiAgICAgIHJldHVybiBcIkZpbHRlcmluZyBjb250ZXh0XCI7XG4gICAgY2FzZSBcIlBFTkRJTkdfV0FSRUhPVVNFXCI6XG4gICAgICByZXR1cm4gXCJXYWl0aW5nIGZvciB3YXJlaG91c2VcIjtcbiAgICBjYXNlIFwiQ09NUExFVEVEXCI6XG4gICAgICByZXR1cm4gXCJDb21wbGV0ZWRcIjtcbiAgICBjYXNlIFwiRkFJTEVEXCI6XG4gICAgICByZXR1cm4gXCJGYWlsZWRcIjtcbiAgICBjYXNlIFwiQ0FOQ0VMTEVEXCI6XG4gICAgICByZXR1cm4gXCJDYW5jZWxsZWRcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFsuLi5zdHJpbmcudG9rZW5pemVXaXRoT3B0aW9ucyh7IGNhcGl0YWxpemU6IHRydWUsIGxvd2VyQ2FzZTogdHJ1ZSB9LCBzdGF0dXMpXS5qb2luKFxuICAgICAgICBcIiBcIixcbiAgICAgICk7XG4gIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYXR0YWNobWVudCB0eXBlIGhlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogSW5zcGVjdCBhIHtAbGluayBHZW5pZUF0dGFjaG1lbnR9IGFuZCByZXR1cm4gdGhlXG4gKiB7QGxpbmsgQXR0YWNobWVudFR5cGV9IG9mIHBheWxvYWQgaXQgY2Fycmllcy4gUmV0dXJucyB0aGUgZmlyc3RcbiAqIGtub3duIHN1Yi1vYmplY3QgdGhhdCdzIHByZXNlbnQ7IGlmIG5vbmUgb2YgdGhlIGtub3duIG9uZXMgYXJlXG4gKiBwb3B1bGF0ZWQsIGZhbGxzIGJhY2sgdG8gdGhlIGZpcnN0IG5vbi1ib29ra2VlcGluZyBrZXlcbiAqIChmb3J3YXJkLWNvbXBhdCBmb3IgdHlwZXMgd2UgZG9uJ3QgbW9kZWwgeWV0KSwgZWxzZSBgXCJ1bmtub3duXCJgLlxuICpcbiAqIEhvbm9ycyBhIHByZS1zZXQgYGF0dGFjaG1lbnRfdHlwZWAgaWYgb25lIGlzIGFscmVhZHkgb24gdGhlXG4gKiB2YWx1ZSwgc28gdGhpcyBpcyBpZGVtcG90ZW50IGFjcm9zcyByZS1kZXRlY3Rpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0QXR0YWNobWVudFR5cGUoYXR0OiBHZW5pZUF0dGFjaG1lbnQpOiBBdHRhY2htZW50VHlwZSB7XG4gIGlmIChhdHQuYXR0YWNobWVudF90eXBlKSByZXR1cm4gYXR0LmF0dGFjaG1lbnRfdHlwZTtcbiAgaWYgKGF0dC5xdWVyeSkgcmV0dXJuIFwicXVlcnlcIjtcbiAgaWYgKGF0dC50ZXh0KSByZXR1cm4gXCJ0ZXh0XCI7XG4gIGlmIChhdHQuc3VnZ2VzdGVkX3F1ZXN0aW9ucykgcmV0dXJuIFwic3VnZ2VzdGVkX3F1ZXN0aW9uc1wiO1xuICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMoYXR0KSkge1xuICAgIGlmIChrICE9PSBcImF0dGFjaG1lbnRfaWRcIiAmJiBrICE9PSBcImF0dGFjaG1lbnRfdHlwZVwiKSByZXR1cm4gaztcbiAgfVxuICByZXR1cm4gXCJ1bmtub3duXCI7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2VuaWVDaGF0IGV2ZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBXaGVyZSBvbiB0aGUgd2lyZSBhbiBldmVudCB3YXMgb2JzZXJ2ZWQuIFNwcmVhZCBpbnRvIGV2ZXJ5XG4gKiBhdHRhY2htZW50LXNjb3BlZCBldmVudCBwYXlsb2FkIHNvIHN1YnNjcmliZXJzIGNhbiByb3V0ZSwgbG9nLFxuICogb3IgY29ycmVsYXRlIHdpdGhvdXQgcmUtd2Fsa2luZyB0aGUgbWVzc2FnZS5cbiAqXG4gKiBGaWVsZHM6XG4gKiAgIC0gYHNwYWNlX2lkYDogdGhlIEdlbmllIHNwYWNlIHRoZSBjb252ZXJzYXRpb24gbGl2ZXMgaW4uXG4gKiAgIC0gYGNvbnZlcnNhdGlvbl9pZGA6IGNvbnZlcnNhdGlvbiBpZCBvbmNlIEdlbmllIGhhcyBhc3NpZ25lZCBvbmUuXG4gKiAgIC0gYG1lc3NhZ2VfaWRgOiBHZW5pZSBtZXNzYWdlIGlkIGZvciB0aGUgYWN0aXZlIHR1cm4uXG4gKiAgIC0gYGF0dGFjaG1lbnRfaWRgOiBhdHRhY2htZW50IHRoZSBldmVudCBjYW1lIGZyb20uIE9wdGlvbmFsXG4gKiAgICAgYmVjYXVzZSBHZW5pZSBzb21ldGltZXMgZW1pdHMgYW4gYW5vbnltb3VzIG1haW4tYW5zd2VyXG4gKiAgICAgYXR0YWNobWVudCB3aXRob3V0IGFuIGlkOyB0aG9zZSBzdGlsbCBnZXQgZXZlbnRzLCBqdXN0IHdpdGhcbiAqICAgICBgYXR0YWNobWVudF9pZGAgdW5kZWZpbmVkLlxuICovXG5leHBvcnQgY29uc3QgR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHNwYWNlX2lkOiB6LnN0cmluZygpLFxuICBjb252ZXJzYXRpb25faWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgbWVzc2FnZV9pZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBhdHRhY2htZW50X2lkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcbmV4cG9ydCB0eXBlIEdlbmllQ2hhdExvY2F0aW9uID0gei5pbmZlcjx0eXBlb2YgR2VuaWVDaGF0TG9jYXRpb25TY2hlbWE+O1xuXG4vKipcbiAqIExpZmVjeWNsZSBldmVudDogdGhlIHF1ZXN0aW9uIHRoaXMgdHVybiBpcyBhc2tpbmcgR2VuaWUuIEZpcmVzXG4gKiBvbmNlIHBlciBgZ2VuaWVFdmVudENoYXRgIGNhbGwsIHRoZSBmaXJzdCB0aW1lIHRoZSB1bmRlcmx5aW5nXG4gKiBgZ2VuaWVDaGF0YCBsb29wIHlpZWxkcyBhIGBHZW5pZU1lc3NhZ2VgLiBDYXJyaWVzIHRoZSBwcm9tcHRcbiAqIHRleHQgR2VuaWUgZWNob2VkIGJhY2sgb24gYG1lc3NhZ2UuY29udGVudGAgYW5kIHRoZSBhc3NpZ25lZFxuICogYG1lc3NhZ2VfaWRgIHNvIHN1YnNjcmliZXJzIGNhbiBncm91cCBldmVyeSBzdWJzZXF1ZW50IGV2ZW50XG4gKiBmb3IgdGhpcyB0dXJuIHVuZGVyIG9uZSBzdGFibGUga2V5LiBgY29udmVyc2F0aW9uX2lkYCBpc1xuICogcG9wdWxhdGVkIGZvciBib3RoIG9wZW5pbmcgYW5kIGZvbGxvdy11cCB0dXJucyAoR2VuaWUgYXNzaWduc1xuICogaXQgb24gYHN0YXJ0Q29udmVyc2F0aW9uYCkuXG4gKlxuICogRGVmZXJyZWQgKGluc3RlYWQgb2YgZmlyZWQgc3luY2hyb25vdXNseSBvbiBlbnRyeSkgc28gdGhlXG4gKiBgbWVzc2FnZV9pZGAgaXMgYXZhaWxhYmxlIHdoZW4gdGhlIGV2ZW50IGxhbmRzIC0gdGhhdCBvbmUgcm91bmRcbiAqIHRyaXAgY29zdHMgfjIwMG1zIGJ1dCBsZXRzIFVJcyByZW5kZXIgcXVlc3Rpb24gLyB0aGlua2luZyAvXG4gKiBxdWVyeSAvIHRleHQgYXMgYSBzaW5nbGUgZ3JvdXBlZCBibG9jayBwZXIgR2VuaWUgY2FsbCBpbnN0ZWFkXG4gKiBvZiBhIGZsYXQgc3RyZWFtLlxuICpcbiAqIGBhdHRhY2htZW50X2lkYCBpcyBpbnRlbnRpb25hbGx5IGFic2VudCAtIHF1ZXN0aW9ucyBhcmUgdHVyblxuICogc2NvcGVkLCBub3QgYXR0YWNobWVudCBzY29wZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBRdWVzdGlvbkV2ZW50U2NoZW1hID0gR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEub21pdCh7XG4gIGF0dGFjaG1lbnRfaWQ6IHRydWUsXG59KS5leHRlbmQoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJxdWVzdGlvblwiKSxcbiAgY29udGVudDogei5zdHJpbmcoKSxcbn0pO1xuZXhwb3J0IHR5cGUgUXVlc3Rpb25FdmVudCA9IHouaW5mZXI8dHlwZW9mIFF1ZXN0aW9uRXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIExpZmVjeWNsZSBldmVudDogcmF3IGBHZW5pZU1lc3NhZ2VgIHNuYXBzaG90IGZvciB0aGUgYWN0aXZlXG4gKiB0dXJuLiBGaXJlcyBvbmNlIHBlciBwb2xsIHlpZWxkLiBUaGUgZnVsbCBtZXNzYWdlIHNoYXBlXG4gKiAoaW5jbHVkaW5nIHRoZSB3aWRlbmVkIHRob3VnaHQgLyByZWdlbiAvIGF0dGFjaG1lbnQtdHlwZVxuICogZmllbGRzKSBpcyBleHBvc2VkIGlubGluZSBhcyBgbWVzc2FnZWA7IGNvbnN1bWVycyBuYXJyb3cgb25cbiAqIGBldmVudC50eXBlID09PSBcIm1lc3NhZ2VcImAgYW5kIHJlYWNoIGZvciBgZXZlbnQubWVzc2FnZWAuXG4gKi9cbmV4cG9ydCBjb25zdCBNZXNzYWdlRXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5vbWl0KHtcbiAgYXR0YWNobWVudF9pZDogdHJ1ZSxcbn0pLmV4dGVuZCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcIm1lc3NhZ2VcIiksXG4gIG1lc3NhZ2U6IEdlbmllTWVzc2FnZVNjaGVtYSxcbn0pO1xuZXhwb3J0IHR5cGUgTWVzc2FnZUV2ZW50ID0gei5pbmZlcjx0eXBlb2YgTWVzc2FnZUV2ZW50U2NoZW1hPjtcblxuLyoqXG4gKiBUb3AtbGV2ZWwgYG1lc3NhZ2Uuc3RhdHVzYCB0cmFuc2l0aW9uZWQuIEZpcmVzIGZvciBldmVyeVxuICogZGlzdGluY3Qgc3RhdHVzIHNlZW4gb24gdGhlIHdpcmUgKGUuZy4gYFNVQk1JVFRFRGAgLT5cbiAqIGBGSUxURVJJTkdfQ09OVEVYVGAgLT4gYEFTS0lOR19BSWAgLT4gYFBFTkRJTkdfV0FSRUhPVVNFYCAtPlxuICogYEFTS0lOR19BSWAgLT4gYENPTVBMRVRFRGApLlxuICovXG5leHBvcnQgY29uc3QgU3RhdHVzRXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5vbWl0KHtcbiAgYXR0YWNobWVudF9pZDogdHJ1ZSxcbn0pLmV4dGVuZCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInN0YXR1c1wiKSxcbiAgc3RhdHVzOiBNZXNzYWdlU3RhdHVzU2NoZW1hLFxuICBwcmV2aW91c19zdGF0dXM6IE1lc3NhZ2VTdGF0dXNTY2hlbWEub3B0aW9uYWwoKSxcbn0pO1xuZXhwb3J0IHR5cGUgU3RhdHVzRXZlbnQgPSB6LmluZmVyPHR5cGVvZiBTdGF0dXNFdmVudFNjaGVtYT47XG5cbi8qKlxuICogQSBuZXcgYXR0YWNobWVudCBzbG90IGFwcGVhcmVkIGluIGBtZXNzYWdlLmF0dGFjaG1lbnRzW11gLlxuICogRmlyZXMgZXhhY3RseSBvbmNlIHBlciBhdHRhY2htZW50IChtYXRjaGVkIGJ5IGBhdHRhY2htZW50X2lkYCxcbiAqIHBvc2l0aW9uYWxseSBmb3IgYW5vbnltb3VzIGF0dGFjaG1lbnRzKSB0aGUgZmlyc3QgdGltZSB3ZSBzZWVcbiAqIGl0LiBUaGUgc2xvdCdzIHBheWxvYWQga2luZCBsYW5kcyBpbiBgYXR0YWNobWVudF90eXBlYCBzbyB0aGVcbiAqIG91dGVyIGB0eXBlYCBkaXNjcmltaW5hdG9yIHN0YXlzIHVuYW1iaWd1b3VzLlxuICovXG5leHBvcnQgY29uc3QgQXR0YWNobWVudEV2ZW50U2NoZW1hID0gR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEuZXh0ZW5kKHtcbiAgdHlwZTogei5saXRlcmFsKFwiYXR0YWNobWVudFwiKSxcbiAgaW5kZXg6IHoubnVtYmVyKCksXG4gIGF0dGFjaG1lbnRfdHlwZTogei5jdXN0b208QXR0YWNobWVudFR5cGU+KCh2KSA9PiB0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiksXG59KTtcbmV4cG9ydCB0eXBlIEF0dGFjaG1lbnRFdmVudCA9IHouaW5mZXI8dHlwZW9mIEF0dGFjaG1lbnRFdmVudFNjaGVtYT47XG5cbi8qKlxuICogQSBuZXcgcmVhc29uaW5nIHN0ZXAgYXBwZWFyZWQgb24gYSBxdWVyeSBhdHRhY2htZW50XG4gKiAoYGF0dGFjaG1lbnRzW2ldLnF1ZXJ5LnRob3VnaHRzW2ldYCkuIERlZHVwbGljYXRlZCBwZXJcbiAqIGAodGhvdWdodF90eXBlLCBjb250ZW50KWAgdHVwbGUgd2l0aGluIGFuIGF0dGFjaG1lbnQgc29cbiAqIHN1YnNjcmliZXJzIGRvbid0IHNlZSB0aGUgc2FtZSB0aG91Z2h0IG11bHRpcGxlIHRpbWVzIC0gR2VuaWVcbiAqIHNvbWV0aW1lcyBtdXRhdGVzIGV4aXN0aW5nIHRob3VnaHQgc2xvdHMgaW4gcGxhY2UsIHNvIHRoZSBkaWZmXG4gKiBpcyB2YWx1ZS1iYXNlZCByYXRoZXIgdGhhbiBwb3NpdGlvbmFsLlxuICovXG5leHBvcnQgY29uc3QgVGhpbmtpbmdFdmVudFNjaGVtYSA9IEdlbmllQ2hhdExvY2F0aW9uU2NoZW1hLmV4dGVuZCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInRoaW5raW5nXCIpLFxuICB0ZXh0OiB6LnN0cmluZygpLFxuICB0aG91Z2h0X3R5cGU6IHouY3VzdG9tPEdlbmllVGhvdWdodFR5cGU+KCh2KSA9PiB0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiksXG59KTtcbmV4cG9ydCB0eXBlIFRoaW5raW5nRXZlbnQgPSB6LmluZmVyPHR5cGVvZiBUaGlua2luZ0V2ZW50U2NoZW1hPjtcblxuLyoqXG4gKiBBIHRleHQtYXR0YWNobWVudCBgY29udGVudGAgZmllbGQgYXBwZWFyZWQgb3IgY2hhbmdlZFxuICogKGBhdHRhY2htZW50c1tpXS50ZXh0LmNvbnRlbnRgKS4gRmlyZXMgd2hlbmV2ZXIgdGhlIHNuYXBzaG90XG4gKiB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIHByZXZpb3VzIG9uZSBmb3IgdGhlIHNhbWUgYXR0YWNobWVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IFRleHRFdmVudFNjaGVtYSA9IEdlbmllQ2hhdExvY2F0aW9uU2NoZW1hLmV4dGVuZCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInRleHRcIiksXG4gIHRleHQ6IHouc3RyaW5nKCksXG59KTtcbmV4cG9ydCB0eXBlIFRleHRFdmVudCA9IHouaW5mZXI8dHlwZW9mIFRleHRFdmVudFNjaGVtYT47XG5cbi8qKlxuICogU1FMIHdhcyBmaW5hbGl6ZWQgb24gYSBxdWVyeSBhdHRhY2htZW50XG4gKiAoYGF0dGFjaG1lbnRzW2ldLnF1ZXJ5LnF1ZXJ5YCkuIEZpcmVzIG9uY2Ugd2hlbiB0aGUgU1FMIHN0cmluZ1xuICogdHJhbnNpdGlvbnMgZnJvbSB1bmRlZmluZWQgdG8gZGVmaW5lZCwgYW5kIGFnYWluIGlmIEdlbmllIGV2ZXJcbiAqIHJld3JpdGVzIGl0LiBgdGl0bGVgIGFuZCBgZGVzY3JpcHRpb25gIGFyZSBkZW5vcm1hbGlzZWQgb2ZmIHRoZVxuICogYXR0YWNobWVudCdzIGBxdWVyeS50aXRsZWAgLyBgcXVlcnkuZGVzY3JpcHRpb25gIHNvIGNvbnN1bWVyc1xuICogY2FuIGxhYmVsIHRoZSBTUUwgcGlsbCB3aXRob3V0IHJlLXdhbGtpbmcgdGhlIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBjb25zdCBRdWVyeUV2ZW50U2NoZW1hID0gR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEuZXh0ZW5kKHtcbiAgdHlwZTogei5saXRlcmFsKFwicXVlcnlcIiksXG4gIHNxbDogei5zdHJpbmcoKSxcbiAgdGl0bGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgZGVzY3JpcHRpb246IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuZXhwb3J0IHR5cGUgUXVlcnlFdmVudCA9IHouaW5mZXI8dHlwZW9mIFF1ZXJ5RXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIFNRTCB3YXMgc3VibWl0dGVkIHRvIGEgU1FMIHdhcmVob3VzZSBhbmQgYSBzdGF0ZW1lbnQgaWQgd2FzXG4gKiBhc3NpZ25lZCAoYGF0dGFjaG1lbnRzW2ldLnF1ZXJ5LnN0YXRlbWVudF9pZGApLiBGaXJlcyB3aGVuIHRoZVxuICogc3RhdGVtZW50IGlkIHRyYW5zaXRpb25zIGZyb20gdW5kZWZpbmVkIHRvIGRlZmluZWQgLSB0aGlzIGlzIHRoZVxuICogcG9pbnQgYXQgd2hpY2ggYGNsaWVudC5zdGF0ZW1lbnRFeGVjdXRpb24uZ2V0U3RhdGVtZW50KHsgc3RhdGVtZW50X2lkIH0pYFxuICogYmVjb21lcyBhIHZhbGlkIGNhbGwuXG4gKi9cbmV4cG9ydCBjb25zdCBTdGF0ZW1lbnRFdmVudFNjaGVtYSA9IEdlbmllQ2hhdExvY2F0aW9uU2NoZW1hLmV4dGVuZCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInN0YXRlbWVudFwiKSxcbiAgc3RhdGVtZW50X2lkOiB6LnN0cmluZygpLFxufSk7XG5leHBvcnQgdHlwZSBTdGF0ZW1lbnRFdmVudCA9IHouaW5mZXI8dHlwZW9mIFN0YXRlbWVudEV2ZW50U2NoZW1hPjtcblxuLyoqXG4gKiBSb3cgY291bnQgZm9yIGEgcXVlcnkgYXR0YWNobWVudCdzIHJlc3VsdCBjaGFuZ2VkXG4gKiAoYGF0dGFjaG1lbnRzW2ldLnF1ZXJ5LnF1ZXJ5X3Jlc3VsdF9tZXRhZGF0YS5yb3dfY291bnRgKS4gRmlyZXNcbiAqIG9uIGV2ZXJ5IGNoYW5nZSwgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGB1bmRlZmluZWQgLT4gMGAgYW5kIHRoZVxuICogbGF0ZXIgYDAgLT4gTmAgb25jZSB0aGUgd2FyZWhvdXNlIGZpbmlzaGVzIGV4ZWN1dGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IFJvd3NFdmVudFNjaGVtYSA9IEdlbmllQ2hhdExvY2F0aW9uU2NoZW1hLmV4dGVuZCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInJvd3NcIiksXG4gIHJvd19jb3VudDogei5udW1iZXIoKSxcbiAgcHJldmlvdXNfcm93X2NvdW50OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHN0YXRlbWVudF9pZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSk7XG5leHBvcnQgdHlwZSBSb3dzRXZlbnQgPSB6LmluZmVyPHR5cGVvZiBSb3dzRXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIEdlbmllIHByb2R1Y2VkIGEgZm9sbG93LXVwIHN1Z2dlc3RlZC1xdWVzdGlvbnMgbGlzdFxuICogKGBhdHRhY2htZW50c1tpXS5zdWdnZXN0ZWRfcXVlc3Rpb25zLnF1ZXN0aW9uc1tdYCkuIEZpcmVzIG9uY2VcbiAqIHdoZW4gdGhlIGxpc3QgYXBwZWFycywgYW5kIGFnYWluIGlmIEdlbmllIHJld3JpdGVzIGl0LlxuICovXG5leHBvcnQgY29uc3QgU3VnZ2VzdGVkUXVlc3Rpb25zRXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5leHRlbmQoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJzdWdnZXN0ZWRfcXVlc3Rpb25zXCIpLFxuICBxdWVzdGlvbnM6IHouYXJyYXkoei5zdHJpbmcoKSksXG59KTtcbmV4cG9ydCB0eXBlIFN1Z2dlc3RlZFF1ZXN0aW9uc0V2ZW50ID0gei5pbmZlcjx0eXBlb2YgU3VnZ2VzdGVkUXVlc3Rpb25zRXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIFRoZSBhY3RpdmUgdHVybiByZWFjaGVkIGEgdGVybWluYWwgc3RhdHVzLiBBbHdheXMgZmlyZXMgb25jZVxuICogcGVyIHR1cm4gKGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB0ZXJtaW5hbCBgbWVzc2FnZWAgZXZlbnQpLlxuICogQ2FycmllcyB0aGUgZmluYWwgYEdlbmllTWVzc2FnZWAgc25hcHNob3QgaW5saW5lIHNvIHN1YnNjcmliZXJzXG4gKiBkb24ndCBuZWVkIHRvIGtlZXAgdGhlaXIgb3duIGNvcHkgb2YgdGhlIGxhc3QgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJlc3VsdEV2ZW50U2NoZW1hID0gR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEub21pdCh7XG4gIGF0dGFjaG1lbnRfaWQ6IHRydWUsXG59KS5leHRlbmQoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJyZXN1bHRcIiksXG4gIHN0YXR1czogei5lbnVtKFRFUk1JTkFMX1NUQVRVU0VTKSxcbiAgbWVzc2FnZTogR2VuaWVNZXNzYWdlU2NoZW1hLFxufSk7XG5leHBvcnQgdHlwZSBSZXN1bHRFdmVudCA9IHouaW5mZXI8dHlwZW9mIFJlc3VsdEV2ZW50U2NoZW1hPjtcblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIHVuaW9uIHlpZWxkZWQgYnkgYGdlbmllRXZlbnRDaGF0YC4gRWFjaCB2YXJpYW50XG4gKiBpcyBhIHNpbmdsZSBmbGF0IG9iamVjdCB3aXRoIGB0eXBlYCBhcyB0aGUgZGlzY3JpbWluYXRvciBhbmRcbiAqIHRoZSBwYXlsb2FkIGZpZWxkcyBob2lzdGVkIGRpcmVjdGx5IHRvIHRoZSB0b3AgbGV2ZWwgLSBub1xuICogYHBheWxvYWRgIHdyYXBwZXIuIENvbnN1bWVycyBuYXJyb3cgb24gYHR5cGVgIGFuZCByZWFkIGZpZWxkc1xuICogaW5saW5lOlxuICpcbiAqIEBleGFtcGxlXG4gKiBmb3IgYXdhaXQgKGNvbnN0IGV2ZW50IG9mIGdlbmllRXZlbnRDaGF0KHNwYWNlSWQsIFwiVG9wIHN0b3Jlcz9cIikpIHtcbiAqICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gKiAgICAgY2FzZSBcInRoaW5raW5nXCI6XG4gKiAgICAgICBjb25zb2xlLmxvZyhldmVudC50aG91Z2h0X3R5cGUsIGV2ZW50LnRleHQpO1xuICogICAgICAgYnJlYWs7XG4gKiAgICAgY2FzZSBcInJlc3VsdFwiOlxuICogICAgICAgY29uc29sZS5sb2coXCJkb25lOlwiLCBldmVudC5zdGF0dXMpO1xuICogICAgICAgYnJlYWs7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBTdHJlYW0gb3JkZXIgcGVyIHR1cm46XG4gKlxuICogICAxLiBgcXVlc3Rpb25gLCBlbWl0dGVkIHdpdGggdGhlIGZpcnN0IGBtZXNzYWdlYCB5aWVsZCAoZGVmZXJyZWQgc29cbiAqICAgICAgdGhlIGFzc2lnbmVkIGBtZXNzYWdlX2lkYCBpcyBhdmFpbGFibGUpLCBjYXJyeWluZyB0aGUgcHJvbXB0XG4gKiAgICAgIHRoaXMgdHVybiBzZW50IHRvIEdlbmllLlxuICogICAyLiBgbWVzc2FnZWAgZm9yIGV2ZXJ5IHBvbGwgeWllbGQgKHJhdyBgR2VuaWVNZXNzYWdlYCBvblxuICogICAgICBgZXZlbnQubWVzc2FnZWApLlxuICogICAzLiBBbnkgZGVyaXZlZCBldmVudHMgdGhlIHNuYXBzaG90IGRpZmYgcHJvZHVjZWQgKGBzdGF0dXNgLFxuICogICAgICBgYXR0YWNobWVudGAsIGB0aGlua2luZ2AsIGB0ZXh0YCwgYHF1ZXJ5YCwgYHN0YXRlbWVudGAsXG4gKiAgICAgIGByb3dzYCwgYHN1Z2dlc3RlZF9xdWVzdGlvbnNgKSBpbiB0aGF0IGZpeGVkIG9yZGVyLlxuICogICA0LiBPbiB0aGUgdGVybWluYWwgc25hcHNob3QsIGEgZmluYWwgYHJlc3VsdGAgZXZlbnQuXG4gKlxuICogRXJyb3JzIHByb3BhZ2F0ZSB2aWEgdGhlIGdlbmVyYXRvciB0aHJvd2luZyAoYHRyeWAvYGNhdGNoYCB0aGVcbiAqIGBmb3IgYXdhaXRgKSwgbm90IHZpYSBhbiBgZXJyb3JgIHZhcmlhbnQgb24gdGhpcyB1bmlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IEdlbmllQ2hhdEV2ZW50U2NoZW1hID0gei5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgUXVlc3Rpb25FdmVudFNjaGVtYSxcbiAgTWVzc2FnZUV2ZW50U2NoZW1hLFxuICBTdGF0dXNFdmVudFNjaGVtYSxcbiAgQXR0YWNobWVudEV2ZW50U2NoZW1hLFxuICBUaGlua2luZ0V2ZW50U2NoZW1hLFxuICBUZXh0RXZlbnRTY2hlbWEsXG4gIFF1ZXJ5RXZlbnRTY2hlbWEsXG4gIFN0YXRlbWVudEV2ZW50U2NoZW1hLFxuICBSb3dzRXZlbnRTY2hlbWEsXG4gIFN1Z2dlc3RlZFF1ZXN0aW9uc0V2ZW50U2NoZW1hLFxuICBSZXN1bHRFdmVudFNjaGVtYSxcbl0pO1xuZXhwb3J0IHR5cGUgR2VuaWVDaGF0RXZlbnQgPSB6LmluZmVyPHR5cGVvZiBHZW5pZUNoYXRFdmVudFNjaGVtYT47XG5cbi8qKiBEaXNjcmltaW5hdG9yIHR5cGUgZm9yIHtAbGluayBHZW5pZUNoYXRFdmVudH0uICovXG5leHBvcnQgdHlwZSBHZW5pZUNoYXRFdmVudFR5cGUgPSBHZW5pZUNoYXRFdmVudFtcInR5cGVcIl07XG5cbi8qKlxuICogRmllbGQgc2V0IGZvciBhIGdpdmVuIHtAbGluayBHZW5pZUNoYXRFdmVudFR5cGV9IC0gdGhlIHZhcmlhbnRcbiAqIHdpdGggdGhlIGB0eXBlYCBkaXNjcmltaW5hdG9yIHN0cmlwcGVkLiBVc2VkIGJ5IGRldGVjdG9ycyBpblxuICogYGV2ZW50LnRzYCBzbyBlYWNoIGRldGVjdG9yIHJldHVybnMganVzdCB0aGUgcGF5bG9hZCBmaWVsZHMgYW5kXG4gKiB0aGUgb3JjaGVzdHJhdG9yIHN0YW1wcyBgdHlwZWAgYXQgeWllbGQgdGltZS5cbiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVDaGF0RXZlbnRGaWVsZHM8VCBleHRlbmRzIEdlbmllQ2hhdEV2ZW50VHlwZT4gPSBPbWl0PFxuICBFeHRyYWN0PEdlbmllQ2hhdEV2ZW50LCB7IHR5cGU6IFQgfT4sXG4gIFwidHlwZVwiXG4+O1xuIl19
@@ -0,0 +1 @@
1
+ {"root":["../src/event.ts","../src/genie-model.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -12,24 +12,28 @@
12
12
  },
13
13
  "dependencies": {
14
14
  "zod": "4.3.6",
15
- "@dbx-tools/shared-core": "0.3.44",
16
- "@dbx-tools/shared-sdk-model": "0.3.44"
15
+ "@dbx-tools/shared-core": "0.4.0",
16
+ "@dbx-tools/shared-sdk-model": "0.4.0"
17
17
  },
18
- "main": "index.ts",
18
+ "main": "./lib/index.js",
19
19
  "license": "UNLICENSED",
20
20
  "publishConfig": {
21
21
  "access": "public"
22
22
  },
23
- "version": "0.3.44",
24
- "types": "index.ts",
23
+ "version": "0.4.0",
24
+ "types": "./lib/index.d.ts",
25
25
  "type": "module",
26
26
  "exports": {
27
- ".": "./index.ts",
27
+ ".": {
28
+ "types": "./lib/index.d.ts",
29
+ "default": "./lib/index.js"
30
+ },
28
31
  "./package.json": "./package.json"
29
32
  },
30
33
  "files": [
31
34
  "index.ts",
32
- "src"
35
+ "src",
36
+ "lib"
33
37
  ],
34
38
  "dbxToolsConfig": {
35
39
  "tags": [