sunsama-api 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +215 -0
  3. package/dist/cjs/client/index.js +347 -0
  4. package/dist/cjs/client/index.js.map +1 -0
  5. package/dist/cjs/errors/index.js +110 -0
  6. package/dist/cjs/errors/index.js.map +1 -0
  7. package/dist/cjs/index.js +21 -0
  8. package/dist/cjs/index.js.map +1 -0
  9. package/dist/cjs/queries/fragments/index.js +9 -0
  10. package/dist/cjs/queries/fragments/index.js.map +1 -0
  11. package/dist/cjs/queries/fragments/stream.js +74 -0
  12. package/dist/cjs/queries/fragments/stream.js.map +1 -0
  13. package/dist/cjs/queries/fragments/task.js +500 -0
  14. package/dist/cjs/queries/fragments/task.js.map +1 -0
  15. package/dist/cjs/queries/index.js +11 -0
  16. package/dist/cjs/queries/index.js.map +1 -0
  17. package/dist/cjs/queries/streams.js +19 -0
  18. package/dist/cjs/queries/streams.js.map +1 -0
  19. package/dist/cjs/queries/tasks.js +41 -0
  20. package/dist/cjs/queries/tasks.js.map +1 -0
  21. package/dist/cjs/queries/user.js +472 -0
  22. package/dist/cjs/queries/user.js.map +1 -0
  23. package/dist/cjs/types/api.js +9 -0
  24. package/dist/cjs/types/api.js.map +1 -0
  25. package/dist/cjs/types/client.js +6 -0
  26. package/dist/cjs/types/client.js.map +1 -0
  27. package/dist/cjs/types/common.js +6 -0
  28. package/dist/cjs/types/common.js.map +1 -0
  29. package/dist/cjs/types/index.js +8 -0
  30. package/dist/cjs/types/index.js.map +1 -0
  31. package/dist/cjs/utils/index.js +63 -0
  32. package/dist/cjs/utils/index.js.map +1 -0
  33. package/dist/esm/client/index.js +348 -0
  34. package/dist/esm/client/index.js.map +1 -0
  35. package/dist/esm/errors/index.js +105 -0
  36. package/dist/esm/errors/index.js.map +1 -0
  37. package/dist/esm/index.js +16 -0
  38. package/dist/esm/index.js.map +1 -0
  39. package/dist/esm/queries/fragments/index.js +6 -0
  40. package/dist/esm/queries/fragments/index.js.map +1 -0
  41. package/dist/esm/queries/fragments/stream.js +71 -0
  42. package/dist/esm/queries/fragments/stream.js.map +1 -0
  43. package/dist/esm/queries/fragments/task.js +497 -0
  44. package/dist/esm/queries/fragments/task.js.map +1 -0
  45. package/dist/esm/queries/index.js +8 -0
  46. package/dist/esm/queries/index.js.map +1 -0
  47. package/dist/esm/queries/streams.js +16 -0
  48. package/dist/esm/queries/streams.js.map +1 -0
  49. package/dist/esm/queries/tasks.js +38 -0
  50. package/dist/esm/queries/tasks.js.map +1 -0
  51. package/dist/esm/queries/user.js +469 -0
  52. package/dist/esm/queries/user.js.map +1 -0
  53. package/dist/esm/types/api.js +8 -0
  54. package/dist/esm/types/api.js.map +1 -0
  55. package/dist/esm/types/client.js +5 -0
  56. package/dist/esm/types/client.js.map +1 -0
  57. package/dist/esm/types/common.js +5 -0
  58. package/dist/esm/types/common.js.map +1 -0
  59. package/dist/esm/types/index.js +7 -0
  60. package/dist/esm/types/index.js.map +1 -0
  61. package/dist/esm/utils/index.js +57 -0
  62. package/dist/esm/utils/index.js.map +1 -0
  63. package/dist/types/client/index.d.ts +109 -0
  64. package/dist/types/client/index.d.ts.map +1 -0
  65. package/dist/types/errors/index.d.ts +67 -0
  66. package/dist/types/errors/index.d.ts.map +1 -0
  67. package/dist/types/index.d.ts +14 -0
  68. package/dist/types/index.d.ts.map +1 -0
  69. package/dist/types/queries/fragments/index.d.ts +6 -0
  70. package/dist/types/queries/fragments/index.d.ts.map +1 -0
  71. package/dist/types/queries/fragments/stream.d.ts +5 -0
  72. package/dist/types/queries/fragments/stream.d.ts.map +1 -0
  73. package/dist/types/queries/fragments/task.d.ts +8 -0
  74. package/dist/types/queries/fragments/task.d.ts.map +1 -0
  75. package/dist/types/queries/index.d.ts +8 -0
  76. package/dist/types/queries/index.d.ts.map +1 -0
  77. package/dist/types/queries/streams.d.ts +5 -0
  78. package/dist/types/queries/streams.d.ts.map +1 -0
  79. package/dist/types/queries/tasks.d.ts +6 -0
  80. package/dist/types/queries/tasks.d.ts.map +1 -0
  81. package/dist/types/queries/user.d.ts +5 -0
  82. package/dist/types/queries/user.d.ts.map +1 -0
  83. package/dist/types/types/api.d.ts +838 -0
  84. package/dist/types/types/api.d.ts.map +1 -0
  85. package/dist/types/types/client.d.ts +30 -0
  86. package/dist/types/types/client.d.ts.map +1 -0
  87. package/dist/types/types/common.d.ts +58 -0
  88. package/dist/types/types/common.d.ts.map +1 -0
  89. package/dist/types/types/index.d.ts +9 -0
  90. package/dist/types/types/index.d.ts.map +1 -0
  91. package/dist/types/utils/index.d.ts +35 -0
  92. package/dist/types/utils/index.d.ts.map +1 -0
  93. package/package.json +90 -0
