kanmi-perf-revenue 1.0.0 → 1.2.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 (94) hide show
  1. package/README.md +347 -173
  2. package/dist/empirical/ab-testing.d.ts +83 -0
  3. package/dist/empirical/ab-testing.d.ts.map +1 -0
  4. package/dist/empirical/ab-testing.js +281 -0
  5. package/dist/empirical/ab-testing.js.map +1 -0
  6. package/dist/empirical/alerting.d.ts +85 -0
  7. package/dist/empirical/alerting.d.ts.map +1 -0
  8. package/dist/empirical/alerting.js +358 -0
  9. package/dist/empirical/alerting.js.map +1 -0
  10. package/dist/empirical/attribution.d.ts +80 -0
  11. package/dist/empirical/attribution.d.ts.map +1 -0
  12. package/dist/empirical/attribution.js +305 -0
  13. package/dist/empirical/attribution.js.map +1 -0
  14. package/dist/empirical/cohort.d.ts +75 -0
  15. package/dist/empirical/cohort.d.ts.map +1 -0
  16. package/dist/empirical/cohort.js +305 -0
  17. package/dist/empirical/cohort.js.map +1 -0
  18. package/dist/empirical/conversion-curve.d.ts +7 -10
  19. package/dist/empirical/conversion-curve.d.ts.map +1 -1
  20. package/dist/empirical/conversion-curve.js +37 -4
  21. package/dist/empirical/conversion-curve.js.map +1 -1
  22. package/dist/empirical/correlation.d.ts +91 -0
  23. package/dist/empirical/correlation.d.ts.map +1 -0
  24. package/dist/empirical/correlation.js +461 -0
  25. package/dist/empirical/correlation.js.map +1 -0
  26. package/dist/empirical/data-import.d.ts +22 -0
  27. package/dist/empirical/data-import.d.ts.map +1 -1
  28. package/dist/empirical/data-import.js +44 -0
  29. package/dist/empirical/data-import.js.map +1 -1
  30. package/dist/empirical/datadog-product-analytics.d.ts +192 -0
  31. package/dist/empirical/datadog-product-analytics.d.ts.map +1 -0
  32. package/dist/empirical/datadog-product-analytics.js +632 -0
  33. package/dist/empirical/datadog-product-analytics.js.map +1 -0
  34. package/dist/empirical/datadog-session-query.d.ts +32 -0
  35. package/dist/empirical/datadog-session-query.d.ts.map +1 -1
  36. package/dist/empirical/datadog-session-query.js +238 -17
  37. package/dist/empirical/datadog-session-query.js.map +1 -1
  38. package/dist/empirical/engagement-analysis.d.ts +112 -0
  39. package/dist/empirical/engagement-analysis.d.ts.map +1 -0
  40. package/dist/empirical/engagement-analysis.js +354 -0
  41. package/dist/empirical/engagement-analysis.js.map +1 -0
  42. package/dist/empirical/export.d.ts +75 -0
  43. package/dist/empirical/export.d.ts.map +1 -0
  44. package/dist/empirical/export.js +392 -0
  45. package/dist/empirical/export.js.map +1 -0
  46. package/dist/empirical/forecasting.d.ts +80 -0
  47. package/dist/empirical/forecasting.d.ts.map +1 -0
  48. package/dist/empirical/forecasting.js +287 -0
  49. package/dist/empirical/forecasting.js.map +1 -0
  50. package/dist/empirical/funnel.d.ts +66 -0
  51. package/dist/empirical/funnel.d.ts.map +1 -0
  52. package/dist/empirical/funnel.js +293 -0
  53. package/dist/empirical/funnel.js.map +1 -0
  54. package/dist/empirical/history.d.ts +198 -0
  55. package/dist/empirical/history.d.ts.map +1 -0
  56. package/dist/empirical/history.js +396 -0
  57. package/dist/empirical/history.js.map +1 -0
  58. package/dist/empirical/index.d.ts +41 -16
  59. package/dist/empirical/index.d.ts.map +1 -1
  60. package/dist/empirical/index.js +96 -13
  61. package/dist/empirical/index.js.map +1 -1
  62. package/dist/empirical/interactions.d.ts +89 -0
  63. package/dist/empirical/interactions.d.ts.map +1 -0
  64. package/dist/empirical/interactions.js +346 -0
  65. package/dist/empirical/interactions.js.map +1 -0
  66. package/dist/empirical/opportunity-calculator.d.ts +6 -18
  67. package/dist/empirical/opportunity-calculator.d.ts.map +1 -1
  68. package/dist/empirical/opportunity-calculator.js +19 -1
  69. package/dist/empirical/opportunity-calculator.js.map +1 -1
  70. package/dist/empirical/report.d.ts +3 -11
  71. package/dist/empirical/report.d.ts.map +1 -1
  72. package/dist/empirical/report.js +11 -7
  73. package/dist/empirical/report.js.map +1 -1
  74. package/dist/empirical/roi-calculator.d.ts +104 -0
  75. package/dist/empirical/roi-calculator.d.ts.map +1 -0
  76. package/dist/empirical/roi-calculator.js +403 -0
  77. package/dist/empirical/roi-calculator.js.map +1 -0
  78. package/dist/empirical/seasonality.d.ts +80 -0
  79. package/dist/empirical/seasonality.d.ts.map +1 -0
  80. package/dist/empirical/seasonality.js +340 -0
  81. package/dist/empirical/seasonality.js.map +1 -0
  82. package/dist/empirical/segmentation.d.ts +135 -0
  83. package/dist/empirical/segmentation.d.ts.map +1 -0
  84. package/dist/empirical/segmentation.js +379 -0
  85. package/dist/empirical/segmentation.js.map +1 -0
  86. package/dist/empirical/statistics.d.ts +118 -0
  87. package/dist/empirical/statistics.d.ts.map +1 -0
  88. package/dist/empirical/statistics.js +344 -0
  89. package/dist/empirical/statistics.js.map +1 -0
  90. package/dist/empirical/sweet-spot.d.ts +81 -0
  91. package/dist/empirical/sweet-spot.d.ts.map +1 -0
  92. package/dist/empirical/sweet-spot.js +198 -0
  93. package/dist/empirical/sweet-spot.js.map +1 -0
  94. package/package.json +2 -2
