@10up/block-renderer-benchmark 0.1.4

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 (77) hide show
  1. package/dist/analysis/comparison.d.ts +29 -0
  2. package/dist/analysis/comparison.d.ts.map +1 -0
  3. package/dist/analysis/comparison.js +94 -0
  4. package/dist/analysis/comparison.js.map +1 -0
  5. package/dist/analysis/index.d.ts +6 -0
  6. package/dist/analysis/index.d.ts.map +1 -0
  7. package/dist/analysis/index.js +6 -0
  8. package/dist/analysis/index.js.map +1 -0
  9. package/dist/analysis/regression.d.ts +34 -0
  10. package/dist/analysis/regression.d.ts.map +1 -0
  11. package/dist/analysis/regression.js +63 -0
  12. package/dist/analysis/regression.js.map +1 -0
  13. package/dist/cli/commands/compare.d.ts +9 -0
  14. package/dist/cli/commands/compare.d.ts.map +1 -0
  15. package/dist/cli/commands/compare.js +142 -0
  16. package/dist/cli/commands/compare.js.map +1 -0
  17. package/dist/cli/commands/report.d.ts +9 -0
  18. package/dist/cli/commands/report.d.ts.map +1 -0
  19. package/dist/cli/commands/report.js +158 -0
  20. package/dist/cli/commands/report.js.map +1 -0
  21. package/dist/cli/commands/run.d.ts +9 -0
  22. package/dist/cli/commands/run.d.ts.map +1 -0
  23. package/dist/cli/commands/run.js +107 -0
  24. package/dist/cli/commands/run.js.map +1 -0
  25. package/dist/cli/index.d.ts +8 -0
  26. package/dist/cli/index.d.ts.map +1 -0
  27. package/dist/cli/index.js +165 -0
  28. package/dist/cli/index.js.map +1 -0
  29. package/dist/index.d.ts +16 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +19 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/reporters/console-reporter.d.ts +47 -0
  34. package/dist/reporters/console-reporter.d.ts.map +1 -0
  35. package/dist/reporters/console-reporter.js +191 -0
  36. package/dist/reporters/console-reporter.js.map +1 -0
  37. package/dist/reporters/index.d.ts +6 -0
  38. package/dist/reporters/index.d.ts.map +1 -0
  39. package/dist/reporters/index.js +6 -0
  40. package/dist/reporters/index.js.map +1 -0
  41. package/dist/reporters/markdown-reporter.d.ts +32 -0
  42. package/dist/reporters/markdown-reporter.d.ts.map +1 -0
  43. package/dist/reporters/markdown-reporter.js +133 -0
  44. package/dist/reporters/markdown-reporter.js.map +1 -0
  45. package/dist/runner/benchmark-runner.d.ts +37 -0
  46. package/dist/runner/benchmark-runner.d.ts.map +1 -0
  47. package/dist/runner/benchmark-runner.js +133 -0
  48. package/dist/runner/benchmark-runner.js.map +1 -0
  49. package/dist/runner/index.d.ts +6 -0
  50. package/dist/runner/index.d.ts.map +1 -0
  51. package/dist/runner/index.js +6 -0
  52. package/dist/runner/index.js.map +1 -0
  53. package/dist/runner/timing.d.ts +43 -0
  54. package/dist/runner/timing.d.ts.map +1 -0
  55. package/dist/runner/timing.js +115 -0
  56. package/dist/runner/timing.js.map +1 -0
  57. package/dist/runner/vitest-reporter.d.ts +38 -0
  58. package/dist/runner/vitest-reporter.d.ts.map +1 -0
  59. package/dist/runner/vitest-reporter.js +134 -0
  60. package/dist/runner/vitest-reporter.js.map +1 -0
  61. package/dist/storage/index.d.ts +6 -0
  62. package/dist/storage/index.d.ts.map +1 -0
  63. package/dist/storage/index.js +6 -0
  64. package/dist/storage/index.js.map +1 -0
  65. package/dist/storage/json-storage.d.ts +59 -0
  66. package/dist/storage/json-storage.d.ts.map +1 -0
  67. package/dist/storage/json-storage.js +142 -0
  68. package/dist/storage/json-storage.js.map +1 -0
  69. package/dist/storage/sqlite-storage.d.ts +72 -0
  70. package/dist/storage/sqlite-storage.d.ts.map +1 -0
  71. package/dist/storage/sqlite-storage.js +305 -0
  72. package/dist/storage/sqlite-storage.js.map +1 -0
  73. package/dist/types.d.ts +253 -0
  74. package/dist/types.d.ts.map +1 -0
  75. package/dist/types.js +21 -0
  76. package/dist/types.js.map +1 -0
  77. package/package.json +79 -0
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Vitest benchmark reporter
3
+ *
4
+ * Custom reporter that collects benchmark results from Vitest
5
+ * and stores them using the benchmark storage system.
6
+ */
7
+ import { JsonStorage } from '../storage/json-storage.js';
8
+ import { SqliteStorage } from '../storage/sqlite-storage.js';
9
+ import { ConsoleReporter } from '../reporters/console-reporter.js';
10
+ import { getEnvironmentInfo, getGitInfo, generateRunId } from './benchmark-runner.js';
11
+ /**
12
+ * Vitest benchmark reporter
13
+ */
14
+ export class VitestBenchmarkReporter {
15
+ options;
16
+ measurements = [];
17
+ startTime = '';
18
+ runId = '';
19
+ constructor(options = {}) {
20
+ this.options = {
21
+ outputToConsole: true,
22
+ ...options,
23
+ };
24
+ }
25
+ onInit() {
26
+ this.startTime = new Date().toISOString();
27
+ this.runId = generateRunId();
28
+ this.measurements = [];
29
+ }
30
+ onFinished(files, errors) {
31
+ if (errors && errors.length > 0) {
32
+ console.error('Benchmark errors:', errors);
33
+ return;
34
+ }
35
+ if (!files || files.length === 0) {
36
+ return;
37
+ }
38
+ // Extract measurements from all benchmark files
39
+ for (const file of files) {
40
+ if (file.tasks) {
41
+ for (const task of file.tasks) {
42
+ this.extractFromTask(task);
43
+ }
44
+ }
45
+ }
46
+ if (this.measurements.length === 0) {
47
+ console.log('No benchmark results found.');
48
+ return;
49
+ }
50
+ // Create run object
51
+ const run = {
52
+ id: this.runId,
53
+ startTime: this.startTime,
54
+ endTime: new Date().toISOString(),
55
+ duration: Date.now() - new Date(this.startTime).getTime(),
56
+ measurements: this.measurements,
57
+ environment: getEnvironmentInfo(),
58
+ git: getGitInfo(),
59
+ };
60
+ // Output to console if enabled
61
+ if (this.options.outputToConsole) {
62
+ const consoleReporter = new ConsoleReporter();
63
+ consoleReporter.reportRun(run);
64
+ }
65
+ // Save to SQLite if path provided
66
+ if (this.options.dbPath) {
67
+ try {
68
+ const sqliteStorage = new SqliteStorage(this.options.dbPath);
69
+ sqliteStorage.saveRun(run);
70
+ sqliteStorage.close();
71
+ console.log(`\nResults saved to database: ${this.options.dbPath}`);
72
+ }
73
+ catch (error) {
74
+ console.error('Failed to save to SQLite:', error);
75
+ }
76
+ }
77
+ // Update baseline if requested
78
+ if (this.options.updateBaseline && this.options.baselinePath) {
79
+ try {
80
+ const jsonStorage = new JsonStorage(this.options.baselinePath);
81
+ jsonStorage.updateFromRun(run);
82
+ console.log(`\nBaseline updated: ${this.options.baselinePath}`);
83
+ }
84
+ catch (error) {
85
+ console.error('Failed to update baseline:', error);
86
+ }
87
+ }
88
+ }
89
+ extractFromTask(task) {
90
+ // Check if this task has benchmark results
91
+ if (task.result?.benchmark) {
92
+ const benchmark = task.result.benchmark;
93
+ const name = task.name || 'unknown';
94
+ const [packageName, functionName] = name.includes('/')
95
+ ? name.split('/', 2)
96
+ : ['unknown', name];
97
+ const samples = benchmark.samples ?? [];
98
+ const sortedSamples = [...samples].sort((a, b) => a - b);
99
+ const median = sortedSamples[Math.floor(sortedSamples.length / 2)] ?? benchmark.mean ?? 0;
100
+ const p95 = sortedSamples[Math.floor(sortedSamples.length * 0.95)] ?? benchmark.p99 ?? 0;
101
+ this.measurements.push({
102
+ runId: this.runId,
103
+ name,
104
+ package: packageName,
105
+ function: functionName,
106
+ timing: {
107
+ mean: benchmark.mean ?? 0,
108
+ median,
109
+ min: benchmark.min ?? 0,
110
+ max: benchmark.max ?? 0,
111
+ stdDev: benchmark.sd ?? 0,
112
+ p95,
113
+ p99: benchmark.p99 ?? 0,
114
+ },
115
+ iterations: samples.length || 0,
116
+ timestamp: new Date().toISOString(),
117
+ opsPerSecond: benchmark.hz,
118
+ });
119
+ }
120
+ // Recurse into child tasks
121
+ if (task.tasks && Array.isArray(task.tasks)) {
122
+ for (const childTask of task.tasks) {
123
+ this.extractFromTask(childTask);
124
+ }
125
+ }
126
+ }
127
+ }
128
+ /**
129
+ * Create a Vitest benchmark reporter with the given options
130
+ */
131
+ export function createBenchmarkReporter(options) {
132
+ return new VitestBenchmarkReporter(options);
133
+ }
134
+ //# sourceMappingURL=vitest-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest-reporter.js","sourceRoot":"","sources":["../../src/runner/vitest-reporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Storage module exports
3
+ */
4
+ export { JsonStorage, DEFAULT_BASELINE_PATH, createJsonStorage, } from './json-storage.js';
5
+ export { SqliteStorage, DEFAULT_DB_PATH, createSqliteStorage, } from './sqlite-storage.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,aAAa,EACb,eAAe,EACf,mBAAmB,GACpB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Storage module exports
3
+ */
4
+ export { JsonStorage, DEFAULT_BASELINE_PATH, createJsonStorage, } from './json-storage.js';
5
+ export { SqliteStorage, DEFAULT_DB_PATH, createSqliteStorage, } from './sqlite-storage.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,aAAa,EACb,eAAe,EACf,mBAAmB,GACpB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * JSON file storage for benchmark baselines
3
+ *
4
+ * Stores baseline measurements in a JSON file that can be committed to git
5
+ * for version control and easy diffing.
6
+ */
7
+ import type { BaselineFile, BaselineEntry, BenchmarkMeasurement, BenchmarkRun } from '../types.js';
8
+ /**
9
+ * JSON storage for benchmark baselines
10
+ */
11
+ export declare class JsonStorage {
12
+ private filePath;
13
+ constructor(filePath: string);
14
+ /**
15
+ * Load the baseline file
16
+ */
17
+ load(): BaselineFile | null;
18
+ /**
19
+ * Save the baseline file
20
+ */
21
+ save(baseline: BaselineFile): void;
22
+ /**
23
+ * Get a specific baseline entry
24
+ */
25
+ getBaseline(name: string): BaselineEntry | null;
26
+ /**
27
+ * Update baselines from a benchmark run
28
+ */
29
+ updateFromRun(run: BenchmarkRun): void;
30
+ /**
31
+ * Update baselines from individual measurements
32
+ */
33
+ updateFromMeasurements(measurements: BenchmarkMeasurement[]): void;
34
+ /**
35
+ * Get all baseline entries
36
+ */
37
+ getAllBaselines(): Record<string, BaselineEntry>;
38
+ /**
39
+ * Check if the baseline file exists
40
+ */
41
+ exists(): boolean;
42
+ /**
43
+ * Get the file path
44
+ */
45
+ getPath(): string;
46
+ /**
47
+ * Create an empty baseline file
48
+ */
49
+ initialize(): void;
50
+ }
51
+ /**
52
+ * Default baseline file path relative to project root
53
+ */
54
+ export declare const DEFAULT_BASELINE_PATH = "benchmarks/baselines/baseline.json";
55
+ /**
56
+ * Create a JSON storage instance with the default path
57
+ */
58
+ export declare function createJsonStorage(rootDir: string): JsonStorage;
59
+ //# sourceMappingURL=json-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-storage.d.ts","sourceRoot":"","sources":["../../src/storage/json-storage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKnG;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM;IAI5B;;OAEG;IACH,IAAI,IAAI,YAAY,GAAG,IAAI;IAa3B;;OAEG;IACH,IAAI,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAQlC;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAK/C;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI;IAwBtC;;OAEG;IACH,sBAAsB,CAAC,YAAY,EAAE,oBAAoB,EAAE,GAAG,IAAI;IAwBlE;;OAEG;IACH,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IAKhD;;OAEG;IACH,MAAM,IAAI,OAAO;IAIjB;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,UAAU,IAAI,IAAI;CAWnB;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,uCAAuC,CAAC;AAE1E;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAE9D"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * JSON file storage for benchmark baselines
3
+ *
4
+ * Stores baseline measurements in a JSON file that can be committed to git
5
+ * for version control and easy diffing.
6
+ */
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import { getGitInfo } from '../runner/benchmark-runner.js';
10
+ const CURRENT_VERSION = 1;
11
+ /**
12
+ * JSON storage for benchmark baselines
13
+ */
14
+ export class JsonStorage {
15
+ filePath;
16
+ constructor(filePath) {
17
+ this.filePath = filePath;
18
+ }
19
+ /**
20
+ * Load the baseline file
21
+ */
22
+ load() {
23
+ try {
24
+ if (!fs.existsSync(this.filePath)) {
25
+ return null;
26
+ }
27
+ const content = fs.readFileSync(this.filePath, 'utf-8');
28
+ return JSON.parse(content);
29
+ }
30
+ catch (error) {
31
+ console.error(`Failed to load baseline file: ${error}`);
32
+ return null;
33
+ }
34
+ }
35
+ /**
36
+ * Save the baseline file
37
+ */
38
+ save(baseline) {
39
+ const dir = path.dirname(this.filePath);
40
+ if (!fs.existsSync(dir)) {
41
+ fs.mkdirSync(dir, { recursive: true });
42
+ }
43
+ fs.writeFileSync(this.filePath, JSON.stringify(baseline, null, 2));
44
+ }
45
+ /**
46
+ * Get a specific baseline entry
47
+ */
48
+ getBaseline(name) {
49
+ const file = this.load();
50
+ return file?.baselines[name] ?? null;
51
+ }
52
+ /**
53
+ * Update baselines from a benchmark run
54
+ */
55
+ updateFromRun(run) {
56
+ const existing = this.load();
57
+ const gitInfo = getGitInfo();
58
+ const baseline = {
59
+ version: CURRENT_VERSION,
60
+ generated: new Date().toISOString(),
61
+ commit: gitInfo?.commitHash,
62
+ branch: gitInfo?.branch,
63
+ baselines: existing?.baselines ?? {},
64
+ };
65
+ for (const measurement of run.measurements) {
66
+ baseline.baselines[measurement.name] = {
67
+ mean: measurement.timing.mean,
68
+ median: measurement.timing.median,
69
+ p95: measurement.timing.p95,
70
+ iterations: measurement.iterations,
71
+ };
72
+ }
73
+ this.save(baseline);
74
+ }
75
+ /**
76
+ * Update baselines from individual measurements
77
+ */
78
+ updateFromMeasurements(measurements) {
79
+ const existing = this.load();
80
+ const gitInfo = getGitInfo();
81
+ const baseline = {
82
+ version: CURRENT_VERSION,
83
+ generated: new Date().toISOString(),
84
+ commit: gitInfo?.commitHash,
85
+ branch: gitInfo?.branch,
86
+ baselines: existing?.baselines ?? {},
87
+ };
88
+ for (const measurement of measurements) {
89
+ baseline.baselines[measurement.name] = {
90
+ mean: measurement.timing.mean,
91
+ median: measurement.timing.median,
92
+ p95: measurement.timing.p95,
93
+ iterations: measurement.iterations,
94
+ };
95
+ }
96
+ this.save(baseline);
97
+ }
98
+ /**
99
+ * Get all baseline entries
100
+ */
101
+ getAllBaselines() {
102
+ const file = this.load();
103
+ return file?.baselines ?? {};
104
+ }
105
+ /**
106
+ * Check if the baseline file exists
107
+ */
108
+ exists() {
109
+ return fs.existsSync(this.filePath);
110
+ }
111
+ /**
112
+ * Get the file path
113
+ */
114
+ getPath() {
115
+ return this.filePath;
116
+ }
117
+ /**
118
+ * Create an empty baseline file
119
+ */
120
+ initialize() {
121
+ const gitInfo = getGitInfo();
122
+ const baseline = {
123
+ version: CURRENT_VERSION,
124
+ generated: new Date().toISOString(),
125
+ commit: gitInfo?.commitHash,
126
+ branch: gitInfo?.branch,
127
+ baselines: {},
128
+ };
129
+ this.save(baseline);
130
+ }
131
+ }
132
+ /**
133
+ * Default baseline file path relative to project root
134
+ */
135
+ export const DEFAULT_BASELINE_PATH = 'benchmarks/baselines/baseline.json';
136
+ /**
137
+ * Create a JSON storage instance with the default path
138
+ */
139
+ export function createJsonStorage(rootDir) {
140
+ return new JsonStorage(path.join(rootDir, DEFAULT_BASELINE_PATH));
141
+ }
142
+ //# sourceMappingURL=json-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-storage.js","sourceRoot":"","sources":["../../src/storage/json-storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * SQLite storage for historical benchmark data
3
+ *
4
+ * Stores all benchmark runs and measurements for trend analysis
5
+ * and historical comparisons.
6
+ */
7
+ import type { BenchmarkRun, BenchmarkMeasurement } from '../types.js';
8
+ /**
9
+ * SQLite storage for benchmark data
10
+ */
11
+ export declare class SqliteStorage {
12
+ private db;
13
+ private dbPath;
14
+ constructor(dbPath: string);
15
+ /**
16
+ * Initialize the database schema
17
+ */
18
+ private initSchema;
19
+ /**
20
+ * Save a benchmark run
21
+ */
22
+ saveRun(run: BenchmarkRun): void;
23
+ /**
24
+ * Get the latest run
25
+ */
26
+ getLatestRun(): BenchmarkRun | null;
27
+ /**
28
+ * Get a run by ID
29
+ */
30
+ getRun(id: string): BenchmarkRun | null;
31
+ /**
32
+ * Get a run by commit hash
33
+ */
34
+ getRunByCommit(commitHash: string): BenchmarkRun | null;
35
+ /**
36
+ * Get recent runs
37
+ */
38
+ getRecentRuns(limit?: number): BenchmarkRun[];
39
+ /**
40
+ * Get measurement history for a specific benchmark
41
+ */
42
+ getMeasurementHistory(name: string, limit?: number): BenchmarkMeasurement[];
43
+ /**
44
+ * Get all measurements for a run
45
+ */
46
+ private getMeasurementsForRun;
47
+ /**
48
+ * Load a run with its measurements
49
+ */
50
+ private loadRunWithMeasurements;
51
+ /**
52
+ * Convert a measurement row to a BenchmarkMeasurement
53
+ */
54
+ private rowToMeasurement;
55
+ /**
56
+ * Close the database connection
57
+ */
58
+ close(): void;
59
+ /**
60
+ * Get the database file path
61
+ */
62
+ getPath(): string;
63
+ }
64
+ /**
65
+ * Default database path relative to project root
66
+ */
67
+ export declare const DEFAULT_DB_PATH = "benchmarks/.benchmark.db";
68
+ /**
69
+ * Create a SQLite storage instance with the default path
70
+ */
71
+ export declare function createSqliteStorage(rootDir: string): SqliteStorage;
72
+ //# sourceMappingURL=sqlite-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-storage.d.ts","sourceRoot":"","sources":["../../src/storage/sqlite-storage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EAGrB,MAAM,aAAa,CAAC;AAoDrB;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAc1B;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI;IAsEhC;;OAEG;IACH,YAAY,IAAI,YAAY,GAAG,IAAI;IAWnC;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IASvC;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAYvD;;OAEG;IACH,aAAa,CAAC,KAAK,GAAE,MAAW,GAAG,YAAY,EAAE;IAUjD;;OAEG;IACH,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,oBAAoB,EAAE;IAa/E;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAQ7B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA8B/B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA6BxB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,OAAO,IAAI,MAAM;CAGlB;AA2CD;;GAEG;AACH,eAAO,MAAM,eAAe,6BAA6B,CAAC;AAE1D;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAElE"}