@nsshunt/stsappframework 3.1.58 → 3.1.59

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 (56) hide show
  1. package/dist/index.js +0 -1
  2. package/dist/index.js.map +1 -1
  3. package/dist/influxdb/influxDBManagerBase.js +5 -5
  4. package/dist/influxdb/influxDBManagerBase.js.map +1 -1
  5. package/dist/kafka/IMKafkaManager.js +9 -9
  6. package/dist/kafka/IMKafkaManager.js.map +1 -1
  7. package/dist/processbase.js +4 -4
  8. package/dist/processbase.js.map +1 -1
  9. package/dist/server.js +8 -8
  10. package/dist/server.js.map +1 -1
  11. package/dist/vitesttesting/singleservertest.test.js +2 -2
  12. package/dist/vitesttesting/singleservertest.test.js.map +1 -1
  13. package/package.json +3 -5
  14. package/src/authutilsnode.ts +1 -1
  15. package/src/commonTypes.ts +2 -2
  16. package/src/index.ts +0 -1
  17. package/src/influxdb/influxDBManager.ts +1 -1
  18. package/src/influxdb/influxDBManagerBase.ts +2 -2
  19. package/src/kafka/IMKafkaManager.ts +1 -2
  20. package/src/masterprocessbase.ts +1 -1
  21. package/src/processbase.ts +2 -3
  22. package/src/server.ts +1 -1
  23. package/src/singleprocessbase.ts +1 -1
  24. package/src/socketIoServerHelper.ts +1 -1
  25. package/src/testing/wsevents.ts +1 -1
  26. package/src/vitesttesting/singleservertest.test.ts +1 -1
  27. package/src/vitesttesting/wsevents.ts +1 -1
  28. package/types/authutilsnode.d.ts +1 -1
  29. package/types/authutilsnode.d.ts.map +1 -1
  30. package/types/commonTypes.d.ts +2 -2
  31. package/types/commonTypes.d.ts.map +1 -1
  32. package/types/index.d.ts +0 -1
  33. package/types/index.d.ts.map +1 -1
  34. package/types/influxdb/influxDBManager.d.ts +1 -1
  35. package/types/influxdb/influxDBManager.d.ts.map +1 -1
  36. package/types/influxdb/influxDBManagerBase.d.ts +1 -1
  37. package/types/influxdb/influxDBManagerBase.d.ts.map +1 -1
  38. package/types/kafka/IMKafkaManager.d.ts +1 -1
  39. package/types/kafka/IMKafkaManager.d.ts.map +1 -1
  40. package/types/masterprocessbase.d.ts +1 -1
  41. package/types/masterprocessbase.d.ts.map +1 -1
  42. package/types/processbase.d.ts +1 -2
  43. package/types/processbase.d.ts.map +1 -1
  44. package/types/singleprocessbase.d.ts +1 -1
  45. package/types/singleprocessbase.d.ts.map +1 -1
  46. package/types/socketIoServerHelper.d.ts +1 -1
  47. package/types/socketIoServerHelper.d.ts.map +1 -1
  48. package/types/testing/wsevents.d.ts +1 -1
  49. package/types/testing/wsevents.d.ts.map +1 -1
  50. package/types/vitesttesting/wsevents.d.ts +1 -1
  51. package/types/vitesttesting/wsevents.d.ts.map +1 -1
  52. package/dist/globalServiceDefinitions.js +0 -229
  53. package/dist/globalServiceDefinitions.js.map +0 -1
  54. package/src/globalServiceDefinitions.ts +0 -280
  55. package/types/globalServiceDefinitions.d.ts +0 -52
  56. package/types/globalServiceDefinitions.d.ts.map +0 -1
