@omote/core 0.9.7 → 0.10.6

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 (36) hide show
  1. package/README.md +77 -35
  2. package/dist/{chunk-X5OTUOE6.mjs → chunk-3FILA2CD.mjs} +63 -205
  3. package/dist/chunk-3FILA2CD.mjs.map +1 -0
  4. package/dist/{chunk-CYBTTLG7.mjs → chunk-5WIOGMJA.mjs} +77 -219
  5. package/dist/chunk-5WIOGMJA.mjs.map +1 -0
  6. package/dist/{chunk-3NDJA3I4.mjs → chunk-NWZMIQK4.mjs} +135 -206
  7. package/dist/chunk-NWZMIQK4.mjs.map +1 -0
  8. package/dist/{chunk-Y3DTP5P3.mjs → chunk-VSYYT4HO.mjs} +1 -1
  9. package/dist/{chunk-X5OTUOE6.mjs.map → chunk-VSYYT4HO.mjs.map} +1 -1
  10. package/dist/chunk-WW4XAUJ3.mjs +208 -0
  11. package/dist/chunk-WW4XAUJ3.mjs.map +1 -0
  12. package/dist/index.d.mts +336 -1375
  13. package/dist/index.d.ts +336 -1375
  14. package/dist/index.js +6738 -11284
  15. package/dist/index.js.map +1 -1
  16. package/dist/index.mjs +6099 -10719
  17. package/dist/index.mjs.map +1 -1
  18. package/dist/logging/index.js +5 -0
  19. package/dist/logging/index.js.map +1 -1
  20. package/dist/logging/index.mjs +1 -1
  21. package/dist/otlp-2BML6FIK.mjs +7 -0
  22. package/dist/otlp-2BML6FIK.mjs.map +1 -0
  23. package/package.json +1 -2
  24. package/dist/Logger-BeUI6jG7.d.mts +0 -145
  25. package/dist/Logger-BeUI6jG7.d.ts +0 -145
  26. package/dist/Logger-DSoGAYJu.d.mts +0 -141
  27. package/dist/Logger-DSoGAYJu.d.ts +0 -141
  28. package/dist/chunk-3NDJA3I4.mjs.map +0 -1
  29. package/dist/chunk-CYBTTLG7.mjs.map +0 -1
  30. package/dist/chunk-ESU52TDS.mjs +0 -287
  31. package/dist/chunk-ESU52TDS.mjs.map +0 -1
  32. package/dist/chunk-MXKJOF4I.mjs +0 -38
  33. package/dist/chunk-MXKJOF4I.mjs.map +0 -1
  34. package/dist/chunk-XK22BRG4.mjs +0 -38
  35. package/dist/chunk-XK22BRG4.mjs.map +0 -1
  36. package/dist/chunk-Y3DTP5P3.mjs.map +0 -1