@@ -0,0 +1,472 @@
1
+ "use strict";
2
+ /**
3
+ * User-related GraphQL queries
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.GET_USER_QUERY = void 0;
7
+ const graphql_tag_1 = require("graphql-tag");
8
+ exports.GET_USER_QUERY = (0, graphql_tag_1.gql) `
9
+ query getUser {
10
+ currentUser {
11
+ _id
12
+ activationDate
13
+ admin
14
+ aka
15
+ calendar {
16
+ items {
17
+ id
18
+ accountId
19
+ google {
20
+ summary
21
+ summaryOverride
22
+ timeZone
23
+ selected
24
+ accessRole
25
+ accountId
26
+ __typename
27
+ }
28
+ microsoft {
29
+ id
30
+ name
31
+ color
32
+ hexColor
33
+ isDefaultCalendar
34
+ canShare
35
+ canViewPrivateItems
36
+ canEdit
37
+ isRemovable
38
+ allowedOnlineMeetingProviders
39
+ defaultOnlineMeetingProvider
40
+ isTallyingResponse
41
+ owner {
42
+ address
43
+ name
44
+ __typename
45
+ }
46
+ primary
47
+ accountId
48
+ __typename
49
+ }
50
+ __typename
51
+ }
52
+ __typename
53
+ }
54
+ services {
55
+ google {
56
+ scope
57
+ id
58
+ email
59
+ name
60
+ picture
61
+ locale
62
+ __typename
63
+ }
64
+ microsoft {
65
+ scope
66
+ id
67
+ email
68
+ name
69
+ isPersonalAccount
70
+ __typename
71
+ }
72
+ phoneNumber {
73
+ number
74
+ verified
75
+ otpExpiresAt
76
+ __typename
77
+ }
78
+ ssoEnforced
79
+ __typename
80
+ }
81
+ emails {
82
+ address
83
+ verified
84
+ __typename
85
+ }
86
+ primaryGroup {
87
+ groupId
88
+ __typename
89
+ }
90
+ onboarding
91
+ preferences {
92
+ clockStyle
93
+ defaultCalendarView
94
+ defaultHomeView
95
+ defaultMainPanel
96
+ defaultMobileCalendarView
97
+ defaultHideTasks
98
+ hideTeamEvtCopies
99
+ hideMessenger
100
+ disableSpellcheck
101
+ channelRecommendations
102
+ plannedTimeRecommendations
103
+ subtaskPlannedTimeRecommendations
104
+ startDayOfWeekOffset
105
+ workingSessionTransparency
106
+ workingSessionVisibility
107
+ workingSessionDuration
108
+ promptToUpdateStatus
109
+ darkMode
110
+ keyboardShortcuts
111
+ customKeyboardShortcuts {
112
+ id
113
+ disabled
114
+ global
115
+ key
116
+ metaKey
117
+ ctrlKey
118
+ shiftKey
119
+ __typename
120
+ }
121
+ autoArchiveThreshold
122
+ showDeclinedEvents
123
+ usePlannedTimeAsActualTime
124
+ rollToTop
125
+ includeWeekendInReflection
126
+ planningAutoRollover
127
+ autoFocus
128
+ focusBarDisabledTriggers
129
+ workloadThreshold
130
+ importEventFilters
131
+ autoImportEvents
132
+ importEventCompletionSync
133
+ workingSessionCalendarReminder
134
+ workingSessionBuffer
135
+ focusModeNextUpReminder
136
+ autoRescheduleWorkingSessionConflicts
137
+ autoRescheduleWorkingSessionCompletions
138
+ schedulingHours {
139
+ start {
140
+ hour
141
+ minute
142
+ __typename
143
+ }
144
+ end {
145
+ hour
146
+ minute
147
+ __typename
148
+ }
149
+ __typename
150
+ }
151
+ defaultEmailClient
152
+ timerNotificationsEnabled
153
+ timerNotificationsSoundId
154
+ timerPomodoroNotificationsSoundId
155
+ timerNotificationsVolume
156
+ timerNotificationsTimeRemainingTriggers
157
+ endOfDayMessageId
158
+ endOfDayCustomMessage
159
+ autoBreak
160
+ defaultTargetFocusDuration
161
+ defaultTargetBreakDuration
162
+ defaultFocusTimerView
163
+ completedTaskCalendarPinStyle
164
+ hideCompletedTasks
165
+ insertTaskPosition
166
+ chatToolFocusSyncTrigger
167
+ chatToolFocusSyncUpdateStatus
168
+ chatToolFocusSyncUpdateDnd
169
+ chatToolFocusSyncPrivacy
170
+ chatToolFocusSyncStatusEmoji
171
+ navigationPanelStyle
172
+ preferredAILanguage
173
+ preferredLanguage
174
+ visualizeTaskProjectedTimeOnCalendar
175
+ visualizeTaskActualTimeOnCalendar
176
+ __typename
177
+ }
178
+ contacts {
179
+ integrationEnabled
180
+ usesNewPeopleApi
181
+ accountId
182
+ __typename
183
+ }
184
+ createdAt
185
+ dailyPlanning {
186
+ snoozedUntilDate
187
+ lastDayPlanned
188
+ disabledSteps
189
+ importEventsWithoutInvitees
190
+ __typename
191
+ }
192
+ dailyShutdown {
193
+ snoozedUntilDate
194
+ lastDayShutdown
195
+ __typename
196
+ }
197
+ daysPlanned
198
+ daysShutdown
199
+ desktopApp {
200
+ darwin {
201
+ status
202
+ deferralDate
203
+ __typename
204
+ }
205
+ win32 {
206
+ status
207
+ deferralDate
208
+ __typename
209
+ }
210
+ linux {
211
+ status
212
+ deferralDate
213
+ __typename
214
+ }
215
+ __typename
216
+ }
217
+ mobileApp {
218
+ status
219
+ os
220
+ lastModified
221
+ __typename
222
+ }
223
+ lastAnnouncementCheckDate
224
+ lastModified
225
+ nodeId
226
+ notifySettings {
227
+ inviteeResponse {
228
+ subscribed
229
+ channels
230
+ __typename
231
+ }
232
+ invitedToEvent {
233
+ subscribed
234
+ channels
235
+ __typename
236
+ }
237
+ eventUpdated {
238
+ subscribed
239
+ channels
240
+ __typename
241
+ }
242
+ eventCancelled {
243
+ subscribed
244
+ channels
245
+ __typename
246
+ }
247
+ newComments {
248
+ subscribed
249
+ channels
250
+ __typename
251
+ }
252
+ shareTasks {
253
+ subscribed
254
+ channels
255
+ __typename
256
+ }
257
+ taskComment {
258
+ subscribed
259
+ channels
260
+ __typename
261
+ }
262
+ taskStream {
263
+ subscribed
264
+ channels
265
+ __typename
266
+ }
267
+ taskAssignee {
268
+ subscribed
269
+ channels
270
+ __typename
271
+ }
272
+ taskCompletion {
273
+ subscribed
274
+ channels
275
+ __typename
276
+ }
277
+ taskSchedule {
278
+ subscribed
279
+ channels
280
+ __typename
281
+ }
282
+ taskCreation {
283
+ subscribed
284
+ channels
285
+ __typename
286
+ }
287
+ eventReminders {
288
+ subscribed
289
+ channels
290
+ __typename
291
+ }
292
+ dossier {
293
+ subscribed
294
+ channels
295
+ __typename
296
+ }
297
+ planYourDay {
298
+ subscribed
299
+ channels
300
+ __typename
301
+ }
302
+ weeklyStats {
303
+ subscribed
304
+ channels
305
+ __typename
306
+ }
307
+ weekReview {
308
+ subscribed
309
+ channels
310
+ __typename
311
+ }
312
+ systemUpdates {
313
+ subscribed
314
+ channels
315
+ __typename
316
+ }
317
+ dailyWrapSeen {
318
+ subscribed
319
+ channels
320
+ __typename
321
+ }
322
+ dailyWrapReply {
323
+ subscribed
324
+ channels
325
+ __typename
326
+ }
327
+ __typename
328
+ }
329
+ profile {
330
+ profilePictureURL
331
+ firstname
332
+ lastname
333
+ timezone
334
+ timezoneWarningDisabled
335
+ profileThumbs {
336
+ image_24
337
+ image_32
338
+ image_48
339
+ image_72
340
+ image_192
341
+ __typename
342
+ }
343
+ useCase
344
+ onboardingEventSent
345
+ __typename
346
+ }
347
+ toursCompleted
348
+ username
349
+ waitList
350
+ weeklyPlanning {
351
+ hour
352
+ minute
353
+ isoWeekday
354
+ lastWeekPlanned
355
+ weeksPlanned
356
+ disabled
357
+ __typename
358
+ }
359
+ weeklyReview {
360
+ hour
361
+ minute
362
+ isoWeekday
363
+ lastWeekReviewed
364
+ weeksReviewed
365
+ disabled
366
+ __typename
367
+ }
368
+ lastArchiveCheckDate
369
+ integrationRequests
370
+ dayStart {
371
+ hour
372
+ minute
373
+ disabled
374
+ __typename
375
+ }
376
+ plannedDayStart {
377
+ hour
378
+ minute
379
+ disabled
380
+ __typename
381
+ }
382
+ dayEnd {
383
+ hour
384
+ minute
385
+ disabled
386
+ __typename
387
+ }
388
+ waitlistId
389
+ trialPeriod
390
+ qualificationAssessment
391
+ disappointmentIndex
392
+ emailCourses {
393
+ id
394
+ status
395
+ __typename
396
+ }
397
+ tracking {
398
+ facebook {
399
+ _fbp
400
+ _fbc
401
+ __typename
402
+ }
403
+ chatSetupConfigId
404
+ __typename
405
+ }
406
+ proficiencies {
407
+ id
408
+ count
409
+ proficient
410
+ proficientAt
411
+ firstPerformedAt
412
+ __typename
413
+ }
414
+ assistant {
415
+ scheduledCalls {
416
+ workflow
417
+ reminder {
418
+ schedule {
419
+ enabled
420
+ isoDayIndex
421
+ time {
422
+ hour
423
+ minute
424
+ __typename
425
+ }
426
+ __typename
427
+ }
428
+ __typename
429
+ }
430
+ __typename
431
+ }
432
+ __typename
433
+ }
434
+ dailyWrap {
435
+ reminder {
436
+ schedule {
437
+ enabled
438
+ isoDayIndex
439
+ time {
440
+ hour
441
+ minute
442
+ __typename
443
+ }
444
+ __typename
445
+ }
446
+ nextDeliveryAt
447
+ __typename
448
+ }
449
+ __typename
450
+ }
451
+ dailyCatchUp {
452
+ reminder {
453
+ schedule {
454
+ enabled
455
+ isoDayIndex
456
+ time {
457
+ hour
458
+ minute
459
+ __typename
460
+ }
461
+ __typename
462
+ }
463
+ nextDeliveryAt
464
+ __typename
465
+ }
466
+ __typename
467
+ }
468
+ __typename
469
+ }
470
+ }
471
+ `;
472
+ //# sourceMappingURL=user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../../src/queries/user.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,6CAAkC;AAErB,QAAA,cAAc,GAAG,IAAA,iBAAG,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+chC,CAAC"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ /**
3
+ * API response and data types
4
+ *
5
+ * These types represent the structure of data returned by the Sunsama API.
6
+ * They will be populated based on the actual API documentation.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/types/api.ts"],"names":[],"mappings":";AAAA;;;;;GAKG"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Client configuration and related types
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/types/client.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Common utility types used throughout the library
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/types/common.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ /**
3
+ * Type definitions for the Sunsama API wrapper
4
+ *
5
+ * This file exports all type definitions used throughout the library.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ /**
3
+ * Utility functions for the Sunsama API wrapper
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.validateNonEmptyString = validateNonEmptyString;
7
+ exports.validatePositiveNumber = validatePositiveNumber;
8
+ exports.buildUrlWithParams = buildUrlWithParams;
9
+ exports.isPlainObject = isPlainObject;
10
+ /**
11
+ * Validates that a string is not empty
12
+ *
13
+ * @param value - The string to validate
14
+ * @param fieldName - Name of the field (for error messages)
15
+ * @throws {Error} If the string is empty or only whitespace
16
+ */
17
+ function validateNonEmptyString(value, fieldName) {
18
+ if (!value || value.trim().length === 0) {
19
+ throw new Error(`${fieldName} cannot be empty`);
20
+ }
21
+ }
22
+ /**
23
+ * Validates that a number is positive
24
+ *
25
+ * @param value - The number to validate
26
+ * @param fieldName - Name of the field (for error messages)
27
+ * @throws {Error} If the number is not positive
28
+ */
29
+ function validatePositiveNumber(value, fieldName) {
30
+ if (value <= 0) {
31
+ throw new Error(`${fieldName} must be a positive number`);
32
+ }
33
+ }
34
+ /**
35
+ * Builds a URL with query parameters
36
+ *
37
+ * @param baseUrl - The base URL
38
+ * @param params - Query parameters to append
39
+ * @returns The complete URL with query string
40
+ */
41
+ function buildUrlWithParams(baseUrl, params) {
42
+ if (!params || Object.keys(params).length === 0) {
43
+ return baseUrl;
44
+ }
45
+ const url = new URL(baseUrl);
46
+ Object.entries(params).forEach(([key, value]) => {
47
+ url.searchParams.append(key, String(value));
48
+ });
49
+ return url.toString();
50
+ }
51
+ /**
52
+ * Checks if a value is a plain object
53
+ *
54
+ * @param value - The value to check
55
+ * @returns True if the value is a plain object
56
+ */
57
+ function isPlainObject(value) {
58
+ return (typeof value === 'object' &&
59
+ value !== null &&
60
+ value.constructor === Object &&
61
+ Object.prototype.toString.call(value) === '[object Object]');
62
+ }
63
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;AASH,wDAIC;AASD,wDAIC;AASD,gDAeC;AAQD,sCAOC;AA/DD;;;;;;GAMG;AACH,SAAgB,sBAAsB,CAAC,KAAa,EAAE,SAAiB;IACrE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,kBAAkB,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,sBAAsB,CAAC,KAAa,EAAE,SAAiB;IACrE,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,4BAA4B,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAChC,OAAe,EACf,MAAkD;IAElD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAE7B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC9C,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,KAAc;IAC1C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,KAAK,CAAC,WAAW,KAAK,MAAM;QAC5B,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,iBAAiB,CAC5D,CAAC;AACJ,CAAC"}