@@ -1,280 +0,0 @@
1
- import { Gauge } from '@nsshunt/stsinstrumentation'
2
- import { SubscriptionTopic } from '@nsshunt/stssocketio-client'
3
- import { IContextBase } from '@nsshunt/stspublisherserver'
4
- import { IServiceProcessContext } from './commonTypes'
5
-
6
- export type IInstrumentHashMap = Record<string, string>;
7
-
8
- export interface IHistoField {
9
- label: string
10
- bucketLimit: number
11
- }
12
-
13
- export enum influxDBDataType {
14
- intField = 'intField',
15
- floatField = 'floatField',
16
- stringField = 'stringField'
17
- }
18
-
19
- export interface IFieldRecord {
20
- fieldName: string
21
- gauge: Gauge
22
- instrumentProperty: string
23
- dataType: string
24
- influxdbDataType: influxDBDataType
25
- timeSeriesIndex?: boolean
26
- quantile?: boolean // Does this field require a quantile ?
27
- histo?: IHistoField[]
28
- }
29
-
30
- //@@ current not used - delete if required ...
31
- export interface IRedisQueryFilters {
32
- level1ContextField: string
33
- level2ContextField: string
34
- level3ContextField: string
35
- }
36
-
37
- export interface IRedisIndexPrefixDefinitions {
38
- timeSeriesIndex: string
39
- timeSeriesPrefix: string
40
- instantIndex: string
41
- instantPrefix: string
42
- }
43
-
44
- export interface IsubscriptionTopic {
45
- subscriptionTopic: SubscriptionTopic
46
- route: string,
47
- }
48
-
49
- export interface IServiceDefinition {
50
- influxDBContextTags: string[],
51
- redisIndexPrefixDefinitions: IRedisIndexPrefixDefinitions
52
- fieldList: IFieldRecord[] // Specific additional fields (beyond the core fields) that this service supports
53
- GetPathFromContext: (context: IContextBase) => string
54
- redisQueryFilters: IRedisQueryFilters
55
- subscriptionTopics: IsubscriptionTopic[]
56
- }
57
-
58
- export interface IGlobalServiceDefinitions {
59
- coreFieldList: IFieldRecord[] // Set of instruments that are used by all service types
60
- services: Record<string, IServiceDefinition>;
61
- }
62
-
63
- /*
64
- AllServicesCombined = 'AllServicesCombined',
65
- Services = 'Services',
66
- ServiceInstances = 'ServiceInstances',
67
- ServiceInstance = 'ServiceInstance',
68
-
69
- // User Agents topics
70
- AllAgentsCombined = 'AllAgentsCombined',
71
- Agents = 'Agents',
72
- AgentWorkers = 'AgentWorkers',
73
- AgentWorker = 'AgentWorker',
74
-
75
- // Lambda topics
76
- AllLambdasCombined = "AllLambdasCombined",
77
- LambdaTechnologies = "LambdaTechnologies", // e.g. aws was lambdas
78
- LambdaSubTechnologies = "LambdaSubTechnologies", // e.g. aws_s3, aws_sqs, aws_sns was LambdaInstances
79
- LambdaSubTechnologiesInstance = "LambdaSubTechnologiesInstance", // (uuidv4()) was ServiceInstance
80
- */
81
-
82
- export const globalServiceDefinitions: IGlobalServiceDefinitions = {
83
- coreFieldList: [
84
- { fieldName: 'requestCount', gauge: Gauge.REQUEST_COUNT_GAUGE, instrumentProperty: 'val', dataType: 'number', influxdbDataType: influxDBDataType.intField },
85
- { fieldName: 'errorCount', gauge: Gauge.ERROR_COUNT_GAUGE, instrumentProperty: 'val', dataType: 'number', influxdbDataType: influxDBDataType.intField },
86
- { fieldName: 'retryCount', gauge: Gauge.RETRY_COUNT_GAUGE, instrumentProperty: 'val', dataType: 'number', influxdbDataType: influxDBDataType.intField },
87
- { fieldName: 'authenticationCount', gauge: Gauge.AUTHENTICATION_COUNT_GAUGE, instrumentProperty: 'val', dataType: 'number', influxdbDataType: influxDBDataType.intField },
88
- { fieldName: 'authenticationErrorCount', gauge: Gauge.AUTHENTICATION_ERROR_COUNT_GAUGE, instrumentProperty: 'val', dataType: 'number', influxdbDataType: influxDBDataType.intField },
89
- { fieldName: 'authenticationRetryCount', gauge: Gauge.AUTHENTICATION_RETRY_COUNT_GAUGE, instrumentProperty: 'val', dataType: 'number', influxdbDataType: influxDBDataType.intField },
90
- { fieldName: 'velocity', gauge: Gauge.VELOCITY_GAUGE, instrumentProperty: 'va', dataType: 'number', influxdbDataType: influxDBDataType.floatField },
91
- { fieldName: 'activeRequestCount', gauge: Gauge.ACTIVE_REQUEST_GAUGE, instrumentProperty: 'val', dataType: 'number', timeSeriesIndex: true, quantile: true, influxdbDataType: influxDBDataType.intField },
92
- { fieldName: 'coreCount', gauge: Gauge.CORE_COUNT_GAUGE, instrumentProperty: 'val', dataType: 'number', influxdbDataType: influxDBDataType.intField },
93
- { fieldName: 'rx', gauge: Gauge.NETWORK_RX_GAUGE, instrumentProperty: 'va', dataType: 'number', influxdbDataType: influxDBDataType.floatField },
94
- { fieldName: 'tx', gauge: Gauge.NETWORK_TX_GAUGE, instrumentProperty: 'va', dataType: 'number', influxdbDataType: influxDBDataType.floatField },
95
- { fieldName: 'timer', gauge: Gauge.TIMER_GAUGE, instrumentProperty: 'val', dataType: 'number', influxdbDataType: influxDBDataType.floatField },
96
- { fieldName: 'duration', gauge: Gauge.DURATION_GAUGE, instrumentProperty: 'val', dataType: 'number', timeSeriesIndex: true, quantile: true, influxdbDataType: influxDBDataType.floatField,
97
- histo: [
98
- { label: 'B10', bucketLimit: 10 },
99
- { label: 'B20', bucketLimit: 20 },
100
- { label: 'B50', bucketLimit: 50 },
101
- { label: 'B100', bucketLimit: 100 },
102
- { label: 'B1000', bucketLimit: 1000 },
103
- { label: 'B50000', bucketLimit: 50000 },
104
- { label: 'BInfinity', bucketLimit: -1 }
105
- ] },
106
- { fieldName: 'latency', gauge: Gauge.LATENCY_GAUGE, instrumentProperty: 'val', dataType: 'number', timeSeriesIndex: true, quantile: true, influxdbDataType: influxDBDataType.floatField,
107
- histo: [
108
- { label: 'B10', bucketLimit: 10 },
109
- { label: 'B20', bucketLimit: 20 },
110
- { label: 'B50', bucketLimit: 50 },
111
- { label: 'B100', bucketLimit: 100 },
112
- { label: 'B1000', bucketLimit: 1000 },
113
- { label: 'B50000', bucketLimit: 50000 },
114
- { label: 'BInfinity', bucketLimit: -1 }
115
- ] }
116
- ],
117
- services: {
118
- ['service']: {
119
- influxDBContextTags: [
120
- 'serviceId',
121
- 'serviceName',
122
- 'serviceVersion',
123
- 'serviceInstanceId',
124
- 'serviceInstanceProcessId',
125
- 'hostName',
126
- 'pid',
127
- 'ppid'
128
- ],
129
- redisIndexPrefixDefinitions: {
130
- timeSeriesIndex: 'idx:serviceIndexTimeSeries',
131
- timeSeriesPrefix: '/serviceTimeSeries:',
132
- instantIndex: 'idx:serviceIndexInstant',
133
- instantPrefix: '/serviceInstant:'
134
- },
135
- fieldList: [
136
- { fieldName: 'cpu', gauge: Gauge.CPU_LOAD_GAUGE, instrumentProperty: 'val', dataType: 'number', timeSeriesIndex: true, quantile: true, influxdbDataType: influxDBDataType.floatField },
137
- { fieldName: 'connectionCount', gauge: Gauge.CONNECTION_COUNT_GAUGE, instrumentProperty: 'val', dataType: 'number', timeSeriesIndex: true, quantile: true, influxdbDataType: influxDBDataType.intField },
138
- { fieldName: 'connectionPoolCount', gauge: Gauge.CONNECTION_POOL_TOTAL_GAUGE, instrumentProperty: 'val', dataType: 'number', influxdbDataType: influxDBDataType.intField },
139
- { fieldName: 'connectionIdleCount', gauge: Gauge.CONNECTION_POOL_IDLE_GAUGE, instrumentProperty: 'val', dataType: 'number', influxdbDataType: influxDBDataType.intField },
140
- { fieldName: 'connectionWaitingCount', gauge: Gauge.CONNECTION_POOL_WAITING_GAUGE, instrumentProperty: 'val', dataType: 'number', influxdbDataType: influxDBDataType.intField },
141
- { fieldName: 'systemcpu', gauge: Gauge.CPU_SYSTEM_LOAD_GAUGE, instrumentProperty: 'val', dataType: 'number', timeSeriesIndex: true, quantile: true, influxdbDataType: influxDBDataType.floatField },
142
- { fieldName: 'memory', gauge: Gauge.OBJECT_GAUGE, instrumentProperty: 'val', dataType: 'JSON', influxdbDataType: influxDBDataType.stringField }
143
- ],
144
- GetPathFromContext(context: IServiceProcessContext): string {
145
- //const { serviceId, serviceInstanceId, hostName, serviceInstanceProcessId,
146
- //pid, ppid, serviceName, serviceVersion } = instrumentPayload.context;
147
- const { serviceId, serviceInstanceId, serviceInstanceProcessId } = context;
148
- return `/${serviceId}/${serviceInstanceId}/${serviceInstanceProcessId}`; //@@ these should line up with the query filer names
149
- },
150
- redisQueryFilters: {
151
- level1ContextField: 'serviceType',
152
- level2ContextField: 'appid',
153
- level3ContextField: 'appinstanceid'
154
- },
155
- subscriptionTopics: [
156
- {
157
- subscriptionTopic: SubscriptionTopic.AllServicesCombined,
158
- route: '/metrics'
159
- },
160
- {
161
- subscriptionTopic: SubscriptionTopic.Services,
162
- route: '/metrics/services'
163
- },
164
- {
165
- subscriptionTopic: SubscriptionTopic.ServiceInstances,
166
- route: '/metrics/services/:key'
167
- },
168
- {
169
- subscriptionTopic: SubscriptionTopic.ServiceInstance,
170
- route: '/metrics/services/:key/:subkey'
171
- }
172
- ]
173
- },
174
- ['agent']: {
175
- influxDBContextTags: [
176
- 'id',
177
- 'hostName',
178
- 'agentName',
179
- 'threadId',
180
- 'asyncRunnerId'
181
- ],
182
- redisIndexPrefixDefinitions: {
183
- timeSeriesIndex: 'idx:agentIndexTimeSeries',
184
- timeSeriesPrefix: '/agentTimeSeries:',
185
- instantIndex: 'idx:agentIndexInstant',
186
- instantPrefix: '/agentInstant:'
187
- },
188
- fieldList: [
189
- { fieldName: 'childCount', gauge: Gauge.CHILD_COUNT, instrumentProperty: 'val', dataType: 'number', influxdbDataType: influxDBDataType.intField }
190
- ],
191
- //@@ need type declare in appframework ?? agent does not use appframework ... perhaps stspublisher
192
- GetPathFromContext(context: IContextBase): string {
193
- //const { nid, id, hostName, agentName, threadId, asyncRunnerId } = context;
194
- const { agentName, threadId, asyncRunnerId } = context;
195
- return `/${agentName}/${threadId}/${asyncRunnerId}`; //@@ these should line up with the query filer names
196
- },
197
- redisQueryFilters: {
198
- level1ContextField: 'serviceType',
199
- level2ContextField: 'appid', //@@ this should be named something else
200
- level3ContextField: 'appinstanceid' //@@ this should be named something else
201
- },
202
- subscriptionTopics: [
203
- {
204
- subscriptionTopic: SubscriptionTopic.AllAgentsCombined,
205
- route: '/metrics'
206
- },
207
- {
208
- subscriptionTopic: SubscriptionTopic.Agents,
209
- route: '/metrics/agents'
210
- },
211
- {
212
- subscriptionTopic: SubscriptionTopic.AgentWorkers,
213
- route: '/metrics/agents/:key'
214
- },
215
- {
216
- subscriptionTopic: SubscriptionTopic.AgentWorker,
217
- route: '/metrics/agents/:key/:subkey'
218
- }
219
- ]
220
- },
221
- ['lambda']: {
222
- influxDBContextTags: [
223
- 'technology',
224
- 'subTechnology',
225
- 'lambdaFunctionName',
226
- 'lambdaInstance',
227
- 'hostName',
228
- 'processId',
229
- 'parentProcessId',
230
- 'useCase',
231
- 'pattern'
232
- ],
233
- redisIndexPrefixDefinitions: {
234
- timeSeriesIndex: 'idx:lambdaIndexTimeSeries',
235
- timeSeriesPrefix: '/lambdaTimeSeries:',
236
- instantIndex: 'idx:lambdaIndexInstant',
237
- instantPrefix: '/lambdaInstant:'
238
- },
239
- fieldList: [
240
- { fieldName: 'cpu', gauge: Gauge.CPU_LOAD_GAUGE, instrumentProperty: 'val', dataType: 'number', timeSeriesIndex: true, quantile: true, influxdbDataType: influxDBDataType.floatField },
241
- { fieldName: 'connectionCount', gauge: Gauge.CONNECTION_COUNT_GAUGE, instrumentProperty: 'val', dataType: 'number', timeSeriesIndex: true, quantile: true, influxdbDataType: influxDBDataType.intField },
242
- { fieldName: 'connectionPoolCount', gauge: Gauge.CONNECTION_POOL_TOTAL_GAUGE, instrumentProperty: 'val', dataType: 'number', influxdbDataType: influxDBDataType.intField },
243
- { fieldName: 'connectionIdleCount', gauge: Gauge.CONNECTION_POOL_IDLE_GAUGE, instrumentProperty: 'val', dataType: 'number', influxdbDataType: influxDBDataType.intField },
244
- { fieldName: 'connectionWaitingCount', gauge: Gauge.CONNECTION_POOL_WAITING_GAUGE, instrumentProperty: 'val', dataType: 'number', influxdbDataType: influxDBDataType.intField },
245
- { fieldName: 'systemcpu', gauge: Gauge.CPU_SYSTEM_LOAD_GAUGE, instrumentProperty: 'val', dataType: 'number', timeSeriesIndex: true, quantile: true, influxdbDataType: influxDBDataType.floatField },
246
- { fieldName: 'memory', gauge: Gauge.OBJECT_GAUGE, instrumentProperty: 'val', dataType: 'JSON', influxdbDataType: influxDBDataType.stringField }
247
- ],
248
- //@@ need type declare in appframework
249
- GetPathFromContext(context: IContextBase): string {
250
- //const { serviceId, serviceInstanceId, hostName, serviceInstanceProcessId,
251
- //pid, ppid, serviceName, serviceVersion } = instrumentPayload.context;
252
- const { technology, subTechnology, lambdaInstance } = context;
253
- return `/${technology}/${subTechnology}/${lambdaInstance}`;
254
- },
255
- redisQueryFilters: {
256
- level1ContextField: 'serviceType',
257
- level2ContextField: 'technology',
258
- level3ContextField: 'subTechnology'
259
- },
260
- subscriptionTopics: [
261
- {
262
- subscriptionTopic: SubscriptionTopic.AllLambdasCombined, // uicontrollerlanding
263
- route: '/metrics'
264
- },
265
- {
266
- subscriptionTopic: SubscriptionTopic.LambdaTechnologies, // uicontrollerlambda
267
- route: '/metrics/lambdas'
268
- },
269
- {
270
- subscriptionTopic: SubscriptionTopic.LambdaSubTechnologies, // uicontrollerlambdasubtechnologies
271
- route: '/metrics/lambdas/:key'
272
- },
273
- {
274
- subscriptionTopic: SubscriptionTopic.LambdaSubTechnologiesInstance, // uicontrollerlambdasubtechnologiesinstance
275
- route: '/metrics/lambdas/:key/:subkey'
276
- }
277
- ]
278
- }
279
- }
280
- }
@@ -1,52 +0,0 @@
1
- import { Gauge } from '@nsshunt/stsinstrumentation';
2
- import { SubscriptionTopic } from '@nsshunt/stssocketio-client';
3
- import { IContextBase } from '@nsshunt/stspublisherserver';
4
- export type IInstrumentHashMap = Record<string, string>;
5
- export interface IHistoField {
6
- label: string;
7
- bucketLimit: number;
8
- }
9
- export declare enum influxDBDataType {
10
- intField = "intField",
11
- floatField = "floatField",
12
- stringField = "stringField"
13
- }
14
- export interface IFieldRecord {
15
- fieldName: string;
16
- gauge: Gauge;
17
- instrumentProperty: string;
18
- dataType: string;
19
- influxdbDataType: influxDBDataType;
20
- timeSeriesIndex?: boolean;
21
- quantile?: boolean;
22
- histo?: IHistoField[];
23
- }
24
- export interface IRedisQueryFilters {
25
- level1ContextField: string;
26
- level2ContextField: string;
27
- level3ContextField: string;
28
- }
29
- export interface IRedisIndexPrefixDefinitions {
30
- timeSeriesIndex: string;
31
- timeSeriesPrefix: string;
32
- instantIndex: string;
33
- instantPrefix: string;
34
- }
35
- export interface IsubscriptionTopic {
36
- subscriptionTopic: SubscriptionTopic;
37
- route: string;
38
- }
39
- export interface IServiceDefinition {
40
- influxDBContextTags: string[];
41
- redisIndexPrefixDefinitions: IRedisIndexPrefixDefinitions;
42
- fieldList: IFieldRecord[];
43
- GetPathFromContext: (context: IContextBase) => string;
44
- redisQueryFilters: IRedisQueryFilters;
45
- subscriptionTopics: IsubscriptionTopic[];
46
- }
47
- export interface IGlobalServiceDefinitions {
48
- coreFieldList: IFieldRecord[];
49
- services: Record<string, IServiceDefinition>;
50
- }
51
- export declare const globalServiceDefinitions: IGlobalServiceDefinitions;
52
- //# sourceMappingURL=globalServiceDefinitions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"globalServiceDefinitions.d.ts","sourceRoot":"","sources":["../src/globalServiceDefinitions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAG1D,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAExD,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;CACtB;AAED,oBAAY,gBAAgB;IACxB,QAAQ,aAAa;IACrB,UAAU,eAAe;IACzB,WAAW,gBAAgB;CAC9B;AAED,MAAM,WAAW,YAAY;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,KAAK,CAAA;IACZ,kBAAkB,EAAE,MAAM,CAAA;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,WAAW,EAAE,CAAA;CACxB;AAGD,MAAM,WAAW,kBAAkB;IAC/B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,kBAAkB,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,4BAA4B;IACzC,eAAe,EAAE,MAAM,CAAA;IACvB,gBAAgB,EAAE,MAAM,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,kBAAkB;IAC/B,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IAC/B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,2BAA2B,EAAE,4BAA4B,CAAA;IACzD,SAAS,EAAE,YAAY,EAAE,CAAA;IACzB,kBAAkB,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,MAAM,CAAA;IACrD,iBAAiB,EAAE,kBAAkB,CAAA;IACrC,kBAAkB,EAAE,kBAAkB,EAAE,CAAA;CAC3C;AAED,MAAM,WAAW,yBAAyB;IACtC,aAAa,EAAE,YAAY,EAAE,CAAA;IAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAChD;AAqBD,eAAO,MAAM,wBAAwB,EAAE,yBAsMtC,CAAA"}