@@ -0,0 +1,208 @@
1
+ // src/telemetry/exporters/otlp.ts
2
+ var StatusCode = {
3
+ UNSET: 0,
4
+ OK: 1,
5
+ ERROR: 2
6
+ };
7
+ function toOTLPAttributeValue(value) {
8
+ if (typeof value === "string") return { stringValue: value };
9
+ if (typeof value === "number") return Number.isInteger(value) ? { intValue: value } : { doubleValue: value };
10
+ return { boolValue: value };
11
+ }
12
+ function toOTLPAttributes(attrs) {
13
+ return Object.entries(attrs).filter(([, v]) => v !== void 0).map(([key, value]) => ({ key, value: toOTLPAttributeValue(value) }));
14
+ }
15
+ function spanToOTLPSpan(span) {
16
+ return {
17
+ traceId: span.traceId,
18
+ spanId: span.spanId,
19
+ parentSpanId: span.parentSpanId || "",
20
+ name: span.name,
21
+ kind: 1,
22
+ // INTERNAL
23
+ startTimeUnixNano: String(span.epochMs * 1e6),
24
+ endTimeUnixNano: String(span.endEpochMs * 1e6),
25
+ attributes: toOTLPAttributes(span.attributes),
26
+ status: {
27
+ code: span.status === "ok" ? StatusCode.OK : StatusCode.ERROR,
28
+ message: span.error?.message || ""
29
+ }
30
+ };
31
+ }
32
+ function metricToOTLPMetric(metric) {
33
+ const attributes = toOTLPAttributes(metric.attributes);
34
+ const timeUnixNano = String(metric.timestamp * 1e6);
35
+ if (metric.type === "counter") {
36
+ return {
37
+ name: metric.name,
38
+ sum: {
39
+ dataPoints: [{
40
+ attributes,
41
+ timeUnixNano,
42
+ asInt: metric.value
43
+ }],
44
+ aggregationTemporality: 1,
45
+ // DELTA
46
+ isMonotonic: true
47
+ }
48
+ };
49
+ }
50
+ if (metric.histogramData) {
51
+ return {
52
+ name: metric.name,
53
+ histogram: {
54
+ dataPoints: [{
55
+ attributes,
56
+ timeUnixNano,
57
+ count: metric.histogramData.count,
58
+ sum: metric.histogramData.sum,
59
+ min: metric.histogramData.min,
60
+ max: metric.histogramData.max,
61
+ explicitBounds: metric.histogramData.bucketBoundaries,
62
+ bucketCounts: metric.histogramData.bucketCounts
63
+ }],
64
+ aggregationTemporality: 1
65
+ // DELTA
66
+ }
67
+ };
68
+ }
69
+ return {
70
+ name: metric.name,
71
+ gauge: {
72
+ dataPoints: [{
73
+ attributes,
74
+ timeUnixNano,
75
+ asDouble: metric.value
76
+ }]
77
+ }
78
+ };
79
+ }
80
+ var OTLPExporter = class {
81
+ constructor(config, serviceName = "omote-sdk", serviceVersion = "0.1.0") {
82
+ this.spanBuffer = [];
83
+ this.metricBuffer = [];
84
+ this.flushIntervalId = null;
85
+ this.BUFFER_SIZE = 100;
86
+ this.FLUSH_INTERVAL_MS = 5e3;
87
+ this.isShutdown = false;
88
+ const parsed = new URL(config.endpoint);
89
+ if (parsed.protocol !== "https:") {
90
+ const isLocalhost = parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1" || parsed.hostname === "[::1]";
91
+ if (!isLocalhost) {
92
+ throw new Error("OTLP endpoint must use HTTPS (or localhost for development)");
93
+ }
94
+ }
95
+ this.config = {
96
+ endpoint: config.endpoint,
97
+ timeoutMs: config.timeoutMs ?? 1e4,
98
+ headers: config.headers ? { ...config.headers } : {}
99
+ };
100
+ this.serviceName = serviceName;
101
+ this.serviceVersion = serviceVersion;
102
+ this.flushIntervalId = setInterval(() => {
103
+ this.flush().catch(console.error);
104
+ }, this.FLUSH_INTERVAL_MS);
105
+ }
106
+ exportSpan(span) {
107
+ if (this.isShutdown) return;
108
+ this.spanBuffer.push(span);
109
+ if (this.spanBuffer.length >= this.BUFFER_SIZE) {
110
+ this.flush().catch(console.error);
111
+ }
112
+ }
113
+ exportMetric(metric) {
114
+ if (this.isShutdown) return;
115
+ this.metricBuffer.push(metric);
116
+ if (this.metricBuffer.length >= this.BUFFER_SIZE) {
117
+ this.flush().catch(console.error);
118
+ }
119
+ }
120
+ async flush() {
121
+ if (this.isShutdown) return;
122
+ const spans = this.spanBuffer.splice(0);
123
+ const metrics = this.metricBuffer.splice(0);
124
+ const promises = [];
125
+ if (spans.length > 0) {
126
+ promises.push(this.exportSpans(spans));
127
+ }
128
+ if (metrics.length > 0) {
129
+ promises.push(this.exportMetrics(metrics));
130
+ }
131
+ await Promise.all(promises);
132
+ }
133
+ async shutdown() {
134
+ if (this.flushIntervalId) {
135
+ clearInterval(this.flushIntervalId);
136
+ this.flushIntervalId = null;
137
+ }
138
+ await this.flush();
139
+ this.isShutdown = true;
140
+ }
141
+ async exportSpans(spans) {
142
+ const resourceAttrs = [
143
+ { key: "service.name", value: { stringValue: this.serviceName } },
144
+ { key: "service.version", value: { stringValue: this.serviceVersion } },
145
+ { key: "telemetry.sdk.name", value: { stringValue: "omote-sdk" } },
146
+ { key: "telemetry.sdk.language", value: { stringValue: "javascript" } }
147
+ ];
148
+ const body = {
149
+ resourceSpans: [{
150
+ resource: { attributes: resourceAttrs },
151
+ scopeSpans: [{
152
+ scope: { name: "omote-sdk", version: this.serviceVersion },
153
+ spans: spans.map(spanToOTLPSpan)
154
+ }]
155
+ }]
156
+ };
157
+ const endpoint = this.config.endpoint.replace(/\/$/, "") + "/v1/traces";
158
+ await this.sendRequest(endpoint, body);
159
+ }
160
+ async exportMetrics(metrics) {
161
+ const resourceAttrs = [
162
+ { key: "service.name", value: { stringValue: this.serviceName } },
163
+ { key: "service.version", value: { stringValue: this.serviceVersion } }
164
+ ];
165
+ const body = {
166
+ resourceMetrics: [{
167
+ resource: { attributes: resourceAttrs },
168
+ scopeMetrics: [{
169
+ scope: { name: "omote-sdk", version: this.serviceVersion },
170
+ metrics: metrics.map(metricToOTLPMetric)
171
+ }]
172
+ }]
173
+ };
174
+ const endpoint = this.config.endpoint.replace(/\/$/, "") + "/v1/metrics";
175
+ await this.sendRequest(endpoint, body);
176
+ }
177
+ async sendRequest(endpoint, body) {
178
+ const controller = new AbortController();
179
+ const timeoutId = setTimeout(() => controller.abort(), this.config.timeoutMs);
180
+ try {
181
+ const response = await fetch(endpoint, {
182
+ method: "POST",
183
+ headers: {
184
+ "Content-Type": "application/json",
185
+ ...this.config.headers
186
+ },
187
+ body: JSON.stringify(body),
188
+ signal: controller.signal
189
+ });
190
+ if (!response.ok) {
191
+ console.warn(`[OTLP] Export failed: ${response.status} ${response.statusText}`);
192
+ }
193
+ } catch (error) {
194
+ if (error.name === "AbortError") {
195
+ console.warn("[OTLP] Export timed out");
196
+ } else {
197
+ console.warn("[OTLP] Export error:", error);
198
+ }
199
+ } finally {
200
+ clearTimeout(timeoutId);
201
+ }
202
+ }
203
+ };
204
+
205
+ export {
206
+ OTLPExporter
207
+ };
208
+ //# sourceMappingURL=chunk-WW4XAUJ3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/telemetry/exporters/otlp.ts"],"sourcesContent":["/**\n * OTLP Exporter\n *\n * Exports telemetry data to OTLP-compatible backends (Jaeger, Tempo, etc.)\n * using the OTLP/HTTP JSON protocol.\n *\n * @category Telemetry\n */\n\nimport type { OTLPExporterConfig } from '../types';\nimport type { SpanData, MetricData, TelemetryExporterInterface } from './console';\n\n/**\n * OTLP span status codes\n */\nconst StatusCode = {\n UNSET: 0,\n OK: 1,\n ERROR: 2,\n} as const;\n\n/**\n * Convert attribute value to OTLP format\n */\nfunction toOTLPAttributeValue(value: string | number | boolean | undefined) {\n if (typeof value === 'string') return { stringValue: value };\n if (typeof value === 'number') return Number.isInteger(value) ? { intValue: value } : { doubleValue: value };\n return { boolValue: value };\n}\n\n/**\n * Convert attributes object to OTLP attribute array\n */\nfunction toOTLPAttributes(attrs: Record<string, string | number | boolean | undefined>) {\n return Object.entries(attrs)\n .filter(([, v]) => v !== undefined)\n .map(([key, value]) => ({ key, value: toOTLPAttributeValue(value) }));\n}\n\n/**\n * Convert internal span to OTLP span format (without resource wrapper)\n */\nfunction spanToOTLPSpan(span: SpanData) {\n return {\n traceId: span.traceId,\n spanId: span.spanId,\n parentSpanId: span.parentSpanId || '',\n name: span.name,\n kind: 1, // INTERNAL\n startTimeUnixNano: String(span.epochMs * 1_000_000),\n endTimeUnixNano: String(span.endEpochMs * 1_000_000),\n attributes: toOTLPAttributes(span.attributes as Record<string, string | number | boolean | undefined>),\n status: {\n code: span.status === 'ok' ? StatusCode.OK : StatusCode.ERROR,\n message: span.error?.message || '',\n },\n };\n}\n\n/**\n * Convert internal metric to OTLP metric format (without resource wrapper)\n */\nfunction metricToOTLPMetric(metric: MetricData) {\n const attributes = toOTLPAttributes(metric.attributes);\n const timeUnixNano = String(metric.timestamp * 1_000_000);\n\n if (metric.type === 'counter') {\n return {\n name: metric.name,\n sum: {\n dataPoints: [{\n attributes,\n timeUnixNano,\n asInt: metric.value,\n }],\n aggregationTemporality: 1, // DELTA\n isMonotonic: true,\n },\n };\n }\n\n // Histogram type\n if (metric.histogramData) {\n return {\n name: metric.name,\n histogram: {\n dataPoints: [{\n attributes,\n timeUnixNano,\n count: metric.histogramData.count,\n sum: metric.histogramData.sum,\n min: metric.histogramData.min,\n max: metric.histogramData.max,\n explicitBounds: metric.histogramData.bucketBoundaries,\n bucketCounts: metric.histogramData.bucketCounts,\n }],\n aggregationTemporality: 1, // DELTA\n },\n };\n }\n\n // Fallback for histogram without bucket data\n return {\n name: metric.name,\n gauge: {\n dataPoints: [{\n attributes,\n timeUnixNano,\n asDouble: metric.value,\n }],\n },\n };\n}\n\n/**\n * OTLP exporter for production telemetry\n *\n * Sends spans and metrics to OTLP-compatible backends like:\n * - Jaeger\n * - Grafana Tempo\n * - Honeycomb\n * - Datadog\n * - AWS X-Ray (with collector)\n */\nexport class OTLPExporter implements TelemetryExporterInterface {\n private config: Required<OTLPExporterConfig>;\n private serviceName: string;\n private serviceVersion: string;\n private spanBuffer: SpanData[] = [];\n private metricBuffer: MetricData[] = [];\n private flushIntervalId: ReturnType<typeof setInterval> | null = null;\n private readonly BUFFER_SIZE = 100;\n private readonly FLUSH_INTERVAL_MS = 5000;\n private isShutdown = false;\n\n constructor(\n config: OTLPExporterConfig,\n serviceName: string = 'omote-sdk',\n serviceVersion: string = '0.1.0'\n ) {\n // Validate endpoint URL: must be HTTPS or localhost\n const parsed = new URL(config.endpoint);\n if (parsed.protocol !== 'https:') {\n const isLocalhost = parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1' || parsed.hostname === '[::1]';\n if (!isLocalhost) {\n throw new Error('OTLP endpoint must use HTTPS (or localhost for development)');\n }\n }\n this.config = {\n endpoint: config.endpoint,\n timeoutMs: config.timeoutMs ?? 10000,\n headers: config.headers ? { ...config.headers } : {},\n };\n this.serviceName = serviceName;\n this.serviceVersion = serviceVersion;\n\n // Start periodic flush\n this.flushIntervalId = setInterval(() => {\n this.flush().catch(console.error);\n }, this.FLUSH_INTERVAL_MS);\n }\n\n exportSpan(span: SpanData): void {\n if (this.isShutdown) return;\n\n this.spanBuffer.push(span);\n\n if (this.spanBuffer.length >= this.BUFFER_SIZE) {\n this.flush().catch(console.error);\n }\n }\n\n exportMetric(metric: MetricData): void {\n if (this.isShutdown) return;\n\n this.metricBuffer.push(metric);\n\n if (this.metricBuffer.length >= this.BUFFER_SIZE) {\n this.flush().catch(console.error);\n }\n }\n\n async flush(): Promise<void> {\n if (this.isShutdown) return;\n\n const spans = this.spanBuffer.splice(0);\n const metrics = this.metricBuffer.splice(0);\n\n const promises: Promise<void>[] = [];\n\n // Export spans\n if (spans.length > 0) {\n promises.push(this.exportSpans(spans));\n }\n\n // Export metrics\n if (metrics.length > 0) {\n promises.push(this.exportMetrics(metrics));\n }\n\n await Promise.all(promises);\n }\n\n async shutdown(): Promise<void> {\n if (this.flushIntervalId) {\n clearInterval(this.flushIntervalId);\n this.flushIntervalId = null;\n }\n\n // Final flush before marking shutdown\n await this.flush();\n\n this.isShutdown = true;\n }\n\n private async exportSpans(spans: SpanData[]): Promise<void> {\n // Group all spans into a single ResourceSpan\n const resourceAttrs = [\n { key: 'service.name', value: { stringValue: this.serviceName } },\n { key: 'service.version', value: { stringValue: this.serviceVersion } },\n { key: 'telemetry.sdk.name', value: { stringValue: 'omote-sdk' } },\n { key: 'telemetry.sdk.language', value: { stringValue: 'javascript' } },\n ];\n\n const body = {\n resourceSpans: [{\n resource: { attributes: resourceAttrs },\n scopeSpans: [{\n scope: { name: 'omote-sdk', version: this.serviceVersion },\n spans: spans.map(spanToOTLPSpan),\n }],\n }],\n };\n\n const endpoint = this.config.endpoint.replace(/\\/$/, '') + '/v1/traces';\n await this.sendRequest(endpoint, body);\n }\n\n private async exportMetrics(metrics: MetricData[]): Promise<void> {\n // Group all metrics into a single ResourceMetric\n const resourceAttrs = [\n { key: 'service.name', value: { stringValue: this.serviceName } },\n { key: 'service.version', value: { stringValue: this.serviceVersion } },\n ];\n\n const body = {\n resourceMetrics: [{\n resource: { attributes: resourceAttrs },\n scopeMetrics: [{\n scope: { name: 'omote-sdk', version: this.serviceVersion },\n metrics: metrics.map(metricToOTLPMetric),\n }],\n }],\n };\n\n const endpoint = this.config.endpoint.replace(/\\/$/, '') + '/v1/metrics';\n await this.sendRequest(endpoint, body);\n }\n\n private async sendRequest(endpoint: string, body: unknown): Promise<void> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeoutMs);\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n console.warn(`[OTLP] Export failed: ${response.status} ${response.statusText}`);\n }\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n console.warn('[OTLP] Export timed out');\n } else {\n console.warn('[OTLP] Export error:', error);\n }\n } finally {\n clearTimeout(timeoutId);\n }\n }\n}\n"],"mappings":";AAeA,IAAM,aAAa;AAAA,EACjB,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,OAAO;AACT;AAKA,SAAS,qBAAqB,OAA8C;AAC1E,MAAI,OAAO,UAAU,SAAU,QAAO,EAAE,aAAa,MAAM;AAC3D,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,UAAU,KAAK,IAAI,EAAE,UAAU,MAAM,IAAI,EAAE,aAAa,MAAM;AAC3G,SAAO,EAAE,WAAW,MAAM;AAC5B;AAKA,SAAS,iBAAiB,OAA8D;AACtF,SAAO,OAAO,QAAQ,KAAK,EACxB,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,MAAS,EACjC,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,EAAE,KAAK,OAAO,qBAAqB,KAAK,EAAE,EAAE;AACxE;AAKA,SAAS,eAAe,MAAgB;AACtC,SAAO;AAAA,IACL,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK;AAAA,IACb,cAAc,KAAK,gBAAgB;AAAA,IACnC,MAAM,KAAK;AAAA,IACX,MAAM;AAAA;AAAA,IACN,mBAAmB,OAAO,KAAK,UAAU,GAAS;AAAA,IAClD,iBAAiB,OAAO,KAAK,aAAa,GAAS;AAAA,IACnD,YAAY,iBAAiB,KAAK,UAAmE;AAAA,IACrG,QAAQ;AAAA,MACN,MAAM,KAAK,WAAW,OAAO,WAAW,KAAK,WAAW;AAAA,MACxD,SAAS,KAAK,OAAO,WAAW;AAAA,IAClC;AAAA,EACF;AACF;AAKA,SAAS,mBAAmB,QAAoB;AAC9C,QAAM,aAAa,iBAAiB,OAAO,UAAU;AACrD,QAAM,eAAe,OAAO,OAAO,YAAY,GAAS;AAExD,MAAI,OAAO,SAAS,WAAW;AAC7B,WAAO;AAAA,MACL,MAAM,OAAO;AAAA,MACb,KAAK;AAAA,QACH,YAAY,CAAC;AAAA,UACX;AAAA,UACA;AAAA,UACA,OAAO,OAAO;AAAA,QAChB,CAAC;AAAA,QACD,wBAAwB;AAAA;AAAA,QACxB,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAGA,MAAI,OAAO,eAAe;AACxB,WAAO;AAAA,MACL,MAAM,OAAO;AAAA,MACb,WAAW;AAAA,QACT,YAAY,CAAC;AAAA,UACX;AAAA,UACA;AAAA,UACA,OAAO,OAAO,cAAc;AAAA,UAC5B,KAAK,OAAO,cAAc;AAAA,UAC1B,KAAK,OAAO,cAAc;AAAA,UAC1B,KAAK,OAAO,cAAc;AAAA,UAC1B,gBAAgB,OAAO,cAAc;AAAA,UACrC,cAAc,OAAO,cAAc;AAAA,QACrC,CAAC;AAAA,QACD,wBAAwB;AAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,OAAO;AAAA,MACL,YAAY,CAAC;AAAA,QACX;AAAA,QACA;AAAA,QACA,UAAU,OAAO;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAYO,IAAM,eAAN,MAAyD;AAAA,EAW9D,YACE,QACA,cAAsB,aACtB,iBAAyB,SACzB;AAXF,SAAQ,aAAyB,CAAC;AAClC,SAAQ,eAA6B,CAAC;AACtC,SAAQ,kBAAyD;AACjE,SAAiB,cAAc;AAC/B,SAAiB,oBAAoB;AACrC,SAAQ,aAAa;AAQnB,UAAM,SAAS,IAAI,IAAI,OAAO,QAAQ;AACtC,QAAI,OAAO,aAAa,UAAU;AAChC,YAAM,cAAc,OAAO,aAAa,eAAe,OAAO,aAAa,eAAe,OAAO,aAAa;AAC9G,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,6DAA6D;AAAA,MAC/E;AAAA,IACF;AACA,SAAK,SAAS;AAAA,MACZ,UAAU,OAAO;AAAA,MACjB,WAAW,OAAO,aAAa;AAAA,MAC/B,SAAS,OAAO,UAAU,EAAE,GAAG,OAAO,QAAQ,IAAI,CAAC;AAAA,IACrD;AACA,SAAK,cAAc;AACnB,SAAK,iBAAiB;AAGtB,SAAK,kBAAkB,YAAY,MAAM;AACvC,WAAK,MAAM,EAAE,MAAM,QAAQ,KAAK;AAAA,IAClC,GAAG,KAAK,iBAAiB;AAAA,EAC3B;AAAA,EAEA,WAAW,MAAsB;AAC/B,QAAI,KAAK,WAAY;AAErB,SAAK,WAAW,KAAK,IAAI;AAEzB,QAAI,KAAK,WAAW,UAAU,KAAK,aAAa;AAC9C,WAAK,MAAM,EAAE,MAAM,QAAQ,KAAK;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,aAAa,QAA0B;AACrC,QAAI,KAAK,WAAY;AAErB,SAAK,aAAa,KAAK,MAAM;AAE7B,QAAI,KAAK,aAAa,UAAU,KAAK,aAAa;AAChD,WAAK,MAAM,EAAE,MAAM,QAAQ,KAAK;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,WAAY;AAErB,UAAM,QAAQ,KAAK,WAAW,OAAO,CAAC;AACtC,UAAM,UAAU,KAAK,aAAa,OAAO,CAAC;AAE1C,UAAM,WAA4B,CAAC;AAGnC,QAAI,MAAM,SAAS,GAAG;AACpB,eAAS,KAAK,KAAK,YAAY,KAAK,CAAC;AAAA,IACvC;AAGA,QAAI,QAAQ,SAAS,GAAG;AACtB,eAAS,KAAK,KAAK,cAAc,OAAO,CAAC;AAAA,IAC3C;AAEA,UAAM,QAAQ,IAAI,QAAQ;AAAA,EAC5B;AAAA,EAEA,MAAM,WAA0B;AAC9B,QAAI,KAAK,iBAAiB;AACxB,oBAAc,KAAK,eAAe;AAClC,WAAK,kBAAkB;AAAA,IACzB;AAGA,UAAM,KAAK,MAAM;AAEjB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,MAAc,YAAY,OAAkC;AAE1D,UAAM,gBAAgB;AAAA,MACpB,EAAE,KAAK,gBAAgB,OAAO,EAAE,aAAa,KAAK,YAAY,EAAE;AAAA,MAChE,EAAE,KAAK,mBAAmB,OAAO,EAAE,aAAa,KAAK,eAAe,EAAE;AAAA,MACtE,EAAE,KAAK,sBAAsB,OAAO,EAAE,aAAa,YAAY,EAAE;AAAA,MACjE,EAAE,KAAK,0BAA0B,OAAO,EAAE,aAAa,aAAa,EAAE;AAAA,IACxE;AAEA,UAAM,OAAO;AAAA,MACX,eAAe,CAAC;AAAA,QACd,UAAU,EAAE,YAAY,cAAc;AAAA,QACtC,YAAY,CAAC;AAAA,UACX,OAAO,EAAE,MAAM,aAAa,SAAS,KAAK,eAAe;AAAA,UACzD,OAAO,MAAM,IAAI,cAAc;AAAA,QACjC,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAEA,UAAM,WAAW,KAAK,OAAO,SAAS,QAAQ,OAAO,EAAE,IAAI;AAC3D,UAAM,KAAK,YAAY,UAAU,IAAI;AAAA,EACvC;AAAA,EAEA,MAAc,cAAc,SAAsC;AAEhE,UAAM,gBAAgB;AAAA,MACpB,EAAE,KAAK,gBAAgB,OAAO,EAAE,aAAa,KAAK,YAAY,EAAE;AAAA,MAChE,EAAE,KAAK,mBAAmB,OAAO,EAAE,aAAa,KAAK,eAAe,EAAE;AAAA,IACxE;AAEA,UAAM,OAAO;AAAA,MACX,iBAAiB,CAAC;AAAA,QAChB,UAAU,EAAE,YAAY,cAAc;AAAA,QACtC,cAAc,CAAC;AAAA,UACb,OAAO,EAAE,MAAM,aAAa,SAAS,KAAK,eAAe;AAAA,UACzD,SAAS,QAAQ,IAAI,kBAAkB;AAAA,QACzC,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAEA,UAAM,WAAW,KAAK,OAAO,SAAS,QAAQ,OAAO,EAAE,IAAI;AAC3D,UAAM,KAAK,YAAY,UAAU,IAAI;AAAA,EACvC;AAAA,EAEA,MAAc,YAAY,UAAkB,MAA8B;AACxE,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,OAAO,SAAS;AAE5E,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,UAAU;AAAA,QACrC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,GAAG,KAAK,OAAO;AAAA,QACjB;AAAA,QACA,MAAM,KAAK,UAAU,IAAI;AAAA,QACzB,QAAQ,WAAW;AAAA,MACrB,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,gBAAQ,KAAK,yBAAyB,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,MAChF;AAAA,IACF,SAAS,OAAO;AACd,UAAK,MAAgB,SAAS,cAAc;AAC1C,gBAAQ,KAAK,yBAAyB;AAAA,MACxC,OAAO;AACL,gBAAQ,KAAK,wBAAwB,KAAK;AAAA,MAC5C;AAAA,IACF,UAAE;AACA,mBAAa,SAAS;AAAA,IACxB;AAAA,EACF;AACF;","names":[]}