@@ -0,0 +1,392 @@
1
+ /**
2
+ * Export Formats
3
+ *
4
+ * Export analysis results to various formats:
5
+ * - JSON (machine-readable)
6
+ * - CSV (spreadsheet-compatible)
7
+ * - Slack (formatted message blocks)
8
+ * - Email (HTML email template)
9
+ *
10
+ * @author Kanmi Obasa <i@kanmiobasa.com>
11
+ */
12
+ // =============================================================================
13
+ // JSON EXPORT
14
+ // =============================================================================
15
+ /**
16
+ * Export analysis to JSON.
17
+ */
18
+ export function exportToJson(result, options = {}) {
19
+ const data = {
20
+ metadata: {
21
+ clientName: options.clientName,
22
+ generatedAt: new Date().toISOString(),
23
+ period: result.metadata.period,
24
+ totalSessions: result.metadata.totalSessions,
25
+ },
26
+ summary: {
27
+ sessionsWithLcp: result.metadata.sessionsWithLcp,
28
+ conversions: result.metadata.sessionsWithConversions,
29
+ topOpportunity: result.topOpportunity,
30
+ },
31
+ opportunities: Object.entries(result.opportunities).map(([metric, opp]) => ({
32
+ metric,
33
+ priority: opp.recommendation.priority,
34
+ targetMs: opp.recommendation.target_ms,
35
+ monthlyOpportunity: opp.recommendation.monthly_opportunity,
36
+ summary: opp.recommendation.summary,
37
+ })),
38
+ curves: options.includeRawData
39
+ ? Object.entries(result.curves).map(([metric, curve]) => ({
40
+ metric,
41
+ buckets: curve.buckets,
42
+ overallCvr: curve.summary.overall_cvr,
43
+ }))
44
+ : undefined,
45
+ };
46
+ return options.format === 'pretty'
47
+ ? JSON.stringify(data, null, 2)
48
+ : JSON.stringify(data);
49
+ }
50
+ // =============================================================================
51
+ // CSV EXPORT
52
+ // =============================================================================
53
+ /**
54
+ * Export opportunities to CSV.
55
+ */
56
+ export function exportOpportunitiesToCsv(result) {
57
+ const headers = [
58
+ 'Metric',
59
+ 'Priority',
60
+ 'Target (ms)',
61
+ 'Monthly Opportunity ($)',
62
+ 'Sessions to Improve',
63
+ 'Current CVR',
64
+ 'Target CVR',
65
+ 'Summary',
66
+ ];
67
+ const rows = [headers];
68
+ for (const [metric, opp] of Object.entries(result.opportunities)) {
69
+ const scenario = opp.scenarios[0];
70
+ rows.push([
71
+ metric.toUpperCase(),
72
+ opp.recommendation.priority,
73
+ opp.recommendation.target_ms.toString(),
74
+ opp.recommendation.monthly_opportunity.toLocaleString(),
75
+ scenario?.slow_sessions?.toString() || '',
76
+ ((scenario?.slow_cvr || 0) * 100).toFixed(2) + '%',
77
+ ((scenario?.fast_cvr || 0) * 100).toFixed(2) + '%',
78
+ `"${opp.recommendation.summary}"`,
79
+ ]);
80
+ }
81
+ return rows.map(row => row.join(',')).join('\n');
82
+ }
83
+ /**
84
+ * Export curve data to CSV.
85
+ */
86
+ export function exportCurvesToCsv(result) {
87
+ const headers = [
88
+ 'Metric',
89
+ 'Bucket',
90
+ 'Min',
91
+ 'Max',
92
+ 'Sessions',
93
+ 'Conversions',
94
+ 'CVR',
95
+ 'AOV',
96
+ ];
97
+ const rows = [headers];
98
+ for (const [metric, curve] of Object.entries(result.curves)) {
99
+ for (const bucket of curve.buckets) {
100
+ rows.push([
101
+ metric.toUpperCase(),
102
+ bucket.range,
103
+ bucket.lower_ms.toString(),
104
+ bucket.upper_ms.toString(),
105
+ bucket.sessions.toString(),
106
+ bucket.conversions.toString(),
107
+ (bucket.conversion_rate * 100).toFixed(4) + '%',
108
+ '$' + bucket.aov.toFixed(2),
109
+ ]);
110
+ }
111
+ }
112
+ return rows.map(row => row.join(',')).join('\n');
113
+ }
114
+ // =============================================================================
115
+ // SLACK EXPORT
116
+ // =============================================================================
117
+ /**
118
+ * Format analysis result for Slack.
119
+ */
120
+ export function exportToSlack(result, options = {}) {
121
+ const blocks = [];
122
+ // Header
123
+ blocks.push({
124
+ type: 'header',
125
+ text: {
126
+ type: 'plain_text',
127
+ text: `📊 Performance Revenue Analysis${options.clientName ? ` - ${options.clientName}` : ''}`,
128
+ },
129
+ });
130
+ // Divider
131
+ blocks.push({ type: 'divider' });
132
+ // Summary
133
+ blocks.push({
134
+ type: 'section',
135
+ fields: [
136
+ {
137
+ type: 'mrkdwn',
138
+ text: `*Sessions Analyzed*\n${result.metadata.totalSessions.toLocaleString()}`,
139
+ },
140
+ {
141
+ type: 'mrkdwn',
142
+ text: `*Conversions*\n${result.metadata.sessionsWithConversions.toLocaleString()}`,
143
+ },
144
+ ],
145
+ });
146
+ // Top Opportunity
147
+ if (result.topOpportunity) {
148
+ blocks.push({
149
+ type: 'section',
150
+ text: {
151
+ type: 'mrkdwn',
152
+ text: `*🎯 Top Opportunity*\n${result.topOpportunity.summary}\n\n*Potential Monthly Revenue:* $${result.topOpportunity.monthlyRevenue.toLocaleString()}`,
153
+ },
154
+ });
155
+ }
156
+ // Divider
157
+ blocks.push({ type: 'divider' });
158
+ // All opportunities
159
+ blocks.push({
160
+ type: 'section',
161
+ text: {
162
+ type: 'mrkdwn',
163
+ text: '*All Opportunities*',
164
+ },
165
+ });
166
+ for (const [metric, opp] of Object.entries(result.opportunities)) {
167
+ const priority = opp.recommendation.priority;
168
+ const emoji = priority === 'high' ? '🔴' : priority === 'medium' ? '🟡' : '🟢';
169
+ blocks.push({
170
+ type: 'section',
171
+ text: {
172
+ type: 'mrkdwn',
173
+ text: `${emoji} *${metric.toUpperCase()}*: $${opp.recommendation.monthly_opportunity.toLocaleString()}/month (${priority} priority)`,
174
+ },
175
+ });
176
+ }
177
+ // Context
178
+ blocks.push({
179
+ type: 'context',
180
+ text: {
181
+ type: 'mrkdwn',
182
+ text: `Analysis period: ${result.metadata.period.start} to ${result.metadata.period.end}`,
183
+ },
184
+ });
185
+ return {
186
+ blocks,
187
+ text: `Performance Revenue Analysis: $${result.topOpportunity?.monthlyRevenue.toLocaleString() || 0} monthly opportunity`,
188
+ };
189
+ }
190
+ /**
191
+ * Format alerts for Slack.
192
+ */
193
+ export function exportAlertsToSlack(report) {
194
+ const blocks = [];
195
+ // Header
196
+ const emoji = report.summary.critical > 0 ? '🚨' :
197
+ report.summary.warning > 0 ? '⚠️' : '✅';
198
+ blocks.push({
199
+ type: 'header',
200
+ text: {
201
+ type: 'plain_text',
202
+ text: `${emoji} Performance Alert Report`,
203
+ },
204
+ });
205
+ // Summary
206
+ blocks.push({
207
+ type: 'section',
208
+ fields: [
209
+ { type: 'mrkdwn', text: `*Critical*\n${report.summary.critical}` },
210
+ { type: 'mrkdwn', text: `*Warning*\n${report.summary.warning}` },
211
+ { type: 'mrkdwn', text: `*Info*\n${report.summary.info}` },
212
+ { type: 'mrkdwn', text: `*Total*\n${report.summary.total}` },
213
+ ],
214
+ });
215
+ if (report.alerts.length > 0) {
216
+ blocks.push({ type: 'divider' });
217
+ blocks.push({
218
+ type: 'section',
219
+ text: {
220
+ type: 'mrkdwn',
221
+ text: '*Active Alerts*',
222
+ },
223
+ });
224
+ for (const alert of report.alerts.slice(0, 10)) {
225
+ const alertEmoji = alert.severity === 'critical' ? '🚨' :
226
+ alert.severity === 'warning' ? '⚠️' : 'ℹ️';
227
+ blocks.push({
228
+ type: 'section',
229
+ text: {
230
+ type: 'mrkdwn',
231
+ text: `${alertEmoji} ${alert.message}`,
232
+ },
233
+ });
234
+ }
235
+ }
236
+ return {
237
+ blocks,
238
+ text: `${emoji} Performance Alert: ${report.summary.critical} critical, ${report.summary.warning} warning`,
239
+ };
240
+ }
241
+ // =============================================================================
242
+ // EMAIL EXPORT
243
+ // =============================================================================
244
+ /**
245
+ * Generate email template from analysis.
246
+ */
247
+ export function exportToEmail(result, options = {}) {
248
+ const subject = `Performance Revenue Report${options.clientName ? ` - ${options.clientName}` : ''} | ${result.metadata.period.start} to ${result.metadata.period.end}`;
249
+ const topOpp = result.topOpportunity;
250
+ const html = `
251
+ <!DOCTYPE html>
252
+ <html>
253
+ <head>
254
+ <style>
255
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px; }
256
+ h1 { color: #1a1a2e; border-bottom: 2px solid #4a47a3; padding-bottom: 10px; }
257
+ h2 { color: #4a47a3; }
258
+ .highlight { background: #f0f0ff; padding: 15px; border-radius: 8px; margin: 15px 0; }
259
+ .opportunity { background: #e8f5e9; padding: 15px; border-radius: 8px; margin: 10px 0; border-left: 4px solid #4caf50; }
260
+ .metric { display: inline-block; margin: 10px 20px 10px 0; }
261
+ .metric-value { font-size: 24px; font-weight: bold; color: #1a1a2e; }
262
+ .metric-label { color: #666; font-size: 14px; }
263
+ table { width: 100%; border-collapse: collapse; margin: 15px 0; }
264
+ th, td { padding: 10px; text-align: left; border-bottom: 1px solid #ddd; }
265
+ th { background: #f5f5f5; }
266
+ .priority-high { color: #d32f2f; }
267
+ .priority-medium { color: #f57c00; }
268
+ .priority-low { color: #388e3c; }
269
+ .footer { margin-top: 30px; padding-top: 20px; border-top: 1px solid #ddd; color: #666; font-size: 12px; }
270
+ </style>
271
+ </head>
272
+ <body>
273
+ <h1>📊 Performance Revenue Report</h1>
274
+ ${options.clientName ? `<p><strong>Client:</strong> ${options.clientName}</p>` : ''}
275
+ <p><strong>Period:</strong> ${result.metadata.period.start} to ${result.metadata.period.end}</p>
276
+
277
+ <div class="highlight">
278
+ <div class="metric">
279
+ <div class="metric-value">${result.metadata.totalSessions.toLocaleString()}</div>
280
+ <div class="metric-label">Sessions Analyzed</div>
281
+ </div>
282
+ <div class="metric">
283
+ <div class="metric-value">${result.metadata.sessionsWithConversions.toLocaleString()}</div>
284
+ <div class="metric-label">Conversions</div>
285
+ </div>
286
+ <div class="metric">
287
+ <div class="metric-value">${((result.metadata.sessionsWithConversions / result.metadata.totalSessions) * 100).toFixed(2)}%</div>
288
+ <div class="metric-label">Conversion Rate</div>
289
+ </div>
290
+ </div>
291
+
292
+ ${topOpp ? `
293
+ <div class="opportunity">
294
+ <h2>🎯 Top Opportunity</h2>
295
+ <p><strong>${topOpp.summary}</strong></p>
296
+ <p style="font-size: 24px; margin: 10px 0;"><strong>$${topOpp.monthlyRevenue.toLocaleString()}</strong> potential monthly revenue</p>
297
+ </div>
298
+ ` : ''}
299
+
300
+ <h2>All Opportunities</h2>
301
+ <table>
302
+ <tr>
303
+ <th>Metric</th>
304
+ <th>Priority</th>
305
+ <th>Monthly Opportunity</th>
306
+ </tr>
307
+ ${Object.entries(result.opportunities).map(([metric, opp]) => `
308
+ <tr>
309
+ <td>${metric.toUpperCase()}</td>
310
+ <td class="priority-${opp.recommendation.priority}">${opp.recommendation.priority.toUpperCase()}</td>
311
+ <td><strong>$${opp.recommendation.monthly_opportunity.toLocaleString()}</strong></td>
312
+ </tr>
313
+ `).join('')}
314
+ </table>
315
+
316
+ <div class="footer">
317
+ <p>Generated by Empirical Performance Revenue Engine</p>
318
+ <p>${new Date().toISOString()}</p>
319
+ </div>
320
+ </body>
321
+ </html>
322
+ `.trim();
323
+ const text = `
324
+ Performance Revenue Report
325
+ ${options.clientName ? `Client: ${options.clientName}` : ''}
326
+ Period: ${result.metadata.period.start} to ${result.metadata.period.end}
327
+
328
+ Summary:
329
+ - Sessions Analyzed: ${result.metadata.totalSessions.toLocaleString()}
330
+ - Conversions: ${result.metadata.sessionsWithConversions.toLocaleString()}
331
+ - CVR: ${((result.metadata.sessionsWithConversions / result.metadata.totalSessions) * 100).toFixed(2)}%
332
+
333
+ ${topOpp ? `
334
+ Top Opportunity:
335
+ ${topOpp.summary}
336
+ Potential Monthly Revenue: $${topOpp.monthlyRevenue.toLocaleString()}
337
+ ` : ''}
338
+
339
+ All Opportunities:
340
+ ${Object.entries(result.opportunities).map(([metric, opp]) => `- ${metric.toUpperCase()}: $${opp.recommendation.monthly_opportunity.toLocaleString()}/month (${opp.recommendation.priority} priority)`).join('\n')}
341
+
342
+ Generated by Empirical Performance Revenue Engine
343
+ `.trim();
344
+ return {
345
+ subject,
346
+ html,
347
+ text,
348
+ };
349
+ }
350
+ // =============================================================================
351
+ // WEBHOOK EXPORT
352
+ // =============================================================================
353
+ /**
354
+ * Generate webhook payload.
355
+ */
356
+ export function exportToWebhook(result, options = {}) {
357
+ return {
358
+ event: 'performance_analysis_complete',
359
+ timestamp: new Date().toISOString(),
360
+ client: options.clientName,
361
+ period: result.metadata.period,
362
+ summary: {
363
+ totalSessions: result.metadata.totalSessions,
364
+ conversions: result.metadata.sessionsWithConversions,
365
+ cvr: result.metadata.sessionsWithConversions / result.metadata.totalSessions,
366
+ },
367
+ topOpportunity: result.topOpportunity,
368
+ opportunities: Object.entries(result.opportunities).map(([metric, opp]) => ({
369
+ metric,
370
+ priority: opp.recommendation.priority,
371
+ monthlyOpportunity: opp.recommendation.monthly_opportunity,
372
+ })),
373
+ };
374
+ }
375
+ /**
376
+ * Generate webhook payload for alerts.
377
+ */
378
+ export function exportAlertWebhook(report) {
379
+ return {
380
+ event: 'performance_alert',
381
+ timestamp: new Date().toISOString(),
382
+ summary: report.summary,
383
+ alerts: report.alerts.map(a => ({
384
+ id: a.id,
385
+ type: a.type,
386
+ severity: a.severity,
387
+ metric: a.metric,
388
+ message: a.message,
389
+ })),
390
+ };
391
+ }
392
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/empirical/export.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAiCH,gFAAgF;AAChF,cAAc;AACd,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAsB,EACtB,UAAyB,EAAE;IAE3B,MAAM,IAAI,GAAG;QACX,QAAQ,EAAE;YACR,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;YAC9B,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,aAAa;SAC7C;QACD,OAAO,EAAE;YACP,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,eAAe;YAChD,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,uBAAuB;YACpD,cAAc,EAAE,MAAM,CAAC,cAAc;SACtC;QACD,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1E,MAAM;YACN,QAAQ,EAAE,GAAG,CAAC,cAAc,CAAC,QAAQ;YACrC,QAAQ,EAAE,GAAG,CAAC,cAAc,CAAC,SAAS;YACtC,kBAAkB,EAAE,GAAG,CAAC,cAAc,CAAC,mBAAmB;YAC1D,OAAO,EAAE,GAAG,CAAC,cAAc,CAAC,OAAO;SACpC,CAAC,CAAC;QACH,MAAM,EAAE,OAAO,CAAC,cAAc;YAC5B,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtD,MAAM;gBACN,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW;aACtC,CAAC,CAAC;YACL,CAAC,CAAC,SAAS;KACd,CAAC;IAEF,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ;QAChC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAsB;IAC7D,MAAM,OAAO,GAAG;QACd,QAAQ;QACR,UAAU;QACV,aAAa;QACb,yBAAyB;QACzB,qBAAqB;QACrB,aAAa;QACb,YAAY;QACZ,SAAS;KACV,CAAC;IAEF,MAAM,IAAI,GAAe,CAAC,OAAO,CAAC,CAAC;IAEnC,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QACjE,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC;YACR,MAAM,CAAC,WAAW,EAAE;YACpB,GAAG,CAAC,cAAc,CAAC,QAAQ;YAC3B,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,QAAQ,EAAE;YACvC,GAAG,CAAC,cAAc,CAAC,mBAAmB,CAAC,cAAc,EAAE;YACvD,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE;YACzC,CAAC,CAAC,QAAQ,EAAE,QAAQ,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG;YAClD,CAAC,CAAC,QAAQ,EAAE,QAAQ,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG;YAClD,IAAI,GAAG,CAAC,cAAc,CAAC,OAAO,GAAG;SAClC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAsB;IACtD,MAAM,OAAO,GAAG;QACd,QAAQ;QACR,QAAQ;QACR,KAAK;QACL,KAAK;QACL,UAAU;QACV,aAAa;QACb,KAAK;QACL,KAAK;KACN,CAAC;IAEF,MAAM,IAAI,GAAe,CAAC,OAAO,CAAC,CAAC;IAEnC,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5D,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC;gBACR,MAAM,CAAC,WAAW,EAAE;gBACpB,MAAM,CAAC,KAAK;gBACZ,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE;gBAC1B,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE;gBAC1B,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE;gBAC1B,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE;gBAC7B,CAAC,MAAM,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG;gBAC/C,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;aAC5B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,gFAAgF;AAChF,eAAe;AACf,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAsB,EACtB,UAAyB,EAAE;IAE3B,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,SAAS;IACT,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE;YACJ,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,kCAAkC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;SAC/F;KACF,CAAC,CAAC;IAEH,UAAU;IACV,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAEjC,UAAU;IACV,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,SAAS;QACf,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,wBAAwB,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,cAAc,EAAE,EAAE;aAC/E;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,kBAAkB,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,cAAc,EAAE,EAAE;aACnF;SACF;KACF,CAAC,CAAC;IAEH,kBAAkB;IAClB,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,SAAS;YACf,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,yBAAyB,MAAM,CAAC,cAAc,CAAC,OAAO,qCAAqC,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,cAAc,EAAE,EAAE;aACzJ;SACF,CAAC,CAAC;IACL,CAAC;IAED,UAAU;IACV,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAEjC,oBAAoB;IACpB,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,qBAAqB;SAC5B;KACF,CAAC,CAAC;IAEH,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QACjE,MAAM,QAAQ,GAAG,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC;QAC7C,MAAM,KAAK,GAAG,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAE/E,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,SAAS;YACf,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,GAAG,KAAK,KAAK,MAAM,CAAC,WAAW,EAAE,OAAO,GAAG,CAAC,cAAc,CAAC,mBAAmB,CAAC,cAAc,EAAE,WAAW,QAAQ,YAAY;aACrI;SACF,CAAC,CAAC;IACL,CAAC;IAED,UAAU;IACV,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,oBAAoB,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE;SAC1F;KACF,CAAC,CAAC;IAEH,OAAO;QACL,MAAM;QACN,IAAI,EAAE,kCAAkC,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC,cAAc,EAAE,IAAI,CAAC,sBAAsB;KAC1H,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAmB;IACrD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,SAAS;IACT,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IAE1C,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE;YACJ,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,GAAG,KAAK,2BAA2B;SAC1C;KACF,CAAC,CAAC;IAEH,UAAU;IACV,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,SAAS;QACf,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE;YAClE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE;YAChE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE;YAC1D,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE;SAC7D;KACF,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAEjC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,SAAS;YACf,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,iBAAiB;aACxB;SACF,CAAC,CAAC;QAEH,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAC/C,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACvD,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAE7C,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,GAAG,UAAU,IAAI,KAAK,CAAC,OAAO,EAAE;iBACvC;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM;QACN,IAAI,EAAE,GAAG,KAAK,uBAAuB,MAAM,CAAC,OAAO,CAAC,QAAQ,cAAc,MAAM,CAAC,OAAO,CAAC,OAAO,UAAU;KAC3G,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,eAAe;AACf,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAsB,EACtB,UAAyB,EAAE;IAE3B,MAAM,OAAO,GAAG,6BAA6B,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;IAEvK,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;IAErC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;IAwBX,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,+BAA+B,OAAO,CAAC,UAAU,MAAM,CAAC,CAAC,CAAC,EAAE;gCACrD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG;;;;kCAI3D,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,cAAc,EAAE;;;;kCAI9C,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,cAAc,EAAE;;;;kCAIxD,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;;;;;IAK1H,MAAM,CAAC,CAAC,CAAC;;;iBAGI,MAAM,CAAC,OAAO;2DAC4B,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE;;GAE9F,CAAC,CAAC,CAAC,EAAE;;;;;;;;;MASF,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;;YAEtD,MAAM,CAAC,WAAW,EAAE;4BACJ,GAAG,CAAC,cAAc,CAAC,QAAQ,KAAK,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,WAAW,EAAE;qBAChF,GAAG,CAAC,cAAc,CAAC,mBAAmB,CAAC,cAAc,EAAE;;KAEvE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;;;;SAKN,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;;;;GAI9B,CAAC,IAAI,EAAE,CAAC;IAET,MAAM,IAAI,GAAG;;EAEb,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE;UACjD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG;;;uBAGhD,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,cAAc,EAAE;iBACpD,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,cAAc,EAAE;SAChE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;;EAEnG,MAAM,CAAC,CAAC,CAAC;;EAET,MAAM,CAAC,OAAO;8BACc,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE;CACnE,CAAC,CAAC,CAAC,EAAE;;;EAGJ,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,CAC3D,KAAK,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,CAAC,cAAc,CAAC,mBAAmB,CAAC,cAAc,EAAE,WAAW,GAAG,CAAC,cAAc,CAAC,QAAQ,YAAY,CACzI,CAAC,IAAI,CAAC,IAAI,CAAC;;;GAGT,CAAC,IAAI,EAAE,CAAC;IAET,OAAO;QACL,OAAO;QACP,IAAI;QACJ,IAAI;KACL,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAsB,EACtB,UAAyB,EAAE;IAE3B,OAAO;QACL,KAAK,EAAE,+BAA+B;QACtC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,MAAM,EAAE,OAAO,CAAC,UAAU;QAC1B,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;QAC9B,OAAO,EAAE;YACP,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,aAAa;YAC5C,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,uBAAuB;YACpD,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,uBAAuB,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa;SAC7E;QACD,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1E,MAAM;YACN,QAAQ,EAAE,GAAG,CAAC,cAAc,CAAC,QAAQ;YACrC,kBAAkB,EAAE,GAAG,CAAC,cAAc,CAAC,mBAAmB;SAC3D,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAmB;IACpD,OAAO;QACL,KAAK,EAAE,mBAAmB;QAC1B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9B,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,OAAO,EAAE,CAAC,CAAC,OAAO;SACnB,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Prediction & Forecasting
3
+ *
4
+ * Project future revenue based on planned performance improvements.
5
+ * Uses empirical data and improvement scenarios.
6
+ *
7
+ * @author Kanmi Obasa <i@kanmiobasa.com>
8
+ */
9
+ import type { SessionData } from './datadog-session-query.js';
10
+ import type { ConversionCurve } from './conversion-curve.js';
11
+ export interface ImprovementScenario {
12
+ /** Descriptive name */
13
+ name: string;
14
+ /** Metric to improve */
15
+ metric: 'lcp' | 'inp' | 'cls' | 'fcp' | 'ttfb';
16
+ /** Target p75 value */
17
+ targetP75: number;
18
+ /** Confidence level (0-1) */
19
+ confidence: number;
20
+ /** Expected implementation date */
21
+ implementationDate?: string;
22
+ }
23
+ export interface ForecastPeriod {
24
+ month: number;
25
+ monthName: string;
26
+ /** Baseline revenue (no improvement) */
27
+ baselineRevenue: number;
28
+ /** Forecasted revenue with improvement */
29
+ forecastedRevenue: number;
30
+ /** Additional revenue from improvement */
31
+ additionalRevenue: number;
32
+ /** Cumulative additional revenue */
33
+ cumulativeAdditional: number;
34
+ }
35
+ export interface RevenueForecast {
36
+ scenario: ImprovementScenario;
37
+ periods: ForecastPeriod[];
38
+ summary: {
39
+ /** 12-month total additional revenue */
40
+ totalAdditionalRevenue: number;
41
+ /** Average monthly lift */
42
+ avgMonthlyLift: number;
43
+ /** Revenue growth percentage */
44
+ revenueGrowthPercent: number;
45
+ };
46
+ assumptions: string[];
47
+ }
48
+ export interface MultiForecast {
49
+ forecasts: RevenueForecast[];
50
+ combined: {
51
+ periods: ForecastPeriod[];
52
+ totalAdditionalRevenue: number;
53
+ netImpact: number;
54
+ };
55
+ recommendations: string[];
56
+ }
57
+ /**
58
+ * Generate revenue forecast for a single improvement scenario.
59
+ */
60
+ export declare function forecastRevenue(scenario: ImprovementScenario, sessions: SessionData[], curve: ConversionCurve | null, config?: {
61
+ forecastMonths?: number;
62
+ seasonalityFactors?: number[];
63
+ growthRate?: number;
64
+ }): RevenueForecast;
65
+ /**
66
+ * Generate combined forecast for multiple improvements.
67
+ */
68
+ export declare function forecastMultipleImprovements(scenarios: ImprovementScenario[], sessions: SessionData[], curves: Record<string, ConversionCurve>, config?: {
69
+ forecastMonths?: number;
70
+ synergisticBonus?: number;
71
+ }): MultiForecast;
72
+ /**
73
+ * Generate markdown report for forecast.
74
+ */
75
+ export declare function generateForecastMarkdown(forecast: RevenueForecast): string;
76
+ /**
77
+ * Generate multi-scenario comparison markdown.
78
+ */
79
+ export declare function generateMultiForecastMarkdown(multiForecast: MultiForecast): string;
80
+ //# sourceMappingURL=forecasting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forecasting.d.ts","sourceRoot":"","sources":["../../src/empirical/forecasting.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAM7D,MAAM,WAAW,mBAAmB;IAClC,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAC/C,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,0CAA0C;IAC1C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,0CAA0C;IAC1C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oCAAoC;IACpC,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,OAAO,EAAE;QACP,wCAAwC;QACxC,sBAAsB,EAAE,MAAM,CAAC;QAC/B,2BAA2B;QAC3B,cAAc,EAAE,MAAM,CAAC;QACvB,gCAAgC;QAChC,oBAAoB,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,QAAQ,EAAE;QACR,OAAO,EAAE,cAAc,EAAE,CAAC;QAC1B,sBAAsB,EAAE,MAAM,CAAC;QAC/B,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAmHD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,mBAAmB,EAC7B,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,EAAE,eAAe,GAAG,IAAI,EAC7B,MAAM,GAAE;IACN,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;CAChB,GACL,eAAe,CA8DjB;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,mBAAmB,EAAE,EAChC,QAAQ,EAAE,WAAW,EAAE,EACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACvC,MAAM,GAAE;IACN,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACtB,GACL,aAAa,CAqEf;AAMD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CA0C1E;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,aAAa,EAAE,aAAa,GAAG,MAAM,CAiDlF"}