@dbx-tools/shared-genie 0.6.212 → 0.6.213

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -11,6 +11,9 @@ Key features:
11
11
 
12
12
  - Runtime schemas for Genie messages, responses, spaces, attachments, and
13
13
  statuses, including fields observed on the live wire.
14
+ - Forward-compatible Agent Mode SSE schemas plus a pure reducer that projects
15
+ reasoning, SQL, Markdown output, structured table metadata, and terminal
16
+ status into `GenieMessage`.
14
17
  - A flat `GenieChatEvent` vocabulary for thinking, SQL, rows, result, status,
15
18
  and error rendering.
16
19
  - Snapshot diff helpers that emit only newly observed semantic events.
@@ -77,9 +80,10 @@ for (const evt of event.eventsFromMessage(current, previous, spaceId)) {
77
80
  ```
78
81
 
79
82
  Use `eventsFromMessage()` when replaying persisted Genie messages, testing UI
80
- event handling, or building a custom polling loop. Individual detectors are also
81
- exported for targeted checks: `detectStatus`, `detectThinking`, `detectQuery`,
82
- `detectRows`, and the other event-specific helpers.
83
+ event handling, diffing Agent Mode or polling `GenieMessage` snapshots into the
84
+ shared vocabulary, or building a custom polling loop. Individual detectors are
85
+ also exported for targeted checks: `detectStatus`, `detectThinking`,
86
+ `detectQuery`, `detectRows`, and the other event-specific helpers.
83
87
 
84
88
  ## Work With Status And Attachments
85
89
 
@@ -128,6 +132,8 @@ The SDK itself is a dev dependency, so importing this package pulls in zod only.
128
132
 
129
133
  ## Modules
130
134
 
135
+ - `agentMode` - forward-compatible zod schemas plus the pure Agent Mode event
136
+ reducer and `GenieMessage` projector, including inline table metadata.
131
137
  - `genieModel` - Genie schemas, status helpers, attachment helpers, and event
132
138
  union schemas/types.
133
139
  - `event` - event detector factory, individual detectors, and
package/index.ts CHANGED
@@ -3,10 +3,13 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/shared-genie";
6
- export const PACKAGE_VERSION = "0.6.212";
6
+ export const PACKAGE_VERSION = "0.6.213";
7
+ export * as agentMode from "./src/agent-mode.ts";
7
8
  export * as dashboards from "./src/dashboards.ts";
8
9
  export * as event from "./src/event.ts";
9
10
  export * as genieModel from "./src/genie-model.ts";
11
+ export { GenieAgentContentSchema, GenieAgentOutputItemSchema, GenieAgentResponseSchema, GenieAgentModeEventSchema, GenieAgentModeProjection } from "./src/agent-mode.ts";
12
+ export type { GenieAgentOutputItem, GenieAgentResponse, GenieAgentModeEvent } from "./src/agent-mode.ts";
10
13
  export { authorizationDetailsGrantRuleSchema, cronScheduleSchema, lifecycleStateSchema, dashboardViewSchema, deleteScheduleRequestSchema, deleteSubscriptionRequestSchema, genieSuggestedQuestionsAttachmentSchema, genieConversationSchema, genieConversationSummarySchema, genieCreateConversationMessageRequestSchema, genieDeleteConversationMessageRequestSchema, genieDeleteConversationRequestSchema, genieExecuteMessageAttachmentQueryRequestSchema, genieExecuteMessageQueryRequestSchema, genieFeedbackRatingSchema, genieGetConversationMessageRequestSchema, genieGetMessageAttachmentQueryResultRequestSchema, genieGetMessageQueryResultRequestSchema, genieGetMessageQueryResultResponseSchema, genieGetQueryResultByAttachmentRequestSchema, genieGetSpaceRequestSchema, genieListConversationMessagesRequestSchema, genieListConversationsRequestSchema, genieListConversationsResponseSchema, genieListSpacesRequestSchema, genieSpaceSchema, genieFeedbackSchema, resultSchema, messageStatusSchema, queryAttachmentParameterSchema, genieResultMetadataSchema, genieSendMessageFeedbackRequestSchema, genieStartConversationMessageRequestSchema, genieTrashSpaceRequestSchema, getDashboardRequestSchema, getPublishedDashboardRequestSchema, getPublishedDashboardTokenInfoRequestSchema, authorizationDetailsSchema, getScheduleRequestSchema, getSubscriptionRequestSchema, listDashboardsRequestSchema, dashboardSchema, listSchedulesRequestSchema, listSubscriptionsRequestSchema, messageErrorTypeSchema, migrateDashboardRequestSchema, publishRequestSchema, publishedDashboardSchema, schedulePauseStatusSchema, subscriptionSubscriberDestinationSchema, subscriptionSubscriberUserSchema, subscriberSchema, textAttachmentPurposeSchema, trashDashboardRequestSchema, unpublishDashboardRequestSchema, updateDashboardRequestSchema, scheduleSchema, createDashboardRequestSchema, createScheduleRequestSchema, subscriptionSchema, genieQueryAttachmentSchema, textAttachmentSchema, genieListSpacesResponseSchema, genieAttachmentSchema, messageErrorSchema, genieMessageSchema, getPublishedDashboardTokenInfoResponseSchema, listDashboardsResponseSchema, listSchedulesResponseSchema, listSubscriptionsResponseSchema, updateScheduleRequestSchema, createSubscriptionRequestSchema, genieListConversationMessagesResponseSchema, genieStartConversationResponseSchema } from "./src/dashboards.ts";
11
14
  export type { AuthorizationDetailsGrantRule, CronSchedule, LifecycleState, DashboardView, DeleteScheduleRequest, DeleteSubscriptionRequest, GenieSuggestedQuestionsAttachment, GenieConversation, GenieConversationSummary, GenieCreateConversationMessageRequest, GenieDeleteConversationMessageRequest, GenieDeleteConversationRequest, GenieExecuteMessageAttachmentQueryRequest, GenieExecuteMessageQueryRequest, GenieFeedbackRating, GenieGetConversationMessageRequest, GenieGetMessageAttachmentQueryResultRequest, GenieGetMessageQueryResultRequest, GenieGetMessageQueryResultResponse, GenieGetQueryResultByAttachmentRequest, GenieGetSpaceRequest, GenieListConversationMessagesRequest, GenieListConversationsRequest, GenieListConversationsResponse, GenieListSpacesRequest, GenieFeedback, Result, QueryAttachmentParameter, GenieResultMetadata, GenieSendMessageFeedbackRequest, GenieStartConversationMessageRequest, GenieTrashSpaceRequest, GetDashboardRequest, GetPublishedDashboardRequest, GetPublishedDashboardTokenInfoRequest, AuthorizationDetails, GetScheduleRequest, GetSubscriptionRequest, ListDashboardsRequest, Dashboard, ListSchedulesRequest, ListSubscriptionsRequest, MessageErrorType, MigrateDashboardRequest, PublishRequest, PublishedDashboard, SchedulePauseStatus, SubscriptionSubscriberDestination, SubscriptionSubscriberUser, Subscriber, TextAttachmentPurpose, TrashDashboardRequest, UnpublishDashboardRequest, UpdateDashboardRequest, Schedule, CreateDashboardRequest, CreateScheduleRequest, Subscription, TextAttachment, GenieListSpacesResponse, MessageError, GetPublishedDashboardTokenInfoResponse, ListDashboardsResponse, ListSchedulesResponse, ListSubscriptionsResponse, UpdateScheduleRequest, CreateSubscriptionRequest, GenieListConversationMessagesResponse, GenieStartConversationResponse } from "./src/dashboards.ts";
12
15
  export { detectStatus, detectAttachmentAdded, detectThinking, detectText, detectQuery, detectStatement, detectRows, detectSuggestedQuestions } from "./src/event.ts";
package/lib/index.d.ts CHANGED
@@ -1,8 +1,11 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/shared-genie";
2
- export declare const PACKAGE_VERSION = "0.6.212";
2
+ export declare const PACKAGE_VERSION = "0.6.213";
3
+ export * as agentMode from "./src/agent-mode.ts";
3
4
  export * as dashboards from "./src/dashboards.ts";
4
5
  export * as event from "./src/event.ts";
5
6
  export * as genieModel from "./src/genie-model.ts";
7
+ export { GenieAgentContentSchema, GenieAgentOutputItemSchema, GenieAgentResponseSchema, GenieAgentModeEventSchema, GenieAgentModeProjection } from "./src/agent-mode.ts";
8
+ export type { GenieAgentOutputItem, GenieAgentResponse, GenieAgentModeEvent } from "./src/agent-mode.ts";
6
9
  export { authorizationDetailsGrantRuleSchema, cronScheduleSchema, lifecycleStateSchema, dashboardViewSchema, deleteScheduleRequestSchema, deleteSubscriptionRequestSchema, genieSuggestedQuestionsAttachmentSchema, genieConversationSchema, genieConversationSummarySchema, genieCreateConversationMessageRequestSchema, genieDeleteConversationMessageRequestSchema, genieDeleteConversationRequestSchema, genieExecuteMessageAttachmentQueryRequestSchema, genieExecuteMessageQueryRequestSchema, genieFeedbackRatingSchema, genieGetConversationMessageRequestSchema, genieGetMessageAttachmentQueryResultRequestSchema, genieGetMessageQueryResultRequestSchema, genieGetMessageQueryResultResponseSchema, genieGetQueryResultByAttachmentRequestSchema, genieGetSpaceRequestSchema, genieListConversationMessagesRequestSchema, genieListConversationsRequestSchema, genieListConversationsResponseSchema, genieListSpacesRequestSchema, genieSpaceSchema, genieFeedbackSchema, resultSchema, messageStatusSchema, queryAttachmentParameterSchema, genieResultMetadataSchema, genieSendMessageFeedbackRequestSchema, genieStartConversationMessageRequestSchema, genieTrashSpaceRequestSchema, getDashboardRequestSchema, getPublishedDashboardRequestSchema, getPublishedDashboardTokenInfoRequestSchema, authorizationDetailsSchema, getScheduleRequestSchema, getSubscriptionRequestSchema, listDashboardsRequestSchema, dashboardSchema, listSchedulesRequestSchema, listSubscriptionsRequestSchema, messageErrorTypeSchema, migrateDashboardRequestSchema, publishRequestSchema, publishedDashboardSchema, schedulePauseStatusSchema, subscriptionSubscriberDestinationSchema, subscriptionSubscriberUserSchema, subscriberSchema, textAttachmentPurposeSchema, trashDashboardRequestSchema, unpublishDashboardRequestSchema, updateDashboardRequestSchema, scheduleSchema, createDashboardRequestSchema, createScheduleRequestSchema, subscriptionSchema, genieQueryAttachmentSchema, textAttachmentSchema, genieListSpacesResponseSchema, genieAttachmentSchema, messageErrorSchema, genieMessageSchema, getPublishedDashboardTokenInfoResponseSchema, listDashboardsResponseSchema, listSchedulesResponseSchema, listSubscriptionsResponseSchema, updateScheduleRequestSchema, createSubscriptionRequestSchema, genieListConversationMessagesResponseSchema, genieStartConversationResponseSchema } from "./src/dashboards.ts";
7
10
  export type { AuthorizationDetailsGrantRule, CronSchedule, LifecycleState, DashboardView, DeleteScheduleRequest, DeleteSubscriptionRequest, GenieSuggestedQuestionsAttachment, GenieConversation, GenieConversationSummary, GenieCreateConversationMessageRequest, GenieDeleteConversationMessageRequest, GenieDeleteConversationRequest, GenieExecuteMessageAttachmentQueryRequest, GenieExecuteMessageQueryRequest, GenieFeedbackRating, GenieGetConversationMessageRequest, GenieGetMessageAttachmentQueryResultRequest, GenieGetMessageQueryResultRequest, GenieGetMessageQueryResultResponse, GenieGetQueryResultByAttachmentRequest, GenieGetSpaceRequest, GenieListConversationMessagesRequest, GenieListConversationsRequest, GenieListConversationsResponse, GenieListSpacesRequest, GenieFeedback, Result, QueryAttachmentParameter, GenieResultMetadata, GenieSendMessageFeedbackRequest, GenieStartConversationMessageRequest, GenieTrashSpaceRequest, GetDashboardRequest, GetPublishedDashboardRequest, GetPublishedDashboardTokenInfoRequest, AuthorizationDetails, GetScheduleRequest, GetSubscriptionRequest, ListDashboardsRequest, Dashboard, ListSchedulesRequest, ListSubscriptionsRequest, MessageErrorType, MigrateDashboardRequest, PublishRequest, PublishedDashboard, SchedulePauseStatus, SubscriptionSubscriberDestination, SubscriptionSubscriberUser, Subscriber, TextAttachmentPurpose, TrashDashboardRequest, UnpublishDashboardRequest, UpdateDashboardRequest, Schedule, CreateDashboardRequest, CreateScheduleRequest, Subscription, TextAttachment, GenieListSpacesResponse, MessageError, GetPublishedDashboardTokenInfoResponse, ListDashboardsResponse, ListSchedulesResponse, ListSubscriptionsResponse, UpdateScheduleRequest, CreateSubscriptionRequest, GenieListConversationMessagesResponse, GenieStartConversationResponse } from "./src/dashboards.ts";
8
11
  export { detectStatus, detectAttachmentAdded, detectThinking, detectText, detectQuery, detectStatement, detectRows, detectSuggestedQuestions } from "./src/event.ts";
package/lib/index.js CHANGED
@@ -2,11 +2,13 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/shared-genie";
5
- export const PACKAGE_VERSION = "0.6.212";
5
+ export const PACKAGE_VERSION = "0.6.213";
6
+ export * as agentMode from "./src/agent-mode.js";
6
7
  export * as dashboards from "./src/dashboards.js";
7
8
  export * as event from "./src/event.js";
8
9
  export * as genieModel from "./src/genie-model.js";
10
+ export { GenieAgentContentSchema, GenieAgentOutputItemSchema, GenieAgentResponseSchema, GenieAgentModeEventSchema, GenieAgentModeProjection } from "./src/agent-mode.js";
9
11
  export { authorizationDetailsGrantRuleSchema, cronScheduleSchema, lifecycleStateSchema, dashboardViewSchema, deleteScheduleRequestSchema, deleteSubscriptionRequestSchema, genieSuggestedQuestionsAttachmentSchema, genieConversationSchema, genieConversationSummarySchema, genieCreateConversationMessageRequestSchema, genieDeleteConversationMessageRequestSchema, genieDeleteConversationRequestSchema, genieExecuteMessageAttachmentQueryRequestSchema, genieExecuteMessageQueryRequestSchema, genieFeedbackRatingSchema, genieGetConversationMessageRequestSchema, genieGetMessageAttachmentQueryResultRequestSchema, genieGetMessageQueryResultRequestSchema, genieGetMessageQueryResultResponseSchema, genieGetQueryResultByAttachmentRequestSchema, genieGetSpaceRequestSchema, genieListConversationMessagesRequestSchema, genieListConversationsRequestSchema, genieListConversationsResponseSchema, genieListSpacesRequestSchema, genieSpaceSchema, genieFeedbackSchema, resultSchema, messageStatusSchema, queryAttachmentParameterSchema, genieResultMetadataSchema, genieSendMessageFeedbackRequestSchema, genieStartConversationMessageRequestSchema, genieTrashSpaceRequestSchema, getDashboardRequestSchema, getPublishedDashboardRequestSchema, getPublishedDashboardTokenInfoRequestSchema, authorizationDetailsSchema, getScheduleRequestSchema, getSubscriptionRequestSchema, listDashboardsRequestSchema, dashboardSchema, listSchedulesRequestSchema, listSubscriptionsRequestSchema, messageErrorTypeSchema, migrateDashboardRequestSchema, publishRequestSchema, publishedDashboardSchema, schedulePauseStatusSchema, subscriptionSubscriberDestinationSchema, subscriptionSubscriberUserSchema, subscriberSchema, textAttachmentPurposeSchema, trashDashboardRequestSchema, unpublishDashboardRequestSchema, updateDashboardRequestSchema, scheduleSchema, createDashboardRequestSchema, createScheduleRequestSchema, subscriptionSchema, genieQueryAttachmentSchema, textAttachmentSchema, genieListSpacesResponseSchema, genieAttachmentSchema, messageErrorSchema, genieMessageSchema, getPublishedDashboardTokenInfoResponseSchema, listDashboardsResponseSchema, listSchedulesResponseSchema, listSubscriptionsResponseSchema, updateScheduleRequestSchema, createSubscriptionRequestSchema, genieListConversationMessagesResponseSchema, genieStartConversationResponseSchema } from "./src/dashboards.js";
10
12
  export { detectStatus, detectAttachmentAdded, detectThinking, detectText, detectQuery, detectStatement, detectRows, detectSuggestedQuestions } from "./src/event.js";
11
13
  export { MessageStatusSchema, GenieThoughtSchema, ATTACHMENT_TYPES, GenieQueryAttachmentSchema, GenieTextAttachmentSchema, GenieAttachmentSchema, GenieMessageSchema, GenieResponseSchema, GenieSpaceSchema, TERMINAL_STATUSES, GenieChatLocationSchema, QuestionEventSchema, MessageEventSchema, StatusEventSchema, AttachmentEventSchema, ThinkingEventSchema, TextEventSchema, QueryEventSchema, StatementEventSchema, RowsEventSchema, SuggestedQuestionsEventSchema, ResultEventSchema, GenieChatEventSchema } from "./src/genie-model.js";
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx5QkFBeUIsQ0FBQztBQUM1RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssVUFBVSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0IsRUFBRSxtQkFBbUIsRUFBRSwyQkFBMkIsRUFBRSwrQkFBK0IsRUFBRSx1Q0FBdUMsRUFBRSx1QkFBdUIsRUFBRSw4QkFBOEIsRUFBRSwyQ0FBMkMsRUFBRSwyQ0FBMkMsRUFBRSxvQ0FBb0MsRUFBRSwrQ0FBK0MsRUFBRSxxQ0FBcUMsRUFBRSx5QkFBeUIsRUFBRSx3Q0FBd0MsRUFBRSxpREFBaUQsRUFBRSx1Q0FBdUMsRUFBRSx3Q0FBd0MsRUFBRSw0Q0FBNEMsRUFBRSwwQkFBMEIsRUFBRSwwQ0FBMEMsRUFBRSxtQ0FBbUMsRUFBRSxvQ0FBb0MsRUFBRSw0QkFBNEIsRUFBRSxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsOEJBQThCLEVBQUUseUJBQXlCLEVBQUUscUNBQXFDLEVBQUUsMENBQTBDLEVBQUUsNEJBQTRCLEVBQUUseUJBQXlCLEVBQUUsa0NBQWtDLEVBQUUsMkNBQTJDLEVBQUUsMEJBQTBCLEVBQUUsd0JBQXdCLEVBQUUsNEJBQTRCLEVBQUUsMkJBQTJCLEVBQUUsZUFBZSxFQUFFLDBCQUEwQixFQUFFLDhCQUE4QixFQUFFLHNCQUFzQixFQUFFLDZCQUE2QixFQUFFLG9CQUFvQixFQUFFLHdCQUF3QixFQUFFLHlCQUF5QixFQUFFLHVDQUF1QyxFQUFFLGdDQUFnQyxFQUFFLGdCQUFnQixFQUFFLDJCQUEyQixFQUFFLDJCQUEyQixFQUFFLCtCQUErQixFQUFFLDRCQUE0QixFQUFFLGNBQWMsRUFBRSw0QkFBNEIsRUFBRSwyQkFBMkIsRUFBRSxrQkFBa0IsRUFBRSwwQkFBMEIsRUFBRSxvQkFBb0IsRUFBRSw2QkFBNkIsRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSw0Q0FBNEMsRUFBRSw0QkFBNEIsRUFBRSwyQkFBMkIsRUFBRSwrQkFBK0IsRUFBRSwyQkFBMkIsRUFBRSwrQkFBK0IsRUFBRSwyQ0FBMkMsRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTd5RSxPQUFPLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNySyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsMEJBQTBCLEVBQUUseUJBQXlCLEVBQUUscUJBQXFCLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixFQUFFLGVBQWUsRUFBRSw2QkFBNkIsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9zaGFyZWQtZ2VuaWVcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuNi4yMTJcIjtcbmV4cG9ydCAqIGFzIGRhc2hib2FyZHMgZnJvbSBcIi4vc3JjL2Rhc2hib2FyZHMudHNcIjtcbmV4cG9ydCAqIGFzIGV2ZW50IGZyb20gXCIuL3NyYy9ldmVudC50c1wiO1xuZXhwb3J0ICogYXMgZ2VuaWVNb2RlbCBmcm9tIFwiLi9zcmMvZ2VuaWUtbW9kZWwudHNcIjtcbmV4cG9ydCB7IGF1dGhvcml6YXRpb25EZXRhaWxzR3JhbnRSdWxlU2NoZW1hLCBjcm9uU2NoZWR1bGVTY2hlbWEsIGxpZmVjeWNsZVN0YXRlU2NoZW1hLCBkYXNoYm9hcmRWaWV3U2NoZW1hLCBkZWxldGVTY2hlZHVsZVJlcXVlc3RTY2hlbWEsIGRlbGV0ZVN1YnNjcmlwdGlvblJlcXVlc3RTY2hlbWEsIGdlbmllU3VnZ2VzdGVkUXVlc3Rpb25zQXR0YWNobWVudFNjaGVtYSwgZ2VuaWVDb252ZXJzYXRpb25TY2hlbWEsIGdlbmllQ29udmVyc2F0aW9uU3VtbWFyeVNjaGVtYSwgZ2VuaWVDcmVhdGVDb252ZXJzYXRpb25NZXNzYWdlUmVxdWVzdFNjaGVtYSwgZ2VuaWVEZWxldGVDb252ZXJzYXRpb25NZXNzYWdlUmVxdWVzdFNjaGVtYSwgZ2VuaWVEZWxldGVDb252ZXJzYXRpb25SZXF1ZXN0U2NoZW1hLCBnZW5pZUV4ZWN1dGVNZXNzYWdlQXR0YWNobWVudFF1ZXJ5UmVxdWVzdFNjaGVtYSwgZ2VuaWVFeGVjdXRlTWVzc2FnZVF1ZXJ5UmVxdWVzdFNjaGVtYSwgZ2VuaWVGZWVkYmFja1JhdGluZ1NjaGVtYSwgZ2VuaWVHZXRDb252ZXJzYXRpb25NZXNzYWdlUmVxdWVzdFNjaGVtYSwgZ2VuaWVHZXRNZXNzYWdlQXR0YWNobWVudFF1ZXJ5UmVzdWx0UmVxdWVzdFNjaGVtYSwgZ2VuaWVHZXRNZXNzYWdlUXVlcnlSZXN1bHRSZXF1ZXN0U2NoZW1hLCBnZW5pZUdldE1lc3NhZ2VRdWVyeVJlc3VsdFJlc3BvbnNlU2NoZW1hLCBnZW5pZUdldFF1ZXJ5UmVzdWx0QnlBdHRhY2htZW50UmVxdWVzdFNjaGVtYSwgZ2VuaWVHZXRTcGFjZVJlcXVlc3RTY2hlbWEsIGdlbmllTGlzdENvbnZlcnNhdGlvbk1lc3NhZ2VzUmVxdWVzdFNjaGVtYSwgZ2VuaWVMaXN0Q29udmVyc2F0aW9uc1JlcXVlc3RTY2hlbWEsIGdlbmllTGlzdENvbnZlcnNhdGlvbnNSZXNwb25zZVNjaGVtYSwgZ2VuaWVMaXN0U3BhY2VzUmVxdWVzdFNjaGVtYSwgZ2VuaWVTcGFjZVNjaGVtYSwgZ2VuaWVGZWVkYmFja1NjaGVtYSwgcmVzdWx0U2NoZW1hLCBtZXNzYWdlU3RhdHVzU2NoZW1hLCBxdWVyeUF0dGFjaG1lbnRQYXJhbWV0ZXJTY2hlbWEsIGdlbmllUmVzdWx0TWV0YWRhdGFTY2hlbWEsIGdlbmllU2VuZE1lc3NhZ2VGZWVkYmFja1JlcXVlc3RTY2hlbWEsIGdlbmllU3RhcnRDb252ZXJzYXRpb25NZXNzYWdlUmVxdWVzdFNjaGVtYSwgZ2VuaWVUcmFzaFNwYWNlUmVxdWVzdFNjaGVtYSwgZ2V0RGFzaGJvYXJkUmVxdWVzdFNjaGVtYSwgZ2V0UHVibGlzaGVkRGFzaGJvYXJkUmVxdWVzdFNjaGVtYSwgZ2V0UHVibGlzaGVkRGFzaGJvYXJkVG9rZW5JbmZvUmVxdWVzdFNjaGVtYSwgYXV0aG9yaXphdGlvbkRldGFpbHNTY2hlbWEsIGdldFNjaGVkdWxlUmVxdWVzdFNjaGVtYSwgZ2V0U3Vic2NyaXB0aW9uUmVxdWVzdFNjaGVtYSwgbGlzdERhc2hib2FyZHNSZXF1ZXN0U2NoZW1hLCBkYXNoYm9hcmRTY2hlbWEsIGxpc3RTY2hlZHVsZXNSZXF1ZXN0U2NoZW1hLCBsaXN0U3Vic2NyaXB0aW9uc1JlcXVlc3RTY2hlbWEsIG1lc3NhZ2VFcnJvclR5cGVTY2hlbWEsIG1pZ3JhdGVEYXNoYm9hcmRSZXF1ZXN0U2NoZW1hLCBwdWJsaXNoUmVxdWVzdFNjaGVtYSwgcHVibGlzaGVkRGFzaGJvYXJkU2NoZW1hLCBzY2hlZHVsZVBhdXNlU3RhdHVzU2NoZW1hLCBzdWJzY3JpcHRpb25TdWJzY3JpYmVyRGVzdGluYXRpb25TY2hlbWEsIHN1YnNjcmlwdGlvblN1YnNjcmliZXJVc2VyU2NoZW1hLCBzdWJzY3JpYmVyU2NoZW1hLCB0ZXh0QXR0YWNobWVudFB1cnBvc2VTY2hlbWEsIHRyYXNoRGFzaGJvYXJkUmVxdWVzdFNjaGVtYSwgdW5wdWJsaXNoRGFzaGJvYXJkUmVxdWVzdFNjaGVtYSwgdXBkYXRlRGFzaGJvYXJkUmVxdWVzdFNjaGVtYSwgc2NoZWR1bGVTY2hlbWEsIGNyZWF0ZURhc2hib2FyZFJlcXVlc3RTY2hlbWEsIGNyZWF0ZVNjaGVkdWxlUmVxdWVzdFNjaGVtYSwgc3Vic2NyaXB0aW9uU2NoZW1hLCBnZW5pZVF1ZXJ5QXR0YWNobWVudFNjaGVtYSwgdGV4dEF0dGFjaG1lbnRTY2hlbWEsIGdlbmllTGlzdFNwYWNlc1Jlc3BvbnNlU2NoZW1hLCBnZW5pZUF0dGFjaG1lbnRTY2hlbWEsIG1lc3NhZ2VFcnJvclNjaGVtYSwgZ2VuaWVNZXNzYWdlU2NoZW1hLCBnZXRQdWJsaXNoZWREYXNoYm9hcmRUb2tlbkluZm9SZXNwb25zZVNjaGVtYSwgbGlzdERhc2hib2FyZHNSZXNwb25zZVNjaGVtYSwgbGlzdFNjaGVkdWxlc1Jlc3BvbnNlU2NoZW1hLCBsaXN0U3Vic2NyaXB0aW9uc1Jlc3BvbnNlU2NoZW1hLCB1cGRhdGVTY2hlZHVsZVJlcXVlc3RTY2hlbWEsIGNyZWF0ZVN1YnNjcmlwdGlvblJlcXVlc3RTY2hlbWEsIGdlbmllTGlzdENvbnZlcnNhdGlvbk1lc3NhZ2VzUmVzcG9uc2VTY2hlbWEsIGdlbmllU3RhcnRDb252ZXJzYXRpb25SZXNwb25zZVNjaGVtYSB9IGZyb20gXCIuL3NyYy9kYXNoYm9hcmRzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF1dGhvcml6YXRpb25EZXRhaWxzR3JhbnRSdWxlLCBDcm9uU2NoZWR1bGUsIExpZmVjeWNsZVN0YXRlLCBEYXNoYm9hcmRWaWV3LCBEZWxldGVTY2hlZHVsZVJlcXVlc3QsIERlbGV0ZVN1YnNjcmlwdGlvblJlcXVlc3QsIEdlbmllU3VnZ2VzdGVkUXVlc3Rpb25zQXR0YWNobWVudCwgR2VuaWVDb252ZXJzYXRpb24sIEdlbmllQ29udmVyc2F0aW9uU3VtbWFyeSwgR2VuaWVDcmVhdGVDb252ZXJzYXRpb25NZXNzYWdlUmVxdWVzdCwgR2VuaWVEZWxldGVDb252ZXJzYXRpb25NZXNzYWdlUmVxdWVzdCwgR2VuaWVEZWxldGVDb252ZXJzYXRpb25SZXF1ZXN0LCBHZW5pZUV4ZWN1dGVNZXNzYWdlQXR0YWNobWVudFF1ZXJ5UmVxdWVzdCwgR2VuaWVFeGVjdXRlTWVzc2FnZVF1ZXJ5UmVxdWVzdCwgR2VuaWVGZWVkYmFja1JhdGluZywgR2VuaWVHZXRDb252ZXJzYXRpb25NZXNzYWdlUmVxdWVzdCwgR2VuaWVHZXRNZXNzYWdlQXR0YWNobWVudFF1ZXJ5UmVzdWx0UmVxdWVzdCwgR2VuaWVHZXRNZXNzYWdlUXVlcnlSZXN1bHRSZXF1ZXN0LCBHZW5pZUdldE1lc3NhZ2VRdWVyeVJlc3VsdFJlc3BvbnNlLCBHZW5pZUdldFF1ZXJ5UmVzdWx0QnlBdHRhY2htZW50UmVxdWVzdCwgR2VuaWVHZXRTcGFjZVJlcXVlc3QsIEdlbmllTGlzdENvbnZlcnNhdGlvbk1lc3NhZ2VzUmVxdWVzdCwgR2VuaWVMaXN0Q29udmVyc2F0aW9uc1JlcXVlc3QsIEdlbmllTGlzdENvbnZlcnNhdGlvbnNSZXNwb25zZSwgR2VuaWVMaXN0U3BhY2VzUmVxdWVzdCwgR2VuaWVGZWVkYmFjaywgUmVzdWx0LCBRdWVyeUF0dGFjaG1lbnRQYXJhbWV0ZXIsIEdlbmllUmVzdWx0TWV0YWRhdGEsIEdlbmllU2VuZE1lc3NhZ2VGZWVkYmFja1JlcXVlc3QsIEdlbmllU3RhcnRDb252ZXJzYXRpb25NZXNzYWdlUmVxdWVzdCwgR2VuaWVUcmFzaFNwYWNlUmVxdWVzdCwgR2V0RGFzaGJvYXJkUmVxdWVzdCwgR2V0UHVibGlzaGVkRGFzaGJvYXJkUmVxdWVzdCwgR2V0UHVibGlzaGVkRGFzaGJvYXJkVG9rZW5JbmZvUmVxdWVzdCwgQXV0aG9yaXphdGlvbkRldGFpbHMsIEdldFNjaGVkdWxlUmVxdWVzdCwgR2V0U3Vic2NyaXB0aW9uUmVxdWVzdCwgTGlzdERhc2hib2FyZHNSZXF1ZXN0LCBEYXNoYm9hcmQsIExpc3RTY2hlZHVsZXNSZXF1ZXN0LCBMaXN0U3Vic2NyaXB0aW9uc1JlcXVlc3QsIE1lc3NhZ2VFcnJvclR5cGUsIE1pZ3JhdGVEYXNoYm9hcmRSZXF1ZXN0LCBQdWJsaXNoUmVxdWVzdCwgUHVibGlzaGVkRGFzaGJvYXJkLCBTY2hlZHVsZVBhdXNlU3RhdHVzLCBTdWJzY3JpcHRpb25TdWJzY3JpYmVyRGVzdGluYXRpb24sIFN1YnNjcmlwdGlvblN1YnNjcmliZXJVc2VyLCBTdWJzY3JpYmVyLCBUZXh0QXR0YWNobWVudFB1cnBvc2UsIFRyYXNoRGFzaGJvYXJkUmVxdWVzdCwgVW5wdWJsaXNoRGFzaGJvYXJkUmVxdWVzdCwgVXBkYXRlRGFzaGJvYXJkUmVxdWVzdCwgU2NoZWR1bGUsIENyZWF0ZURhc2hib2FyZFJlcXVlc3QsIENyZWF0ZVNjaGVkdWxlUmVxdWVzdCwgU3Vic2NyaXB0aW9uLCBUZXh0QXR0YWNobWVudCwgR2VuaWVMaXN0U3BhY2VzUmVzcG9uc2UsIE1lc3NhZ2VFcnJvciwgR2V0UHVibGlzaGVkRGFzaGJvYXJkVG9rZW5JbmZvUmVzcG9uc2UsIExpc3REYXNoYm9hcmRzUmVzcG9uc2UsIExpc3RTY2hlZHVsZXNSZXNwb25zZSwgTGlzdFN1YnNjcmlwdGlvbnNSZXNwb25zZSwgVXBkYXRlU2NoZWR1bGVSZXF1ZXN0LCBDcmVhdGVTdWJzY3JpcHRpb25SZXF1ZXN0LCBHZW5pZUxpc3RDb252ZXJzYXRpb25NZXNzYWdlc1Jlc3BvbnNlLCBHZW5pZVN0YXJ0Q29udmVyc2F0aW9uUmVzcG9uc2UgfSBmcm9tIFwiLi9zcmMvZGFzaGJvYXJkcy50c1wiO1xuZXhwb3J0IHsgZGV0ZWN0U3RhdHVzLCBkZXRlY3RBdHRhY2htZW50QWRkZWQsIGRldGVjdFRoaW5raW5nLCBkZXRlY3RUZXh0LCBkZXRlY3RRdWVyeSwgZGV0ZWN0U3RhdGVtZW50LCBkZXRlY3RSb3dzLCBkZXRlY3RTdWdnZXN0ZWRRdWVzdGlvbnMgfSBmcm9tIFwiLi9zcmMvZXZlbnQudHNcIjtcbmV4cG9ydCB7IE1lc3NhZ2VTdGF0dXNTY2hlbWEsIEdlbmllVGhvdWdodFNjaGVtYSwgQVRUQUNITUVOVF9UWVBFUywgR2VuaWVRdWVyeUF0dGFjaG1lbnRTY2hlbWEsIEdlbmllVGV4dEF0dGFjaG1lbnRTY2hlbWEsIEdlbmllQXR0YWNobWVudFNjaGVtYSwgR2VuaWVNZXNzYWdlU2NoZW1hLCBHZW5pZVJlc3BvbnNlU2NoZW1hLCBHZW5pZVNwYWNlU2NoZW1hLCBURVJNSU5BTF9TVEFUVVNFUywgR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEsIFF1ZXN0aW9uRXZlbnRTY2hlbWEsIE1lc3NhZ2VFdmVudFNjaGVtYSwgU3RhdHVzRXZlbnRTY2hlbWEsIEF0dGFjaG1lbnRFdmVudFNjaGVtYSwgVGhpbmtpbmdFdmVudFNjaGVtYSwgVGV4dEV2ZW50U2NoZW1hLCBRdWVyeUV2ZW50U2NoZW1hLCBTdGF0ZW1lbnRFdmVudFNjaGVtYSwgUm93c0V2ZW50U2NoZW1hLCBTdWdnZXN0ZWRRdWVzdGlvbnNFdmVudFNjaGVtYSwgUmVzdWx0RXZlbnRTY2hlbWEsIEdlbmllQ2hhdEV2ZW50U2NoZW1hIH0gZnJvbSBcIi4vc3JjL2dlbmllLW1vZGVsLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1lc3NhZ2VTdGF0dXMsIEdlbmllVGhvdWdodFR5cGUsIEdlbmllVGhvdWdodCwgS25vd25BdHRhY2htZW50VHlwZSwgQXR0YWNobWVudFR5cGUsIEdlbmllUXVlcnlBdHRhY2htZW50LCBHZW5pZVRleHRBdHRhY2htZW50UHVycG9zZSwgR2VuaWVUZXh0QXR0YWNobWVudCwgR2VuaWVBdHRhY2htZW50LCBHZW5pZU1lc3NhZ2UsIEdlbmllUmVzcG9uc2UsIEdlbmllU3BhY2UsIFRlcm1pbmFsU3RhdHVzLCBHZW5pZUNoYXRMb2NhdGlvbiwgUXVlc3Rpb25FdmVudCwgTWVzc2FnZUV2ZW50LCBTdGF0dXNFdmVudCwgQXR0YWNobWVudEV2ZW50LCBUaGlua2luZ0V2ZW50LCBUZXh0RXZlbnQsIFF1ZXJ5RXZlbnQsIFN0YXRlbWVudEV2ZW50LCBSb3dzRXZlbnQsIFN1Z2dlc3RlZFF1ZXN0aW9uc0V2ZW50LCBSZXN1bHRFdmVudCwgR2VuaWVDaGF0RXZlbnQsIEdlbmllQ2hhdEV2ZW50VHlwZSwgR2VuaWVDaGF0RXZlbnRGaWVsZHMgfSBmcm9tIFwiLi9zcmMvZ2VuaWUtbW9kZWwudHNcIjtcbiJdfQ==
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx5QkFBeUIsQ0FBQztBQUM1RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxTQUFTLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLDBCQUEwQixFQUFFLHdCQUF3QixFQUFFLHlCQUF5QixFQUFFLHdCQUF3QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFekssT0FBTyxFQUFFLG1DQUFtQyxFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUFFLG1CQUFtQixFQUFFLDJCQUEyQixFQUFFLCtCQUErQixFQUFFLHVDQUF1QyxFQUFFLHVCQUF1QixFQUFFLDhCQUE4QixFQUFFLDJDQUEyQyxFQUFFLDJDQUEyQyxFQUFFLG9DQUFvQyxFQUFFLCtDQUErQyxFQUFFLHFDQUFxQyxFQUFFLHlCQUF5QixFQUFFLHdDQUF3QyxFQUFFLGlEQUFpRCxFQUFFLHVDQUF1QyxFQUFFLHdDQUF3QyxFQUFFLDRDQUE0QyxFQUFFLDBCQUEwQixFQUFFLDBDQUEwQyxFQUFFLG1DQUFtQyxFQUFFLG9DQUFvQyxFQUFFLDRCQUE0QixFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSw4QkFBOEIsRUFBRSx5QkFBeUIsRUFBRSxxQ0FBcUMsRUFBRSwwQ0FBMEMsRUFBRSw0QkFBNEIsRUFBRSx5QkFBeUIsRUFBRSxrQ0FBa0MsRUFBRSwyQ0FBMkMsRUFBRSwwQkFBMEIsRUFBRSx3QkFBd0IsRUFBRSw0QkFBNEIsRUFBRSwyQkFBMkIsRUFBRSxlQUFlLEVBQUUsMEJBQTBCLEVBQUUsOEJBQThCLEVBQUUsc0JBQXNCLEVBQUUsNkJBQTZCLEVBQUUsb0JBQW9CLEVBQUUsd0JBQXdCLEVBQUUseUJBQXlCLEVBQUUsdUNBQXVDLEVBQUUsZ0NBQWdDLEVBQUUsZ0JBQWdCLEVBQUUsMkJBQTJCLEVBQUUsMkJBQTJCLEVBQUUsK0JBQStCLEVBQUUsNEJBQTRCLEVBQUUsY0FBYyxFQUFFLDRCQUE0QixFQUFFLDJCQUEyQixFQUFFLGtCQUFrQixFQUFFLDBCQUEwQixFQUFFLG9CQUFvQixFQUFFLDZCQUE2QixFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLDRDQUE0QyxFQUFFLDRCQUE0QixFQUFFLDJCQUEyQixFQUFFLCtCQUErQixFQUFFLDJCQUEyQixFQUFFLCtCQUErQixFQUFFLDJDQUEyQyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFN3lFLE9BQU8sRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JLLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSwwQkFBMEIsRUFBRSx5QkFBeUIsRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSx1QkFBdUIsRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLDZCQUE2QixFQUFFLGlCQUFpQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0JBQXNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL3NoYXJlZC1nZW5pZVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC42LjIxM1wiO1xuZXhwb3J0ICogYXMgYWdlbnRNb2RlIGZyb20gXCIuL3NyYy9hZ2VudC1tb2RlLnRzXCI7XG5leHBvcnQgKiBhcyBkYXNoYm9hcmRzIGZyb20gXCIuL3NyYy9kYXNoYm9hcmRzLnRzXCI7XG5leHBvcnQgKiBhcyBldmVudCBmcm9tIFwiLi9zcmMvZXZlbnQudHNcIjtcbmV4cG9ydCAqIGFzIGdlbmllTW9kZWwgZnJvbSBcIi4vc3JjL2dlbmllLW1vZGVsLnRzXCI7XG5leHBvcnQgeyBHZW5pZUFnZW50Q29udGVudFNjaGVtYSwgR2VuaWVBZ2VudE91dHB1dEl0ZW1TY2hlbWEsIEdlbmllQWdlbnRSZXNwb25zZVNjaGVtYSwgR2VuaWVBZ2VudE1vZGVFdmVudFNjaGVtYSwgR2VuaWVBZ2VudE1vZGVQcm9qZWN0aW9uIH0gZnJvbSBcIi4vc3JjL2FnZW50LW1vZGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgR2VuaWVBZ2VudE91dHB1dEl0ZW0sIEdlbmllQWdlbnRSZXNwb25zZSwgR2VuaWVBZ2VudE1vZGVFdmVudCB9IGZyb20gXCIuL3NyYy9hZ2VudC1tb2RlLnRzXCI7XG5leHBvcnQgeyBhdXRob3JpemF0aW9uRGV0YWlsc0dyYW50UnVsZVNjaGVtYSwgY3JvblNjaGVkdWxlU2NoZW1hLCBsaWZlY3ljbGVTdGF0ZVNjaGVtYSwgZGFzaGJvYXJkVmlld1NjaGVtYSwgZGVsZXRlU2NoZWR1bGVSZXF1ZXN0U2NoZW1hLCBkZWxldGVTdWJzY3JpcHRpb25SZXF1ZXN0U2NoZW1hLCBnZW5pZVN1Z2dlc3RlZFF1ZXN0aW9uc0F0dGFjaG1lbnRTY2hlbWEsIGdlbmllQ29udmVyc2F0aW9uU2NoZW1hLCBnZW5pZUNvbnZlcnNhdGlvblN1bW1hcnlTY2hlbWEsIGdlbmllQ3JlYXRlQ29udmVyc2F0aW9uTWVzc2FnZVJlcXVlc3RTY2hlbWEsIGdlbmllRGVsZXRlQ29udmVyc2F0aW9uTWVzc2FnZVJlcXVlc3RTY2hlbWEsIGdlbmllRGVsZXRlQ29udmVyc2F0aW9uUmVxdWVzdFNjaGVtYSwgZ2VuaWVFeGVjdXRlTWVzc2FnZUF0dGFjaG1lbnRRdWVyeVJlcXVlc3RTY2hlbWEsIGdlbmllRXhlY3V0ZU1lc3NhZ2VRdWVyeVJlcXVlc3RTY2hlbWEsIGdlbmllRmVlZGJhY2tSYXRpbmdTY2hlbWEsIGdlbmllR2V0Q29udmVyc2F0aW9uTWVzc2FnZVJlcXVlc3RTY2hlbWEsIGdlbmllR2V0TWVzc2FnZUF0dGFjaG1lbnRRdWVyeVJlc3VsdFJlcXVlc3RTY2hlbWEsIGdlbmllR2V0TWVzc2FnZVF1ZXJ5UmVzdWx0UmVxdWVzdFNjaGVtYSwgZ2VuaWVHZXRNZXNzYWdlUXVlcnlSZXN1bHRSZXNwb25zZVNjaGVtYSwgZ2VuaWVHZXRRdWVyeVJlc3VsdEJ5QXR0YWNobWVudFJlcXVlc3RTY2hlbWEsIGdlbmllR2V0U3BhY2VSZXF1ZXN0U2NoZW1hLCBnZW5pZUxpc3RDb252ZXJzYXRpb25NZXNzYWdlc1JlcXVlc3RTY2hlbWEsIGdlbmllTGlzdENvbnZlcnNhdGlvbnNSZXF1ZXN0U2NoZW1hLCBnZW5pZUxpc3RDb252ZXJzYXRpb25zUmVzcG9uc2VTY2hlbWEsIGdlbmllTGlzdFNwYWNlc1JlcXVlc3RTY2hlbWEsIGdlbmllU3BhY2VTY2hlbWEsIGdlbmllRmVlZGJhY2tTY2hlbWEsIHJlc3VsdFNjaGVtYSwgbWVzc2FnZVN0YXR1c1NjaGVtYSwgcXVlcnlBdHRhY2htZW50UGFyYW1ldGVyU2NoZW1hLCBnZW5pZVJlc3VsdE1ldGFkYXRhU2NoZW1hLCBnZW5pZVNlbmRNZXNzYWdlRmVlZGJhY2tSZXF1ZXN0U2NoZW1hLCBnZW5pZVN0YXJ0Q29udmVyc2F0aW9uTWVzc2FnZVJlcXVlc3RTY2hlbWEsIGdlbmllVHJhc2hTcGFjZVJlcXVlc3RTY2hlbWEsIGdldERhc2hib2FyZFJlcXVlc3RTY2hlbWEsIGdldFB1Ymxpc2hlZERhc2hib2FyZFJlcXVlc3RTY2hlbWEsIGdldFB1Ymxpc2hlZERhc2hib2FyZFRva2VuSW5mb1JlcXVlc3RTY2hlbWEsIGF1dGhvcml6YXRpb25EZXRhaWxzU2NoZW1hLCBnZXRTY2hlZHVsZVJlcXVlc3RTY2hlbWEsIGdldFN1YnNjcmlwdGlvblJlcXVlc3RTY2hlbWEsIGxpc3REYXNoYm9hcmRzUmVxdWVzdFNjaGVtYSwgZGFzaGJvYXJkU2NoZW1hLCBsaXN0U2NoZWR1bGVzUmVxdWVzdFNjaGVtYSwgbGlzdFN1YnNjcmlwdGlvbnNSZXF1ZXN0U2NoZW1hLCBtZXNzYWdlRXJyb3JUeXBlU2NoZW1hLCBtaWdyYXRlRGFzaGJvYXJkUmVxdWVzdFNjaGVtYSwgcHVibGlzaFJlcXVlc3RTY2hlbWEsIHB1Ymxpc2hlZERhc2hib2FyZFNjaGVtYSwgc2NoZWR1bGVQYXVzZVN0YXR1c1NjaGVtYSwgc3Vic2NyaXB0aW9uU3Vic2NyaWJlckRlc3RpbmF0aW9uU2NoZW1hLCBzdWJzY3JpcHRpb25TdWJzY3JpYmVyVXNlclNjaGVtYSwgc3Vic2NyaWJlclNjaGVtYSwgdGV4dEF0dGFjaG1lbnRQdXJwb3NlU2NoZW1hLCB0cmFzaERhc2hib2FyZFJlcXVlc3RTY2hlbWEsIHVucHVibGlzaERhc2hib2FyZFJlcXVlc3RTY2hlbWEsIHVwZGF0ZURhc2hib2FyZFJlcXVlc3RTY2hlbWEsIHNjaGVkdWxlU2NoZW1hLCBjcmVhdGVEYXNoYm9hcmRSZXF1ZXN0U2NoZW1hLCBjcmVhdGVTY2hlZHVsZVJlcXVlc3RTY2hlbWEsIHN1YnNjcmlwdGlvblNjaGVtYSwgZ2VuaWVRdWVyeUF0dGFjaG1lbnRTY2hlbWEsIHRleHRBdHRhY2htZW50U2NoZW1hLCBnZW5pZUxpc3RTcGFjZXNSZXNwb25zZVNjaGVtYSwgZ2VuaWVBdHRhY2htZW50U2NoZW1hLCBtZXNzYWdlRXJyb3JTY2hlbWEsIGdlbmllTWVzc2FnZVNjaGVtYSwgZ2V0UHVibGlzaGVkRGFzaGJvYXJkVG9rZW5JbmZvUmVzcG9uc2VTY2hlbWEsIGxpc3REYXNoYm9hcmRzUmVzcG9uc2VTY2hlbWEsIGxpc3RTY2hlZHVsZXNSZXNwb25zZVNjaGVtYSwgbGlzdFN1YnNjcmlwdGlvbnNSZXNwb25zZVNjaGVtYSwgdXBkYXRlU2NoZWR1bGVSZXF1ZXN0U2NoZW1hLCBjcmVhdGVTdWJzY3JpcHRpb25SZXF1ZXN0U2NoZW1hLCBnZW5pZUxpc3RDb252ZXJzYXRpb25NZXNzYWdlc1Jlc3BvbnNlU2NoZW1hLCBnZW5pZVN0YXJ0Q29udmVyc2F0aW9uUmVzcG9uc2VTY2hlbWEgfSBmcm9tIFwiLi9zcmMvZGFzaGJvYXJkcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBBdXRob3JpemF0aW9uRGV0YWlsc0dyYW50UnVsZSwgQ3JvblNjaGVkdWxlLCBMaWZlY3ljbGVTdGF0ZSwgRGFzaGJvYXJkVmlldywgRGVsZXRlU2NoZWR1bGVSZXF1ZXN0LCBEZWxldGVTdWJzY3JpcHRpb25SZXF1ZXN0LCBHZW5pZVN1Z2dlc3RlZFF1ZXN0aW9uc0F0dGFjaG1lbnQsIEdlbmllQ29udmVyc2F0aW9uLCBHZW5pZUNvbnZlcnNhdGlvblN1bW1hcnksIEdlbmllQ3JlYXRlQ29udmVyc2F0aW9uTWVzc2FnZVJlcXVlc3QsIEdlbmllRGVsZXRlQ29udmVyc2F0aW9uTWVzc2FnZVJlcXVlc3QsIEdlbmllRGVsZXRlQ29udmVyc2F0aW9uUmVxdWVzdCwgR2VuaWVFeGVjdXRlTWVzc2FnZUF0dGFjaG1lbnRRdWVyeVJlcXVlc3QsIEdlbmllRXhlY3V0ZU1lc3NhZ2VRdWVyeVJlcXVlc3QsIEdlbmllRmVlZGJhY2tSYXRpbmcsIEdlbmllR2V0Q29udmVyc2F0aW9uTWVzc2FnZVJlcXVlc3QsIEdlbmllR2V0TWVzc2FnZUF0dGFjaG1lbnRRdWVyeVJlc3VsdFJlcXVlc3QsIEdlbmllR2V0TWVzc2FnZVF1ZXJ5UmVzdWx0UmVxdWVzdCwgR2VuaWVHZXRNZXNzYWdlUXVlcnlSZXN1bHRSZXNwb25zZSwgR2VuaWVHZXRRdWVyeVJlc3VsdEJ5QXR0YWNobWVudFJlcXVlc3QsIEdlbmllR2V0U3BhY2VSZXF1ZXN0LCBHZW5pZUxpc3RDb252ZXJzYXRpb25NZXNzYWdlc1JlcXVlc3QsIEdlbmllTGlzdENvbnZlcnNhdGlvbnNSZXF1ZXN0LCBHZW5pZUxpc3RDb252ZXJzYXRpb25zUmVzcG9uc2UsIEdlbmllTGlzdFNwYWNlc1JlcXVlc3QsIEdlbmllRmVlZGJhY2ssIFJlc3VsdCwgUXVlcnlBdHRhY2htZW50UGFyYW1ldGVyLCBHZW5pZVJlc3VsdE1ldGFkYXRhLCBHZW5pZVNlbmRNZXNzYWdlRmVlZGJhY2tSZXF1ZXN0LCBHZW5pZVN0YXJ0Q29udmVyc2F0aW9uTWVzc2FnZVJlcXVlc3QsIEdlbmllVHJhc2hTcGFjZVJlcXVlc3QsIEdldERhc2hib2FyZFJlcXVlc3QsIEdldFB1Ymxpc2hlZERhc2hib2FyZFJlcXVlc3QsIEdldFB1Ymxpc2hlZERhc2hib2FyZFRva2VuSW5mb1JlcXVlc3QsIEF1dGhvcml6YXRpb25EZXRhaWxzLCBHZXRTY2hlZHVsZVJlcXVlc3QsIEdldFN1YnNjcmlwdGlvblJlcXVlc3QsIExpc3REYXNoYm9hcmRzUmVxdWVzdCwgRGFzaGJvYXJkLCBMaXN0U2NoZWR1bGVzUmVxdWVzdCwgTGlzdFN1YnNjcmlwdGlvbnNSZXF1ZXN0LCBNZXNzYWdlRXJyb3JUeXBlLCBNaWdyYXRlRGFzaGJvYXJkUmVxdWVzdCwgUHVibGlzaFJlcXVlc3QsIFB1Ymxpc2hlZERhc2hib2FyZCwgU2NoZWR1bGVQYXVzZVN0YXR1cywgU3Vic2NyaXB0aW9uU3Vic2NyaWJlckRlc3RpbmF0aW9uLCBTdWJzY3JpcHRpb25TdWJzY3JpYmVyVXNlciwgU3Vic2NyaWJlciwgVGV4dEF0dGFjaG1lbnRQdXJwb3NlLCBUcmFzaERhc2hib2FyZFJlcXVlc3QsIFVucHVibGlzaERhc2hib2FyZFJlcXVlc3QsIFVwZGF0ZURhc2hib2FyZFJlcXVlc3QsIFNjaGVkdWxlLCBDcmVhdGVEYXNoYm9hcmRSZXF1ZXN0LCBDcmVhdGVTY2hlZHVsZVJlcXVlc3QsIFN1YnNjcmlwdGlvbiwgVGV4dEF0dGFjaG1lbnQsIEdlbmllTGlzdFNwYWNlc1Jlc3BvbnNlLCBNZXNzYWdlRXJyb3IsIEdldFB1Ymxpc2hlZERhc2hib2FyZFRva2VuSW5mb1Jlc3BvbnNlLCBMaXN0RGFzaGJvYXJkc1Jlc3BvbnNlLCBMaXN0U2NoZWR1bGVzUmVzcG9uc2UsIExpc3RTdWJzY3JpcHRpb25zUmVzcG9uc2UsIFVwZGF0ZVNjaGVkdWxlUmVxdWVzdCwgQ3JlYXRlU3Vic2NyaXB0aW9uUmVxdWVzdCwgR2VuaWVMaXN0Q29udmVyc2F0aW9uTWVzc2FnZXNSZXNwb25zZSwgR2VuaWVTdGFydENvbnZlcnNhdGlvblJlc3BvbnNlIH0gZnJvbSBcIi4vc3JjL2Rhc2hib2FyZHMudHNcIjtcbmV4cG9ydCB7IGRldGVjdFN0YXR1cywgZGV0ZWN0QXR0YWNobWVudEFkZGVkLCBkZXRlY3RUaGlua2luZywgZGV0ZWN0VGV4dCwgZGV0ZWN0UXVlcnksIGRldGVjdFN0YXRlbWVudCwgZGV0ZWN0Um93cywgZGV0ZWN0U3VnZ2VzdGVkUXVlc3Rpb25zIH0gZnJvbSBcIi4vc3JjL2V2ZW50LnRzXCI7XG5leHBvcnQgeyBNZXNzYWdlU3RhdHVzU2NoZW1hLCBHZW5pZVRob3VnaHRTY2hlbWEsIEFUVEFDSE1FTlRfVFlQRVMsIEdlbmllUXVlcnlBdHRhY2htZW50U2NoZW1hLCBHZW5pZVRleHRBdHRhY2htZW50U2NoZW1hLCBHZW5pZUF0dGFjaG1lbnRTY2hlbWEsIEdlbmllTWVzc2FnZVNjaGVtYSwgR2VuaWVSZXNwb25zZVNjaGVtYSwgR2VuaWVTcGFjZVNjaGVtYSwgVEVSTUlOQUxfU1RBVFVTRVMsIEdlbmllQ2hhdExvY2F0aW9uU2NoZW1hLCBRdWVzdGlvbkV2ZW50U2NoZW1hLCBNZXNzYWdlRXZlbnRTY2hlbWEsIFN0YXR1c0V2ZW50U2NoZW1hLCBBdHRhY2htZW50RXZlbnRTY2hlbWEsIFRoaW5raW5nRXZlbnRTY2hlbWEsIFRleHRFdmVudFNjaGVtYSwgUXVlcnlFdmVudFNjaGVtYSwgU3RhdGVtZW50RXZlbnRTY2hlbWEsIFJvd3NFdmVudFNjaGVtYSwgU3VnZ2VzdGVkUXVlc3Rpb25zRXZlbnRTY2hlbWEsIFJlc3VsdEV2ZW50U2NoZW1hLCBHZW5pZUNoYXRFdmVudFNjaGVtYSB9IGZyb20gXCIuL3NyYy9nZW5pZS1tb2RlbC50c1wiO1xuZXhwb3J0IHR5cGUgeyBNZXNzYWdlU3RhdHVzLCBHZW5pZVRob3VnaHRUeXBlLCBHZW5pZVRob3VnaHQsIEtub3duQXR0YWNobWVudFR5cGUsIEF0dGFjaG1lbnRUeXBlLCBHZW5pZVF1ZXJ5QXR0YWNobWVudCwgR2VuaWVUZXh0QXR0YWNobWVudFB1cnBvc2UsIEdlbmllVGV4dEF0dGFjaG1lbnQsIEdlbmllQXR0YWNobWVudCwgR2VuaWVNZXNzYWdlLCBHZW5pZVJlc3BvbnNlLCBHZW5pZVNwYWNlLCBUZXJtaW5hbFN0YXR1cywgR2VuaWVDaGF0TG9jYXRpb24sIFF1ZXN0aW9uRXZlbnQsIE1lc3NhZ2VFdmVudCwgU3RhdHVzRXZlbnQsIEF0dGFjaG1lbnRFdmVudCwgVGhpbmtpbmdFdmVudCwgVGV4dEV2ZW50LCBRdWVyeUV2ZW50LCBTdGF0ZW1lbnRFdmVudCwgUm93c0V2ZW50LCBTdWdnZXN0ZWRRdWVzdGlvbnNFdmVudCwgUmVzdWx0RXZlbnQsIEdlbmllQ2hhdEV2ZW50LCBHZW5pZUNoYXRFdmVudFR5cGUsIEdlbmllQ2hhdEV2ZW50RmllbGRzIH0gZnJvbSBcIi4vc3JjL2dlbmllLW1vZGVsLnRzXCI7XG4iXX0=
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Browser-safe Genie Agent Mode SSE contracts.
3
+ *
4
+ * Schemas validate the stable Responses-style event envelope while preserving
5
+ * additive fields and output-item variants introduced by the beta API.
6
+ *
7
+ * @module
8
+ */
9
+ import { z } from "zod";
10
+ import { type GenieMessage } from "./genie-model.ts";
11
+ /** Agent Mode output content item with forward-compatible fields. */
12
+ export declare const GenieAgentContentSchema: z.ZodObject<{
13
+ type: z.ZodString;
14
+ text: z.ZodOptional<z.ZodString>;
15
+ metadata: z.ZodOptional<z.ZodUnknown>;
16
+ }, z.core.$loose>;
17
+ /** Agent Mode response output item with known projection fields. */
18
+ export declare const GenieAgentOutputItemSchema: z.ZodObject<{
19
+ type: z.ZodString;
20
+ id: z.ZodOptional<z.ZodString>;
21
+ call_id: z.ZodOptional<z.ZodString>;
22
+ name: z.ZodOptional<z.ZodString>;
23
+ arguments: z.ZodOptional<z.ZodString>;
24
+ output: z.ZodOptional<z.ZodString>;
25
+ status: z.ZodOptional<z.ZodString>;
26
+ content: z.ZodOptional<z.ZodArray<z.ZodObject<{
27
+ type: z.ZodString;
28
+ text: z.ZodOptional<z.ZodString>;
29
+ metadata: z.ZodOptional<z.ZodUnknown>;
30
+ }, z.core.$loose>>>;
31
+ }, z.core.$loose>;
32
+ /** Genie Agent Mode response carried by lifecycle events. */
33
+ export declare const GenieAgentResponseSchema: z.ZodObject<{
34
+ object: z.ZodOptional<z.ZodString>;
35
+ id: z.ZodString;
36
+ model: z.ZodOptional<z.ZodString>;
37
+ status: z.ZodString;
38
+ output: z.ZodOptional<z.ZodArray<z.ZodObject<{
39
+ type: z.ZodString;
40
+ id: z.ZodOptional<z.ZodString>;
41
+ call_id: z.ZodOptional<z.ZodString>;
42
+ name: z.ZodOptional<z.ZodString>;
43
+ arguments: z.ZodOptional<z.ZodString>;
44
+ output: z.ZodOptional<z.ZodString>;
45
+ status: z.ZodOptional<z.ZodString>;
46
+ content: z.ZodOptional<z.ZodArray<z.ZodObject<{
47
+ type: z.ZodString;
48
+ text: z.ZodOptional<z.ZodString>;
49
+ metadata: z.ZodOptional<z.ZodUnknown>;
50
+ }, z.core.$loose>>>;
51
+ }, z.core.$loose>>>;
52
+ conversation_id: z.ZodOptional<z.ZodString>;
53
+ created_at: z.ZodOptional<z.ZodNumber>;
54
+ error: z.ZodOptional<z.ZodUnknown>;
55
+ }, z.core.$loose>;
56
+ /** One SSE event from the Genie Agent Mode response stream. */
57
+ export declare const GenieAgentModeEventSchema: z.ZodObject<{
58
+ type: z.ZodString;
59
+ sequence_number: z.ZodOptional<z.ZodNumber>;
60
+ output_index: z.ZodOptional<z.ZodNumber>;
61
+ response: z.ZodOptional<z.ZodObject<{
62
+ object: z.ZodOptional<z.ZodString>;
63
+ id: z.ZodString;
64
+ model: z.ZodOptional<z.ZodString>;
65
+ status: z.ZodString;
66
+ output: z.ZodOptional<z.ZodArray<z.ZodObject<{
67
+ type: z.ZodString;
68
+ id: z.ZodOptional<z.ZodString>;
69
+ call_id: z.ZodOptional<z.ZodString>;
70
+ name: z.ZodOptional<z.ZodString>;
71
+ arguments: z.ZodOptional<z.ZodString>;
72
+ output: z.ZodOptional<z.ZodString>;
73
+ status: z.ZodOptional<z.ZodString>;
74
+ content: z.ZodOptional<z.ZodArray<z.ZodObject<{
75
+ type: z.ZodString;
76
+ text: z.ZodOptional<z.ZodString>;
77
+ metadata: z.ZodOptional<z.ZodUnknown>;
78
+ }, z.core.$loose>>>;
79
+ }, z.core.$loose>>>;
80
+ conversation_id: z.ZodOptional<z.ZodString>;
81
+ created_at: z.ZodOptional<z.ZodNumber>;
82
+ error: z.ZodOptional<z.ZodUnknown>;
83
+ }, z.core.$loose>>;
84
+ item: z.ZodOptional<z.ZodObject<{
85
+ type: z.ZodString;
86
+ id: z.ZodOptional<z.ZodString>;
87
+ call_id: z.ZodOptional<z.ZodString>;
88
+ name: z.ZodOptional<z.ZodString>;
89
+ arguments: z.ZodOptional<z.ZodString>;
90
+ output: z.ZodOptional<z.ZodString>;
91
+ status: z.ZodOptional<z.ZodString>;
92
+ content: z.ZodOptional<z.ZodArray<z.ZodObject<{
93
+ type: z.ZodString;
94
+ text: z.ZodOptional<z.ZodString>;
95
+ metadata: z.ZodOptional<z.ZodUnknown>;
96
+ }, z.core.$loose>>>;
97
+ }, z.core.$loose>>;
98
+ }, z.core.$loose>;
99
+ /** Validated Agent Mode response output item. */
100
+ export type GenieAgentOutputItem = z.infer<typeof GenieAgentOutputItemSchema>;
101
+ /** Validated Agent Mode response. */
102
+ export type GenieAgentResponse = z.infer<typeof GenieAgentResponseSchema>;
103
+ /** Validated Agent Mode SSE event. */
104
+ export type GenieAgentModeEvent = z.infer<typeof GenieAgentModeEventSchema>;
105
+ /** Stateful pure reducer from Agent Mode SSE events to Genie message snapshots. */
106
+ export declare class GenieAgentModeProjection {
107
+ private readonly spaceId;
108
+ private readonly content;
109
+ private readonly items;
110
+ private response;
111
+ constructor(spaceId: string, content: string);
112
+ /** Apply one validated SSE event and return its projected snapshot. */
113
+ apply(event: GenieAgentModeEvent): GenieMessage | undefined;
114
+ /** Current response id, once `response.created` has arrived. */
115
+ get responseId(): string | undefined;
116
+ /** Current conversation id, once assigned by Genie. */
117
+ get conversationId(): string | undefined;
118
+ /** Whether the latest response status is terminal. */
119
+ get terminal(): boolean;
120
+ }
121
+ /** Project one Agent Mode response snapshot onto the shared Genie message shape. */
122
+ export declare function projectAgentModeMessage(spaceId: string, content: string, response: GenieAgentResponse, items: GenieAgentOutputItem[]): GenieMessage;
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Browser-safe Genie Agent Mode SSE contracts.
3
+ *
4
+ * Schemas validate the stable Responses-style event envelope while preserving
5
+ * additive fields and output-item variants introduced by the beta API.
6
+ *
7
+ * @module
8
+ */
9
+ import { z } from "zod";
10
+ import { json, object } from "@dbx-tools/shared-core";
11
+ import { GenieMessageSchema, } from "./genie-model.js";
12
+ /** Agent Mode output content item with forward-compatible fields. */
13
+ export const GenieAgentContentSchema = z
14
+ .object({
15
+ type: z.string(),
16
+ text: z.string().optional(),
17
+ metadata: z.unknown().optional(),
18
+ })
19
+ .loose();
20
+ /** Agent Mode response output item with known projection fields. */
21
+ export const GenieAgentOutputItemSchema = z
22
+ .object({
23
+ type: z.string(),
24
+ id: z.string().optional(),
25
+ call_id: z.string().optional(),
26
+ name: z.string().optional(),
27
+ arguments: z.string().optional(),
28
+ output: z.string().optional(),
29
+ status: z.string().optional(),
30
+ content: z.array(GenieAgentContentSchema).optional(),
31
+ })
32
+ .loose();
33
+ /** Genie Agent Mode response carried by lifecycle events. */
34
+ export const GenieAgentResponseSchema = z
35
+ .object({
36
+ object: z.string().optional(),
37
+ id: z.string(),
38
+ model: z.string().optional(),
39
+ status: z.string(),
40
+ output: z.array(GenieAgentOutputItemSchema).optional(),
41
+ conversation_id: z.string().optional(),
42
+ created_at: z.number().optional(),
43
+ error: z.unknown().optional(),
44
+ })
45
+ .loose();
46
+ /** One SSE event from the Genie Agent Mode response stream. */
47
+ export const GenieAgentModeEventSchema = z
48
+ .object({
49
+ type: z.string(),
50
+ sequence_number: z.number().optional(),
51
+ output_index: z.number().optional(),
52
+ response: GenieAgentResponseSchema.optional(),
53
+ item: GenieAgentOutputItemSchema.optional(),
54
+ })
55
+ .loose();
56
+ /** Stateful pure reducer from Agent Mode SSE events to Genie message snapshots. */
57
+ export class GenieAgentModeProjection {
58
+ spaceId;
59
+ content;
60
+ items = new Map();
61
+ response;
62
+ constructor(spaceId, content) {
63
+ this.spaceId = spaceId;
64
+ this.content = content;
65
+ }
66
+ /** Apply one validated SSE event and return its projected snapshot. */
67
+ apply(event) {
68
+ if (event.response) {
69
+ this.response = event.response;
70
+ if (event.response.output) {
71
+ this.items.clear();
72
+ event.response.output.forEach((item, index) => {
73
+ this.items.set(agentItemKey(item, index), item);
74
+ });
75
+ }
76
+ }
77
+ if (event.item) {
78
+ this.items.set(agentItemKey(event.item, event.output_index), event.item);
79
+ }
80
+ if ((!event.response && !event.item) || !this.response)
81
+ return undefined;
82
+ return projectAgentModeMessage(this.spaceId, this.content, this.response, [
83
+ ...this.items.values(),
84
+ ]);
85
+ }
86
+ /** Current response id, once `response.created` has arrived. */
87
+ get responseId() {
88
+ return this.response?.id;
89
+ }
90
+ /** Current conversation id, once assigned by Genie. */
91
+ get conversationId() {
92
+ return this.response?.conversation_id;
93
+ }
94
+ /** Whether the latest response status is terminal. */
95
+ get terminal() {
96
+ return this.response ? isTerminalStatus(this.response.status) : false;
97
+ }
98
+ }
99
+ function isTerminalStatus(status) {
100
+ return status === "completed" || status === "failed" || status === "cancelled";
101
+ }
102
+ function agentItemKey(item, index) {
103
+ if (typeof item.id === "string")
104
+ return item.id;
105
+ if (typeof item.call_id === "string")
106
+ return item.call_id;
107
+ return String(typeof index === "number" ? index : (item.type ?? "item"));
108
+ }
109
+ /** Project one Agent Mode response snapshot onto the shared Genie message shape. */
110
+ export function projectAgentModeMessage(spaceId, content, response, items) {
111
+ const errorValue = object.isRecord(response.error) ? response.error : undefined;
112
+ const errorMessage = typeof errorValue?.message === "string"
113
+ ? errorValue.message
114
+ : typeof response.error === "string"
115
+ ? response.error
116
+ : undefined;
117
+ return GenieMessageSchema.parse({
118
+ id: response.id,
119
+ message_id: response.id,
120
+ space_id: spaceId,
121
+ conversation_id: response.conversation_id ?? "",
122
+ content,
123
+ status: agentModeStatus(response.status, items),
124
+ attachments: items.flatMap(itemAttachments),
125
+ ...(response.created_at !== undefined ? { created_timestamp: response.created_at } : {}),
126
+ ...(errorMessage ? { error: { error: errorMessage } } : {}),
127
+ });
128
+ }
129
+ function agentModeStatus(value, items) {
130
+ if (value === "completed")
131
+ return "COMPLETED";
132
+ if (value === "failed")
133
+ return "FAILED";
134
+ if (value === "cancelled")
135
+ return "CANCELLED";
136
+ if (items.some((item) => item.type === "function_call"))
137
+ return "EXECUTING_QUERY";
138
+ return "ASKING_AI";
139
+ }
140
+ function itemAttachments(item) {
141
+ const id = item.id ?? item.call_id;
142
+ if (item.type === "reasoning") {
143
+ const thoughts = contentText(item.content, "reasoning_text").map((thoughtContent) => ({
144
+ thought_type: "THOUGHT_TYPE_STEPS",
145
+ content: thoughtContent,
146
+ }));
147
+ return thoughts.length === 0
148
+ ? []
149
+ : [{ attachment_id: id, attachment_type: "query", query: { id, thoughts } }];
150
+ }
151
+ if (item.type === "function_call") {
152
+ const argumentsValue = json.parseRecord(item.arguments);
153
+ const query = typeof argumentsValue?.sql === "string"
154
+ ? argumentsValue.sql
155
+ : typeof argumentsValue?.query === "string"
156
+ ? argumentsValue.query
157
+ : undefined;
158
+ const title = typeof argumentsValue?.title === "string" ? argumentsValue.title : item.name;
159
+ return query
160
+ ? [
161
+ {
162
+ attachment_id: id,
163
+ attachment_type: "query",
164
+ query: {
165
+ id,
166
+ query,
167
+ ...(title ? { title } : {}),
168
+ },
169
+ },
170
+ ]
171
+ : [];
172
+ }
173
+ if (item.type === "function_call_output" && item.output !== undefined) {
174
+ return [textAttachment(id, item.output)];
175
+ }
176
+ if (item.type === "message") {
177
+ return (item.content ?? []).flatMap((part) => part.type === "output_text" && part.text
178
+ ? [textAttachment(id, part.text, part.metadata)]
179
+ : []);
180
+ }
181
+ return [];
182
+ }
183
+ function contentText(value, type) {
184
+ if (!value)
185
+ return [];
186
+ return value.flatMap((part) => (part.type === type && part.text ? [part.text] : []));
187
+ }
188
+ function textAttachment(id, content, metadata) {
189
+ return {
190
+ attachment_id: id,
191
+ attachment_type: "text",
192
+ text: {
193
+ id,
194
+ content,
195
+ purpose: "TEXT_ATTACHMENT_PURPOSE_ANSWER",
196
+ ...(metadata !== undefined ? { metadata } : {}),
197
+ },
198
+ };
199
+ }
200
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtbW9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZ2VudC1tb2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFFSCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFdEQsT0FBTyxFQUNMLGtCQUFrQixHQUluQixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLHFFQUFxRTtBQUNyRSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDO0tBQ3JDLE1BQU0sQ0FBQztJQUNOLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0lBQ2hCLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzNCLFFBQVEsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQ2pDLENBQUM7S0FDRCxLQUFLLEVBQUUsQ0FBQztBQUVYLG9FQUFvRTtBQUNwRSxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxDQUFDO0tBQ3hDLE1BQU0sQ0FBQztJQUNOLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0lBQ2hCLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3pCLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzlCLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzNCLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ2hDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzdCLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMs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QUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2hELENBQUMsQ0FBQyxFQUFFLENBQ1AsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FDbEIsS0FBNEQsRUFDNUQsSUFBWTtJQUVaLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDdEIsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3ZGLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FDckIsRUFBc0IsRUFDdEIsT0FBZSxFQUNmLFFBQWtCO0lBRWxCLE9BQU87UUFDTCxhQUFhLEVBQUUsRUFBRTtRQUNqQixlQUFlLEVBQUUsTUFBTTtRQUN2QixJQUFJLEVBQUU7WUFDSixFQUFFO1lBQ0YsT0FBTztZQUNQLE9BQU8sRUFBRSxnQ0FBZ0M7WUFDekMsR0FBRyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNoRDtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCcm93c2VyLXNhZmUgR2VuaWUgQWdlbnQgTW9kZSBTU0UgY29udHJhY3RzLlxuICpcbiAqIFNjaGVtYXMgdmFsaWRhdGUgdGhlIHN0YWJsZSBSZXNwb25zZXMtc3R5bGUgZXZlbnQgZW52ZWxvcGUgd2hpbGUgcHJlc2VydmluZ1xuICogYWRkaXRpdmUgZmllbGRzIGFuZCBvdXRwdXQtaXRlbSB2YXJpYW50cyBpbnRyb2R1Y2VkIGJ5IHRoZSBiZXRhIEFQSS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IGpzb24sIG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbmltcG9ydCB7XG4gIEdlbmllTWVzc2FnZVNjaGVtYSxcbiAgdHlwZSBHZW5pZUF0dGFjaG1lbnQsXG4gIHR5cGUgR2VuaWVNZXNzYWdlLFxuICB0eXBlIEdlbmllVGhvdWdodCxcbn0gZnJvbSBcIi4vZ2VuaWUtbW9kZWwudHNcIjtcblxuLyoqIEFnZW50IE1vZGUgb3V0cHV0IGNvbnRlbnQgaXRlbSB3aXRoIGZvcndhcmQtY29tcGF0aWJsZSBmaWVsZHMuICovXG5leHBvcnQgY29uc3QgR2VuaWVBZ2VudENvbnRlbnRTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHR5cGU6IHouc3RyaW5nKCksXG4gICAgdGV4dDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIG1ldGFkYXRhOiB6LnVua25vd24oKS5vcHRpb25hbCgpLFxuICB9KVxuICAubG9vc2UoKTtcblxuLyoqIEFnZW50IE1vZGUgcmVzcG9uc2Ugb3V0cHV0IGl0ZW0gd2l0aCBrbm93biBwcm9qZWN0aW9uIGZpZWxkcy4gKi9cbmV4cG9ydCBjb25zdCBHZW5pZUFnZW50T3V0cHV0SXRlbVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgdHlwZTogei5zdHJpbmcoKSxcbiAgICBpZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGNhbGxfaWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBuYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgYXJndW1lbnRzOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgb3V0cHV0OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgc3RhdHVzOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgY29udGVudDogei5hcnJheShHZW5pZUFnZW50Q29udGVudFNjaGVtYSkub3B0aW9uYWwoKSxcbiAgfSlcbiAgLmxvb3NlKCk7XG5cbi8qKiBHZW5pZSBBZ2VudCBNb2RlIHJlc3BvbnNlIGNhcnJpZWQgYnkgbGlmZWN5Y2xlIGV2ZW50cy4gKi9cbmV4cG9ydCBjb25zdCBHZW5pZUFnZW50UmVzcG9uc2VTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIG9iamVjdDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGlkOiB6LnN0cmluZygpLFxuICAgIG1vZGVsOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgc3RhdHVzOiB6LnN0cmluZygpLFxuICAgIG91dHB1dDogei5hcnJheShHZW5pZUFnZW50T3V0cHV0SXRlbVNjaGVtYSkub3B0aW9uYWwoKSxcbiAgICBjb252ZXJzYXRpb25faWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBjcmVhdGVkX2F0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgZXJyb3I6IHoudW5rbm93bigpLm9wdGlvbmFsKCksXG4gIH0pXG4gIC5sb29zZSgpO1xuXG4vKiogT25lIFNTRSBldmVudCBmcm9tIHRoZSBHZW5pZSBBZ2VudCBNb2RlIHJlc3BvbnNlIHN0cmVhbS4gKi9cbmV4cG9ydCBjb25zdCBHZW5pZUFnZW50TW9kZUV2ZW50U2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICB0eXBlOiB6LnN0cmluZygpLFxuICAgIHNlcXVlbmNlX251bWJlcjogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIG91dHB1dF9pbmRleDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIHJlc3BvbnNlOiBHZW5pZUFnZW50UmVzcG9uc2VTY2hlbWEub3B0aW9uYWwoKSxcbiAgICBpdGVtOiBHZW5pZUFnZW50T3V0cHV0SXRlbVNjaGVtYS5vcHRpb25hbCgpLFxuICB9KVxuICAubG9vc2UoKTtcblxuLyoqIFZhbGlkYXRlZCBBZ2VudCBNb2RlIHJlc3BvbnNlIG91dHB1dCBpdGVtLiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVBZ2VudE91dHB1dEl0ZW0gPSB6LmluZmVyPHR5cGVvZiBHZW5pZUFnZW50T3V0cHV0SXRlbVNjaGVtYT47XG4vKiogVmFsaWRhdGVkIEFnZW50IE1vZGUgcmVzcG9uc2UuICovXG5leHBvcnQgdHlwZSBHZW5pZUFnZW50UmVzcG9uc2UgPSB6LmluZmVyPHR5cGVvZiBHZW5pZUFnZW50UmVzcG9uc2VTY2hlbWE+O1xuLyoqIFZhbGlkYXRlZCBBZ2VudCBNb2RlIFNTRSBldmVudC4gKi9cbmV4cG9ydCB0eXBlIEdlbmllQWdlbnRNb2RlRXZlbnQgPSB6LmluZmVyPHR5cGVvZiBHZW5pZUFnZW50TW9kZUV2ZW50U2NoZW1hPjtcblxuLyoqIFN0YXRlZnVsIHB1cmUgcmVkdWNlciBmcm9tIEFnZW50IE1vZGUgU1NFIGV2ZW50cyB0byBHZW5pZSBtZXNzYWdlIHNuYXBzaG90cy4gKi9cbmV4cG9ydCBjbGFzcyBHZW5pZUFnZW50TW9kZVByb2plY3Rpb24ge1xuICBwcml2YXRlIHJlYWRvbmx5IGl0ZW1zID0gbmV3IE1hcDxzdHJpbmcsIEdlbmllQWdlbnRPdXRwdXRJdGVtPigpO1xuICBwcml2YXRlIHJlc3BvbnNlOiBHZW5pZUFnZW50UmVzcG9uc2UgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzcGFjZUlkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250ZW50OiBzdHJpbmcsXG4gICkge31cblxuICAvKiogQXBwbHkgb25lIHZhbGlkYXRlZCBTU0UgZXZlbnQgYW5kIHJldHVybiBpdHMgcHJvamVjdGVkIHNuYXBzaG90LiAqL1xuICBhcHBseShldmVudDogR2VuaWVBZ2VudE1vZGVFdmVudCk6IEdlbmllTWVzc2FnZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGV2ZW50LnJlc3BvbnNlKSB7XG4gICAgICB0aGlzLnJlc3BvbnNlID0gZXZlbnQucmVzcG9uc2U7XG4gICAgICBpZiAoZXZlbnQucmVzcG9uc2Uub3V0cHV0KSB7XG4gICAgICAgIHRoaXMuaXRlbXMuY2xlYXIoKTtcbiAgICAgICAgZXZlbnQucmVzcG9uc2Uub3V0cHV0LmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgdGhpcy5pdGVtcy5zZXQoYWdlbnRJdGVtS2V5KGl0ZW0sIGluZGV4KSwgaXRlbSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXZlbnQuaXRlbSkge1xuICAgICAgdGhpcy5pdGVtcy5zZXQoYWdlbnRJdGVtS2V5KGV2ZW50Lml0ZW0sIGV2ZW50Lm91dHB1dF9pbmRleCksIGV2ZW50Lml0ZW0pO1xuICAgIH1cbiAgICBpZiAoKCFldmVudC5yZXNwb25zZSAmJiAhZXZlbnQuaXRlbSkgfHwgIXRoaXMucmVzcG9uc2UpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHByb2plY3RBZ2VudE1vZGVNZXNzYWdlKHRoaXMuc3BhY2VJZCwgdGhpcy5jb250ZW50LCB0aGlzLnJlc3BvbnNlLCBbXG4gICAgICAuLi50aGlzLml0ZW1zLnZhbHVlcygpLFxuICAgIF0pO1xuICB9XG5cbiAgLyoqIEN1cnJlbnQgcmVzcG9uc2UgaWQsIG9uY2UgYHJlc3BvbnNlLmNyZWF0ZWRgIGhhcyBhcnJpdmVkLiAqL1xuICBnZXQgcmVzcG9uc2VJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlc3BvbnNlPy5pZDtcbiAgfVxuXG4gIC8qKiBDdXJyZW50IGNvbnZlcnNhdGlvbiBpZCwgb25jZSBhc3NpZ25lZCBieSBHZW5pZS4gKi9cbiAgZ2V0IGNvbnZlcnNhdGlvbklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2U/LmNvbnZlcnNhdGlvbl9pZDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBsYXRlc3QgcmVzcG9uc2Ugc3RhdHVzIGlzIHRlcm1pbmFsLiAqL1xuICBnZXQgdGVybWluYWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2UgPyBpc1Rlcm1pbmFsU3RhdHVzKHRoaXMucmVzcG9uc2Uuc3RhdHVzKSA6IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzVGVybWluYWxTdGF0dXMoc3RhdHVzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHN0YXR1cyA9PT0gXCJjb21wbGV0ZWRcIiB8fCBzdGF0dXMgPT09IFwiZmFpbGVkXCIgfHwgc3RhdHVzID09PSBcImNhbmNlbGxlZFwiO1xufVxuXG5mdW5jdGlvbiBhZ2VudEl0ZW1LZXkoaXRlbTogR2VuaWVBZ2VudE91dHB1dEl0ZW0sIGluZGV4OiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBpdGVtLmlkID09PSBcInN0cmluZ1wiKSByZXR1cm4gaXRlbS5pZDtcbiAgaWYgKHR5cGVvZiBpdGVtLmNhbGxfaWQgPT09IFwic3RyaW5nXCIpIHJldHVybiBpdGVtLmNhbGxfaWQ7XG4gIHJldHVybiBTdHJpbmcodHlwZW9mIGluZGV4ID09PSBcIm51bWJlclwiID8gaW5kZXggOiAoaXRlbS50eXBlID8/IFwiaXRlbVwiKSk7XG59XG5cbi8qKiBQcm9qZWN0IG9uZSBBZ2VudCBNb2RlIHJlc3BvbnNlIHNuYXBzaG90IG9udG8gdGhlIHNoYXJlZCBHZW5pZSBtZXNzYWdlIHNoYXBlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2plY3RBZ2VudE1vZGVNZXNzYWdlKFxuICBzcGFjZUlkOiBzdHJpbmcsXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgcmVzcG9uc2U6IEdlbmllQWdlbnRSZXNwb25zZSxcbiAgaXRlbXM6IEdlbmllQWdlbnRPdXRwdXRJdGVtW10sXG4pOiBHZW5pZU1lc3NhZ2Uge1xuICBjb25zdCBlcnJvclZhbHVlID0gb2JqZWN0LmlzUmVjb3JkKHJlc3BvbnNlLmVycm9yKSA/IHJlc3BvbnNlLmVycm9yIDogdW5kZWZpbmVkO1xuICBjb25zdCBlcnJvck1lc3NhZ2UgPVxuICAgIHR5cGVvZiBlcnJvclZhbHVlPy5tZXNzYWdlID09PSBcInN0cmluZ1wiXG4gICAgICA/IGVycm9yVmFsdWUubWVzc2FnZVxuICAgICAgOiB0eXBlb2YgcmVzcG9uc2UuZXJyb3IgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyByZXNwb25zZS5lcnJvclxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIEdlbmllTWVzc2FnZVNjaGVtYS5wYXJzZSh7XG4gICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgIG1lc3NhZ2VfaWQ6IHJlc3BvbnNlLmlkLFxuICAgIHNwYWNlX2lkOiBzcGFjZUlkLFxuICAgIGNvbnZlcnNhdGlvbl9pZDogcmVzcG9uc2UuY29udmVyc2F0aW9uX2lkID8/IFwiXCIsXG4gICAgY29udGVudCxcbiAgICBzdGF0dXM6IGFnZW50TW9kZVN0YXR1cyhyZXNwb25zZS5zdGF0dXMsIGl0ZW1zKSxcbiAgICBhdHRhY2htZW50czogaXRlbXMuZmxhdE1hcChpdGVtQXR0YWNobWVudHMpLFxuICAgIC4uLihyZXNwb25zZS5jcmVhdGVkX2F0ICE9PSB1bmRlZmluZWQgPyB7IGNyZWF0ZWRfdGltZXN0YW1wOiByZXNwb25zZS5jcmVhdGVkX2F0IH0gOiB7fSksXG4gICAgLi4uKGVycm9yTWVzc2FnZSA/IHsgZXJyb3I6IHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9IH0gOiB7fSksXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZ2VudE1vZGVTdGF0dXModmFsdWU6IHN0cmluZywgaXRlbXM6IEdlbmllQWdlbnRPdXRwdXRJdGVtW10pOiBHZW5pZU1lc3NhZ2VbXCJzdGF0dXNcIl0ge1xuICBpZiAodmFsdWUgPT09IFwiY29tcGxldGVkXCIpIHJldHVybiBcIkNPTVBMRVRFRFwiO1xuICBpZiAodmFsdWUgPT09IFwiZmFpbGVkXCIpIHJldHVybiBcIkZBSUxFRFwiO1xuICBpZiAodmFsdWUgPT09IFwiY2FuY2VsbGVkXCIpIHJldHVybiBcIkNBTkNFTExFRFwiO1xuICBpZiAoaXRlbXMuc29tZSgoaXRlbSkgPT4gaXRlbS50eXBlID09PSBcImZ1bmN0aW9uX2NhbGxcIikpIHJldHVybiBcIkVYRUNVVElOR19RVUVSWVwiO1xuICByZXR1cm4gXCJBU0tJTkdfQUlcIjtcbn1cblxuZnVuY3Rpb24gaXRlbUF0dGFjaG1lbnRzKGl0ZW06IEdlbmllQWdlbnRPdXRwdXRJdGVtKTogR2VuaWVBdHRhY2htZW50W10ge1xuICBjb25zdCBpZCA9IGl0ZW0uaWQgPz8gaXRlbS5jYWxsX2lkO1xuICBpZiAoaXRlbS50eXBlID09PSBcInJlYXNvbmluZ1wiKSB7XG4gICAgY29uc3QgdGhvdWdodHMgPSBjb250ZW50VGV4dChpdGVtLmNvbnRlbnQsIFwicmVhc29uaW5nX3RleHRcIikubWFwKFxuICAgICAgKHRob3VnaHRDb250ZW50KTogR2VuaWVUaG91Z2h0ID0+ICh7XG4gICAgICAgIHRob3VnaHRfdHlwZTogXCJUSE9VR0hUX1RZUEVfU1RFUFNcIixcbiAgICAgICAgY29udGVudDogdGhvdWdodENvbnRlbnQsXG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiB0aG91Z2h0cy5sZW5ndGggPT09IDBcbiAgICAgID8gW11cbiAgICAgIDogW3sgYXR0YWNobWVudF9pZDogaWQsIGF0dGFjaG1lbnRfdHlwZTogXCJxdWVyeVwiLCBxdWVyeTogeyBpZCwgdGhvdWdodHMgfSB9XTtcbiAgfVxuICBpZiAoaXRlbS50eXBlID09PSBcImZ1bmN0aW9uX2NhbGxcIikge1xuICAgIGNvbnN0IGFyZ3VtZW50c1ZhbHVlID0ganNvbi5wYXJzZVJlY29yZChpdGVtLmFyZ3VtZW50cyk7XG4gICAgY29uc3QgcXVlcnkgPVxuICAgICAgdHlwZW9mIGFyZ3VtZW50c1ZhbHVlPy5zcWwgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBhcmd1bWVudHNWYWx1ZS5zcWxcbiAgICAgICAgOiB0eXBlb2YgYXJndW1lbnRzVmFsdWU/LnF1ZXJ5ID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyBhcmd1bWVudHNWYWx1ZS5xdWVyeVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRpdGxlID0gdHlwZW9mIGFyZ3VtZW50c1ZhbHVlPy50aXRsZSA9PT0gXCJzdHJpbmdcIiA/IGFyZ3VtZW50c1ZhbHVlLnRpdGxlIDogaXRlbS5uYW1lO1xuICAgIHJldHVybiBxdWVyeVxuICAgICAgPyBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYXR0YWNobWVudF9pZDogaWQsXG4gICAgICAgICAgICBhdHRhY2htZW50X3R5cGU6IFwicXVlcnlcIixcbiAgICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgLi4uKHRpdGxlID8geyB0aXRsZSB9IDoge30pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgICA6IFtdO1xuICB9XG4gIGlmIChpdGVtLnR5cGUgPT09IFwiZnVuY3Rpb25fY2FsbF9vdXRwdXRcIiAmJiBpdGVtLm91dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIFt0ZXh0QXR0YWNobWVudChpZCwgaXRlbS5vdXRwdXQpXTtcbiAgfVxuICBpZiAoaXRlbS50eXBlID09PSBcIm1lc3NhZ2VcIikge1xuICAgIHJldHVybiAoaXRlbS5jb250ZW50ID8/IFtdKS5mbGF0TWFwKChwYXJ0KSA9PlxuICAgICAgcGFydC50eXBlID09PSBcIm91dHB1dF90ZXh0XCIgJiYgcGFydC50ZXh0XG4gICAgICAgID8gW3RleHRBdHRhY2htZW50KGlkLCBwYXJ0LnRleHQsIHBhcnQubWV0YWRhdGEpXVxuICAgICAgICA6IFtdLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5mdW5jdGlvbiBjb250ZW50VGV4dChcbiAgdmFsdWU6IHouaW5mZXI8dHlwZW9mIEdlbmllQWdlbnRDb250ZW50U2NoZW1hPltdIHwgdW5kZWZpbmVkLFxuICB0eXBlOiBzdHJpbmcsXG4pOiBzdHJpbmdbXSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBbXTtcbiAgcmV0dXJuIHZhbHVlLmZsYXRNYXAoKHBhcnQpID0+IChwYXJ0LnR5cGUgPT09IHR5cGUgJiYgcGFydC50ZXh0ID8gW3BhcnQudGV4dF0gOiBbXSkpO1xufVxuXG5mdW5jdGlvbiB0ZXh0QXR0YWNobWVudChcbiAgaWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY29udGVudDogc3RyaW5nLFxuICBtZXRhZGF0YT86IHVua25vd24sXG4pOiBHZW5pZUF0dGFjaG1lbnQge1xuICByZXR1cm4ge1xuICAgIGF0dGFjaG1lbnRfaWQ6IGlkLFxuICAgIGF0dGFjaG1lbnRfdHlwZTogXCJ0ZXh0XCIsXG4gICAgdGV4dDoge1xuICAgICAgaWQsXG4gICAgICBjb250ZW50LFxuICAgICAgcHVycG9zZTogXCJURVhUX0FUVEFDSE1FTlRfUFVSUE9TRV9BTlNXRVJcIixcbiAgICAgIC4uLihtZXRhZGF0YSAhPT0gdW5kZWZpbmVkID8geyBtZXRhZGF0YSB9IDoge30pLFxuICAgIH0sXG4gIH07XG59XG4iXX0=
@@ -142,11 +142,15 @@ export type GenieQueryAttachment = z.infer<typeof GenieQueryAttachmentSchema>;
142
142
  * server-side enum change cannot invalidate an otherwise complete message.
143
143
  */
144
144
  export type GenieTextAttachmentPurpose = "FOLLOW_UP_QUESTION" | "TEXT_ATTACHMENT_PURPOSE_ANSWER" | (string & {});
145
- /** Text attachment schema widened for forward-compatible purpose values. */
145
+ /**
146
+ * Text attachment widened for forward-compatible purpose values and optional
147
+ * Agent Mode table metadata.
148
+ */
146
149
  export declare const GenieTextAttachmentSchema: z.ZodObject<{
147
150
  content: z.ZodOptional<z.ZodString>;
148
151
  id: z.ZodOptional<z.ZodString>;
149
152
  purpose: z.ZodOptional<z.ZodCustom<GenieTextAttachmentPurpose, GenieTextAttachmentPurpose>>;
153
+ metadata: z.ZodOptional<z.ZodUnknown>;
150
154
  }, z.core.$strip>;
151
155
  /** Narrative text attachment, including its optional semantic purpose. */
152
156
  export type GenieTextAttachment = z.infer<typeof GenieTextAttachmentSchema>;
@@ -200,6 +204,7 @@ export declare const GenieAttachmentSchema: z.ZodObject<{
200
204
  content: z.ZodOptional<z.ZodString>;
201
205
  id: z.ZodOptional<z.ZodString>;
202
206
  purpose: z.ZodOptional<z.ZodCustom<GenieTextAttachmentPurpose, GenieTextAttachmentPurpose>>;
207
+ metadata: z.ZodOptional<z.ZodUnknown>;
203
208
  }, z.core.$strip>>;
204
209
  attachment_type: z.ZodOptional<z.ZodCustom<AttachmentType, AttachmentType>>;
205
210
  }, z.core.$strip>;
@@ -274,6 +279,7 @@ export declare const GenieMessageSchema: z.ZodObject<{
274
279
  content: z.ZodOptional<z.ZodString>;
275
280
  id: z.ZodOptional<z.ZodString>;
276
281
  purpose: z.ZodOptional<z.ZodCustom<GenieTextAttachmentPurpose, GenieTextAttachmentPurpose>>;
282
+ metadata: z.ZodOptional<z.ZodUnknown>;
277
283
  }, z.core.$strip>>;
278
284
  attachment_type: z.ZodOptional<z.ZodCustom<AttachmentType, AttachmentType>>;
279
285
  }, z.core.$strip>>>;
@@ -345,6 +351,7 @@ export declare const GenieResponseSchema: z.ZodPipe<z.ZodObject<{
345
351
  content: z.ZodOptional<z.ZodString>;
346
352
  id: z.ZodOptional<z.ZodString>;
347
353
  purpose: z.ZodOptional<z.ZodCustom<GenieTextAttachmentPurpose, GenieTextAttachmentPurpose>>;
354
+ metadata: z.ZodOptional<z.ZodUnknown>;
348
355
  }, z.core.$strip>>;
349
356
  attachment_type: z.ZodOptional<z.ZodCustom<AttachmentType, AttachmentType>>;
350
357
  }, z.core.$strip>>>;
@@ -379,6 +386,7 @@ export declare const GenieResponseSchema: z.ZodPipe<z.ZodObject<{
379
386
  content?: string | undefined;
380
387
  id?: string | undefined;
381
388
  purpose?: GenieTextAttachmentPurpose | undefined;
389
+ metadata?: unknown;
382
390
  } | undefined;
383
391
  attachment_type?: AttachmentType | undefined;
384
392
  }[], {
@@ -434,6 +442,7 @@ export declare const GenieResponseSchema: z.ZodPipe<z.ZodObject<{
434
442
  content?: string | undefined;
435
443
  id?: string | undefined;
436
444
  purpose?: GenieTextAttachmentPurpose | undefined;
445
+ metadata?: unknown;
437
446
  } | undefined;
438
447
  attachment_type?: AttachmentType | undefined;
439
448
  }[] | undefined;
@@ -610,6 +619,7 @@ export declare const MessageEventSchema: z.ZodObject<{
610
619
  content: z.ZodOptional<z.ZodString>;
611
620
  id: z.ZodOptional<z.ZodString>;
612
621
  purpose: z.ZodOptional<z.ZodCustom<GenieTextAttachmentPurpose, GenieTextAttachmentPurpose>>;
622
+ metadata: z.ZodOptional<z.ZodUnknown>;
613
623
  }, z.core.$strip>>;
614
624
  attachment_type: z.ZodOptional<z.ZodCustom<AttachmentType, AttachmentType>>;
615
625
  }, z.core.$strip>>>;
@@ -825,6 +835,7 @@ export declare const ResultEventSchema: z.ZodObject<{
825
835
  content: z.ZodOptional<z.ZodString>;
826
836
  id: z.ZodOptional<z.ZodString>;
827
837
  purpose: z.ZodOptional<z.ZodCustom<GenieTextAttachmentPurpose, GenieTextAttachmentPurpose>>;
838
+ metadata: z.ZodOptional<z.ZodUnknown>;
828
839
  }, z.core.$strip>>;
829
840
  attachment_type: z.ZodOptional<z.ZodCustom<AttachmentType, AttachmentType>>;
830
841
  }, z.core.$strip>>>;
@@ -931,6 +942,7 @@ export declare const GenieChatEventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<
931
942
  content: z.ZodOptional<z.ZodString>;
932
943
  id: z.ZodOptional<z.ZodString>;
933
944
  purpose: z.ZodOptional<z.ZodCustom<GenieTextAttachmentPurpose, GenieTextAttachmentPurpose>>;
945
+ metadata: z.ZodOptional<z.ZodUnknown>;
934
946
  }, z.core.$strip>>;
935
947
  attachment_type: z.ZodOptional<z.ZodCustom<AttachmentType, AttachmentType>>;
936
948
  }, z.core.$strip>>>;
@@ -1061,6 +1073,7 @@ export declare const GenieChatEventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<
1061
1073
  content: z.ZodOptional<z.ZodString>;
1062
1074
  id: z.ZodOptional<z.ZodString>;
1063
1075
  purpose: z.ZodOptional<z.ZodCustom<GenieTextAttachmentPurpose, GenieTextAttachmentPurpose>>;
1076
+ metadata: z.ZodOptional<z.ZodUnknown>;
1064
1077
  }, z.core.$strip>>;
1065
1078
  attachment_type: z.ZodOptional<z.ZodCustom<AttachmentType, AttachmentType>>;
1066
1079
  }, z.core.$strip>>>;
@@ -87,9 +87,13 @@ export const ATTACHMENT_TYPES = [
87
87
  export const GenieQueryAttachmentSchema = SDKGenieQueryAttachmentSchema.extend({
88
88
  thoughts: z.array(GenieThoughtSchema).optional(),
89
89
  });
90
- /** Text attachment schema widened for forward-compatible purpose values. */
90
+ /**
91
+ * Text attachment widened for forward-compatible purpose values and optional
92
+ * Agent Mode table metadata.
93
+ */
91
94
  export const GenieTextAttachmentSchema = dashboards.textAttachmentSchema.extend({
92
95
  purpose: z.custom((value) => typeof value === "string").optional(),
96
+ metadata: z.unknown().optional(),
93
97
  });
94
98
  /**
95
99
  * `GenieAttachment` with:
@@ -448,4 +452,4 @@ export const GenieChatEventSchema = z.discriminatedUnion("type", [
448
452
  SuggestedQuestionsEventSchema,
449
453
  ResultEventSchema,
450
454
  ]);
451
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuaWUtbW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuaWUtbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0NHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxLQUFLLFVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5QyxrRkFBa0Y7QUFDbEYsaUZBQWlGO0FBQ2pGLDZEQUE2RDtBQUM3RCxNQUFNLEVBQ0oscUJBQXFCLEVBQUUsd0JBQXdCLEVBQy9DLGtCQUFrQixFQUFFLHFCQUFxQixFQUN6QywwQkFBMEIsRUFBRSw2QkFBNkIsRUFDekQsZ0JBQWdCLEVBQUUsbUJBQW1CLEdBQ3RDLEdBQUcsVUFBVSxDQUFDO0FBVWYsd0ZBQXdGO0FBQ3hGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQztBQWlDbEU7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN6QyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBbUIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQztJQUN0RSxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtDQUNwQixDQUFDLENBQUM7QUFJSCw2RUFBNkU7QUFFN0U7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRztJQUM5QixPQUFPO0lBQ1AsTUFBTTtJQUNOLHFCQUFxQjtDQUNlLENBQUM7QUFNdkMseUVBQXlFO0FBRXpFOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyw2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QU0sRUFBRTtJQUNyQixrQkFBa0IsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3pDLFlBQVksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQ3BDLENBQUMsQ0FBQztBQUlIOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLENBQUM7SUFDMUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUM7SUFDdEMsU0FBUyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQy9CLENBQUMsQ0FBQztBQUlIOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsdUJBQXVCLENBQUMsSUFBSSxDQUFDO0lBQzVELGFBQWEsRUFBRSxJQUFJO0NBQ3BCLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDUixJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDekIsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDakMsT0FBTyxFQUFFLGtCQUFrQjtDQUM1QixDQUFDLENBQUM7QUFJSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUNHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRTtJQUMvRCxtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLGlCQUFpQjtJQUNqQixxQkFBcUI7SUFDckIsbUJBQW1CO0lBQ25CLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsb0JBQW9CO0lBQ3BCLGVBQWU7SUFDZiw2QkFBNkI7SUFDN0IsaUJBQWlCO0NBQ2xCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV2lyZS1mb3JtYXQgem9kIHNjaGVtYXMgKyB0eXBlcyBhbmQgaGlnaC1sZXZlbCBldmVudCB2b2NhYnVsYXJ5XG4gKiBmb3IgdGhlIEdlbmllIGNoYXQgZHJpdmVyLlxuICpcbiAqIFR3byByZWxhdGVkIGxheWVycyBsaXZlIGhlcmU6XG4gKlxuICogICAxLiBHZW5pZSB3aXJlIHNoYXBlcyBkZXJpdmVkIGZyb20gdGhpcyBwYWNrYWdlJ3Mgb3duIGdlbmVyYXRlZFxuICogICAgICBgZGFzaGJvYXJkc2Agc2NoZW1hcyAocmVnZW5lcmF0ZWQgZnJvbSB0aGUgdXBzdHJlYW1cbiAqICAgICAgYEBkYXRhYnJpY2tzL3Nkay1leHBlcmltZW50YWxgIGBhcGlzL2Rhc2hib2FyZHMvbW9kZWwuZC50c2BcbiAqICAgICAgYnkgdGhlIGVuZ2luZSdzIGNvZGVnZW4gb24gc3ludGgpLiBXZSBleHRlbmQgdGhlIFNESyBzY2hlbWFzIHdoZXJlIEdlbmllXG4gKiAgICAgIHNoaXBzIGZpZWxkcyBvbiB0aGUgd2lyZSB0aGF0IHRoZSBTREsgZG9lc24ndCBjdXJyZW50bHkgdHlwZTpcbiAqXG4gKiAgICAgICAgLSBgR2VuaWVNZXNzYWdlLmF1dG9fcmVnZW5lcmF0ZV9jb3VudDogbnVtYmVyYCAoc3RhbXBlZFxuICogICAgICAgICAgb24gZXZlcnkgd2lyZSBtZXNzYWdlLCBvbWl0dGVkIGZyb20gdGhlIFNESyBzaGFwZSkuXG4gKiAgICAgICAgLSBgR2VuaWVRdWVyeUF0dGFjaG1lbnQudGhvdWdodHM6IEdlbmllVGhvdWdodFtdYCAodGhlXG4gKiAgICAgICAgICBzdHJlYW1lZCByZWFzb25pbmcgcGF5bG9hZCB3aXRoIGBERVNDUklQVElPTmAsXG4gKiAgICAgICAgICBgREFUQV9TT1VSQ0lOR2AsIGBTVEVQU2AsIGFuZCBgVU5ERVJTVEFORElOR2AgdGhvdWdodFxuICogICAgICAgICAga2luZHMpLlxuICogICAgICAgIC0gYEdlbmllQXR0YWNobWVudC5hdHRhY2htZW50X3R5cGU6IEF0dGFjaG1lbnRUeXBlYFxuICogICAgICAgICAgKGFuIG9wdGlvbmFsIGRpc2NyaW1pbmF0b3IgbGl0ZXJhbCBzbyBjYWxsZXJzIGNhblxuICogICAgICAgICAgYHN3aXRjaCAoYXR0LmF0dGFjaG1lbnRfdHlwZSlgIGluc3RlYWQgb2YgcHJvYmluZ1xuICogICAgICAgICAgd2hpY2ggc3ViLWtleSBpcyBwb3B1bGF0ZWQ7IGNvbXB1dGUgaXQgd2l0aFxuICogICAgICAgICAge0BsaW5rIGRldGVjdEF0dGFjaG1lbnRUeXBlfSkuXG4gKlxuICogICAyLiBFdmVudCB2b2NhYnVsYXJ5IGZvciB0aGUgaGlnaC1sZXZlbCBgZ2VuaWVFdmVudENoYXRgXG4gKiAgICAgIGRyaXZlci4gRWFjaCBldmVudCBpcyBhIGZsYXQgYHoub2JqZWN0YCB3aXRoIGEgYHR5cGVgXG4gKiAgICAgIGxpdGVyYWwgZGlzY3JpbWluYXRvciBhbmQgc25ha2VfY2FzZSBwYXlsb2FkIGZpZWxkcyBob2lzdGVkXG4gKiAgICAgIHRvIHRoZSB0b3AgbGV2ZWwgKG5vIGBwYXlsb2FkYCB3cmFwcGVyKS4gRXZlbnRzIHRoYXQgc2hhcmVcbiAqICAgICAgdGhlIGF0dGFjaG1lbnQtc2NvcGVkIGxvY2F0aW9uIHVzZVxuICogICAgICB7QGxpbmsgR2VuaWVDaGF0TG9jYXRpb25TY2hlbWF9IGFzIGEgYmFzZTsgZXZlbnRzIHRoYXRcbiAqICAgICAgZG9uJ3QgY2FycnkgYW4gYGF0dGFjaG1lbnRfaWRgIChzdGF0dXMsIHJlc3VsdCkgb21pdCBpdC5cbiAqICAgICAge0BsaW5rIEdlbmllQ2hhdEV2ZW50U2NoZW1hfSBidW5kbGVzIHRoZSB2YXJpYW50cyBpbnRvIG9uZVxuICogICAgICBkaXNjcmltaW5hdGVkIHVuaW9uLlxuICpcbiAqIFB1cmUgdHlwZXM6IG5vIHJ1bnRpbWUgaW1wb3J0cyBiZXlvbmQgem9kICsgdGhlIGdlbmVyYXRlZFxuICogYGRhc2hib2FyZHNgIHNjaGVtYXMsIG5vIE5vZGUtb25seSBjb2RlLCBzYWZlIGZvciBicm93c2VyIGJ1bmRsZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0ICogYXMgZGFzaGJvYXJkcyBmcm9tIFwiLi9kYXNoYm9hcmRzLnRzXCI7XG5cbi8vIFRoZSBnZW5lcmF0ZWQgU0RLIHNjaGVtYXMgbGl2ZSBpbiB0aGUgc2libGluZyBgLi9kYXNoYm9hcmRzLnRzYCwgd3JpdHRlbiBieSB0aGVcbi8vIGVuZ2luZSdzIGNvZGVnZW4gZnJvbSB0aGUgdXBzdHJlYW0gYC5kLnRzYC4gQWxpYXMgdGhlIGhhbmRmdWwgR2VuaWUgZXh0ZW5kcyBzb1xuLy8gdGhlIHdpZGVuZWQgc2NoZW1hcyBiZWxvdyByZWFkIGFnYWluc3Qgc2hvcnQsIGxvY2FsIG5hbWVzLlxuY29uc3Qge1xuICBnZW5pZUF0dGFjaG1lbnRTY2hlbWE6IFNES0dlbmllQXR0YWNobWVudFNjaGVtYSxcbiAgZ2VuaWVNZXNzYWdlU2NoZW1hOiBTREtHZW5pZU1lc3NhZ2VTY2hlbWEsXG4gIGdlbmllUXVlcnlBdHRhY2htZW50U2NoZW1hOiBTREtHZW5pZVF1ZXJ5QXR0YWNobWVudFNjaGVtYSxcbiAgZ2VuaWVTcGFjZVNjaGVtYTogU0RLR2VuaWVTcGFjZVNjaGVtYSxcbn0gPSBkYXNoYm9hcmRzO1xuXG4vKipcbiAqIFRoZSBTREsncyBgTWVzc2FnZVN0YXR1c2AgdHlwZSwgcmUtZXhwb3J0ZWQgc28gY29uc3VtZXJzIG9mIHRoZVxuICogR2VuaWUgY29udHJhY3QgZ2V0IHRoZSBmdWxsIHdpcmUgdm9jYWJ1bGFyeSBmcm9tIGEgc2luZ2xlIGltcG9ydFxuICogcGF0aCAtIG1pcnJvcnMgdGhlIHJlLWV4cG9ydHMgb2YgdGhlIG90aGVyIFNESy1kZXJpdmVkIHNjaGVtYXNcbiAqIGJlbG93LlxuICovXG5leHBvcnQgdHlwZSBNZXNzYWdlU3RhdHVzID0gZGFzaGJvYXJkcy5NZXNzYWdlU3RhdHVzO1xuXG4vKiogUnVudGltZSB2YWxpZGF0b3IgZm9yIGEgcmF3IEdlbmllIG1lc3NhZ2Ugc3RhdHVzIGZyb20gdGhlIGdlbmVyYXRlZCBTREsgY29udHJhY3QuICovXG5leHBvcnQgY29uc3QgTWVzc2FnZVN0YXR1c1NjaGVtYSA9IGRhc2hib2FyZHMubWVzc2FnZVN0YXR1c1NjaGVtYTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdGhvdWdodHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEdlbmllJ3MgcGVyLXF1ZXJ5IFwidGhvdWdodHNcIiBzdXJmYWNlLiBUaGVzZSBhcHBlYXIgb24gdGhlXG4gKiBgL21lc3NhZ2VzL3tpZH1gIHdpcmUgdW5kZXIgYGF0dGFjaG1lbnRzW2ldLnF1ZXJ5LnRob3VnaHRzW11gIGJ1dFxuICogYXJlIG5vdCB0eXBlZCBvbiB0aGUgU0RLJ3MgYEdlbmllUXVlcnlBdHRhY2htZW50YCBhdCB2MC4xNy5cbiAqXG4gKiBLbm93biB0aG91Z2h0IHR5cGVzIG9ic2VydmVkIGluIHByb2R1Y3Rpb24gcG9sbHM6XG4gKlxuICogICAtIGBUSE9VR0hUX1RZUEVfREVTQ1JJUFRJT05gOiBhIG9uZS1wYXJhZ3JhcGggcmVzdGF0ZW1lbnQgb2ZcbiAqICAgICB3aGF0IHRoZSB1c2VyIGFza2VkLiBUaGUgZmluYWwgYHF1ZXJ5LmRlc2NyaXB0aW9uYCBmaWVsZCBvblxuICogICAgIHRoZSBhdHRhY2htZW50IGNhcnJpZXMgdGhlIHNhbWUgdGV4dC5cbiAqICAgLSBgVEhPVUdIVF9UWVBFX0RBVEFfU09VUkNJTkdgOiBtYXJrZG93biBidWxsZXRzIG9mIHRoZVxuICogICAgIGZ1bGx5LXF1YWxpZmllZCBgY2F0YWxvZy5zY2hlbWEudGFibGVgIHNvdXJjZXMgR2VuaWUgY2hvc2UuXG4gKiAgIC0gYFRIT1VHSFRfVFlQRV9TVEVQU2A6IHRoZSBoaWdoLWxldmVsIHBsYW4gR2VuaWUgd3JvdGUgYmVmb3JlXG4gKiAgICAgcnVubmluZyBTUUwgKG9uZSBidWxsZXQgcGVyIHN0ZXApLlxuICogICAtIGBUSE9VR0hUX1RZUEVfVU5ERVJTVEFORElOR2A6IGFtYmlndWl0eSAvIGludGVycHJldGF0aW9uXG4gKiAgICAgbm90ZXMgKGUuZy4gXCIncmV2ZW51ZScgY291bGQgYmUgaW50ZXJwcmV0ZWQgYXMgZ3Jvc3MsXG4gKiAgICAgbmV0LCBvciByZWNvZ25pemVkIHJldmVudWUuLi5cIikuXG4gKlxuICogT3BlbiBhdCB0aGUgdHlwZSBsZXZlbCAoYHwgKHN0cmluZyAmIHt9KWApIHNvIGEgbmV3IHNlcnZlci1zaWRlXG4gKiB0aG91Z2h0IHR5cGUgZG9lc24ndCBicmVhayBjb21waWxhdGlvbjsgdGhlIGZvdXIga25vd24gdHlwZXNcbiAqIHN0aWxsIG5hcnJvdyBjb3JyZWN0bHkgdW5kZXIgYHN3aXRjaGAuXG4gKi9cbmV4cG9ydCB0eXBlIEdlbmllVGhvdWdodFR5cGUgPVxuICB8IFwiVEhPVUdIVF9UWVBFX0RFU0NSSVBUSU9OXCJcbiAgfCBcIlRIT1VHSFRfVFlQRV9EQVRBX1NPVVJDSU5HXCJcbiAgfCBcIlRIT1VHSFRfVFlQRV9TVEVQU1wiXG4gIHwgXCJUSE9VR0hUX1RZUEVfVU5ERVJTVEFORElOR1wiXG4gIHwgKHN0cmluZyAmIHt9KTtcblxuLyoqXG4gKiBPbmUgcmVhc29uaW5nIHN0ZXAgb24gYSBxdWVyeSBhdHRhY2htZW50LiBTZWVcbiAqIHtAbGluayBHZW5pZVRob3VnaHRUeXBlfSBmb3IgdGhlIGtub3duIGB0aG91Z2h0X3R5cGVgIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IEdlbmllVGhvdWdodFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdGhvdWdodF90eXBlOiB6LmN1c3RvbTxHZW5pZVRob3VnaHRUeXBlPigodikgPT4gdHlwZW9mIHYgPT09IFwic3RyaW5nXCIpLFxuICBjb250ZW50OiB6LnN0cmluZygpLFxufSk7XG4vKiogT25lIHR5cGVkIHJlYXNvbmluZyBlbnRyeSBhdHRhY2hlZCB0byBhIEdlbmllIHF1ZXJ5LiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVUaG91Z2h0ID0gei5pbmZlcjx0eXBlb2YgR2VuaWVUaG91Z2h0U2NoZW1hPjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYXR0YWNobWVudCBkaXNjcmltaW5hdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBEaXNjcmltaW5hdG9yIGZvciB3aGF0J3MgaW5zaWRlIGEgYEdlbmllQXR0YWNobWVudGAuIEdlbmllIG9ubHlcbiAqIGV2ZXIgcG9wdWxhdGVzIG9uZSBvZiBgcXVlcnlgIC8gYHRleHRgIC8gYHN1Z2dlc3RlZF9xdWVzdGlvbnNgXG4gKiBwZXIgYXR0YWNobWVudC4gT3BlbiB2aWEgYChzdHJpbmcgJiB7fSlgIHNvIGEgbmV3IHNlcnZlci1zaWRlXG4gKiB0eXBlIGRvZXNuJ3QgYnJlYWsgY29tcGlsYXRpb247IHRoZSB0aHJlZSBrbm93biB0eXBlcyBzdGlsbFxuICogbmFycm93IGNvcnJlY3RseSB1bmRlciBgc3dpdGNoYC5cbiAqXG4gKiBMaWZ0ZWQgaW50byB0aGUgc2NoZW1hIGFzIHRoZSBvcHRpb25hbFxuICoge0BsaW5rIEdlbmllQXR0YWNobWVudFNjaGVtYX0uYGF0dGFjaG1lbnRfdHlwZWAgZmllbGQgKGNvbXB1dGVcbiAqIGl0IHdpdGgge0BsaW5rIGRldGVjdEF0dGFjaG1lbnRUeXBlfSkgc28gY29uc3VtZXJzIGNhbiBicmFuY2hcbiAqIG9uIGEgbGl0ZXJhbCBpbnN0ZWFkIG9mIHByb2Jpbmcgd2hpY2ggc3ViLW9iamVjdCBrZXkgaXNcbiAqIHByZXNlbnQuIEFsc28gc3VyZmFjZWQgb24ge0BsaW5rIEF0dGFjaG1lbnRFdmVudH0ncyBwYXlsb2FkIGFzXG4gKiBgYXR0YWNobWVudF90eXBlYCAodnMgYSBiYXJlIGB0eXBlYCkgdG8ga2VlcCB0aGUgZmllbGQgY2xlYXIgb2ZcbiAqIHRoZSBldmVudC11bmlvbiBkaXNjcmltaW5hdG9yIGtleS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFUVEFDSE1FTlRfVFlQRVMgPSBbXG4gIFwicXVlcnlcIixcbiAgXCJ0ZXh0XCIsXG4gIFwic3VnZ2VzdGVkX3F1ZXN0aW9uc1wiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgc3RyaW5nW107XG4vKiogQXR0YWNobWVudCBkaXNjcmltaW5hdG9yIHZhbHVlcyB1bmRlcnN0b29kIGJ5IHRoaXMgcGFja2FnZSB2ZXJzaW9uLiAqL1xuZXhwb3J0IHR5cGUgS25vd25BdHRhY2htZW50VHlwZSA9ICh0eXBlb2YgQVRUQUNITUVOVF9UWVBFUylbbnVtYmVyXTtcbi8qKiBGb3J3YXJkLWNvbXBhdGlibGUgYXR0YWNobWVudCBkaXNjcmltaW5hdG9yLCBpbmNsdWRpbmcgZnV0dXJlIEdlbmllIHZhbHVlcy4gKi9cbmV4cG9ydCB0eXBlIEF0dGFjaG1lbnRUeXBlID0gS25vd25BdHRhY2htZW50VHlwZSB8IChzdHJpbmcgJiB7fSk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gd2lkZW5lZCB3aXJlIHNjaGVtYXMgKyB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBgR2VuaWVRdWVyeUF0dGFjaG1lbnRgIHdpZGVuZWQgd2l0aCB0aGUgYHRob3VnaHRzW11gIGZpZWxkIHRoZVxuICogR2VuaWUgd2lyZSBleHBvc2VzIGJ1dCB0aGUgU0RLIGRvZXNuJ3QgY3VycmVudGx5IHR5cGUuIEV2ZXJ5XG4gKiBvdGhlciBmaWVsZCAoYGRlc2NyaXB0aW9uYCwgYHF1ZXJ5YCwgYHN0YXRlbWVudF9pZGAsXG4gKiBgcXVlcnlfcmVzdWx0X21ldGFkYXRhYCwgYHRpdGxlYCwgYHBhcmFtZXRlcnNgLFxuICogYGxhc3RfdXBkYXRlZF90aW1lc3RhbXBgLCBgaWRgKSBmbG93cyB0aHJvdWdoIHZlcmJhdGltIGZyb21cbiAqIHRoZSBTREsgc2NoZW1hLlxuICovXG5leHBvcnQgY29uc3QgR2VuaWVRdWVyeUF0dGFjaG1lbnRTY2hlbWEgPSBTREtHZW5pZVF1ZXJ5QXR0YWNobWVudFNjaGVtYS5leHRlbmQoe1xuICB0aG91Z2h0czogei5hcnJheShHZW5pZVRob3VnaHRTY2hlbWEpLm9wdGlvbmFsKCksXG59KTtcbi8qKiBRdWVyeSBhdHRhY2htZW50IHdpZGVuZWQgd2l0aCBHZW5pZSdzIHN0cmVhbWVkIHJlYXNvbmluZyB0aG91Z2h0cy4gKi9cbmV4cG9ydCB0eXBlIEdlbmllUXVlcnlBdHRhY2htZW50ID0gei5pbmZlcjx0eXBlb2YgR2VuaWVRdWVyeUF0dGFjaG1lbnRTY2hlbWE+O1xuXG4vKipcbiAqIFB1cnBvc2UgYXR0YWNoZWQgdG8gYSBHZW5pZSB0ZXh0IHJlc3BvbnNlLlxuICpcbiAqIFRoZSBnZW5lcmF0ZWQgRGF0YWJyaWNrcyBTREsgc2NoZW1hIGN1cnJlbnRseSBrbm93cyBvbmx5XG4gKiBgRk9MTE9XX1VQX1FVRVNUSU9OYCwgd2hpbGUgdGhlIGxpdmUgR2VuaWUgQVBJIGFsc28gZW1pdHNcbiAqIGBURVhUX0FUVEFDSE1FTlRfUFVSUE9TRV9BTlNXRVJgIGZvciB0aGUgcHJpbWFyeSBhbnN3ZXIgdGV4dC4gS2VlcCB0aGVcbiAqIGtub3duIHZhbHVlcyBkaXNjb3ZlcmFibGUgYW5kIGFjY2VwdCBmdXR1cmUgc3RyaW5nIHZhbHVlcyBzbyBhbiBhZGRpdGl2ZVxuICogc2VydmVyLXNpZGUgZW51bSBjaGFuZ2UgY2Fubm90IGludmFsaWRhdGUgYW4gb3RoZXJ3aXNlIGNvbXBsZXRlIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCB0eXBlIEdlbmllVGV4dEF0dGFjaG1lbnRQdXJwb3NlID1cbiAgXCJGT0xMT1dfVVBfUVVFU1RJT05cIiB8IFwiVEVYVF9BVFRBQ0hNRU5UX1BVUlBPU0VfQU5TV0VSXCIgfCAoc3RyaW5nICYge30pO1xuXG4vKiogVGV4dCBhdHRhY2htZW50IHNjaGVtYSB3aWRlbmVkIGZvciBmb3J3YXJkLWNvbXBhdGlibGUgcHVycG9zZSB2YWx1ZXMuICovXG5leHBvcnQgY29uc3QgR2VuaWVUZXh0QXR0YWNobWVudFNjaGVtYSA9IGRhc2hib2FyZHMudGV4dEF0dGFjaG1lbnRTY2hlbWEuZXh0ZW5kKHtcbiAgcHVycG9zZTogei5jdXN0b208R2VuaWVUZXh0QXR0YWNobWVudFB1cnBvc2U+KCh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKS5vcHRpb25hbCgpLFxufSk7XG4vKiogTmFycmF0aXZlIHRleHQgYXR0YWNobWVudCwgaW5jbHVkaW5nIGl0cyBvcHRpb25hbCBzZW1hbnRpYyBwdXJwb3NlLiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVUZXh0QXR0YWNobWVudCA9IHouaW5mZXI8dHlwZW9mIEdlbmllVGV4dEF0dGFjaG1lbnRTY2hlbWE+O1xuXG4vKipcbiAqIGBHZW5pZUF0dGFjaG1lbnRgIHdpdGg6XG4gKlxuICogICAtIGBxdWVyeWAgcmUtdHlwZWQgdG8gdGhlIHRob3VnaHRzLWF3YXJlXG4gKiAgICAge0BsaW5rIEdlbmllUXVlcnlBdHRhY2htZW50U2NoZW1hfS5cbiAqICAgLSBgYXR0YWNobWVudF90eXBlYCBkaXNjcmltaW5hdG9yIGxpdGVyYWxcbiAqICAgICAoe0BsaW5rIEF0dGFjaG1lbnRUeXBlfSkgc28gY29uc3VtZXJzIGNhbiBgc3dpdGNoXG4gKiAgICAgKGF0dC5hdHRhY2htZW50X3R5cGUpYCB0byBuYXJyb3cgd2hpY2ggc3ViLW9iamVjdCBpc1xuICogICAgIHBvcHVsYXRlZC4gT3B0aW9uYWwgb24gdGhlIHdpcmUgKEdlbmllIGRvZXNuJ3Qgc2VuZCBpdCk7XG4gKiAgICAgY2FsbGVycyBjb21wdXRlIGl0IHdpdGgge0BsaW5rIGRldGVjdEF0dGFjaG1lbnRUeXBlfSB3aGVuXG4gKiAgICAgdGhleSB3YW50IHRoZSBsaXRlcmFsIHVwLWZyb250LlxuICpcbiAqIGB0ZXh0YCBpcyByZS10eXBlZCB0byB0aGUgZm9yd2FyZC1jb21wYXRpYmxlXG4gKiB7QGxpbmsgR2VuaWVUZXh0QXR0YWNobWVudFNjaGVtYX0uIGBhdHRhY2htZW50X2lkYCBhbmRcbiAqIGBzdWdnZXN0ZWRfcXVlc3Rpb25zYCBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkLiBgYXR0YWNobWVudF9pZGAgaXMgZ2VudWluZWx5XG4gKiBvcHRpb25hbCBvbiB0aGUgd2lyZTpcbiAqIHRoZSBmaXJzdCB0ZXh0IGF0dGFjaG1lbnQgR2VuaWUgZW1pdHMgcGVyIHR1cm4gKHRoZSBcIm1haW5cbiAqIGFuc3dlciB0ZXh0XCIpIGFycml2ZXMgd2l0aCBubyBpZCwgb25seSB0aGUgZm9sbG93LXVwIHRleHRcbiAqIGF0dGFjaG1lbnQgZ2V0cyBvbmUuXG4gKi9cbmV4cG9ydCBjb25zdCBHZW5pZUF0dGFjaG1lbnRTY2hlbWEgPSBTREtHZW5pZUF0dGFjaG1lbnRTY2hlbWEuZXh0ZW5kKHtcbiAgcXVlcnk6IEdlbmllUXVlcnlBdHRhY2htZW50U2NoZW1hLm9wdGlvbmFsKCksXG4gIHRleHQ6IEdlbmllVGV4dEF0dGFjaG1lbnRTY2hlbWEub3B0aW9uYWwoKSxcbiAgYXR0YWNobWVudF90eXBlOiB6LmN1c3RvbTxBdHRhY2htZW50VHlwZT4oKHYpID0+IHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKS5vcHRpb25hbCgpLFxufSk7XG4vKiogR2VuaWUgbWVzc2FnZSBhdHRhY2htZW50IHdpdGggYW4gb3B0aW9uYWwgY29tcHV0ZWQgZGlzY3JpbWluYXRvci4gKi9cbmV4cG9ydCB0eXBlIEdlbmllQXR0YWNobWVudCA9IHouaW5mZXI8dHlwZW9mIEdlbmllQXR0YWNobWVudFNjaGVtYT47XG5cbi8qKlxuICogYEdlbmllTWVzc2FnZWAgd2lkZW5lZCB3aXRoOlxuICpcbiAqICAgLSBgYXV0b19yZWdlbmVyYXRlX2NvdW50YDogbnVtYmVyIHN0YW1wZWQgb24gZXZlcnkgd2lyZVxuICogICAgIG1lc3NhZ2UgdGhhdCB0aGUgU0RLIHR5cGUgb21pdHMgYXQgdjAuMTcuXG4gKiAgIC0gYGF0dGFjaG1lbnRzYDogcmUtdHlwZWQgdG8gdGhlIGxvY2FsXG4gKiAgICAge0BsaW5rIEdlbmllQXR0YWNobWVudFNjaGVtYX0gc29cbiAqICAgICBgYXR0YWNobWVudC5xdWVyeT8udGhvdWdodHNgIChhbmQgdGhlXG4gKiAgICAgYGF0dGFjaG1lbnRfdHlwZWAgZGlzY3JpbWluYXRvcikgaXMgcmVhY2hhYmxlIHdpdGhvdXQgYVxuICogICAgIGNhc3QuXG4gKlxuICogRXZlcnkgb3RoZXIgZmllbGQgKGBpZGAsIGBzcGFjZV9pZGAsIGBjb252ZXJzYXRpb25faWRgLFxuICogYHVzZXJfaWRgLCBgY3JlYXRlZF90aW1lc3RhbXBgLCBgbGFzdF91cGRhdGVkX3RpbWVzdGFtcGAsXG4gKiBgc3RhdHVzYCwgYGNvbnRlbnRgLCBgbWVzc2FnZV9pZGAsIGBxdWVyeV9yZXN1bHRgLCBgZXJyb3JgLFxuICogYGZlZWRiYWNrYCkgcGFzc2VzIHRocm91Z2ggZnJvbSB0aGUgU0RLIHNjaGVtYS5cbiAqL1xuZXhwb3J0IGNvbnN0IEdlbmllTWVzc2FnZVNjaGVtYSA9IFNES0dlbmllTWVzc2FnZVNjaGVtYS5leHRlbmQoe1xuICBhdHRhY2htZW50czogei5hcnJheShHZW5pZUF0dGFjaG1lbnRTY2hlbWEpLm9wdGlvbmFsKCksXG4gIGF1dG9fcmVnZW5lcmF0ZV9jb3VudDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxufSk7XG4vKiogR2VuaWUgbWVzc2FnZSBzbmFwc2hvdCB3aWRlbmVkIHdpdGggdHlwZWQgYXR0YWNobWVudHMgYW5kIHJlZ2VuZXJhdGlvbiBjb3VudC4gKi9cbmV4cG9ydCB0eXBlIEdlbmllTWVzc2FnZSA9IHouaW5mZXI8dHlwZW9mIEdlbmllTWVzc2FnZVNjaGVtYT47XG5cbi8qKlxuICogRG9tYWluIHByb2plY3Rpb24gb2Yge0BsaW5rIEdlbmllTWVzc2FnZVNjaGVtYX0gdGhhdCBkcm9wcyBldmVyeVxuICogdHVybi1sZXZlbCBmaWVsZCAoYGlkYCwgYHN0YXR1c2AsIGBjcmVhdGVkX3RpbWVzdGFtcGAsXG4gKiBgcXVlcnlfcmVzdWx0YCwgLi4uKSBhbmQgeWllbGRzIGp1c3QgdGhlIHJlc3BvbnNlIHBheWxvYWQgYXMgYVxuICogZmxhdCBgR2VuaWVBdHRhY2htZW50W11gLiBQYXJzZXMgdGhlIHNhbWUgd2lyZSBzaGFwZSBhc1xuICoge0BsaW5rIEdlbmllTWVzc2FnZVNjaGVtYX07IG1pc3NpbmcgYGF0dGFjaG1lbnRzYCBkZWZhdWx0cyB0b1xuICogYFtdYCBzbyB0aGUgb3V0cHV0IGlzIGFsd2F5cyBhbiBhcnJheS5cbiAqXG4gKiBVc2Ugd2hlbiBjb25zdW1lcnMgb25seSBjYXJlIGFib3V0IHRoZSBtb2RlbCdzIHJlc3BvbnNlXG4gKiBhdHRhY2htZW50cyBhbmQgbm90IHRoZSBzdXJyb3VuZGluZyBtZXNzYWdlIGVudmVsb3BlLlxuICovXG5leHBvcnQgY29uc3QgR2VuaWVSZXNwb25zZVNjaGVtYSA9IEdlbmllTWVzc2FnZVNjaGVtYS50cmFuc2Zvcm0oKG0pID0+IG0uYXR0YWNobWVudHMgPz8gW10pO1xuLyoqIE5vcm1hbGl6ZWQgYXR0YWNobWVudCBhcnJheSBleHRyYWN0ZWQgZnJvbSBhIEdlbmllIG1lc3NhZ2UgcmVzcG9uc2UuICovXG5leHBvcnQgdHlwZSBHZW5pZVJlc3BvbnNlID0gei5pbmZlcjx0eXBlb2YgR2VuaWVSZXNwb25zZVNjaGVtYT47XG5cbi8qKlxuICogYEdlbmllU3BhY2VgIHdpZGVuZWQgd2l0aCBhbiBvcHRpb25hbCBgc2VyaWFsaXplZF9zcGFjZWAgZmllbGRcbiAqIGNhcnJ5aW5nIGEgSlNPTi1zdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwYWNlJ3MgZnVsbFxuICogZGVmaW5pdGlvbiAoY2F0YWxvZ3MsIHNjaGVtYXMsIHRhYmxlcywgc2FtcGxlIHF1ZXN0aW9ucywgcHJvbXB0cyxcbiAqIGV0Yy4pIGFzIGV4cG9ydGVkIGJ5IHRoZSB3b3Jrc3BhY2UgZXhwb3J0IGVuZHBvaW50LlxuICpcbiAqIFRoZSBiYXNlIFNESyBzaGFwZSAoYGRlc2NyaXB0aW9uYCwgYHNwYWNlX2lkYCwgYHRpdGxlYCxcbiAqIGB3YXJlaG91c2VfaWRgKSBjb3ZlcnMgdGhlIGRpcmVjdG9yeS1saXN0aW5nIHN1cmZhY2UgLSBlbm91Z2ggdG9cbiAqIHJvdXRlIGEgY2hhdC4gYHNlcmlhbGl6ZWRfc3BhY2VgIGlzIG9wdC1pbiBzbyBjYWxsZXJzIHRoYXQgbmVlZFxuICogdGhlIGZ1bGwgc3BhY2Ugc2NoZW1hIChlLmcuIHRvIHNlZWQgYSBzeXN0ZW0gcHJvbXB0IG9yIHRvIHNoaXBcbiAqIHRoZSBkZWZpbml0aW9uIHRvIGFuIGFnZW50KSBjYW4gYXR0YWNoIGl0IHdpdGhvdXQgYSBzZWNvbmQgdHlwZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEdlbmllU3BhY2VTY2hlbWEgPSBTREtHZW5pZVNwYWNlU2NoZW1hLmV4dGVuZCh7XG4gIHNlcmlhbGl6ZWRfc3BhY2U6IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIFwiVGhlIGNvbnRlbnRzIG9mIHRoZSBHZW5pZSBTcGFjZSBpbiBzZXJpYWxpemVkIHN0cmluZyBmb3JtLiBUaGlzIGZpZWxkIGlzIGV4Y2x1ZGVkIGluIExpc3QgR2VuaWUgc3BhY2VzIHJlc3BvbnNlcy4gVGhpcyBmaWVsZCBwcm92aWRlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBKU09OIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIHNwYWNlJ3MgbGF5b3V0IGFuZCBjb21wb25lbnRzLlwiLFxuICAgICksXG59KTtcbi8qKiBHZW5pZSBzcGFjZSBtZXRhZGF0YSB3aXRoIHRoZSBpZGVudGlmaWVycyByZXF1aXJlZCBieSBjaGF0IGNvbnN1bWVycy4gKi9cbmV4cG9ydCB0eXBlIEdlbmllU3BhY2UgPSB6LmluZmVyPHR5cGVvZiBHZW5pZVNwYWNlU2NoZW1hPjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHRlcm1pbmFsIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFRlcm1pbmFsIEdlbmllIG1lc3NhZ2Ugc3RhdHVzZXMuIFRoZSBwb2xsaW5nIGxvb3AgaW4gdGhlIGNoYXRcbiAqIGRyaXZlciBzdG9wcyBhcyBzb29uIGFzIHRoZSBsYXRlc3QgbWVzc2FnZSBoYXMgb25lIG9mIHRoZXNlXG4gKiBzdGF0dXNlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFRFUk1JTkFMX1NUQVRVU0VTID0gW1wiQ09NUExFVEVEXCIsIFwiRkFJTEVEXCIsIFwiQ0FOQ0VMTEVEXCJdIGFzIGNvbnN0O1xuLyoqIE1lc3NhZ2Ugc3RhdHVzIHRoYXQgZW5kcyBhIEdlbmllIHR1cm4gYW5kIHByb2R1Y2VzIGEgZmluYWwgcmVzdWx0IGV2ZW50LiAqL1xuZXhwb3J0IHR5cGUgVGVybWluYWxTdGF0dXMgPSAodHlwZW9mIFRFUk1JTkFMX1NUQVRVU0VTKVtudW1iZXJdO1xuXG4vKiogTmFycm93IGBNZXNzYWdlU3RhdHVzIHwgdW5kZWZpbmVkYCB0byBhIHtAbGluayBUZXJtaW5hbFN0YXR1c30uICovXG5leHBvcnQgZnVuY3Rpb24gaXNUZXJtaW5hbFN0YXR1cyhzOiBNZXNzYWdlU3RhdHVzIHwgdW5kZWZpbmVkKTogcyBpcyBUZXJtaW5hbFN0YXR1cyB7XG4gIHJldHVybiBzICE9PSB1bmRlZmluZWQgJiYgKFRFUk1JTkFMX1NUQVRVU0VTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyhzKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgcmF3IEdlbmllIHdpcmUgc3RhdHVzIChgRkVUQ0hJTkdfTUVUQURBVEFgLFxuICogYEFTS0lOR19BSWAsIGBFWEVDVVRJTkdfUVVFUllgLCAuLi4pIGludG8gYSBzaG9ydCwgc2VudGVuY2UtY2FzZWRcbiAqIGxhYmVsIHNhZmUgdG8gZHJvcCBpbnRvIGEgVUkgcGlsbC4gS25vd24gc3RhdGVzIGdldCBhIGN1cmF0ZWRcbiAqIGxhYmVsOyB1bmtub3duIHN0YXRlcyBmYWxsIGJhY2sgdG8gYHN0cmluZy50b2tlbml6ZVdpdGhPcHRpb25zYFxuICogc28gbmV3IHN0YXRlcyBzdGlsbCByZW5kZXIgY2xlYW5seSB3aXRob3V0IGNvZGUgY2hhbmdlcy5cbiAqXG4gKiBQdXJlIChubyBOb2RlLW9ubHkgZGVwcyksIHNhZmUgZm9yIGJyb3dzZXIgYnVuZGxlcy4gQm90aCB0aGVcbiAqIEdlbmllIGFnZW50IChzZXJ2ZXIpIGFuZCBhbnkgVUkgdGhhdCBzdWJzY3JpYmVzIHRvIHN0YXR1cyBldmVudHNcbiAqIGNhbGwgdGhpcyBzbyBsYWJlbHMgc3RheSBpbiBsb2NrLXN0ZXAgYWNyb3NzIHRoZSB3aXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaHVtYW5pemVTdGF0dXMoc3RhdHVzOiBNZXNzYWdlU3RhdHVzKTogc3RyaW5nIHtcbiAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICBjYXNlIFwiRkVUQ0hJTkdfTUVUQURBVEFcIjpcbiAgICAgIHJldHVybiBcIkZldGNoaW5nIG1ldGFkYXRhXCI7XG4gICAgY2FzZSBcIkFTS0lOR19BSVwiOlxuICAgICAgcmV0dXJuIFwiQXNraW5nIEdlbmllXCI7XG4gICAgY2FzZSBcIkVYRUNVVElOR19RVUVSWVwiOlxuICAgICAgcmV0dXJuIFwiUnVubmluZyBTUUwgcXVlcnlcIjtcbiAgICBjYXNlIFwiRklMVEVSSU5HX0NPTlRFWFRcIjpcbiAgICAgIHJldHVybiBcIkZpbHRlcmluZyBjb250ZXh0XCI7XG4gICAgY2FzZSBcIlBFTkRJTkdfV0FSRUhPVVNFXCI6XG4gICAgICByZXR1cm4gXCJXYWl0aW5nIGZvciB3YXJlaG91c2VcIjtcbiAgICBjYXNlIFwiQ09NUExFVEVEXCI6XG4gICAgICByZXR1cm4gXCJDb21wbGV0ZWRcIjtcbiAgICBjYXNlIFwiRkFJTEVEXCI6XG4gICAgICByZXR1cm4gXCJGYWlsZWRcIjtcbiAgICBjYXNlIFwiQ0FOQ0VMTEVEXCI6XG4gICAgICByZXR1cm4gXCJDYW5jZWxsZWRcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFsuLi5zdHJpbmcudG9rZW5pemVXaXRoT3B0aW9ucyh7IGNhcGl0YWxpemU6IHRydWUsIGxvd2VyQ2FzZTogdHJ1ZSB9LCBzdGF0dXMpXS5qb2luKFxuICAgICAgICBcIiBcIixcbiAgICAgICk7XG4gIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYXR0YWNobWVudCB0eXBlIGhlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogSW5zcGVjdCBhIHtAbGluayBHZW5pZUF0dGFjaG1lbnR9IGFuZCByZXR1cm4gdGhlXG4gKiB7QGxpbmsgQXR0YWNobWVudFR5cGV9IG9mIHBheWxvYWQgaXQgY2Fycmllcy4gUmV0dXJucyB0aGUgZmlyc3RcbiAqIGtub3duIHN1Yi1vYmplY3QgdGhhdCdzIHByZXNlbnQ7IGlmIG5vbmUgb2YgdGhlIGtub3duIG9uZXMgYXJlXG4gKiBwb3B1bGF0ZWQsIGZhbGxzIGJhY2sgdG8gdGhlIGZpcnN0IG5vbi1ib29ra2VlcGluZyBrZXlcbiAqIChmb3J3YXJkLWNvbXBhdCBmb3IgdHlwZXMgd2UgZG9uJ3QgbW9kZWwgeWV0KSwgZWxzZSBgXCJ1bmtub3duXCJgLlxuICpcbiAqIEhvbm9ycyBhIHByZS1zZXQgYGF0dGFjaG1lbnRfdHlwZWAgaWYgb25lIGlzIGFscmVhZHkgb24gdGhlXG4gKiB2YWx1ZSwgc28gdGhpcyBpcyBpZGVtcG90ZW50IGFjcm9zcyByZS1kZXRlY3Rpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0QXR0YWNobWVudFR5cGUoYXR0OiBHZW5pZUF0dGFjaG1lbnQpOiBBdHRhY2htZW50VHlwZSB7XG4gIGlmIChhdHQuYXR0YWNobWVudF90eXBlKSByZXR1cm4gYXR0LmF0dGFjaG1lbnRfdHlwZTtcbiAgaWYgKGF0dC5xdWVyeSkgcmV0dXJuIFwicXVlcnlcIjtcbiAgaWYgKGF0dC50ZXh0KSByZXR1cm4gXCJ0ZXh0XCI7XG4gIGlmIChhdHQuc3VnZ2VzdGVkX3F1ZXN0aW9ucykgcmV0dXJuIFwic3VnZ2VzdGVkX3F1ZXN0aW9uc1wiO1xuICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMoYXR0KSkge1xuICAgIGlmIChrICE9PSBcImF0dGFjaG1lbnRfaWRcIiAmJiBrICE9PSBcImF0dGFjaG1lbnRfdHlwZVwiKSByZXR1cm4gaztcbiAgfVxuICByZXR1cm4gXCJ1bmtub3duXCI7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2VuaWVDaGF0IGV2ZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBXaGVyZSBvbiB0aGUgd2lyZSBhbiBldmVudCB3YXMgb2JzZXJ2ZWQuIFNwcmVhZCBpbnRvIGV2ZXJ5XG4gKiBhdHRhY2htZW50LXNjb3BlZCBldmVudCBwYXlsb2FkIHNvIHN1YnNjcmliZXJzIGNhbiByb3V0ZSwgbG9nLFxuICogb3IgY29ycmVsYXRlIHdpdGhvdXQgcmUtd2Fsa2luZyB0aGUgbWVzc2FnZS5cbiAqXG4gKiBGaWVsZHM6XG4gKiAgIC0gYHNwYWNlX2lkYDogdGhlIEdlbmllIHNwYWNlIHRoZSBjb252ZXJzYXRpb24gbGl2ZXMgaW4uXG4gKiAgIC0gYGNvbnZlcnNhdGlvbl9pZGA6IGNvbnZlcnNhdGlvbiBpZCBvbmNlIEdlbmllIGhhcyBhc3NpZ25lZCBvbmUuXG4gKiAgIC0gYG1lc3NhZ2VfaWRgOiBHZW5pZSBtZXNzYWdlIGlkIGZvciB0aGUgYWN0aXZlIHR1cm4uXG4gKiAgIC0gYGF0dGFjaG1lbnRfaWRgOiBhdHRhY2htZW50IHRoZSBldmVudCBjYW1lIGZyb20uIE9wdGlvbmFsXG4gKiAgICAgYmVjYXVzZSBHZW5pZSBzb21ldGltZXMgZW1pdHMgYW4gYW5vbnltb3VzIG1haW4tYW5zd2VyXG4gKiAgICAgYXR0YWNobWVudCB3aXRob3V0IGFuIGlkOyB0aG9zZSBzdGlsbCBnZXQgZXZlbnRzLCBqdXN0IHdpdGhcbiAqICAgICBgYXR0YWNobWVudF9pZGAgdW5kZWZpbmVkLlxuICovXG5leHBvcnQgY29uc3QgR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHNwYWNlX2lkOiB6LnN0cmluZygpLFxuICBjb252ZXJzYXRpb25faWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgbWVzc2FnZV9pZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBhdHRhY2htZW50X2lkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcbi8qKiBDb252ZXJzYXRpb24sIG1lc3NhZ2UsIGFuZCBhdHRhY2htZW50IGNvb3JkaW5hdGVzIHNoYXJlZCBieSBhdHRhY2htZW50IGV2ZW50cy4gKi9cbmV4cG9ydCB0eXBlIEdlbmllQ2hhdExvY2F0aW9uID0gei5pbmZlcjx0eXBlb2YgR2VuaWVDaGF0TG9jYXRpb25TY2hlbWE+O1xuXG4vKipcbiAqIExpZmVjeWNsZSBldmVudDogdGhlIHF1ZXN0aW9uIHRoaXMgdHVybiBpcyBhc2tpbmcgR2VuaWUuIEZpcmVzXG4gKiBvbmNlIHBlciBgZ2VuaWVFdmVudENoYXRgIGNhbGwsIHRoZSBmaXJzdCB0aW1lIHRoZSB1bmRlcmx5aW5nXG4gKiBgZ2VuaWVDaGF0YCBsb29wIHlpZWxkcyBhIGBHZW5pZU1lc3NhZ2VgLiBDYXJyaWVzIHRoZSBwcm9tcHRcbiAqIHRleHQgR2VuaWUgZWNob2VkIGJhY2sgb24gYG1lc3NhZ2UuY29udGVudGAgYW5kIHRoZSBhc3NpZ25lZFxuICogYG1lc3NhZ2VfaWRgIHNvIHN1YnNjcmliZXJzIGNhbiBncm91cCBldmVyeSBzdWJzZXF1ZW50IGV2ZW50XG4gKiBmb3IgdGhpcyB0dXJuIHVuZGVyIG9uZSBzdGFibGUga2V5LiBgY29udmVyc2F0aW9uX2lkYCBpc1xuICogcG9wdWxhdGVkIGZvciBib3RoIG9wZW5pbmcgYW5kIGZvbGxvdy11cCB0dXJucyAoR2VuaWUgYXNzaWduc1xuICogaXQgb24gYHN0YXJ0Q29udmVyc2F0aW9uYCkuXG4gKlxuICogRGVmZXJyZWQgKGluc3RlYWQgb2YgZmlyZWQgc3luY2hyb25vdXNseSBvbiBlbnRyeSkgc28gdGhlXG4gKiBgbWVzc2FnZV9pZGAgaXMgYXZhaWxhYmxlIHdoZW4gdGhlIGV2ZW50IGxhbmRzIC0gdGhhdCBvbmUgcm91bmRcbiAqIHRyaXAgY29zdHMgfjIwMG1zIGJ1dCBsZXRzIFVJcyByZW5kZXIgcXVlc3Rpb24gLyB0aGlua2luZyAvXG4gKiBxdWVyeSAvIHRleHQgYXMgYSBzaW5nbGUgZ3JvdXBlZCBibG9jayBwZXIgR2VuaWUgY2FsbCBpbnN0ZWFkXG4gKiBvZiBhIGZsYXQgc3RyZWFtLlxuICpcbiAqIGBhdHRhY2htZW50X2lkYCBpcyBpbnRlbnRpb25hbGx5IGFic2VudCAtIHF1ZXN0aW9ucyBhcmUgdHVyblxuICogc2NvcGVkLCBub3QgYXR0YWNobWVudCBzY29wZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBRdWVzdGlvbkV2ZW50U2NoZW1hID0gR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEub21pdCh7XG4gIGF0dGFjaG1lbnRfaWQ6IHRydWUsXG59KS5leHRlbmQoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJxdWVzdGlvblwiKSxcbiAgY29udGVudDogei5zdHJpbmcoKSxcbn0pO1xuLyoqIEluaXRpYWwgZXZlbnQgY2FycnlpbmcgdGhlIHVzZXIncyBxdWVzdGlvbiBhZnRlciBHZW5pZSBhc3NpZ25zIGEgbWVzc2FnZSBpZC4gKi9cbmV4cG9ydCB0eXBlIFF1ZXN0aW9uRXZlbnQgPSB6LmluZmVyPHR5cGVvZiBRdWVzdGlvbkV2ZW50U2NoZW1hPjtcblxuLyoqXG4gKiBMaWZlY3ljbGUgZXZlbnQ6IHJhdyBgR2VuaWVNZXNzYWdlYCBzbmFwc2hvdCBmb3IgdGhlIGFjdGl2ZVxuICogdHVybi4gRmlyZXMgb25jZSBwZXIgcG9sbCB5aWVsZC4gVGhlIGZ1bGwgbWVzc2FnZSBzaGFwZVxuICogKGluY2x1ZGluZyB0aGUgd2lkZW5lZCB0aG91Z2h0IC8gcmVnZW4gLyBhdHRhY2htZW50LXR5cGVcbiAqIGZpZWxkcykgaXMgZXhwb3NlZCBpbmxpbmUgYXMgYG1lc3NhZ2VgOyBjb25zdW1lcnMgbmFycm93IG9uXG4gKiBgZXZlbnQudHlwZSA9PT0gXCJtZXNzYWdlXCJgIGFuZCByZWFjaCBmb3IgYGV2ZW50Lm1lc3NhZ2VgLlxuICovXG5leHBvcnQgY29uc3QgTWVzc2FnZUV2ZW50U2NoZW1hID0gR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEub21pdCh7XG4gIGF0dGFjaG1lbnRfaWQ6IHRydWUsXG59KS5leHRlbmQoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJtZXNzYWdlXCIpLFxuICBtZXNzYWdlOiBHZW5pZU1lc3NhZ2VTY2hlbWEsXG59KTtcbi8qKiBSYXcgR2VuaWUgbWVzc2FnZSBzbmFwc2hvdCBlbWl0dGVkIG9uIGV2ZXJ5IHBvbGwgaXRlcmF0aW9uLiAqL1xuZXhwb3J0IHR5cGUgTWVzc2FnZUV2ZW50ID0gei5pbmZlcjx0eXBlb2YgTWVzc2FnZUV2ZW50U2NoZW1hPjtcblxuLyoqXG4gKiBUb3AtbGV2ZWwgYG1lc3NhZ2Uuc3RhdHVzYCB0cmFuc2l0aW9uZWQuIEZpcmVzIGZvciBldmVyeVxuICogZGlzdGluY3Qgc3RhdHVzIHNlZW4gb24gdGhlIHdpcmUgKGUuZy4gYFNVQk1JVFRFRGAgLT5cbiAqIGBGSUxURVJJTkdfQ09OVEVYVGAgLT4gYEFTS0lOR19BSWAgLT4gYFBFTkRJTkdfV0FSRUhPVVNFYCAtPlxuICogYEFTS0lOR19BSWAgLT4gYENPTVBMRVRFRGApLlxuICovXG5leHBvcnQgY29uc3QgU3RhdHVzRXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5vbWl0KHtcbiAgYXR0YWNobWVudF9pZDogdHJ1ZSxcbn0pLmV4dGVuZCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInN0YXR1c1wiKSxcbiAgc3RhdHVzOiBNZXNzYWdlU3RhdHVzU2NoZW1hLFxuICBwcmV2aW91c19zdGF0dXM6IE1lc3NhZ2VTdGF0dXNTY2hlbWEub3B0aW9uYWwoKSxcbn0pO1xuLyoqIE1lc3NhZ2Utc3RhdHVzIHRyYW5zaXRpb24sIGluY2x1ZGluZyB0aGUgcHJldmlvdXMgc3RhdHVzIHdoZW4gYXZhaWxhYmxlLiAqL1xuZXhwb3J0IHR5cGUgU3RhdHVzRXZlbnQgPSB6LmluZmVyPHR5cGVvZiBTdGF0dXNFdmVudFNjaGVtYT47XG5cbi8qKlxuICogQSBuZXcgYXR0YWNobWVudCBzbG90IGFwcGVhcmVkIGluIGBtZXNzYWdlLmF0dGFjaG1lbnRzW11gLlxuICogRmlyZXMgZXhhY3RseSBvbmNlIHBlciBhdHRhY2htZW50IChtYXRjaGVkIGJ5IGBhdHRhY2htZW50X2lkYCxcbiAqIHBvc2l0aW9uYWxseSBmb3IgYW5vbnltb3VzIGF0dGFjaG1lbnRzKSB0aGUgZmlyc3QgdGltZSB3ZSBzZWVcbiAqIGl0LiBUaGUgc2xvdCdzIHBheWxvYWQga2luZCBsYW5kcyBpbiBgYXR0YWNobWVudF90eXBlYCBzbyB0aGVcbiAqIG91dGVyIGB0eXBlYCBkaXNjcmltaW5hdG9yIHN0YXlzIHVuYW1iaWd1b3VzLlxuICovXG5leHBvcnQgY29uc3QgQXR0YWNobWVudEV2ZW50U2NoZW1hID0gR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEuZXh0ZW5kKHtcbiAgdHlwZTogei5saXRlcmFsKFwiYXR0YWNobWVudFwiKSxcbiAgaW5kZXg6IHoubnVtYmVyKCksXG4gIGF0dGFjaG1lbnRfdHlwZTogei5jdXN0b208QXR0YWNobWVudFR5cGU+KCh2KSA9PiB0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiksXG59KTtcbi8qKiBFdmVudCBlbWl0dGVkIHdoZW4gYSBuZXcgdHlwZWQgYXR0YWNobWVudCBhcHBlYXJzIG9uIHRoZSBtZXNzYWdlLiAqL1xuZXhwb3J0IHR5cGUgQXR0YWNobWVudEV2ZW50ID0gei5pbmZlcjx0eXBlb2YgQXR0YWNobWVudEV2ZW50U2NoZW1hPjtcblxuLyoqXG4gKiBBIG5ldyByZWFzb25pbmcgc3RlcCBhcHBlYXJlZCBvbiBhIHF1ZXJ5IGF0dGFjaG1lbnRcbiAqIChgYXR0YWNobWVudHNbaV0ucXVlcnkudGhvdWdodHNbaV1gKS4gRGVkdXBsaWNhdGVkIHBlclxuICogYCh0aG91Z2h0X3R5cGUsIGNvbnRlbnQpYCB0dXBsZSB3aXRoaW4gYW4gYXR0YWNobWVudCBzb1xuICogc3Vic2NyaWJlcnMgZG9uJ3Qgc2VlIHRoZSBzYW1lIHRob3VnaHQgbXVsdGlwbGUgdGltZXMgLSBHZW5pZVxuICogc29tZXRpbWVzIG11dGF0ZXMgZXhpc3RpbmcgdGhvdWdodCBzbG90cyBpbiBwbGFjZSwgc28gdGhlIGRpZmZcbiAqIGlzIHZhbHVlLWJhc2VkIHJhdGhlciB0aGFuIHBvc2l0aW9uYWwuXG4gKi9cbmV4cG9ydCBjb25zdCBUaGlua2luZ0V2ZW50U2NoZW1hID0gR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEuZXh0ZW5kKHtcbiAgdHlwZTogei5saXRlcmFsKFwidGhpbmtpbmdcIiksXG4gIHRleHQ6IHouc3RyaW5nKCksXG4gIHRob3VnaHRfdHlwZTogei5jdXN0b208R2VuaWVUaG91Z2h0VHlwZT4oKHYpID0+IHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSxcbn0pO1xuLyoqIEluY3JlbWVudGFsIEdlbmllIHJlYXNvbmluZyBldmVudCBkZXJpdmVkIGZyb20gcXVlcnkgdGhvdWdodHMuICovXG5leHBvcnQgdHlwZSBUaGlua2luZ0V2ZW50ID0gei5pbmZlcjx0eXBlb2YgVGhpbmtpbmdFdmVudFNjaGVtYT47XG5cbi8qKlxuICogQSB0ZXh0LWF0dGFjaG1lbnQgYGNvbnRlbnRgIGZpZWxkIGFwcGVhcmVkIG9yIGNoYW5nZWRcbiAqIChgYXR0YWNobWVudHNbaV0udGV4dC5jb250ZW50YCkuIEZpcmVzIHdoZW5ldmVyIHRoZSBzbmFwc2hvdFxuICogdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBwcmV2aW91cyBvbmUgZm9yIHRoZSBzYW1lIGF0dGFjaG1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBUZXh0RXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5leHRlbmQoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJ0ZXh0XCIpLFxuICB0ZXh0OiB6LnN0cmluZygpLFxufSk7XG4vKiogTmFycmF0aXZlIGFuc3dlciBmcmFnbWVudCBlbWl0dGVkIGZyb20gYSBHZW5pZSB0ZXh0IGF0dGFjaG1lbnQuICovXG5leHBvcnQgdHlwZSBUZXh0RXZlbnQgPSB6LmluZmVyPHR5cGVvZiBUZXh0RXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIFNRTCB3YXMgZmluYWxpemVkIG9uIGEgcXVlcnkgYXR0YWNobWVudFxuICogKGBhdHRhY2htZW50c1tpXS5xdWVyeS5xdWVyeWApLiBGaXJlcyBvbmNlIHdoZW4gdGhlIFNRTCBzdHJpbmdcbiAqIHRyYW5zaXRpb25zIGZyb20gdW5kZWZpbmVkIHRvIGRlZmluZWQsIGFuZCBhZ2FpbiBpZiBHZW5pZSBldmVyXG4gKiByZXdyaXRlcyBpdC4gYHRpdGxlYCBhbmQgYGRlc2NyaXB0aW9uYCBhcmUgZGVub3JtYWxpc2VkIG9mZiB0aGVcbiAqIGF0dGFjaG1lbnQncyBgcXVlcnkudGl0bGVgIC8gYHF1ZXJ5LmRlc2NyaXB0aW9uYCBzbyBjb25zdW1lcnNcbiAqIGNhbiBsYWJlbCB0aGUgU1FMIHBpbGwgd2l0aG91dCByZS13YWxraW5nIHRoZSBtZXNzYWdlLlxuICovXG5leHBvcnQgY29uc3QgUXVlcnlFdmVudFNjaGVtYSA9IEdlbmllQ2hhdExvY2F0aW9uU2NoZW1hLmV4dGVuZCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInF1ZXJ5XCIpLFxuICBzcWw6IHouc3RyaW5nKCksXG4gIHRpdGxlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcbi8qKiBGaW5hbGl6ZWQgb3IgcmV3cml0dGVuIFNRTCBlbWl0dGVkIGZvciBhIEdlbmllIHF1ZXJ5IGF0dGFjaG1lbnQuICovXG5leHBvcnQgdHlwZSBRdWVyeUV2ZW50ID0gei5pbmZlcjx0eXBlb2YgUXVlcnlFdmVudFNjaGVtYT47XG5cbi8qKlxuICogU1FMIHdhcyBzdWJtaXR0ZWQgdG8gYSBTUUwgd2FyZWhvdXNlIGFuZCBhIHN0YXRlbWVudCBpZCB3YXNcbiAqIGFzc2lnbmVkIChgYXR0YWNobWVudHNbaV0ucXVlcnkuc3RhdGVtZW50X2lkYCkuIEZpcmVzIHdoZW4gdGhlXG4gKiBzdGF0ZW1lbnQgaWQgdHJhbnNpdGlvbnMgZnJvbSB1bmRlZmluZWQgdG8gZGVmaW5lZCAtIHRoaXMgaXMgdGhlXG4gKiBwb2ludCBhdCB3aGljaCBgY2xpZW50LnN0YXRlbWVudEV4ZWN1dGlvbi5nZXRTdGF0ZW1lbnQoeyBzdGF0ZW1lbnRfaWQgfSlgXG4gKiBiZWNvbWVzIGEgdmFsaWQgY2FsbC5cbiAqL1xuZXhwb3J0IGNvbnN0IFN0YXRlbWVudEV2ZW50U2NoZW1hID0gR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEuZXh0ZW5kKHtcbiAgdHlwZTogei5saXRlcmFsKFwic3RhdGVtZW50XCIpLFxuICBzdGF0ZW1lbnRfaWQ6IHouc3RyaW5nKCksXG59KTtcbi8qKiBFdmVudCBpbmRpY2F0aW5nIHRoYXQgYSBxdWVyeSByZWNlaXZlZCBhbiBleGVjdXRhYmxlIHN0YXRlbWVudCBpZC4gKi9cbmV4cG9ydCB0eXBlIFN0YXRlbWVudEV2ZW50ID0gei5pbmZlcjx0eXBlb2YgU3RhdGVtZW50RXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIFJvdyBjb3VudCBmb3IgYSBxdWVyeSBhdHRhY2htZW50J3MgcmVzdWx0IGNoYW5nZWRcbiAqIChgYXR0YWNobWVudHNbaV0ucXVlcnkucXVlcnlfcmVzdWx0X21ldGFkYXRhLnJvd19jb3VudGApLiBGaXJlc1xuICogb24gZXZlcnkgY2hhbmdlLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYHVuZGVmaW5lZCAtPiAwYCBhbmQgdGhlXG4gKiBsYXRlciBgMCAtPiBOYCBvbmNlIHRoZSB3YXJlaG91c2UgZmluaXNoZXMgZXhlY3V0aW9uLlxuICovXG5leHBvcnQgY29uc3QgUm93c0V2ZW50U2NoZW1hID0gR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEuZXh0ZW5kKHtcbiAgdHlwZTogei5saXRlcmFsKFwicm93c1wiKSxcbiAgcm93X2NvdW50OiB6Lm51bWJlcigpLFxuICBwcmV2aW91c19yb3dfY291bnQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgc3RhdGVtZW50X2lkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcbi8qKiBSb3ctY291bnQgdHJhbnNpdGlvbiBmb3IgYSBHZW5pZSBxdWVyeSByZXN1bHQuICovXG5leHBvcnQgdHlwZSBSb3dzRXZlbnQgPSB6LmluZmVyPHR5cGVvZiBSb3dzRXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIEdlbmllIHByb2R1Y2VkIGEgZm9sbG93LXVwIHN1Z2dlc3RlZC1xdWVzdGlvbnMgbGlzdFxuICogKGBhdHRhY2htZW50c1tpXS5zdWdnZXN0ZWRfcXVlc3Rpb25zLnF1ZXN0aW9uc1tdYCkuIEZpcmVzIG9uY2VcbiAqIHdoZW4gdGhlIGxpc3QgYXBwZWFycywgYW5kIGFnYWluIGlmIEdlbmllIHJld3JpdGVzIGl0LlxuICovXG5leHBvcnQgY29uc3QgU3VnZ2VzdGVkUXVlc3Rpb25zRXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5leHRlbmQoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJzdWdnZXN0ZWRfcXVlc3Rpb25zXCIpLFxuICBxdWVzdGlvbnM6IHouYXJyYXkoei5zdHJpbmcoKSksXG59KTtcbi8qKiBGb2xsb3ctdXAgcXVlc3Rpb24gbGlzdCBlbWl0dGVkIHdoZW4gR2VuaWUgYWRkcyBvciByZXdyaXRlcyBzdWdnZXN0aW9ucy4gKi9cbmV4cG9ydCB0eXBlIFN1Z2dlc3RlZFF1ZXN0aW9uc0V2ZW50ID0gei5pbmZlcjx0eXBlb2YgU3VnZ2VzdGVkUXVlc3Rpb25zRXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIFRoZSBhY3RpdmUgdHVybiByZWFjaGVkIGEgdGVybWluYWwgc3RhdHVzLiBBbHdheXMgZmlyZXMgb25jZVxuICogcGVyIHR1cm4gKGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB0ZXJtaW5hbCBgbWVzc2FnZWAgZXZlbnQpLlxuICogQ2FycmllcyB0aGUgZmluYWwgYEdlbmllTWVzc2FnZWAgc25hcHNob3QgaW5saW5lIHNvIHN1YnNjcmliZXJzXG4gKiBkb24ndCBuZWVkIHRvIGtlZXAgdGhlaXIgb3duIGNvcHkgb2YgdGhlIGxhc3QgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJlc3VsdEV2ZW50U2NoZW1hID0gR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEub21pdCh7XG4gIGF0dGFjaG1lbnRfaWQ6IHRydWUsXG59KS5leHRlbmQoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJyZXN1bHRcIiksXG4gIHN0YXR1czogei5lbnVtKFRFUk1JTkFMX1NUQVRVU0VTKSxcbiAgbWVzc2FnZTogR2VuaWVNZXNzYWdlU2NoZW1hLFxufSk7XG4vKiogRmluYWwgZXZlbnQgZm9yIGEgR2VuaWUgdHVybiwgY2FycnlpbmcgaXRzIHRlcm1pbmFsIHN0YXR1cyBhbmQgbWVzc2FnZSBzbmFwc2hvdC4gKi9cbmV4cG9ydCB0eXBlIFJlc3VsdEV2ZW50ID0gei5pbmZlcjx0eXBlb2YgUmVzdWx0RXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIERpc2NyaW1pbmF0ZWQgdW5pb24geWllbGRlZCBieSBgZ2VuaWVFdmVudENoYXRgLiBFYWNoIHZhcmlhbnRcbiAqIGlzIGEgc2luZ2xlIGZsYXQgb2JqZWN0IHdpdGggYHR5cGVgIGFzIHRoZSBkaXNjcmltaW5hdG9yIGFuZFxuICogdGhlIHBheWxvYWQgZmllbGRzIGhvaXN0ZWQgZGlyZWN0bHkgdG8gdGhlIHRvcCBsZXZlbCAtIG5vXG4gKiBgcGF5bG9hZGAgd3JhcHBlci4gQ29uc3VtZXJzIG5hcnJvdyBvbiBgdHlwZWAgYW5kIHJlYWQgZmllbGRzXG4gKiBpbmxpbmU6XG4gKlxuICogQGV4YW1wbGVcbiAqIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2YgZ2VuaWVFdmVudENoYXQoc3BhY2VJZCwgXCJUb3Agc3RvcmVzP1wiKSkge1xuICogICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAqICAgICBjYXNlIFwidGhpbmtpbmdcIjpcbiAqICAgICAgIGNvbnNvbGUubG9nKGV2ZW50LnRob3VnaHRfdHlwZSwgZXZlbnQudGV4dCk7XG4gKiAgICAgICBicmVhaztcbiAqICAgICBjYXNlIFwicmVzdWx0XCI6XG4gKiAgICAgICBjb25zb2xlLmxvZyhcImRvbmU6XCIsIGV2ZW50LnN0YXR1cyk7XG4gKiAgICAgICBicmVhaztcbiAqICAgfVxuICogfVxuICpcbiAqIFN0cmVhbSBvcmRlciBwZXIgdHVybjpcbiAqXG4gKiAgIDEuIGBxdWVzdGlvbmAsIGVtaXR0ZWQgd2l0aCB0aGUgZmlyc3QgYG1lc3NhZ2VgIHlpZWxkIChkZWZlcnJlZCBzb1xuICogICAgICB0aGUgYXNzaWduZWQgYG1lc3NhZ2VfaWRgIGlzIGF2YWlsYWJsZSksIGNhcnJ5aW5nIHRoZSBwcm9tcHRcbiAqICAgICAgdGhpcyB0dXJuIHNlbnQgdG8gR2VuaWUuXG4gKiAgIDIuIGBtZXNzYWdlYCBmb3IgZXZlcnkgcG9sbCB5aWVsZCAocmF3IGBHZW5pZU1lc3NhZ2VgIG9uXG4gKiAgICAgIGBldmVudC5tZXNzYWdlYCkuXG4gKiAgIDMuIEFueSBkZXJpdmVkIGV2ZW50cyB0aGUgc25hcHNob3QgZGlmZiBwcm9kdWNlZCAoYHN0YXR1c2AsXG4gKiAgICAgIGBhdHRhY2htZW50YCwgYHRoaW5raW5nYCwgYHRleHRgLCBgcXVlcnlgLCBgc3RhdGVtZW50YCxcbiAqICAgICAgYHJvd3NgLCBgc3VnZ2VzdGVkX3F1ZXN0aW9uc2ApIGluIHRoYXQgZml4ZWQgb3JkZXIuXG4gKiAgIDQuIE9uIHRoZSB0ZXJtaW5hbCBzbmFwc2hvdCwgYSBmaW5hbCBgcmVzdWx0YCBldmVudC5cbiAqXG4gKiBFcnJvcnMgcHJvcGFnYXRlIHZpYSB0aGUgZ2VuZXJhdG9yIHRocm93aW5nIChgdHJ5YC9gY2F0Y2hgIHRoZVxuICogYGZvciBhd2FpdGApLCBub3QgdmlhIGFuIGBlcnJvcmAgdmFyaWFudCBvbiB0aGlzIHVuaW9uLlxuICovXG5leHBvcnQgY29uc3QgR2VuaWVDaGF0RXZlbnRTY2hlbWEgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICBRdWVzdGlvbkV2ZW50U2NoZW1hLFxuICBNZXNzYWdlRXZlbnRTY2hlbWEsXG4gIFN0YXR1c0V2ZW50U2NoZW1hLFxuICBBdHRhY2htZW50RXZlbnRTY2hlbWEsXG4gIFRoaW5raW5nRXZlbnRTY2hlbWEsXG4gIFRleHRFdmVudFNjaGVtYSxcbiAgUXVlcnlFdmVudFNjaGVtYSxcbiAgU3RhdGVtZW50RXZlbnRTY2hlbWEsXG4gIFJvd3NFdmVudFNjaGVtYSxcbiAgU3VnZ2VzdGVkUXVlc3Rpb25zRXZlbnRTY2hlbWEsXG4gIFJlc3VsdEV2ZW50U2NoZW1hLFxuXSk7XG4vKiogT3JkZXJlZCBldmVudCB1bmlvbiB5aWVsZGVkIGJ5IGBnZW5pZUV2ZW50Q2hhdGA7IGZhaWx1cmVzIGFyZSB0aHJvd24sIG5vdCBlbWl0dGVkLiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVDaGF0RXZlbnQgPSB6LmluZmVyPHR5cGVvZiBHZW5pZUNoYXRFdmVudFNjaGVtYT47XG5cbi8qKiBEaXNjcmltaW5hdG9yIHR5cGUgZm9yIHtAbGluayBHZW5pZUNoYXRFdmVudH0uICovXG5leHBvcnQgdHlwZSBHZW5pZUNoYXRFdmVudFR5cGUgPSBHZW5pZUNoYXRFdmVudFtcInR5cGVcIl07XG5cbi8qKlxuICogRmllbGQgc2V0IGZvciBhIGdpdmVuIHtAbGluayBHZW5pZUNoYXRFdmVudFR5cGV9IC0gdGhlIHZhcmlhbnRcbiAqIHdpdGggdGhlIGB0eXBlYCBkaXNjcmltaW5hdG9yIHN0cmlwcGVkLiBVc2VkIGJ5IGRldGVjdG9ycyBpblxuICogYGV2ZW50LnRzYCBzbyBlYWNoIGRldGVjdG9yIHJldHVybnMganVzdCB0aGUgcGF5bG9hZCBmaWVsZHMgYW5kXG4gKiB0aGUgb3JjaGVzdHJhdG9yIHN0YW1wcyBgdHlwZWAgYXQgeWllbGQgdGltZS5cbiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVDaGF0RXZlbnRGaWVsZHM8VCBleHRlbmRzIEdlbmllQ2hhdEV2ZW50VHlwZT4gPSBPbWl0PFxuICBFeHRyYWN0PEdlbmllQ2hhdEV2ZW50LCB7IHR5cGU6IFQgfT4sXG4gIFwidHlwZVwiXG4+O1xuIl19
455
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuaWUtbW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuaWUtbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0NHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxLQUFLLFVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5QyxrRkFBa0Y7QUFDbEYsaUZBQWlGO0FBQ2pGLDZEQUE2RDtBQUM3RCxNQUFNLEVBQ0oscUJBQXFCLEVBQUUsd0JBQXdCLEVBQy9DLGtCQUFrQixFQUFFLHFCQUFxQixFQUN6QywwQkFBMEIsRUFBRSw2QkFBNkIsRUFDekQsZ0JBQWdCLEVBQUUsbUJBQW1CLEdBQ3RDLEdBQUcsVUFBVSxDQUFDO0FBVWYsd0ZBQXdGO0FBQ3hGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQztBQWlDbEU7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN6QyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBbUIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQztJQUN0RSxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtDQUNwQixDQUFDLENBQUM7QUFJSCw2RUFBNkU7QUFFN0U7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRztJQUM5QixPQUFPO0lBQ1AsTUFBTTtJQUNOLHFCQUFxQjtDQUNlLENBQUM7QUFNdkMseUVBQXlFO0FBRXpFOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyw2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XG4gKiBXaXJlLWZvcm1hdCB6b2Qgc2NoZW1hcyArIHR5cGVzIGFuZCBoaWdoLWxldmVsIGV2ZW50IHZvY2FidWxhcnlcbiAqIGZvciB0aGUgR2VuaWUgY2hhdCBkcml2ZXIuXG4gKlxuICogVHdvIHJlbGF0ZWQgbGF5ZXJzIGxpdmUgaGVyZTpcbiAqXG4gKiAgIDEuIEdlbmllIHdpcmUgc2hhcGVzIGRlcml2ZWQgZnJvbSB0aGlzIHBhY2thZ2UncyBvd24gZ2VuZXJhdGVkXG4gKiAgICAgIGBkYXNoYm9hcmRzYCBzY2hlbWFzIChyZWdlbmVyYXRlZCBmcm9tIHRoZSB1cHN0cmVhbVxuICogICAgICBgQGRhdGFicmlja3Mvc2RrLWV4cGVyaW1lbnRhbGAgYGFwaXMvZGFzaGJvYXJkcy9tb2RlbC5kLnRzYFxuICogICAgICBieSB0aGUgZW5naW5lJ3MgY29kZWdlbiBvbiBzeW50aCkuIFdlIGV4dGVuZCB0aGUgU0RLIHNjaGVtYXMgd2hlcmUgR2VuaWVcbiAqICAgICAgc2hpcHMgZmllbGRzIG9uIHRoZSB3aXJlIHRoYXQgdGhlIFNESyBkb2Vzbid0IGN1cnJlbnRseSB0eXBlOlxuICpcbiAqICAgICAgICAtIGBHZW5pZU1lc3NhZ2UuYXV0b19yZWdlbmVyYXRlX2NvdW50OiBudW1iZXJgIChzdGFtcGVkXG4gKiAgICAgICAgICBvbiBldmVyeSB3aXJlIG1lc3NhZ2UsIG9taXR0ZWQgZnJvbSB0aGUgU0RLIHNoYXBlKS5cbiAqICAgICAgICAtIGBHZW5pZVF1ZXJ5QXR0YWNobWVudC50aG91Z2h0czogR2VuaWVUaG91Z2h0W11gICh0aGVcbiAqICAgICAgICAgIHN0cmVhbWVkIHJlYXNvbmluZyBwYXlsb2FkIHdpdGggYERFU0NSSVBUSU9OYCxcbiAqICAgICAgICAgIGBEQVRBX1NPVVJDSU5HYCwgYFNURVBTYCwgYW5kIGBVTkRFUlNUQU5ESU5HYCB0aG91Z2h0XG4gKiAgICAgICAgICBraW5kcykuXG4gKiAgICAgICAgLSBgR2VuaWVBdHRhY2htZW50LmF0dGFjaG1lbnRfdHlwZTogQXR0YWNobWVudFR5cGVgXG4gKiAgICAgICAgICAoYW4gb3B0aW9uYWwgZGlzY3JpbWluYXRvciBsaXRlcmFsIHNvIGNhbGxlcnMgY2FuXG4gKiAgICAgICAgICBgc3dpdGNoIChhdHQuYXR0YWNobWVudF90eXBlKWAgaW5zdGVhZCBvZiBwcm9iaW5nXG4gKiAgICAgICAgICB3aGljaCBzdWIta2V5IGlzIHBvcHVsYXRlZDsgY29tcHV0ZSBpdCB3aXRoXG4gKiAgICAgICAgICB7QGxpbmsgZGV0ZWN0QXR0YWNobWVudFR5cGV9KS5cbiAqXG4gKiAgIDIuIEV2ZW50IHZvY2FidWxhcnkgZm9yIHRoZSBoaWdoLWxldmVsIGBnZW5pZUV2ZW50Q2hhdGBcbiAqICAgICAgZHJpdmVyLiBFYWNoIGV2ZW50IGlzIGEgZmxhdCBgei5vYmplY3RgIHdpdGggYSBgdHlwZWBcbiAqICAgICAgbGl0ZXJhbCBkaXNjcmltaW5hdG9yIGFuZCBzbmFrZV9jYXNlIHBheWxvYWQgZmllbGRzIGhvaXN0ZWRcbiAqICAgICAgdG8gdGhlIHRvcCBsZXZlbCAobm8gYHBheWxvYWRgIHdyYXBwZXIpLiBFdmVudHMgdGhhdCBzaGFyZVxuICogICAgICB0aGUgYXR0YWNobWVudC1zY29wZWQgbG9jYXRpb24gdXNlXG4gKiAgICAgIHtAbGluayBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYX0gYXMgYSBiYXNlOyBldmVudHMgdGhhdFxuICogICAgICBkb24ndCBjYXJyeSBhbiBgYXR0YWNobWVudF9pZGAgKHN0YXR1cywgcmVzdWx0KSBvbWl0IGl0LlxuICogICAgICB7QGxpbmsgR2VuaWVDaGF0RXZlbnRTY2hlbWF9IGJ1bmRsZXMgdGhlIHZhcmlhbnRzIGludG8gb25lXG4gKiAgICAgIGRpc2NyaW1pbmF0ZWQgdW5pb24uXG4gKlxuICogUHVyZSB0eXBlczogbm8gcnVudGltZSBpbXBvcnRzIGJleW9uZCB6b2QgKyB0aGUgZ2VuZXJhdGVkXG4gKiBgZGFzaGJvYXJkc2Agc2NoZW1hcywgbm8gTm9kZS1vbmx5IGNvZGUsIHNhZmUgZm9yIGJyb3dzZXIgYnVuZGxlcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgKiBhcyBkYXNoYm9hcmRzIGZyb20gXCIuL2Rhc2hib2FyZHMudHNcIjtcblxuLy8gVGhlIGdlbmVyYXRlZCBTREsgc2NoZW1hcyBsaXZlIGluIHRoZSBzaWJsaW5nIGAuL2Rhc2hib2FyZHMudHNgLCB3cml0dGVuIGJ5IHRoZVxuLy8gZW5naW5lJ3MgY29kZWdlbiBmcm9tIHRoZSB1cHN0cmVhbSBgLmQudHNgLiBBbGlhcyB0aGUgaGFuZGZ1bCBHZW5pZSBleHRlbmRzIHNvXG4vLyB0aGUgd2lkZW5lZCBzY2hlbWFzIGJlbG93IHJlYWQgYWdhaW5zdCBzaG9ydCwgbG9jYWwgbmFtZXMuXG5jb25zdCB7XG4gIGdlbmllQXR0YWNobWVudFNjaGVtYTogU0RLR2VuaWVBdHRhY2htZW50U2NoZW1hLFxuICBnZW5pZU1lc3NhZ2VTY2hlbWE6IFNES0dlbmllTWVzc2FnZVNjaGVtYSxcbiAgZ2VuaWVRdWVyeUF0dGFjaG1lbnRTY2hlbWE6IFNES0dlbmllUXVlcnlBdHRhY2htZW50U2NoZW1hLFxuICBnZW5pZVNwYWNlU2NoZW1hOiBTREtHZW5pZVNwYWNlU2NoZW1hLFxufSA9IGRhc2hib2FyZHM7XG5cbi8qKlxuICogVGhlIFNESydzIGBNZXNzYWdlU3RhdHVzYCB0eXBlLCByZS1leHBvcnRlZCBzbyBjb25zdW1lcnMgb2YgdGhlXG4gKiBHZW5pZSBjb250cmFjdCBnZXQgdGhlIGZ1bGwgd2lyZSB2b2NhYnVsYXJ5IGZyb20gYSBzaW5nbGUgaW1wb3J0XG4gKiBwYXRoIC0gbWlycm9ycyB0aGUgcmUtZXhwb3J0cyBvZiB0aGUgb3RoZXIgU0RLLWRlcml2ZWQgc2NoZW1hc1xuICogYmVsb3cuXG4gKi9cbmV4cG9ydCB0eXBlIE1lc3NhZ2VTdGF0dXMgPSBkYXNoYm9hcmRzLk1lc3NhZ2VTdGF0dXM7XG5cbi8qKiBSdW50aW1lIHZhbGlkYXRvciBmb3IgYSByYXcgR2VuaWUgbWVzc2FnZSBzdGF0dXMgZnJvbSB0aGUgZ2VuZXJhdGVkIFNESyBjb250cmFjdC4gKi9cbmV4cG9ydCBjb25zdCBNZXNzYWdlU3RhdHVzU2NoZW1hID0gZGFzaGJvYXJkcy5tZXNzYWdlU3RhdHVzU2NoZW1hO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0aG91Z2h0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogR2VuaWUncyBwZXItcXVlcnkgXCJ0aG91Z2h0c1wiIHN1cmZhY2UuIFRoZXNlIGFwcGVhciBvbiB0aGVcbiAqIGAvbWVzc2FnZXMve2lkfWAgd2lyZSB1bmRlciBgYXR0YWNobWVudHNbaV0ucXVlcnkudGhvdWdodHNbXWAgYnV0XG4gKiBhcmUgbm90IHR5cGVkIG9uIHRoZSBTREsncyBgR2VuaWVRdWVyeUF0dGFjaG1lbnRgIGF0IHYwLjE3LlxuICpcbiAqIEtub3duIHRob3VnaHQgdHlwZXMgb2JzZXJ2ZWQgaW4gcHJvZHVjdGlvbiBwb2xsczpcbiAqXG4gKiAgIC0gYFRIT1VHSFRfVFlQRV9ERVNDUklQVElPTmA6IGEgb25lLXBhcmFncmFwaCByZXN0YXRlbWVudCBvZlxuICogICAgIHdoYXQgdGhlIHVzZXIgYXNrZWQuIFRoZSBmaW5hbCBgcXVlcnkuZGVzY3JpcHRpb25gIGZpZWxkIG9uXG4gKiAgICAgdGhlIGF0dGFjaG1lbnQgY2FycmllcyB0aGUgc2FtZSB0ZXh0LlxuICogICAtIGBUSE9VR0hUX1RZUEVfREFUQV9TT1VSQ0lOR2A6IG1hcmtkb3duIGJ1bGxldHMgb2YgdGhlXG4gKiAgICAgZnVsbHktcXVhbGlmaWVkIGBjYXRhbG9nLnNjaGVtYS50YWJsZWAgc291cmNlcyBHZW5pZSBjaG9zZS5cbiAqICAgLSBgVEhPVUdIVF9UWVBFX1NURVBTYDogdGhlIGhpZ2gtbGV2ZWwgcGxhbiBHZW5pZSB3cm90ZSBiZWZvcmVcbiAqICAgICBydW5uaW5nIFNRTCAob25lIGJ1bGxldCBwZXIgc3RlcCkuXG4gKiAgIC0gYFRIT1VHSFRfVFlQRV9VTkRFUlNUQU5ESU5HYDogYW1iaWd1aXR5IC8gaW50ZXJwcmV0YXRpb25cbiAqICAgICBub3RlcyAoZS5nLiBcIidyZXZlbnVlJyBjb3VsZCBiZSBpbnRlcnByZXRlZCBhcyBncm9zcyxcbiAqICAgICBuZXQsIG9yIHJlY29nbml6ZWQgcmV2ZW51ZS4uLlwiKS5cbiAqXG4gKiBPcGVuIGF0IHRoZSB0eXBlIGxldmVsIChgfCAoc3RyaW5nICYge30pYCkgc28gYSBuZXcgc2VydmVyLXNpZGVcbiAqIHRob3VnaHQgdHlwZSBkb2Vzbid0IGJyZWFrIGNvbXBpbGF0aW9uOyB0aGUgZm91ciBrbm93biB0eXBlc1xuICogc3RpbGwgbmFycm93IGNvcnJlY3RseSB1bmRlciBgc3dpdGNoYC5cbiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVUaG91Z2h0VHlwZSA9XG4gIHwgXCJUSE9VR0hUX1RZUEVfREVTQ1JJUFRJT05cIlxuICB8IFwiVEhPVUdIVF9UWVBFX0RBVEFfU09VUkNJTkdcIlxuICB8IFwiVEhPVUdIVF9UWVBFX1NURVBTXCJcbiAgfCBcIlRIT1VHSFRfVFlQRV9VTkRFUlNUQU5ESU5HXCJcbiAgfCAoc3RyaW5nICYge30pO1xuXG4vKipcbiAqIE9uZSByZWFzb25pbmcgc3RlcCBvbiBhIHF1ZXJ5IGF0dGFjaG1lbnQuIFNlZVxuICoge0BsaW5rIEdlbmllVGhvdWdodFR5cGV9IGZvciB0aGUga25vd24gYHRob3VnaHRfdHlwZWAgdmFsdWVzLlxuICovXG5leHBvcnQgY29uc3QgR2VuaWVUaG91Z2h0U2NoZW1hID0gei5vYmplY3Qoe1xuICB0aG91Z2h0X3R5cGU6IHouY3VzdG9tPEdlbmllVGhvdWdodFR5cGU+KCh2KSA9PiB0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiksXG4gIGNvbnRlbnQ6IHouc3RyaW5nKCksXG59KTtcbi8qKiBPbmUgdHlwZWQgcmVhc29uaW5nIGVudHJ5IGF0dGFjaGVkIHRvIGEgR2VuaWUgcXVlcnkuICovXG5leHBvcnQgdHlwZSBHZW5pZVRob3VnaHQgPSB6LmluZmVyPHR5cGVvZiBHZW5pZVRob3VnaHRTY2hlbWE+O1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBhdHRhY2htZW50IGRpc2NyaW1pbmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIERpc2NyaW1pbmF0b3IgZm9yIHdoYXQncyBpbnNpZGUgYSBgR2VuaWVBdHRhY2htZW50YC4gR2VuaWUgb25seVxuICogZXZlciBwb3B1bGF0ZXMgb25lIG9mIGBxdWVyeWAgLyBgdGV4dGAgLyBgc3VnZ2VzdGVkX3F1ZXN0aW9uc2BcbiAqIHBlciBhdHRhY2htZW50LiBPcGVuIHZpYSBgKHN0cmluZyAmIHt9KWAgc28gYSBuZXcgc2VydmVyLXNpZGVcbiAqIHR5cGUgZG9lc24ndCBicmVhayBjb21waWxhdGlvbjsgdGhlIHRocmVlIGtub3duIHR5cGVzIHN0aWxsXG4gKiBuYXJyb3cgY29ycmVjdGx5IHVuZGVyIGBzd2l0Y2hgLlxuICpcbiAqIExpZnRlZCBpbnRvIHRoZSBzY2hlbWEgYXMgdGhlIG9wdGlvbmFsXG4gKiB7QGxpbmsgR2VuaWVBdHRhY2htZW50U2NoZW1hfS5gYXR0YWNobWVudF90eXBlYCBmaWVsZCAoY29tcHV0ZVxuICogaXQgd2l0aCB7QGxpbmsgZGV0ZWN0QXR0YWNobWVudFR5cGV9KSBzbyBjb25zdW1lcnMgY2FuIGJyYW5jaFxuICogb24gYSBsaXRlcmFsIGluc3RlYWQgb2YgcHJvYmluZyB3aGljaCBzdWItb2JqZWN0IGtleSBpc1xuICogcHJlc2VudC4gQWxzbyBzdXJmYWNlZCBvbiB7QGxpbmsgQXR0YWNobWVudEV2ZW50fSdzIHBheWxvYWQgYXNcbiAqIGBhdHRhY2htZW50X3R5cGVgICh2cyBhIGJhcmUgYHR5cGVgKSB0byBrZWVwIHRoZSBmaWVsZCBjbGVhciBvZlxuICogdGhlIGV2ZW50LXVuaW9uIGRpc2NyaW1pbmF0b3Iga2V5LlxuICovXG5leHBvcnQgY29uc3QgQVRUQUNITUVOVF9UWVBFUyA9IFtcbiAgXCJxdWVyeVwiLFxuICBcInRleHRcIixcbiAgXCJzdWdnZXN0ZWRfcXVlc3Rpb25zXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSBzdHJpbmdbXTtcbi8qKiBBdHRhY2htZW50IGRpc2NyaW1pbmF0b3IgdmFsdWVzIHVuZGVyc3Rvb2QgYnkgdGhpcyBwYWNrYWdlIHZlcnNpb24uICovXG5leHBvcnQgdHlwZSBLbm93bkF0dGFjaG1lbnRUeXBlID0gKHR5cGVvZiBBVFRBQ0hNRU5UX1RZUEVTKVtudW1iZXJdO1xuLyoqIEZvcndhcmQtY29tcGF0aWJsZSBhdHRhY2htZW50IGRpc2NyaW1pbmF0b3IsIGluY2x1ZGluZyBmdXR1cmUgR2VuaWUgdmFsdWVzLiAqL1xuZXhwb3J0IHR5cGUgQXR0YWNobWVudFR5cGUgPSBLbm93bkF0dGFjaG1lbnRUeXBlIHwgKHN0cmluZyAmIHt9KTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLSB3aWRlbmVkIHdpcmUgc2NoZW1hcyArIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIGBHZW5pZVF1ZXJ5QXR0YWNobWVudGAgd2lkZW5lZCB3aXRoIHRoZSBgdGhvdWdodHNbXWAgZmllbGQgdGhlXG4gKiBHZW5pZSB3aXJlIGV4cG9zZXMgYnV0IHRoZSBTREsgZG9lc24ndCBjdXJyZW50bHkgdHlwZS4gRXZlcnlcbiAqIG90aGVyIGZpZWxkIChgZGVzY3JpcHRpb25gLCBgcXVlcnlgLCBgc3RhdGVtZW50X2lkYCxcbiAqIGBxdWVyeV9yZXN1bHRfbWV0YWRhdGFgLCBgdGl0bGVgLCBgcGFyYW1ldGVyc2AsXG4gKiBgbGFzdF91cGRhdGVkX3RpbWVzdGFtcGAsIGBpZGApIGZsb3dzIHRocm91Z2ggdmVyYmF0aW0gZnJvbVxuICogdGhlIFNESyBzY2hlbWEuXG4gKi9cbmV4cG9ydCBjb25zdCBHZW5pZVF1ZXJ5QXR0YWNobWVudFNjaGVtYSA9IFNES0dlbmllUXVlcnlBdHRhY2htZW50U2NoZW1hLmV4dGVuZCh7XG4gIHRob3VnaHRzOiB6LmFycmF5KEdlbmllVGhvdWdodFNjaGVtYSkub3B0aW9uYWwoKSxcbn0pO1xuLyoqIFF1ZXJ5IGF0dGFjaG1lbnQgd2lkZW5lZCB3aXRoIEdlbmllJ3Mgc3RyZWFtZWQgcmVhc29uaW5nIHRob3VnaHRzLiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVRdWVyeUF0dGFjaG1lbnQgPSB6LmluZmVyPHR5cGVvZiBHZW5pZVF1ZXJ5QXR0YWNobWVudFNjaGVtYT47XG5cbi8qKlxuICogUHVycG9zZSBhdHRhY2hlZCB0byBhIEdlbmllIHRleHQgcmVzcG9uc2UuXG4gKlxuICogVGhlIGdlbmVyYXRlZCBEYXRhYnJpY2tzIFNESyBzY2hlbWEgY3VycmVudGx5IGtub3dzIG9ubHlcbiAqIGBGT0xMT1dfVVBfUVVFU1RJT05gLCB3aGlsZSB0aGUgbGl2ZSBHZW5pZSBBUEkgYWxzbyBlbWl0c1xuICogYFRFWFRfQVRUQUNITUVOVF9QVVJQT1NFX0FOU1dFUmAgZm9yIHRoZSBwcmltYXJ5IGFuc3dlciB0ZXh0LiBLZWVwIHRoZVxuICoga25vd24gdmFsdWVzIGRpc2NvdmVyYWJsZSBhbmQgYWNjZXB0IGZ1dHVyZSBzdHJpbmcgdmFsdWVzIHNvIGFuIGFkZGl0aXZlXG4gKiBzZXJ2ZXItc2lkZSBlbnVtIGNoYW5nZSBjYW5ub3QgaW52YWxpZGF0ZSBhbiBvdGhlcndpc2UgY29tcGxldGUgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVUZXh0QXR0YWNobWVudFB1cnBvc2UgPVxuICBcIkZPTExPV19VUF9RVUVTVElPTlwiIHwgXCJURVhUX0FUVEFDSE1FTlRfUFVSUE9TRV9BTlNXRVJcIiB8IChzdHJpbmcgJiB7fSk7XG5cbi8qKlxuICogVGV4dCBhdHRhY2htZW50IHdpZGVuZWQgZm9yIGZvcndhcmQtY29tcGF0aWJsZSBwdXJwb3NlIHZhbHVlcyBhbmQgb3B0aW9uYWxcbiAqIEFnZW50IE1vZGUgdGFibGUgbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBjb25zdCBHZW5pZVRleHRBdHRhY2htZW50U2NoZW1hID0gZGFzaGJvYXJkcy50ZXh0QXR0YWNobWVudFNjaGVtYS5leHRlbmQoe1xuICBwdXJwb3NlOiB6LmN1c3RvbTxHZW5pZVRleHRBdHRhY2htZW50UHVycG9zZT4oKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpLm9wdGlvbmFsKCksXG4gIG1ldGFkYXRhOiB6LnVua25vd24oKS5vcHRpb25hbCgpLFxufSk7XG4vKiogTmFycmF0aXZlIHRleHQgYXR0YWNobWVudCwgaW5jbHVkaW5nIGl0cyBvcHRpb25hbCBzZW1hbnRpYyBwdXJwb3NlLiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVUZXh0QXR0YWNobWVudCA9IHouaW5mZXI8dHlwZW9mIEdlbmllVGV4dEF0dGFjaG1lbnRTY2hlbWE+O1xuXG4vKipcbiAqIGBHZW5pZUF0dGFjaG1lbnRgIHdpdGg6XG4gKlxuICogICAtIGBxdWVyeWAgcmUtdHlwZWQgdG8gdGhlIHRob3VnaHRzLWF3YXJlXG4gKiAgICAge0BsaW5rIEdlbmllUXVlcnlBdHRhY2htZW50U2NoZW1hfS5cbiAqICAgLSBgYXR0YWNobWVudF90eXBlYCBkaXNjcmltaW5hdG9yIGxpdGVyYWxcbiAqICAgICAoe0BsaW5rIEF0dGFjaG1lbnRUeXBlfSkgc28gY29uc3VtZXJzIGNhbiBgc3dpdGNoXG4gKiAgICAgKGF0dC5hdHRhY2htZW50X3R5cGUpYCB0byBuYXJyb3cgd2hpY2ggc3ViLW9iamVjdCBpc1xuICogICAgIHBvcHVsYXRlZC4gT3B0aW9uYWwgb24gdGhlIHdpcmUgKEdlbmllIGRvZXNuJ3Qgc2VuZCBpdCk7XG4gKiAgICAgY2FsbGVycyBjb21wdXRlIGl0IHdpdGgge0BsaW5rIGRldGVjdEF0dGFjaG1lbnRUeXBlfSB3aGVuXG4gKiAgICAgdGhleSB3YW50IHRoZSBsaXRlcmFsIHVwLWZyb250LlxuICpcbiAqIGB0ZXh0YCBpcyByZS10eXBlZCB0byB0aGUgZm9yd2FyZC1jb21wYXRpYmxlXG4gKiB7QGxpbmsgR2VuaWVUZXh0QXR0YWNobWVudFNjaGVtYX0uIGBhdHRhY2htZW50X2lkYCBhbmRcbiAqIGBzdWdnZXN0ZWRfcXVlc3Rpb25zYCBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkLiBgYXR0YWNobWVudF9pZGAgaXMgZ2VudWluZWx5XG4gKiBvcHRpb25hbCBvbiB0aGUgd2lyZTpcbiAqIHRoZSBmaXJzdCB0ZXh0IGF0dGFjaG1lbnQgR2VuaWUgZW1pdHMgcGVyIHR1cm4gKHRoZSBcIm1haW5cbiAqIGFuc3dlciB0ZXh0XCIpIGFycml2ZXMgd2l0aCBubyBpZCwgb25seSB0aGUgZm9sbG93LXVwIHRleHRcbiAqIGF0dGFjaG1lbnQgZ2V0cyBvbmUuXG4gKi9cbmV4cG9ydCBjb25zdCBHZW5pZUF0dGFjaG1lbnRTY2hlbWEgPSBTREtHZW5pZUF0dGFjaG1lbnRTY2hlbWEuZXh0ZW5kKHtcbiAgcXVlcnk6IEdlbmllUXVlcnlBdHRhY2htZW50U2NoZW1hLm9wdGlvbmFsKCksXG4gIHRleHQ6IEdlbmllVGV4dEF0dGFjaG1lbnRTY2hlbWEub3B0aW9uYWwoKSxcbiAgYXR0YWNobWVudF90eXBlOiB6LmN1c3RvbTxBdHRhY2htZW50VHlwZT4oKHYpID0+IHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKS5vcHRpb25hbCgpLFxufSk7XG4vKiogR2VuaWUgbWVzc2FnZSBhdHRhY2htZW50IHdpdGggYW4gb3B0aW9uYWwgY29tcHV0ZWQgZGlzY3JpbWluYXRvci4gKi9cbmV4cG9ydCB0eXBlIEdlbmllQXR0YWNobWVudCA9IHouaW5mZXI8dHlwZW9mIEdlbmllQXR0YWNobWVudFNjaGVtYT47XG5cbi8qKlxuICogYEdlbmllTWVzc2FnZWAgd2lkZW5lZCB3aXRoOlxuICpcbiAqICAgLSBgYXV0b19yZWdlbmVyYXRlX2NvdW50YDogbnVtYmVyIHN0YW1wZWQgb24gZXZlcnkgd2lyZVxuICogICAgIG1lc3NhZ2UgdGhhdCB0aGUgU0RLIHR5cGUgb21pdHMgYXQgdjAuMTcuXG4gKiAgIC0gYGF0dGFjaG1lbnRzYDogcmUtdHlwZWQgdG8gdGhlIGxvY2FsXG4gKiAgICAge0BsaW5rIEdlbmllQXR0YWNobWVudFNjaGVtYX0gc29cbiAqICAgICBgYXR0YWNobWVudC5xdWVyeT8udGhvdWdodHNgIChhbmQgdGhlXG4gKiAgICAgYGF0dGFjaG1lbnRfdHlwZWAgZGlzY3JpbWluYXRvcikgaXMgcmVhY2hhYmxlIHdpdGhvdXQgYVxuICogICAgIGNhc3QuXG4gKlxuICogRXZlcnkgb3RoZXIgZmllbGQgKGBpZGAsIGBzcGFjZV9pZGAsIGBjb252ZXJzYXRpb25faWRgLFxuICogYHVzZXJfaWRgLCBgY3JlYXRlZF90aW1lc3RhbXBgLCBgbGFzdF91cGRhdGVkX3RpbWVzdGFtcGAsXG4gKiBgc3RhdHVzYCwgYGNvbnRlbnRgLCBgbWVzc2FnZV9pZGAsIGBxdWVyeV9yZXN1bHRgLCBgZXJyb3JgLFxuICogYGZlZWRiYWNrYCkgcGFzc2VzIHRocm91Z2ggZnJvbSB0aGUgU0RLIHNjaGVtYS5cbiAqL1xuZXhwb3J0IGNvbnN0IEdlbmllTWVzc2FnZVNjaGVtYSA9IFNES0dlbmllTWVzc2FnZVNjaGVtYS5leHRlbmQoe1xuICBhdHRhY2htZW50czogei5hcnJheShHZW5pZUF0dGFjaG1lbnRTY2hlbWEpLm9wdGlvbmFsKCksXG4gIGF1dG9fcmVnZW5lcmF0ZV9jb3VudDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxufSk7XG4vKiogR2VuaWUgbWVzc2FnZSBzbmFwc2hvdCB3aWRlbmVkIHdpdGggdHlwZWQgYXR0YWNobWVudHMgYW5kIHJlZ2VuZXJhdGlvbiBjb3VudC4gKi9cbmV4cG9ydCB0eXBlIEdlbmllTWVzc2FnZSA9IHouaW5mZXI8dHlwZW9mIEdlbmllTWVzc2FnZVNjaGVtYT47XG5cbi8qKlxuICogRG9tYWluIHByb2plY3Rpb24gb2Yge0BsaW5rIEdlbmllTWVzc2FnZVNjaGVtYX0gdGhhdCBkcm9wcyBldmVyeVxuICogdHVybi1sZXZlbCBmaWVsZCAoYGlkYCwgYHN0YXR1c2AsIGBjcmVhdGVkX3RpbWVzdGFtcGAsXG4gKiBgcXVlcnlfcmVzdWx0YCwgLi4uKSBhbmQgeWllbGRzIGp1c3QgdGhlIHJlc3BvbnNlIHBheWxvYWQgYXMgYVxuICogZmxhdCBgR2VuaWVBdHRhY2htZW50W11gLiBQYXJzZXMgdGhlIHNhbWUgd2lyZSBzaGFwZSBhc1xuICoge0BsaW5rIEdlbmllTWVzc2FnZVNjaGVtYX07IG1pc3NpbmcgYGF0dGFjaG1lbnRzYCBkZWZhdWx0cyB0b1xuICogYFtdYCBzbyB0aGUgb3V0cHV0IGlzIGFsd2F5cyBhbiBhcnJheS5cbiAqXG4gKiBVc2Ugd2hlbiBjb25zdW1lcnMgb25seSBjYXJlIGFib3V0IHRoZSBtb2RlbCdzIHJlc3BvbnNlXG4gKiBhdHRhY2htZW50cyBhbmQgbm90IHRoZSBzdXJyb3VuZGluZyBtZXNzYWdlIGVudmVsb3BlLlxuICovXG5leHBvcnQgY29uc3QgR2VuaWVSZXNwb25zZVNjaGVtYSA9IEdlbmllTWVzc2FnZVNjaGVtYS50cmFuc2Zvcm0oKG0pID0+IG0uYXR0YWNobWVudHMgPz8gW10pO1xuLyoqIE5vcm1hbGl6ZWQgYXR0YWNobWVudCBhcnJheSBleHRyYWN0ZWQgZnJvbSBhIEdlbmllIG1lc3NhZ2UgcmVzcG9uc2UuICovXG5leHBvcnQgdHlwZSBHZW5pZVJlc3BvbnNlID0gei5pbmZlcjx0eXBlb2YgR2VuaWVSZXNwb25zZVNjaGVtYT47XG5cbi8qKlxuICogYEdlbmllU3BhY2VgIHdpZGVuZWQgd2l0aCBhbiBvcHRpb25hbCBgc2VyaWFsaXplZF9zcGFjZWAgZmllbGRcbiAqIGNhcnJ5aW5nIGEgSlNPTi1zdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwYWNlJ3MgZnVsbFxuICogZGVmaW5pdGlvbiAoY2F0YWxvZ3MsIHNjaGVtYXMsIHRhYmxlcywgc2FtcGxlIHF1ZXN0aW9ucywgcHJvbXB0cyxcbiAqIGV0Yy4pIGFzIGV4cG9ydGVkIGJ5IHRoZSB3b3Jrc3BhY2UgZXhwb3J0IGVuZHBvaW50LlxuICpcbiAqIFRoZSBiYXNlIFNESyBzaGFwZSAoYGRlc2NyaXB0aW9uYCwgYHNwYWNlX2lkYCwgYHRpdGxlYCxcbiAqIGB3YXJlaG91c2VfaWRgKSBjb3ZlcnMgdGhlIGRpcmVjdG9yeS1saXN0aW5nIHN1cmZhY2UgLSBlbm91Z2ggdG9cbiAqIHJvdXRlIGEgY2hhdC4gYHNlcmlhbGl6ZWRfc3BhY2VgIGlzIG9wdC1pbiBzbyBjYWxsZXJzIHRoYXQgbmVlZFxuICogdGhlIGZ1bGwgc3BhY2Ugc2NoZW1hIChlLmcuIHRvIHNlZWQgYSBzeXN0ZW0gcHJvbXB0IG9yIHRvIHNoaXBcbiAqIHRoZSBkZWZpbml0aW9uIHRvIGFuIGFnZW50KSBjYW4gYXR0YWNoIGl0IHdpdGhvdXQgYSBzZWNvbmQgdHlwZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEdlbmllU3BhY2VTY2hlbWEgPSBTREtHZW5pZVNwYWNlU2NoZW1hLmV4dGVuZCh7XG4gIHNlcmlhbGl6ZWRfc3BhY2U6IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIFwiVGhlIGNvbnRlbnRzIG9mIHRoZSBHZW5pZSBTcGFjZSBpbiBzZXJpYWxpemVkIHN0cmluZyBmb3JtLiBUaGlzIGZpZWxkIGlzIGV4Y2x1ZGVkIGluIExpc3QgR2VuaWUgc3BhY2VzIHJlc3BvbnNlcy4gVGhpcyBmaWVsZCBwcm92aWRlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBKU09OIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIHNwYWNlJ3MgbGF5b3V0IGFuZCBjb21wb25lbnRzLlwiLFxuICAgICksXG59KTtcbi8qKiBHZW5pZSBzcGFjZSBtZXRhZGF0YSB3aXRoIHRoZSBpZGVudGlmaWVycyByZXF1aXJlZCBieSBjaGF0IGNvbnN1bWVycy4gKi9cbmV4cG9ydCB0eXBlIEdlbmllU3BhY2UgPSB6LmluZmVyPHR5cGVvZiBHZW5pZVNwYWNlU2NoZW1hPjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHRlcm1pbmFsIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFRlcm1pbmFsIEdlbmllIG1lc3NhZ2Ugc3RhdHVzZXMuIFRoZSBwb2xsaW5nIGxvb3AgaW4gdGhlIGNoYXRcbiAqIGRyaXZlciBzdG9wcyBhcyBzb29uIGFzIHRoZSBsYXRlc3QgbWVzc2FnZSBoYXMgb25lIG9mIHRoZXNlXG4gKiBzdGF0dXNlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFRFUk1JTkFMX1NUQVRVU0VTID0gW1wiQ09NUExFVEVEXCIsIFwiRkFJTEVEXCIsIFwiQ0FOQ0VMTEVEXCJdIGFzIGNvbnN0O1xuLyoqIE1lc3NhZ2Ugc3RhdHVzIHRoYXQgZW5kcyBhIEdlbmllIHR1cm4gYW5kIHByb2R1Y2VzIGEgZmluYWwgcmVzdWx0IGV2ZW50LiAqL1xuZXhwb3J0IHR5cGUgVGVybWluYWxTdGF0dXMgPSAodHlwZW9mIFRFUk1JTkFMX1NUQVRVU0VTKVtudW1iZXJdO1xuXG4vKiogTmFycm93IGBNZXNzYWdlU3RhdHVzIHwgdW5kZWZpbmVkYCB0byBhIHtAbGluayBUZXJtaW5hbFN0YXR1c30uICovXG5leHBvcnQgZnVuY3Rpb24gaXNUZXJtaW5hbFN0YXR1cyhzOiBNZXNzYWdlU3RhdHVzIHwgdW5kZWZpbmVkKTogcyBpcyBUZXJtaW5hbFN0YXR1cyB7XG4gIHJldHVybiBzICE9PSB1bmRlZmluZWQgJiYgKFRFUk1JTkFMX1NUQVRVU0VTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyhzKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgcmF3IEdlbmllIHdpcmUgc3RhdHVzIChgRkVUQ0hJTkdfTUVUQURBVEFgLFxuICogYEFTS0lOR19BSWAsIGBFWEVDVVRJTkdfUVVFUllgLCAuLi4pIGludG8gYSBzaG9ydCwgc2VudGVuY2UtY2FzZWRcbiAqIGxhYmVsIHNhZmUgdG8gZHJvcCBpbnRvIGEgVUkgcGlsbC4gS25vd24gc3RhdGVzIGdldCBhIGN1cmF0ZWRcbiAqIGxhYmVsOyB1bmtub3duIHN0YXRlcyBmYWxsIGJhY2sgdG8gYHN0cmluZy50b2tlbml6ZVdpdGhPcHRpb25zYFxuICogc28gbmV3IHN0YXRlcyBzdGlsbCByZW5kZXIgY2xlYW5seSB3aXRob3V0IGNvZGUgY2hhbmdlcy5cbiAqXG4gKiBQdXJlIChubyBOb2RlLW9ubHkgZGVwcyksIHNhZmUgZm9yIGJyb3dzZXIgYnVuZGxlcy4gQm90aCB0aGVcbiAqIEdlbmllIGFnZW50IChzZXJ2ZXIpIGFuZCBhbnkgVUkgdGhhdCBzdWJzY3JpYmVzIHRvIHN0YXR1cyBldmVudHNcbiAqIGNhbGwgdGhpcyBzbyBsYWJlbHMgc3RheSBpbiBsb2NrLXN0ZXAgYWNyb3NzIHRoZSB3aXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaHVtYW5pemVTdGF0dXMoc3RhdHVzOiBNZXNzYWdlU3RhdHVzKTogc3RyaW5nIHtcbiAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICBjYXNlIFwiRkVUQ0hJTkdfTUVUQURBVEFcIjpcbiAgICAgIHJldHVybiBcIkZldGNoaW5nIG1ldGFkYXRhXCI7XG4gICAgY2FzZSBcIkFTS0lOR19BSVwiOlxuICAgICAgcmV0dXJuIFwiQXNraW5nIEdlbmllXCI7XG4gICAgY2FzZSBcIkVYRUNVVElOR19RVUVSWVwiOlxuICAgICAgcmV0dXJuIFwiUnVubmluZyBTUUwgcXVlcnlcIjtcbiAgICBjYXNlIFwiRklMVEVSSU5HX0NPTlRFWFRcIjpcbiAgICAgIHJldHVybiBcIkZpbHRlcmluZyBjb250ZXh0XCI7XG4gICAgY2FzZSBcIlBFTkRJTkdfV0FSRUhPVVNFXCI6XG4gICAgICByZXR1cm4gXCJXYWl0aW5nIGZvciB3YXJlaG91c2VcIjtcbiAgICBjYXNlIFwiQ09NUExFVEVEXCI6XG4gICAgICByZXR1cm4gXCJDb21wbGV0ZWRcIjtcbiAgICBjYXNlIFwiRkFJTEVEXCI6XG4gICAgICByZXR1cm4gXCJGYWlsZWRcIjtcbiAgICBjYXNlIFwiQ0FOQ0VMTEVEXCI6XG4gICAgICByZXR1cm4gXCJDYW5jZWxsZWRcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFsuLi5zdHJpbmcudG9rZW5pemVXaXRoT3B0aW9ucyh7IGNhcGl0YWxpemU6IHRydWUsIGxvd2VyQ2FzZTogdHJ1ZSB9LCBzdGF0dXMpXS5qb2luKFxuICAgICAgICBcIiBcIixcbiAgICAgICk7XG4gIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYXR0YWNobWVudCB0eXBlIGhlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogSW5zcGVjdCBhIHtAbGluayBHZW5pZUF0dGFjaG1lbnR9IGFuZCByZXR1cm4gdGhlXG4gKiB7QGxpbmsgQXR0YWNobWVudFR5cGV9IG9mIHBheWxvYWQgaXQgY2Fycmllcy4gUmV0dXJucyB0aGUgZmlyc3RcbiAqIGtub3duIHN1Yi1vYmplY3QgdGhhdCdzIHByZXNlbnQ7IGlmIG5vbmUgb2YgdGhlIGtub3duIG9uZXMgYXJlXG4gKiBwb3B1bGF0ZWQsIGZhbGxzIGJhY2sgdG8gdGhlIGZpcnN0IG5vbi1ib29ra2VlcGluZyBrZXlcbiAqIChmb3J3YXJkLWNvbXBhdCBmb3IgdHlwZXMgd2UgZG9uJ3QgbW9kZWwgeWV0KSwgZWxzZSBgXCJ1bmtub3duXCJgLlxuICpcbiAqIEhvbm9ycyBhIHByZS1zZXQgYGF0dGFjaG1lbnRfdHlwZWAgaWYgb25lIGlzIGFscmVhZHkgb24gdGhlXG4gKiB2YWx1ZSwgc28gdGhpcyBpcyBpZGVtcG90ZW50IGFjcm9zcyByZS1kZXRlY3Rpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0QXR0YWNobWVudFR5cGUoYXR0OiBHZW5pZUF0dGFjaG1lbnQpOiBBdHRhY2htZW50VHlwZSB7XG4gIGlmIChhdHQuYXR0YWNobWVudF90eXBlKSByZXR1cm4gYXR0LmF0dGFjaG1lbnRfdHlwZTtcbiAgaWYgKGF0dC5xdWVyeSkgcmV0dXJuIFwicXVlcnlcIjtcbiAgaWYgKGF0dC50ZXh0KSByZXR1cm4gXCJ0ZXh0XCI7XG4gIGlmIChhdHQuc3VnZ2VzdGVkX3F1ZXN0aW9ucykgcmV0dXJuIFwic3VnZ2VzdGVkX3F1ZXN0aW9uc1wiO1xuICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMoYXR0KSkge1xuICAgIGlmIChrICE9PSBcImF0dGFjaG1lbnRfaWRcIiAmJiBrICE9PSBcImF0dGFjaG1lbnRfdHlwZVwiKSByZXR1cm4gaztcbiAgfVxuICByZXR1cm4gXCJ1bmtub3duXCI7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2VuaWVDaGF0IGV2ZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBXaGVyZSBvbiB0aGUgd2lyZSBhbiBldmVudCB3YXMgb2JzZXJ2ZWQuIFNwcmVhZCBpbnRvIGV2ZXJ5XG4gKiBhdHRhY2htZW50LXNjb3BlZCBldmVudCBwYXlsb2FkIHNvIHN1YnNjcmliZXJzIGNhbiByb3V0ZSwgbG9nLFxuICogb3IgY29ycmVsYXRlIHdpdGhvdXQgcmUtd2Fsa2luZyB0aGUgbWVzc2FnZS5cbiAqXG4gKiBGaWVsZHM6XG4gKiAgIC0gYHNwYWNlX2lkYDogdGhlIEdlbmllIHNwYWNlIHRoZSBjb252ZXJzYXRpb24gbGl2ZXMgaW4uXG4gKiAgIC0gYGNvbnZlcnNhdGlvbl9pZGA6IGNvbnZlcnNhdGlvbiBpZCBvbmNlIEdlbmllIGhhcyBhc3NpZ25lZCBvbmUuXG4gKiAgIC0gYG1lc3NhZ2VfaWRgOiBHZW5pZSBtZXNzYWdlIGlkIGZvciB0aGUgYWN0aXZlIHR1cm4uXG4gKiAgIC0gYGF0dGFjaG1lbnRfaWRgOiBhdHRhY2htZW50IHRoZSBldmVudCBjYW1lIGZyb20uIE9wdGlvbmFsXG4gKiAgICAgYmVjYXVzZSBHZW5pZSBzb21ldGltZXMgZW1pdHMgYW4gYW5vbnltb3VzIG1haW4tYW5zd2VyXG4gKiAgICAgYXR0YWNobWVudCB3aXRob3V0IGFuIGlkOyB0aG9zZSBzdGlsbCBnZXQgZXZlbnRzLCBqdXN0IHdpdGhcbiAqICAgICBgYXR0YWNobWVudF9pZGAgdW5kZWZpbmVkLlxuICovXG5leHBvcnQgY29uc3QgR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHNwYWNlX2lkOiB6LnN0cmluZygpLFxuICBjb252ZXJzYXRpb25faWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgbWVzc2FnZV9pZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBhdHRhY2htZW50X2lkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcbi8qKiBDb252ZXJzYXRpb24sIG1lc3NhZ2UsIGFuZCBhdHRhY2htZW50IGNvb3JkaW5hdGVzIHNoYXJlZCBieSBhdHRhY2htZW50IGV2ZW50cy4gKi9cbmV4cG9ydCB0eXBlIEdlbmllQ2hhdExvY2F0aW9uID0gei5pbmZlcjx0eXBlb2YgR2VuaWVDaGF0TG9jYXRpb25TY2hlbWE+O1xuXG4vKipcbiAqIExpZmVjeWNsZSBldmVudDogdGhlIHF1ZXN0aW9uIHRoaXMgdHVybiBpcyBhc2tpbmcgR2VuaWUuIEZpcmVzXG4gKiBvbmNlIHBlciBgZ2VuaWVFdmVudENoYXRgIGNhbGwsIHRoZSBmaXJzdCB0aW1lIHRoZSB1bmRlcmx5aW5nXG4gKiBgZ2VuaWVDaGF0YCBsb29wIHlpZWxkcyBhIGBHZW5pZU1lc3NhZ2VgLiBDYXJyaWVzIHRoZSBwcm9tcHRcbiAqIHRleHQgR2VuaWUgZWNob2VkIGJhY2sgb24gYG1lc3NhZ2UuY29udGVudGAgYW5kIHRoZSBhc3NpZ25lZFxuICogYG1lc3NhZ2VfaWRgIHNvIHN1YnNjcmliZXJzIGNhbiBncm91cCBldmVyeSBzdWJzZXF1ZW50IGV2ZW50XG4gKiBmb3IgdGhpcyB0dXJuIHVuZGVyIG9uZSBzdGFibGUga2V5LiBgY29udmVyc2F0aW9uX2lkYCBpc1xuICogcG9wdWxhdGVkIGZvciBib3RoIG9wZW5pbmcgYW5kIGZvbGxvdy11cCB0dXJucyAoR2VuaWUgYXNzaWduc1xuICogaXQgb24gYHN0YXJ0Q29udmVyc2F0aW9uYCkuXG4gKlxuICogRGVmZXJyZWQgKGluc3RlYWQgb2YgZmlyZWQgc3luY2hyb25vdXNseSBvbiBlbnRyeSkgc28gdGhlXG4gKiBgbWVzc2FnZV9pZGAgaXMgYXZhaWxhYmxlIHdoZW4gdGhlIGV2ZW50IGxhbmRzIC0gdGhhdCBvbmUgcm91bmRcbiAqIHRyaXAgY29zdHMgfjIwMG1zIGJ1dCBsZXRzIFVJcyByZW5kZXIgcXVlc3Rpb24gLyB0aGlua2luZyAvXG4gKiBxdWVyeSAvIHRleHQgYXMgYSBzaW5nbGUgZ3JvdXBlZCBibG9jayBwZXIgR2VuaWUgY2FsbCBpbnN0ZWFkXG4gKiBvZiBhIGZsYXQgc3RyZWFtLlxuICpcbiAqIGBhdHRhY2htZW50X2lkYCBpcyBpbnRlbnRpb25hbGx5IGFic2VudCAtIHF1ZXN0aW9ucyBhcmUgdHVyblxuICogc2NvcGVkLCBub3QgYXR0YWNobWVudCBzY29wZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBRdWVzdGlvbkV2ZW50U2NoZW1hID0gR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEub21pdCh7XG4gIGF0dGFjaG1lbnRfaWQ6IHRydWUsXG59KS5leHRlbmQoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJxdWVzdGlvblwiKSxcbiAgY29udGVudDogei5zdHJpbmcoKSxcbn0pO1xuLyoqIEluaXRpYWwgZXZlbnQgY2FycnlpbmcgdGhlIHVzZXIncyBxdWVzdGlvbiBhZnRlciBHZW5pZSBhc3NpZ25zIGEgbWVzc2FnZSBpZC4gKi9cbmV4cG9ydCB0eXBlIFF1ZXN0aW9uRXZlbnQgPSB6LmluZmVyPHR5cGVvZiBRdWVzdGlvbkV2ZW50U2NoZW1hPjtcblxuLyoqXG4gKiBMaWZlY3ljbGUgZXZlbnQ6IHJhdyBgR2VuaWVNZXNzYWdlYCBzbmFwc2hvdCBmb3IgdGhlIGFjdGl2ZVxuICogdHVybi4gRmlyZXMgb25jZSBwZXIgcG9sbCB5aWVsZC4gVGhlIGZ1bGwgbWVzc2FnZSBzaGFwZVxuICogKGluY2x1ZGluZyB0aGUgd2lkZW5lZCB0aG91Z2h0IC8gcmVnZW4gLyBhdHRhY2htZW50LXR5cGVcbiAqIGZpZWxkcykgaXMgZXhwb3NlZCBpbmxpbmUgYXMgYG1lc3NhZ2VgOyBjb25zdW1lcnMgbmFycm93IG9uXG4gKiBgZXZlbnQudHlwZSA9PT0gXCJtZXNzYWdlXCJgIGFuZCByZWFjaCBmb3IgYGV2ZW50Lm1lc3NhZ2VgLlxuICovXG5leHBvcnQgY29uc3QgTWVzc2FnZUV2ZW50U2NoZW1hID0gR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEub21pdCh7XG4gIGF0dGFjaG1lbnRfaWQ6IHRydWUsXG59KS5leHRlbmQoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJtZXNzYWdlXCIpLFxuICBtZXNzYWdlOiBHZW5pZU1lc3NhZ2VTY2hlbWEsXG59KTtcbi8qKiBSYXcgR2VuaWUgbWVzc2FnZSBzbmFwc2hvdCBlbWl0dGVkIG9uIGV2ZXJ5IHBvbGwgaXRlcmF0aW9uLiAqL1xuZXhwb3J0IHR5cGUgTWVzc2FnZUV2ZW50ID0gei5pbmZlcjx0eXBlb2YgTWVzc2FnZUV2ZW50U2NoZW1hPjtcblxuLyoqXG4gKiBUb3AtbGV2ZWwgYG1lc3NhZ2Uuc3RhdHVzYCB0cmFuc2l0aW9uZWQuIEZpcmVzIGZvciBldmVyeVxuICogZGlzdGluY3Qgc3RhdHVzIHNlZW4gb24gdGhlIHdpcmUgKGUuZy4gYFNVQk1JVFRFRGAgLT5cbiAqIGBGSUxURVJJTkdfQ09OVEVYVGAgLT4gYEFTS0lOR19BSWAgLT4gYFBFTkRJTkdfV0FSRUhPVVNFYCAtPlxuICogYEFTS0lOR19BSWAgLT4gYENPTVBMRVRFRGApLlxuICovXG5leHBvcnQgY29uc3QgU3RhdHVzRXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5vbWl0KHtcbiAgYXR0YWNobWVudF9pZDogdHJ1ZSxcbn0pLmV4dGVuZCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInN0YXR1c1wiKSxcbiAgc3RhdHVzOiBNZXNzYWdlU3RhdHVzU2NoZW1hLFxuICBwcmV2aW91c19zdGF0dXM6IE1lc3NhZ2VTdGF0dXNTY2hlbWEub3B0aW9uYWwoKSxcbn0pO1xuLyoqIE1lc3NhZ2Utc3RhdHVzIHRyYW5zaXRpb24sIGluY2x1ZGluZyB0aGUgcHJldmlvdXMgc3RhdHVzIHdoZW4gYXZhaWxhYmxlLiAqL1xuZXhwb3J0IHR5cGUgU3RhdHVzRXZlbnQgPSB6LmluZmVyPHR5cGVvZiBTdGF0dXNFdmVudFNjaGVtYT47XG5cbi8qKlxuICogQSBuZXcgYXR0YWNobWVudCBzbG90IGFwcGVhcmVkIGluIGBtZXNzYWdlLmF0dGFjaG1lbnRzW11gLlxuICogRmlyZXMgZXhhY3RseSBvbmNlIHBlciBhdHRhY2htZW50IChtYXRjaGVkIGJ5IGBhdHRhY2htZW50X2lkYCxcbiAqIHBvc2l0aW9uYWxseSBmb3IgYW5vbnltb3VzIGF0dGFjaG1lbnRzKSB0aGUgZmlyc3QgdGltZSB3ZSBzZWVcbiAqIGl0LiBUaGUgc2xvdCdzIHBheWxvYWQga2luZCBsYW5kcyBpbiBgYXR0YWNobWVudF90eXBlYCBzbyB0aGVcbiAqIG91dGVyIGB0eXBlYCBkaXNjcmltaW5hdG9yIHN0YXlzIHVuYW1iaWd1b3VzLlxuICovXG5leHBvcnQgY29uc3QgQXR0YWNobWVudEV2ZW50U2NoZW1hID0gR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEuZXh0ZW5kKHtcbiAgdHlwZTogei5saXRlcmFsKFwiYXR0YWNobWVudFwiKSxcbiAgaW5kZXg6IHoubnVtYmVyKCksXG4gIGF0dGFjaG1lbnRfdHlwZTogei5jdXN0b208QXR0YWNobWVudFR5cGU+KCh2KSA9PiB0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiksXG59KTtcbi8qKiBFdmVudCBlbWl0dGVkIHdoZW4gYSBuZXcgdHlwZWQgYXR0YWNobWVudCBhcHBlYXJzIG9uIHRoZSBtZXNzYWdlLiAqL1xuZXhwb3J0IHR5cGUgQXR0YWNobWVudEV2ZW50ID0gei5pbmZlcjx0eXBlb2YgQXR0YWNobWVudEV2ZW50U2NoZW1hPjtcblxuLyoqXG4gKiBBIG5ldyByZWFzb25pbmcgc3RlcCBhcHBlYXJlZCBvbiBhIHF1ZXJ5IGF0dGFjaG1lbnRcbiAqIChgYXR0YWNobWVudHNbaV0ucXVlcnkudGhvdWdodHNbaV1gKS4gRGVkdXBsaWNhdGVkIHBlclxuICogYCh0aG91Z2h0X3R5cGUsIGNvbnRlbnQpYCB0dXBsZSB3aXRoaW4gYW4gYXR0YWNobWVudCBzb1xuICogc3Vic2NyaWJlcnMgZG9uJ3Qgc2VlIHRoZSBzYW1lIHRob3VnaHQgbXVsdGlwbGUgdGltZXMgLSBHZW5pZVxuICogc29tZXRpbWVzIG11dGF0ZXMgZXhpc3RpbmcgdGhvdWdodCBzbG90cyBpbiBwbGFjZSwgc28gdGhlIGRpZmZcbiAqIGlzIHZhbHVlLWJhc2VkIHJhdGhlciB0aGFuIHBvc2l0aW9uYWwuXG4gKi9cbmV4cG9ydCBjb25zdCBUaGlua2luZ0V2ZW50U2NoZW1hID0gR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEuZXh0ZW5kKHtcbiAgdHlwZTogei5saXRlcmFsKFwidGhpbmtpbmdcIiksXG4gIHRleHQ6IHouc3RyaW5nKCksXG4gIHRob3VnaHRfdHlwZTogei5jdXN0b208R2VuaWVUaG91Z2h0VHlwZT4oKHYpID0+IHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSxcbn0pO1xuLyoqIEluY3JlbWVudGFsIEdlbmllIHJlYXNvbmluZyBldmVudCBkZXJpdmVkIGZyb20gcXVlcnkgdGhvdWdodHMuICovXG5leHBvcnQgdHlwZSBUaGlua2luZ0V2ZW50ID0gei5pbmZlcjx0eXBlb2YgVGhpbmtpbmdFdmVudFNjaGVtYT47XG5cbi8qKlxuICogQSB0ZXh0LWF0dGFjaG1lbnQgYGNvbnRlbnRgIGZpZWxkIGFwcGVhcmVkIG9yIGNoYW5nZWRcbiAqIChgYXR0YWNobWVudHNbaV0udGV4dC5jb250ZW50YCkuIEZpcmVzIHdoZW5ldmVyIHRoZSBzbmFwc2hvdFxuICogdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBwcmV2aW91cyBvbmUgZm9yIHRoZSBzYW1lIGF0dGFjaG1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBUZXh0RXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5leHRlbmQoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJ0ZXh0XCIpLFxuICB0ZXh0OiB6LnN0cmluZygpLFxufSk7XG4vKiogTmFycmF0aXZlIGFuc3dlciBmcmFnbWVudCBlbWl0dGVkIGZyb20gYSBHZW5pZSB0ZXh0IGF0dGFjaG1lbnQuICovXG5leHBvcnQgdHlwZSBUZXh0RXZlbnQgPSB6LmluZmVyPHR5cGVvZiBUZXh0RXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIFNRTCB3YXMgZmluYWxpemVkIG9uIGEgcXVlcnkgYXR0YWNobWVudFxuICogKGBhdHRhY2htZW50c1tpXS5xdWVyeS5xdWVyeWApLiBGaXJlcyBvbmNlIHdoZW4gdGhlIFNRTCBzdHJpbmdcbiAqIHRyYW5zaXRpb25zIGZyb20gdW5kZWZpbmVkIHRvIGRlZmluZWQsIGFuZCBhZ2FpbiBpZiBHZW5pZSBldmVyXG4gKiByZXdyaXRlcyBpdC4gYHRpdGxlYCBhbmQgYGRlc2NyaXB0aW9uYCBhcmUgZGVub3JtYWxpc2VkIG9mZiB0aGVcbiAqIGF0dGFjaG1lbnQncyBgcXVlcnkudGl0bGVgIC8gYHF1ZXJ5LmRlc2NyaXB0aW9uYCBzbyBjb25zdW1lcnNcbiAqIGNhbiBsYWJlbCB0aGUgU1FMIHBpbGwgd2l0aG91dCByZS13YWxraW5nIHRoZSBtZXNzYWdlLlxuICovXG5leHBvcnQgY29uc3QgUXVlcnlFdmVudFNjaGVtYSA9IEdlbmllQ2hhdExvY2F0aW9uU2NoZW1hLmV4dGVuZCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInF1ZXJ5XCIpLFxuICBzcWw6IHouc3RyaW5nKCksXG4gIHRpdGxlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcbi8qKiBGaW5hbGl6ZWQgb3IgcmV3cml0dGVuIFNRTCBlbWl0dGVkIGZvciBhIEdlbmllIHF1ZXJ5IGF0dGFjaG1lbnQuICovXG5leHBvcnQgdHlwZSBRdWVyeUV2ZW50ID0gei5pbmZlcjx0eXBlb2YgUXVlcnlFdmVudFNjaGVtYT47XG5cbi8qKlxuICogU1FMIHdhcyBzdWJtaXR0ZWQgdG8gYSBTUUwgd2FyZWhvdXNlIGFuZCBhIHN0YXRlbWVudCBpZCB3YXNcbiAqIGFzc2lnbmVkIChgYXR0YWNobWVudHNbaV0ucXVlcnkuc3RhdGVtZW50X2lkYCkuIEZpcmVzIHdoZW4gdGhlXG4gKiBzdGF0ZW1lbnQgaWQgdHJhbnNpdGlvbnMgZnJvbSB1bmRlZmluZWQgdG8gZGVmaW5lZCAtIHRoaXMgaXMgdGhlXG4gKiBwb2ludCBhdCB3aGljaCBgY2xpZW50LnN0YXRlbWVudEV4ZWN1dGlvbi5nZXRTdGF0ZW1lbnQoeyBzdGF0ZW1lbnRfaWQgfSlgXG4gKiBiZWNvbWVzIGEgdmFsaWQgY2FsbC5cbiAqL1xuZXhwb3J0IGNvbnN0IFN0YXRlbWVudEV2ZW50U2NoZW1hID0gR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEuZXh0ZW5kKHtcbiAgdHlwZTogei5saXRlcmFsKFwic3RhdGVtZW50XCIpLFxuICBzdGF0ZW1lbnRfaWQ6IHouc3RyaW5nKCksXG59KTtcbi8qKiBFdmVudCBpbmRpY2F0aW5nIHRoYXQgYSBxdWVyeSByZWNlaXZlZCBhbiBleGVjdXRhYmxlIHN0YXRlbWVudCBpZC4gKi9cbmV4cG9ydCB0eXBlIFN0YXRlbWVudEV2ZW50ID0gei5pbmZlcjx0eXBlb2YgU3RhdGVtZW50RXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIFJvdyBjb3VudCBmb3IgYSBxdWVyeSBhdHRhY2htZW50J3MgcmVzdWx0IGNoYW5nZWRcbiAqIChgYXR0YWNobWVudHNbaV0ucXVlcnkucXVlcnlfcmVzdWx0X21ldGFkYXRhLnJvd19jb3VudGApLiBGaXJlc1xuICogb24gZXZlcnkgY2hhbmdlLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYHVuZGVmaW5lZCAtPiAwYCBhbmQgdGhlXG4gKiBsYXRlciBgMCAtPiBOYCBvbmNlIHRoZSB3YXJlaG91c2UgZmluaXNoZXMgZXhlY3V0aW9uLlxuICovXG5leHBvcnQgY29uc3QgUm93c0V2ZW50U2NoZW1hID0gR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEuZXh0ZW5kKHtcbiAgdHlwZTogei5saXRlcmFsKFwicm93c1wiKSxcbiAgcm93X2NvdW50OiB6Lm51bWJlcigpLFxuICBwcmV2aW91c19yb3dfY291bnQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgc3RhdGVtZW50X2lkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcbi8qKiBSb3ctY291bnQgdHJhbnNpdGlvbiBmb3IgYSBHZW5pZSBxdWVyeSByZXN1bHQuICovXG5leHBvcnQgdHlwZSBSb3dzRXZlbnQgPSB6LmluZmVyPHR5cGVvZiBSb3dzRXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIEdlbmllIHByb2R1Y2VkIGEgZm9sbG93LXVwIHN1Z2dlc3RlZC1xdWVzdGlvbnMgbGlzdFxuICogKGBhdHRhY2htZW50c1tpXS5zdWdnZXN0ZWRfcXVlc3Rpb25zLnF1ZXN0aW9uc1tdYCkuIEZpcmVzIG9uY2VcbiAqIHdoZW4gdGhlIGxpc3QgYXBwZWFycywgYW5kIGFnYWluIGlmIEdlbmllIHJld3JpdGVzIGl0LlxuICovXG5leHBvcnQgY29uc3QgU3VnZ2VzdGVkUXVlc3Rpb25zRXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5leHRlbmQoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJzdWdnZXN0ZWRfcXVlc3Rpb25zXCIpLFxuICBxdWVzdGlvbnM6IHouYXJyYXkoei5zdHJpbmcoKSksXG59KTtcbi8qKiBGb2xsb3ctdXAgcXVlc3Rpb24gbGlzdCBlbWl0dGVkIHdoZW4gR2VuaWUgYWRkcyBvciByZXdyaXRlcyBzdWdnZXN0aW9ucy4gKi9cbmV4cG9ydCB0eXBlIFN1Z2dlc3RlZFF1ZXN0aW9uc0V2ZW50ID0gei5pbmZlcjx0eXBlb2YgU3VnZ2VzdGVkUXVlc3Rpb25zRXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIFRoZSBhY3RpdmUgdHVybiByZWFjaGVkIGEgdGVybWluYWwgc3RhdHVzLiBBbHdheXMgZmlyZXMgb25jZVxuICogcGVyIHR1cm4gKGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB0ZXJtaW5hbCBgbWVzc2FnZWAgZXZlbnQpLlxuICogQ2FycmllcyB0aGUgZmluYWwgYEdlbmllTWVzc2FnZWAgc25hcHNob3QgaW5saW5lIHNvIHN1YnNjcmliZXJzXG4gKiBkb24ndCBuZWVkIHRvIGtlZXAgdGhlaXIgb3duIGNvcHkgb2YgdGhlIGxhc3QgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJlc3VsdEV2ZW50U2NoZW1hID0gR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEub21pdCh7XG4gIGF0dGFjaG1lbnRfaWQ6IHRydWUsXG59KS5leHRlbmQoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJyZXN1bHRcIiksXG4gIHN0YXR1czogei5lbnVtKFRFUk1JTkFMX1NUQVRVU0VTKSxcbiAgbWVzc2FnZTogR2VuaWVNZXNzYWdlU2NoZW1hLFxufSk7XG4vKiogRmluYWwgZXZlbnQgZm9yIGEgR2VuaWUgdHVybiwgY2FycnlpbmcgaXRzIHRlcm1pbmFsIHN0YXR1cyBhbmQgbWVzc2FnZSBzbmFwc2hvdC4gKi9cbmV4cG9ydCB0eXBlIFJlc3VsdEV2ZW50ID0gei5pbmZlcjx0eXBlb2YgUmVzdWx0RXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIERpc2NyaW1pbmF0ZWQgdW5pb24geWllbGRlZCBieSBgZ2VuaWVFdmVudENoYXRgLiBFYWNoIHZhcmlhbnRcbiAqIGlzIGEgc2luZ2xlIGZsYXQgb2JqZWN0IHdpdGggYHR5cGVgIGFzIHRoZSBkaXNjcmltaW5hdG9yIGFuZFxuICogdGhlIHBheWxvYWQgZmllbGRzIGhvaXN0ZWQgZGlyZWN0bHkgdG8gdGhlIHRvcCBsZXZlbCAtIG5vXG4gKiBgcGF5bG9hZGAgd3JhcHBlci4gQ29uc3VtZXJzIG5hcnJvdyBvbiBgdHlwZWAgYW5kIHJlYWQgZmllbGRzXG4gKiBpbmxpbmU6XG4gKlxuICogQGV4YW1wbGVcbiAqIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2YgZ2VuaWVFdmVudENoYXQoc3BhY2VJZCwgXCJUb3Agc3RvcmVzP1wiKSkge1xuICogICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAqICAgICBjYXNlIFwidGhpbmtpbmdcIjpcbiAqICAgICAgIGNvbnNvbGUubG9nKGV2ZW50LnRob3VnaHRfdHlwZSwgZXZlbnQudGV4dCk7XG4gKiAgICAgICBicmVhaztcbiAqICAgICBjYXNlIFwicmVzdWx0XCI6XG4gKiAgICAgICBjb25zb2xlLmxvZyhcImRvbmU6XCIsIGV2ZW50LnN0YXR1cyk7XG4gKiAgICAgICBicmVhaztcbiAqICAgfVxuICogfVxuICpcbiAqIFN0cmVhbSBvcmRlciBwZXIgdHVybjpcbiAqXG4gKiAgIDEuIGBxdWVzdGlvbmAsIGVtaXR0ZWQgd2l0aCB0aGUgZmlyc3QgYG1lc3NhZ2VgIHlpZWxkIChkZWZlcnJlZCBzb1xuICogICAgICB0aGUgYXNzaWduZWQgYG1lc3NhZ2VfaWRgIGlzIGF2YWlsYWJsZSksIGNhcnJ5aW5nIHRoZSBwcm9tcHRcbiAqICAgICAgdGhpcyB0dXJuIHNlbnQgdG8gR2VuaWUuXG4gKiAgIDIuIGBtZXNzYWdlYCBmb3IgZXZlcnkgcG9sbCB5aWVsZCAocmF3IGBHZW5pZU1lc3NhZ2VgIG9uXG4gKiAgICAgIGBldmVudC5tZXNzYWdlYCkuXG4gKiAgIDMuIEFueSBkZXJpdmVkIGV2ZW50cyB0aGUgc25hcHNob3QgZGlmZiBwcm9kdWNlZCAoYHN0YXR1c2AsXG4gKiAgICAgIGBhdHRhY2htZW50YCwgYHRoaW5raW5nYCwgYHRleHRgLCBgcXVlcnlgLCBgc3RhdGVtZW50YCxcbiAqICAgICAgYHJvd3NgLCBgc3VnZ2VzdGVkX3F1ZXN0aW9uc2ApIGluIHRoYXQgZml4ZWQgb3JkZXIuXG4gKiAgIDQuIE9uIHRoZSB0ZXJtaW5hbCBzbmFwc2hvdCwgYSBmaW5hbCBgcmVzdWx0YCBldmVudC5cbiAqXG4gKiBFcnJvcnMgcHJvcGFnYXRlIHZpYSB0aGUgZ2VuZXJhdG9yIHRocm93aW5nIChgdHJ5YC9gY2F0Y2hgIHRoZVxuICogYGZvciBhd2FpdGApLCBub3QgdmlhIGFuIGBlcnJvcmAgdmFyaWFudCBvbiB0aGlzIHVuaW9uLlxuICovXG5leHBvcnQgY29uc3QgR2VuaWVDaGF0RXZlbnRTY2hlbWEgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICBRdWVzdGlvbkV2ZW50U2NoZW1hLFxuICBNZXNzYWdlRXZlbnRTY2hlbWEsXG4gIFN0YXR1c0V2ZW50U2NoZW1hLFxuICBBdHRhY2htZW50RXZlbnRTY2hlbWEsXG4gIFRoaW5raW5nRXZlbnRTY2hlbWEsXG4gIFRleHRFdmVudFNjaGVtYSxcbiAgUXVlcnlFdmVudFNjaGVtYSxcbiAgU3RhdGVtZW50RXZlbnRTY2hlbWEsXG4gIFJvd3NFdmVudFNjaGVtYSxcbiAgU3VnZ2VzdGVkUXVlc3Rpb25zRXZlbnRTY2hlbWEsXG4gIFJlc3VsdEV2ZW50U2NoZW1hLFxuXSk7XG4vKiogT3JkZXJlZCBldmVudCB1bmlvbiB5aWVsZGVkIGJ5IGBnZW5pZUV2ZW50Q2hhdGA7IGZhaWx1cmVzIGFyZSB0aHJvd24sIG5vdCBlbWl0dGVkLiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVDaGF0RXZlbnQgPSB6LmluZmVyPHR5cGVvZiBHZW5pZUNoYXRFdmVudFNjaGVtYT47XG5cbi8qKiBEaXNjcmltaW5hdG9yIHR5cGUgZm9yIHtAbGluayBHZW5pZUNoYXRFdmVudH0uICovXG5leHBvcnQgdHlwZSBHZW5pZUNoYXRFdmVudFR5cGUgPSBHZW5pZUNoYXRFdmVudFtcInR5cGVcIl07XG5cbi8qKlxuICogRmllbGQgc2V0IGZvciBhIGdpdmVuIHtAbGluayBHZW5pZUNoYXRFdmVudFR5cGV9IC0gdGhlIHZhcmlhbnRcbiAqIHdpdGggdGhlIGB0eXBlYCBkaXNjcmltaW5hdG9yIHN0cmlwcGVkLiBVc2VkIGJ5IGRldGVjdG9ycyBpblxuICogYGV2ZW50LnRzYCBzbyBlYWNoIGRldGVjdG9yIHJldHVybnMganVzdCB0aGUgcGF5bG9hZCBmaWVsZHMgYW5kXG4gKiB0aGUgb3JjaGVzdHJhdG9yIHN0YW1wcyBgdHlwZWAgYXQgeWllbGQgdGltZS5cbiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVDaGF0RXZlbnRGaWVsZHM8VCBleHRlbmRzIEdlbmllQ2hhdEV2ZW50VHlwZT4gPSBPbWl0PFxuICBFeHRyYWN0PEdlbmllQ2hhdEV2ZW50LCB7IHR5cGU6IFQgfT4sXG4gIFwidHlwZVwiXG4+O1xuIl19
@@ -1 +1 @@
1
- {"root":["../src/dashboards.ts","../src/event.ts","../src/genie-model.ts","../index.ts"],"version":"5.9.3"}
1
+ {"root":["../src/agent-mode.ts","../src/dashboards.ts","../src/event.ts","../src/genie-model.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -25,7 +25,7 @@
25
25
  "typescript": "^5.9.3"
26
26
  },
27
27
  "dependencies": {
28
- "@dbx-tools/shared-core": "0.6.212",
28
+ "@dbx-tools/shared-core": "0.6.213",
29
29
  "zod": "4.3.6"
30
30
  },
31
31
  "main": "./lib/index.js",
@@ -42,7 +42,7 @@
42
42
  "./package.json": "./package.json"
43
43
  }
44
44
  },
45
- "version": "0.6.212",
45
+ "version": "0.6.213",
46
46
  "types": "./lib/index.d.ts",
47
47
  "type": "module",
48
48
  "exports": {
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Browser-safe Genie Agent Mode SSE contracts.
3
+ *
4
+ * Schemas validate the stable Responses-style event envelope while preserving
5
+ * additive fields and output-item variants introduced by the beta API.
6
+ *
7
+ * @module
8
+ */
9
+
10
+ import { z } from "zod";
11
+ import { json, object } from "@dbx-tools/shared-core";
12
+
13
+ import {
14
+ GenieMessageSchema,
15
+ type GenieAttachment,
16
+ type GenieMessage,
17
+ type GenieThought,
18
+ } from "./genie-model.ts";
19
+
20
+ /** Agent Mode output content item with forward-compatible fields. */
21
+ export const GenieAgentContentSchema = z
22
+ .object({
23
+ type: z.string(),
24
+ text: z.string().optional(),
25
+ metadata: z.unknown().optional(),
26
+ })
27
+ .loose();
28
+
29
+ /** Agent Mode response output item with known projection fields. */
30
+ export const GenieAgentOutputItemSchema = z
31
+ .object({
32
+ type: z.string(),
33
+ id: z.string().optional(),
34
+ call_id: z.string().optional(),
35
+ name: z.string().optional(),
36
+ arguments: z.string().optional(),
37
+ output: z.string().optional(),
38
+ status: z.string().optional(),
39
+ content: z.array(GenieAgentContentSchema).optional(),
40
+ })
41
+ .loose();
42
+
43
+ /** Genie Agent Mode response carried by lifecycle events. */
44
+ export const GenieAgentResponseSchema = z
45
+ .object({
46
+ object: z.string().optional(),
47
+ id: z.string(),
48
+ model: z.string().optional(),
49
+ status: z.string(),
50
+ output: z.array(GenieAgentOutputItemSchema).optional(),
51
+ conversation_id: z.string().optional(),
52
+ created_at: z.number().optional(),
53
+ error: z.unknown().optional(),
54
+ })
55
+ .loose();
56
+
57
+ /** One SSE event from the Genie Agent Mode response stream. */
58
+ export const GenieAgentModeEventSchema = z
59
+ .object({
60
+ type: z.string(),
61
+ sequence_number: z.number().optional(),
62
+ output_index: z.number().optional(),
63
+ response: GenieAgentResponseSchema.optional(),
64
+ item: GenieAgentOutputItemSchema.optional(),
65
+ })
66
+ .loose();
67
+
68
+ /** Validated Agent Mode response output item. */
69
+ export type GenieAgentOutputItem = z.infer<typeof GenieAgentOutputItemSchema>;
70
+ /** Validated Agent Mode response. */
71
+ export type GenieAgentResponse = z.infer<typeof GenieAgentResponseSchema>;
72
+ /** Validated Agent Mode SSE event. */
73
+ export type GenieAgentModeEvent = z.infer<typeof GenieAgentModeEventSchema>;
74
+
75
+ /** Stateful pure reducer from Agent Mode SSE events to Genie message snapshots. */
76
+ export class GenieAgentModeProjection {
77
+ private readonly items = new Map<string, GenieAgentOutputItem>();
78
+ private response: GenieAgentResponse | undefined;
79
+
80
+ constructor(
81
+ private readonly spaceId: string,
82
+ private readonly content: string,
83
+ ) {}
84
+
85
+ /** Apply one validated SSE event and return its projected snapshot. */
86
+ apply(event: GenieAgentModeEvent): GenieMessage | undefined {
87
+ if (event.response) {
88
+ this.response = event.response;
89
+ if (event.response.output) {
90
+ this.items.clear();
91
+ event.response.output.forEach((item, index) => {
92
+ this.items.set(agentItemKey(item, index), item);
93
+ });
94
+ }
95
+ }
96
+ if (event.item) {
97
+ this.items.set(agentItemKey(event.item, event.output_index), event.item);
98
+ }
99
+ if ((!event.response && !event.item) || !this.response) return undefined;
100
+ return projectAgentModeMessage(this.spaceId, this.content, this.response, [
101
+ ...this.items.values(),
102
+ ]);
103
+ }
104
+
105
+ /** Current response id, once `response.created` has arrived. */
106
+ get responseId(): string | undefined {
107
+ return this.response?.id;
108
+ }
109
+
110
+ /** Current conversation id, once assigned by Genie. */
111
+ get conversationId(): string | undefined {
112
+ return this.response?.conversation_id;
113
+ }
114
+
115
+ /** Whether the latest response status is terminal. */
116
+ get terminal(): boolean {
117
+ return this.response ? isTerminalStatus(this.response.status) : false;
118
+ }
119
+ }
120
+
121
+ function isTerminalStatus(status: string): boolean {
122
+ return status === "completed" || status === "failed" || status === "cancelled";
123
+ }
124
+
125
+ function agentItemKey(item: GenieAgentOutputItem, index: unknown): string {
126
+ if (typeof item.id === "string") return item.id;
127
+ if (typeof item.call_id === "string") return item.call_id;
128
+ return String(typeof index === "number" ? index : (item.type ?? "item"));
129
+ }
130
+
131
+ /** Project one Agent Mode response snapshot onto the shared Genie message shape. */
132
+ export function projectAgentModeMessage(
133
+ spaceId: string,
134
+ content: string,
135
+ response: GenieAgentResponse,
136
+ items: GenieAgentOutputItem[],
137
+ ): GenieMessage {
138
+ const errorValue = object.isRecord(response.error) ? response.error : undefined;
139
+ const errorMessage =
140
+ typeof errorValue?.message === "string"
141
+ ? errorValue.message
142
+ : typeof response.error === "string"
143
+ ? response.error
144
+ : undefined;
145
+ return GenieMessageSchema.parse({
146
+ id: response.id,
147
+ message_id: response.id,
148
+ space_id: spaceId,
149
+ conversation_id: response.conversation_id ?? "",
150
+ content,
151
+ status: agentModeStatus(response.status, items),
152
+ attachments: items.flatMap(itemAttachments),
153
+ ...(response.created_at !== undefined ? { created_timestamp: response.created_at } : {}),
154
+ ...(errorMessage ? { error: { error: errorMessage } } : {}),
155
+ });
156
+ }
157
+
158
+ function agentModeStatus(value: string, items: GenieAgentOutputItem[]): GenieMessage["status"] {
159
+ if (value === "completed") return "COMPLETED";
160
+ if (value === "failed") return "FAILED";
161
+ if (value === "cancelled") return "CANCELLED";
162
+ if (items.some((item) => item.type === "function_call")) return "EXECUTING_QUERY";
163
+ return "ASKING_AI";
164
+ }
165
+
166
+ function itemAttachments(item: GenieAgentOutputItem): GenieAttachment[] {
167
+ const id = item.id ?? item.call_id;
168
+ if (item.type === "reasoning") {
169
+ const thoughts = contentText(item.content, "reasoning_text").map(
170
+ (thoughtContent): GenieThought => ({
171
+ thought_type: "THOUGHT_TYPE_STEPS",
172
+ content: thoughtContent,
173
+ }),
174
+ );
175
+ return thoughts.length === 0
176
+ ? []
177
+ : [{ attachment_id: id, attachment_type: "query", query: { id, thoughts } }];
178
+ }
179
+ if (item.type === "function_call") {
180
+ const argumentsValue = json.parseRecord(item.arguments);
181
+ const query =
182
+ typeof argumentsValue?.sql === "string"
183
+ ? argumentsValue.sql
184
+ : typeof argumentsValue?.query === "string"
185
+ ? argumentsValue.query
186
+ : undefined;
187
+ const title = typeof argumentsValue?.title === "string" ? argumentsValue.title : item.name;
188
+ return query
189
+ ? [
190
+ {
191
+ attachment_id: id,
192
+ attachment_type: "query",
193
+ query: {
194
+ id,
195
+ query,
196
+ ...(title ? { title } : {}),
197
+ },
198
+ },
199
+ ]
200
+ : [];
201
+ }
202
+ if (item.type === "function_call_output" && item.output !== undefined) {
203
+ return [textAttachment(id, item.output)];
204
+ }
205
+ if (item.type === "message") {
206
+ return (item.content ?? []).flatMap((part) =>
207
+ part.type === "output_text" && part.text
208
+ ? [textAttachment(id, part.text, part.metadata)]
209
+ : [],
210
+ );
211
+ }
212
+ return [];
213
+ }
214
+
215
+ function contentText(
216
+ value: z.infer<typeof GenieAgentContentSchema>[] | undefined,
217
+ type: string,
218
+ ): string[] {
219
+ if (!value) return [];
220
+ return value.flatMap((part) => (part.type === type && part.text ? [part.text] : []));
221
+ }
222
+
223
+ function textAttachment(
224
+ id: string | undefined,
225
+ content: string,
226
+ metadata?: unknown,
227
+ ): GenieAttachment {
228
+ return {
229
+ attachment_id: id,
230
+ attachment_type: "text",
231
+ text: {
232
+ id,
233
+ content,
234
+ purpose: "TEXT_ATTACHMENT_PURPOSE_ANSWER",
235
+ ...(metadata !== undefined ? { metadata } : {}),
236
+ },
237
+ };
238
+ }
@@ -160,9 +160,13 @@ export type GenieQueryAttachment = z.infer<typeof GenieQueryAttachmentSchema>;
160
160
  export type GenieTextAttachmentPurpose =
161
161
  "FOLLOW_UP_QUESTION" | "TEXT_ATTACHMENT_PURPOSE_ANSWER" | (string & {});
162
162
 
163
- /** Text attachment schema widened for forward-compatible purpose values. */
163
+ /**
164
+ * Text attachment widened for forward-compatible purpose values and optional
165
+ * Agent Mode table metadata.
166
+ */
164
167
  export const GenieTextAttachmentSchema = dashboards.textAttachmentSchema.extend({
165
168
  purpose: z.custom<GenieTextAttachmentPurpose>((value) => typeof value === "string").optional(),
169
+ metadata: z.unknown().optional(),
166
170
  });
167
171
  /** Narrative text attachment, including its optional semantic purpose. */
168
172
  export type GenieTextAttachment = z.infer<typeof GenieTextAttachmentSchema>;