@forgecharts/sdk 1.1.28 → 1.1.30

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 (237) hide show
  1. package/dist/index.js +8100 -48
  2. package/dist/index.js.map +1 -1
  3. package/dist/internal.js +8851 -31
  4. package/dist/internal.js.map +1 -1
  5. package/dist/react/index.js +11558 -27
  6. package/dist/react/index.js.map +1 -1
  7. package/dist/react/internal.js +12147 -43
  8. package/dist/react/internal.js.map +1 -1
  9. package/package.json +1 -1
  10. package/dist/__tests__/backwardCompatibility.test.js +0 -159
  11. package/dist/__tests__/backwardCompatibility.test.js.map +0 -1
  12. package/dist/__tests__/candleInvariant.test.js +0 -415
  13. package/dist/__tests__/candleInvariant.test.js.map +0 -1
  14. package/dist/__tests__/public-api-surface.js +0 -38
  15. package/dist/__tests__/public-api-surface.js.map +0 -1
  16. package/dist/__tests__/timeframeBoundary.test.js +0 -452
  17. package/dist/__tests__/timeframeBoundary.test.js.map +0 -1
  18. package/dist/api/DrawingManager.js +0 -190
  19. package/dist/api/DrawingManager.js.map +0 -1
  20. package/dist/api/EventBus.js +0 -44
  21. package/dist/api/EventBus.js.map +0 -1
  22. package/dist/api/IndicatorDAG.js +0 -316
  23. package/dist/api/IndicatorDAG.js.map +0 -1
  24. package/dist/api/IndicatorRegistry.js +0 -39
  25. package/dist/api/IndicatorRegistry.js.map +0 -1
  26. package/dist/api/LayoutManager.js +0 -51
  27. package/dist/api/LayoutManager.js.map +0 -1
  28. package/dist/api/PaneManager.js +0 -119
  29. package/dist/api/PaneManager.js.map +0 -1
  30. package/dist/api/ReferenceAPI.js +0 -153
  31. package/dist/api/ReferenceAPI.js.map +0 -1
  32. package/dist/api/TChart.js +0 -765
  33. package/dist/api/TChart.js.map +0 -1
  34. package/dist/api/createChart.js +0 -42
  35. package/dist/api/createChart.js.map +0 -1
  36. package/dist/api/drawing tools/fib gann menu/fibRetracement.js +0 -22
  37. package/dist/api/drawing tools/fib gann menu/fibRetracement.js.map +0 -1
  38. package/dist/api/drawing tools/lines menu/crossLine.js +0 -16
  39. package/dist/api/drawing tools/lines menu/crossLine.js.map +0 -1
  40. package/dist/api/drawing tools/lines menu/disjointChannel.js +0 -59
  41. package/dist/api/drawing tools/lines menu/disjointChannel.js.map +0 -1
  42. package/dist/api/drawing tools/lines menu/extendedLine.js +0 -17
  43. package/dist/api/drawing tools/lines menu/extendedLine.js.map +0 -1
  44. package/dist/api/drawing tools/lines menu/flatTopBottom.js +0 -41
  45. package/dist/api/drawing tools/lines menu/flatTopBottom.js.map +0 -1
  46. package/dist/api/drawing tools/lines menu/horizontal.js +0 -19
  47. package/dist/api/drawing tools/lines menu/horizontal.js.map +0 -1
  48. package/dist/api/drawing tools/lines menu/horizontalRay.js +0 -20
  49. package/dist/api/drawing tools/lines menu/horizontalRay.js.map +0 -1
  50. package/dist/api/drawing tools/lines menu/infoLine.js +0 -107
  51. package/dist/api/drawing tools/lines menu/infoLine.js.map +0 -1
  52. package/dist/api/drawing tools/lines menu/insidePitchfork.js +0 -31
  53. package/dist/api/drawing tools/lines menu/insidePitchfork.js.map +0 -1
  54. package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js +0 -15
  55. package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js.map +0 -1
  56. package/dist/api/drawing tools/lines menu/parallelChannel.js +0 -43
  57. package/dist/api/drawing tools/lines menu/parallelChannel.js.map +0 -1
  58. package/dist/api/drawing tools/lines menu/pitchfork.js +0 -12
  59. package/dist/api/drawing tools/lines menu/pitchfork.js.map +0 -1
  60. package/dist/api/drawing tools/lines menu/ray.js +0 -23
  61. package/dist/api/drawing tools/lines menu/ray.js.map +0 -1
  62. package/dist/api/drawing tools/lines menu/regressionTrend.js +0 -127
  63. package/dist/api/drawing tools/lines menu/regressionTrend.js.map +0 -1
  64. package/dist/api/drawing tools/lines menu/schiffPitchfork.js +0 -15
  65. package/dist/api/drawing tools/lines menu/schiffPitchfork.js.map +0 -1
  66. package/dist/api/drawing tools/lines menu/trendAngle.js +0 -51
  67. package/dist/api/drawing tools/lines menu/trendAngle.js.map +0 -1
  68. package/dist/api/drawing tools/lines menu/trendline.js +0 -11
  69. package/dist/api/drawing tools/lines menu/trendline.js.map +0 -1
  70. package/dist/api/drawing tools/lines menu/vertical.js +0 -11
  71. package/dist/api/drawing tools/lines menu/vertical.js.map +0 -1
  72. package/dist/api/drawing tools/pointers menu/crosshair.js +0 -16
  73. package/dist/api/drawing tools/pointers menu/crosshair.js.map +0 -1
  74. package/dist/api/drawing tools/pointers menu/cursor.js +0 -15
  75. package/dist/api/drawing tools/pointers menu/cursor.js.map +0 -1
  76. package/dist/api/drawing tools/pointers menu/demonstration.js +0 -30
  77. package/dist/api/drawing tools/pointers menu/demonstration.js.map +0 -1
  78. package/dist/api/drawing tools/pointers menu/dot.js +0 -23
  79. package/dist/api/drawing tools/pointers menu/dot.js.map +0 -1
  80. package/dist/api/drawing tools/shapes menu/rectangle.js +0 -19
  81. package/dist/api/drawing tools/shapes menu/rectangle.js.map +0 -1
  82. package/dist/api/drawing tools/shapes menu/text.js +0 -25
  83. package/dist/api/drawing tools/shapes menu/text.js.map +0 -1
  84. package/dist/api/drawingUtils.js +0 -83
  85. package/dist/api/drawingUtils.js.map +0 -1
  86. package/dist/core/CanvasLayer.js +0 -56
  87. package/dist/core/CanvasLayer.js.map +0 -1
  88. package/dist/core/Chart.js +0 -839
  89. package/dist/core/Chart.js.map +0 -1
  90. package/dist/core/CoordTransform.js +0 -224
  91. package/dist/core/CoordTransform.js.map +0 -1
  92. package/dist/core/Crosshair.js +0 -186
  93. package/dist/core/Crosshair.js.map +0 -1
  94. package/dist/core/IndicatorEngine.js +0 -181
  95. package/dist/core/IndicatorEngine.js.map +0 -1
  96. package/dist/core/InteractionManager.js +0 -698
  97. package/dist/core/InteractionManager.js.map +0 -1
  98. package/dist/core/PriceScale.js +0 -113
  99. package/dist/core/PriceScale.js.map +0 -1
  100. package/dist/core/Series.js +0 -114
  101. package/dist/core/Series.js.map +0 -1
  102. package/dist/core/TimeScale.js +0 -150
  103. package/dist/core/TimeScale.js.map +0 -1
  104. package/dist/datafeed/DatafeedConnector.js +0 -268
  105. package/dist/datafeed/DatafeedConnector.js.map +0 -1
  106. package/dist/engine/CandleEngine.js +0 -318
  107. package/dist/engine/CandleEngine.js.map +0 -1
  108. package/dist/engine/__tests__/CandleEngine.test.js +0 -300
  109. package/dist/engine/__tests__/CandleEngine.test.js.map +0 -1
  110. package/dist/engine/candleInvariants.js +0 -134
  111. package/dist/engine/candleInvariants.js.map +0 -1
  112. package/dist/engine/mergeUtils.js +0 -64
  113. package/dist/engine/mergeUtils.js.map +0 -1
  114. package/dist/engine/timeframeUtils.js +0 -100
  115. package/dist/engine/timeframeUtils.js.map +0 -1
  116. package/dist/licensing/ChartRuntimeResolver.js +0 -310
  117. package/dist/licensing/ChartRuntimeResolver.js.map +0 -1
  118. package/dist/licensing/LicenseManager.js +0 -114
  119. package/dist/licensing/LicenseManager.js.map +0 -1
  120. package/dist/licensing/__tests__/ChartRuntimeResolver.test.js +0 -177
  121. package/dist/licensing/__tests__/ChartRuntimeResolver.test.js.map +0 -1
  122. package/dist/licensing/__tests__/LicenseManager.test.js +0 -153
  123. package/dist/licensing/__tests__/LicenseManager.test.js.map +0 -1
  124. package/dist/licensing/licenseTypes.js +0 -2
  125. package/dist/licensing/licenseTypes.js.map +0 -1
  126. package/dist/pine/PineCompiler.js +0 -44
  127. package/dist/pine/PineCompiler.js.map +0 -1
  128. package/dist/pine/diagnostics.js +0 -11
  129. package/dist/pine/diagnostics.js.map +0 -1
  130. package/dist/pine/index.js +0 -5
  131. package/dist/pine/index.js.map +0 -1
  132. package/dist/pine/pine-ast.js +0 -19
  133. package/dist/pine/pine-ast.js.map +0 -1
  134. package/dist/pine/pine-lexer.js +0 -249
  135. package/dist/pine/pine-lexer.js.map +0 -1
  136. package/dist/pine/pine-parser.js +0 -416
  137. package/dist/pine/pine-parser.js.map +0 -1
  138. package/dist/pine/pine-transpiler.js +0 -260
  139. package/dist/pine/pine-transpiler.js.map +0 -1
  140. package/dist/pixi/LayerName.js +0 -35
  141. package/dist/pixi/LayerName.js.map +0 -1
  142. package/dist/pixi/PixiCandlestickRenderer.js +0 -107
  143. package/dist/pixi/PixiCandlestickRenderer.js.map +0 -1
  144. package/dist/pixi/PixiChart.js +0 -367
  145. package/dist/pixi/PixiChart.js.map +0 -1
  146. package/dist/pixi/PixiCrosshairRenderer.js +0 -110
  147. package/dist/pixi/PixiCrosshairRenderer.js.map +0 -1
  148. package/dist/pixi/PixiDrawingRenderer.js +0 -111
  149. package/dist/pixi/PixiDrawingRenderer.js.map +0 -1
  150. package/dist/pixi/PixiGridRenderer.js +0 -114
  151. package/dist/pixi/PixiGridRenderer.js.map +0 -1
  152. package/dist/pixi/PixiLayerManager.js +0 -92
  153. package/dist/pixi/PixiLayerManager.js.map +0 -1
  154. package/dist/react/canvas/ChartCanvas.js +0 -604
  155. package/dist/react/canvas/ChartCanvas.js.map +0 -1
  156. package/dist/react/canvas/ChartContextMenu.js +0 -5
  157. package/dist/react/canvas/ChartContextMenu.js.map +0 -1
  158. package/dist/react/canvas/ChartSettingsDialog.js +0 -28
  159. package/dist/react/canvas/ChartSettingsDialog.js.map +0 -1
  160. package/dist/react/canvas/IndicatorLabel.js +0 -196
  161. package/dist/react/canvas/IndicatorLabel.js.map +0 -1
  162. package/dist/react/canvas/IndicatorPane.js +0 -395
  163. package/dist/react/canvas/IndicatorPane.js.map +0 -1
  164. package/dist/react/canvas/PointerOverlay.js +0 -61
  165. package/dist/react/canvas/PointerOverlay.js.map +0 -1
  166. package/dist/react/canvas/toolbars/LeftToolbar.js +0 -407
  167. package/dist/react/canvas/toolbars/LeftToolbar.js.map +0 -1
  168. package/dist/react/hooks/useChartCapabilities.js +0 -66
  169. package/dist/react/hooks/useChartCapabilities.js.map +0 -1
  170. package/dist/react/shell/ManagedAppShell.js +0 -440
  171. package/dist/react/shell/ManagedAppShell.js.map +0 -1
  172. package/dist/react/trading/TradingBridge.js +0 -73
  173. package/dist/react/trading/TradingBridge.js.map +0 -1
  174. package/dist/react/workspace/ChartWorkspace.js +0 -42
  175. package/dist/react/workspace/ChartWorkspace.js.map +0 -1
  176. package/dist/react/workspace/FloatingPanel.js +0 -82
  177. package/dist/react/workspace/FloatingPanel.js.map +0 -1
  178. package/dist/react/workspace/IndicatorsDialog.js +0 -121
  179. package/dist/react/workspace/IndicatorsDialog.js.map +0 -1
  180. package/dist/react/workspace/LayoutMenu.js +0 -113
  181. package/dist/react/workspace/LayoutMenu.js.map +0 -1
  182. package/dist/react/workspace/SymbolSearchDialog.js +0 -245
  183. package/dist/react/workspace/SymbolSearchDialog.js.map +0 -1
  184. package/dist/react/workspace/TabBar.js +0 -29
  185. package/dist/react/workspace/TabBar.js.map +0 -1
  186. package/dist/react/workspace/toolbars/BottomToolbar.js +0 -236
  187. package/dist/react/workspace/toolbars/BottomToolbar.js.map +0 -1
  188. package/dist/react/workspace/toolbars/RightToolbar.js +0 -18
  189. package/dist/react/workspace/toolbars/RightToolbar.js.map +0 -1
  190. package/dist/react/workspace/toolbars/TopToolbar.js +0 -82
  191. package/dist/react/workspace/toolbars/TopToolbar.js.map +0 -1
  192. package/dist/renderers/CandlestickRenderer.js +0 -98
  193. package/dist/renderers/CandlestickRenderer.js.map +0 -1
  194. package/dist/renderers/HistogramRenderer.js +0 -50
  195. package/dist/renderers/HistogramRenderer.js.map +0 -1
  196. package/dist/renderers/LineRenderer.js +0 -64
  197. package/dist/renderers/LineRenderer.js.map +0 -1
  198. package/dist/theme/colors.js +0 -19
  199. package/dist/theme/colors.js.map +0 -1
  200. package/dist/tools/barDivergenceCheck.js +0 -200
  201. package/dist/tools/barDivergenceCheck.js.map +0 -1
  202. package/dist/trading/TradingOverlayStore.js +0 -139
  203. package/dist/trading/TradingOverlayStore.js.map +0 -1
  204. package/dist/trading/UnmanagedIngestion.js +0 -114
  205. package/dist/trading/UnmanagedIngestion.js.map +0 -1
  206. package/dist/trading/__tests__/ManagedTradingController.test.js +0 -271
  207. package/dist/trading/__tests__/ManagedTradingController.test.js.map +0 -1
  208. package/dist/trading/__tests__/TradingOverlayStore.test.js +0 -267
  209. package/dist/trading/__tests__/TradingOverlayStore.test.js.map +0 -1
  210. package/dist/trading/__tests__/UnmanagedIngestion.test.js +0 -170
  211. package/dist/trading/__tests__/UnmanagedIngestion.test.js.map +0 -1
  212. package/dist/trading/managed/ManagedTradingController.js +0 -247
  213. package/dist/trading/managed/ManagedTradingController.js.map +0 -1
  214. package/dist/trading/managed/managedCapabilities.js +0 -79
  215. package/dist/trading/managed/managedCapabilities.js.map +0 -1
  216. package/dist/trading/managed/managedTypes.js +0 -13
  217. package/dist/trading/managed/managedTypes.js.map +0 -1
  218. package/dist/trading/tradingTypes.js +0 -8
  219. package/dist/trading/tradingTypes.js.map +0 -1
  220. package/dist/tscript/TScriptIndicator.js +0 -47
  221. package/dist/tscript/TScriptIndicator.js.map +0 -1
  222. package/dist/tscript/ast.js +0 -22
  223. package/dist/tscript/ast.js.map +0 -1
  224. package/dist/tscript/lexer.js +0 -187
  225. package/dist/tscript/lexer.js.map +0 -1
  226. package/dist/tscript/parser.js +0 -318
  227. package/dist/tscript/parser.js.map +0 -1
  228. package/dist/tscript/runtime.js +0 -475
  229. package/dist/tscript/runtime.js.map +0 -1
  230. package/dist/tscript/series.js +0 -79
  231. package/dist/tscript/series.js.map +0 -1
  232. package/dist/types/IChart.js +0 -2
  233. package/dist/types/IChart.js.map +0 -1
  234. package/dist/types/IRenderer.js +0 -2
  235. package/dist/types/IRenderer.js.map +0 -1
  236. package/dist/types/ISeries.js +0 -2
  237. package/dist/types/ISeries.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forgecharts/sdk",
3
- "version": "1.1.28",
3
+ "version": "1.1.30",
4
4
  "description": "ForgeCharts SDK — canvas-based charting engine, no third-party chart libraries",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,159 +0,0 @@
1
- /**
2
- * Backward compatibility — unit tests
3
- *
4
- * Verifies that the introduction of licensing, unmanaged mode, and managed
5
- * foundations does NOT break the existing SDK contract:
6
- *
7
- * 1. All expected exports exist and have the correct shape/type
8
- * 2. CandleEngine works unchanged (no side-effects from new code)
9
- * 3. Default mode is unmanaged (safe default — nothing breaks by default)
10
- * 4. The RapidAPI datafeed path is unaffected (DatafeedConnector still exports)
11
- * 5. New modules export correctly from the package root (index.ts)
12
- */
13
- import { describe, it, expect, beforeEach } from 'vitest';
14
- import { LicenseManager } from '../licensing/LicenseManager';
15
- import { CandleEngine } from '../engine/CandleEngine';
16
- // ─── License cleanup ──────────────────────────────────────────────────────────
17
- beforeEach(() => {
18
- LicenseManager.getInstance().clear();
19
- });
20
- // ─── Existing exports remain intact ──────────────────────────────────────────
21
- describe('Backward compatibility — SDK exports', () => {
22
- it('CandleEngine is exported', async () => {
23
- const mod = await import('../engine/CandleEngine');
24
- expect(mod.CandleEngine).toBeDefined();
25
- expect(typeof mod.CandleEngine).toBe('function');
26
- });
27
- it('timeframeToMs and getBucketStart are exported', async () => {
28
- const mod = await import('../engine/timeframeUtils');
29
- expect(typeof mod.timeframeToMs).toBe('function');
30
- expect(typeof mod.getBucketStart).toBe('function');
31
- });
32
- it('LicenseManager is exported', async () => {
33
- const mod = await import('../licensing/LicenseManager');
34
- expect(mod.LicenseManager).toBeDefined();
35
- });
36
- it('ChartRuntimeResolver is exported', async () => {
37
- const mod = await import('../licensing/ChartRuntimeResolver');
38
- expect(mod.ChartRuntimeResolver).toBeDefined();
39
- expect(typeof mod.isManagedMode).toBe('function');
40
- expect(typeof mod.isUnmanagedMode).toBe('function');
41
- expect(typeof mod.canRenderOrderEntry).toBe('function');
42
- expect(typeof mod.canRenderManagedTradingControls).toBe('function');
43
- expect(typeof mod.canRenderExternalOverlayOnlyMode).toBe('function');
44
- });
45
- it('TradingOverlayStore is exported', async () => {
46
- const mod = await import('../trading/TradingOverlayStore');
47
- expect(mod.TradingOverlayStore).toBeDefined();
48
- expect(typeof mod.TradingOverlayStore).toBe('function');
49
- });
50
- it('UnmanagedIngestion is exported', async () => {
51
- const mod = await import('../trading/UnmanagedIngestion');
52
- expect(mod.UnmanagedIngestion).toBeDefined();
53
- expect(typeof mod.UnmanagedIngestion).toBe('function');
54
- });
55
- it('ManagedTradingController is exported', async () => {
56
- const mod = await import('../trading/managed/ManagedTradingController');
57
- expect(mod.ManagedTradingController).toBeDefined();
58
- expect(typeof mod.ManagedTradingController).toBe('function');
59
- });
60
- it('DatafeedConnector is exported (default RapidAPI path intact)', async () => {
61
- const mod = await import('../datafeed/DatafeedConnector');
62
- expect(mod.DatafeedConnector).toBeDefined();
63
- expect(typeof mod.DatafeedConnector).toBe('function');
64
- });
65
- });
66
- // ─── CandleEngine unchanged ───────────────────────────────────────────────────
67
- describe('Backward compatibility — CandleEngine still works with no license', () => {
68
- // T0 = 2024-07-03T10:00:00Z in seconds
69
- const T0 = 1_719_997_200;
70
- const T1 = T0 + 60;
71
- function raw(time, close) {
72
- return { time, open: 100, high: close + 5, low: close - 5, close, volume: 1 };
73
- }
74
- it('can be instantiated and used without any license', () => {
75
- const engine = new CandleEngine();
76
- expect(() => engine.initialize([], '1m')).not.toThrow();
77
- });
78
- it('basic OHLCV update works — no licensing side-effects', () => {
79
- const engine = new CandleEngine();
80
- engine.initialize([], '1m');
81
- engine.applyLiveUpdate(raw(T0, 100));
82
- engine.applyLiveUpdate(raw(T0, 105));
83
- engine.applyLiveUpdate(raw(T1, 110));
84
- expect(engine.getBars()).toHaveLength(2);
85
- expect(engine.getBars()[0].close).toBe(105);
86
- expect(engine.getBars()[1].close).toBe(110);
87
- });
88
- it('initialize() resets state completely', () => {
89
- const engine = new CandleEngine();
90
- engine.initialize([], '1m');
91
- engine.applyLiveUpdate(raw(T0, 100));
92
- engine.initialize([], '5m');
93
- expect(engine.getBars()).toHaveLength(0);
94
- });
95
- });
96
- // ─── Default license mode — safe unmanaged defaults ──────────────────────────
97
- describe('Backward compatibility — default mode is unmanaged', () => {
98
- it('LicenseManager.getMode() returns unmanaged with no license', () => {
99
- const lm = LicenseManager.getInstance();
100
- expect(lm.getMode()).toBe('unmanaged');
101
- expect(lm.getLicense()).toBeNull();
102
- });
103
- it('isUnmanagedMode() is true with no license', async () => {
104
- const { isUnmanagedMode } = await import('../licensing/ChartRuntimeResolver');
105
- expect(isUnmanagedMode()).toBe(true);
106
- });
107
- it('isManagedMode() is false with no license', async () => {
108
- const { isManagedMode } = await import('../licensing/ChartRuntimeResolver');
109
- expect(isManagedMode()).toBe(false);
110
- });
111
- it('canRenderCandles() is true with no license', async () => {
112
- const { canRenderCandles } = await import('../licensing/ChartRuntimeResolver');
113
- expect(canRenderCandles()).toBe(true);
114
- });
115
- it('canRenderorderEntry() is false with no license', async () => {
116
- const { canRenderOrderEntry } = await import('../licensing/ChartRuntimeResolver');
117
- expect(canRenderOrderEntry()).toBe(false);
118
- });
119
- it('canRenderManagedTradingControls() is false with no license', async () => {
120
- const { canRenderManagedTradingControls } = await import('../licensing/ChartRuntimeResolver');
121
- expect(canRenderManagedTradingControls()).toBe(false);
122
- });
123
- });
124
- // ─── Unmanaged ingestion is additive — does not replace the existing datafeed ─
125
- describe('Backward compatibility — unmanaged ingestion is opt-in and additive', () => {
126
- it('UnmanagedIngestion can be instantiated without affecting CandleEngine state', async () => {
127
- const standaloneEngine = new CandleEngine();
128
- standaloneEngine.initialize([], '1m');
129
- // Creating an UnmanagedIngestion constructs its OWN internal CandleEngine
130
- const { UnmanagedIngestion } = await import('../trading/UnmanagedIngestion');
131
- const ing = new UnmanagedIngestion('1m');
132
- // The standalone engine is still clean
133
- expect(standaloneEngine.getBars()).toHaveLength(0);
134
- // The ingestion engine also starts empty
135
- expect(ing.getBars()).toHaveLength(0);
136
- });
137
- it('DatafeedConnector can still be constructed independently', async () => {
138
- const { DatafeedConnector } = await import('../datafeed/DatafeedConnector');
139
- const mockDatafeed = {
140
- getHistoricalBars: () => Promise.resolve({ bars: [], noData: true }),
141
- subscribeBars: () => { },
142
- unsubscribeBars: () => { },
143
- };
144
- const mockSeries = {
145
- setData: () => { },
146
- update: () => { },
147
- data: () => [],
148
- applyOptions: () => { },
149
- options: () => ({}),
150
- };
151
- const mockCallbacks = {
152
- onLoading: () => { },
153
- onLoaded: () => { },
154
- onError: () => { },
155
- };
156
- expect(() => new DatafeedConnector(mockDatafeed, mockSeries, mockCallbacks)).not.toThrow();
157
- });
158
- });
159
- //# sourceMappingURL=backwardCompatibility.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"backwardCompatibility.test.js","sourceRoot":"","sources":["../../src/__tests__/backwardCompatibility.test.ts"],"names":[],"mappings":"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"}
@@ -1,415 +0,0 @@
1
- /**
2
- * Candle Invariant Tests
3
- *
4
- * Verifies that the invariant guards in `candleInvariants.ts` fire correctly,
5
- * and that `CandleEngine.applyLiveUpdate` maintains all invariants during
6
- * normal operation (no warnings) and surfaces violations during abnormal
7
- * conditions (mocked guard paths).
8
- *
9
- * Test categories:
10
- * 1. assertOhlcRelationships — each OHLC violation is detected independently
11
- * 2. assertBucketAlignment — misaligned timestamps are caught
12
- * 3. assertNotFinalized — mutating a closed bar triggers the guard
13
- * 4. assertOpenImmutability — open-price overwrite is detected
14
- * 5. assertNoDuplicateAppend — same-bucket spurious append is detected
15
- * 6. assertFinalizedUnchanged — new-bucket finalisation is verified
16
- * 7. CandleEngine integration — no spurious warnings during correct operation
17
- * 8. barDivergenceCheck — compareSources and formatReport
18
- */
19
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
20
- import { assertOhlcRelationships, assertBucketAlignment, assertNotFinalized, assertOpenImmutability, assertNoDuplicateAppend, assertFinalizedUnchanged, _setReporter, _resetReporter, } from '../engine/candleInvariants';
21
- import { CandleEngine } from '../engine/CandleEngine';
22
- import { compareSources, checkAllSources, formatReport, } from '../tools/barDivergenceCheck';
23
- // ─── Reporter harness ─────────────────────────────────────────────────────────
24
- /**
25
- * During tests we capture invariant violation messages instead of printing
26
- * them to console. This lets us assert on the exact message content.
27
- */
28
- let violations = [];
29
- beforeEach(() => {
30
- violations = [];
31
- _setReporter((msg) => violations.push(msg));
32
- });
33
- afterEach(() => {
34
- _resetReporter();
35
- });
36
- // ─── Fixtures ─────────────────────────────────────────────────────────────────
37
- /** Build a valid, closed CandleBar. */
38
- function validBar(overrides = {}) {
39
- return {
40
- timeMs: 60_000,
41
- time: 60,
42
- open: 100,
43
- high: 110,
44
- low: 90,
45
- close: 105,
46
- volume: 1,
47
- isClosed: true,
48
- ...overrides,
49
- };
50
- }
51
- /** Unix seconds helper. */
52
- const sec = (iso) => new Date(iso).getTime() / 1000;
53
- /** Build a minimal RawOHLCV tick for the engine. */
54
- function tick(timeSec, open = 100, high = 110, low = 90, close = 105, volume = 1) {
55
- return { time: timeSec, open, high, low, close, volume };
56
- }
57
- // ─── 1. assertOhlcRelationships ───────────────────────────────────────────────
58
- describe('assertOhlcRelationships', () => {
59
- it('passes for a valid OHLC bar with no violations', () => {
60
- assertOhlcRelationships(validBar(), 'test');
61
- expect(violations).toHaveLength(0);
62
- });
63
- it('detects high < open', () => {
64
- assertOhlcRelationships(validBar({ open: 120, high: 110 }), 'ctx');
65
- expect(violations.some(v => v.includes('high') && v.includes('open'))).toBe(true);
66
- });
67
- it('detects high < close', () => {
68
- assertOhlcRelationships(validBar({ close: 120, high: 110 }), 'ctx');
69
- expect(violations.some(v => v.includes('high') && v.includes('close'))).toBe(true);
70
- });
71
- it('detects high < low', () => {
72
- assertOhlcRelationships(validBar({ high: 80, low: 90 }), 'ctx');
73
- expect(violations.some(v => v.includes('high') && v.includes('low'))).toBe(true);
74
- });
75
- it('detects low > open', () => {
76
- assertOhlcRelationships(validBar({ open: 80, low: 90 }), 'ctx');
77
- expect(violations.some(v => v.includes('low') && v.includes('open'))).toBe(true);
78
- });
79
- it('detects low > close', () => {
80
- assertOhlcRelationships(validBar({ close: 80, low: 90 }), 'ctx');
81
- expect(violations.some(v => v.includes('low') && v.includes('close'))).toBe(true);
82
- });
83
- it('open === high === low === close is valid (doji candle)', () => {
84
- assertOhlcRelationships(validBar({ open: 100, high: 100, low: 100, close: 100 }), 'ctx');
85
- expect(violations).toHaveLength(0);
86
- });
87
- it('includes context and timeMs in violation message', () => {
88
- assertOhlcRelationships(validBar({ open: 120, high: 110, timeMs: 99_000 }), 'myCtx');
89
- expect(violations[0]).toContain('[CANDLE_INVARIANT]');
90
- expect(violations[0]).toContain('myCtx');
91
- expect(violations[0]).toContain('99000');
92
- });
93
- });
94
- // ─── 2. assertBucketAlignment ─────────────────────────────────────────────────
95
- describe('assertBucketAlignment', () => {
96
- it('passes when timeMs is exactly on the 1m boundary', () => {
97
- // 60_000 ms = exactly 1 minute from epoch — valid 1m bucket start
98
- assertBucketAlignment(validBar({ timeMs: 60_000, time: 60 }), '1m', 'test');
99
- expect(violations).toHaveLength(0);
100
- });
101
- it('detects timeMs not on a 1m boundary', () => {
102
- // 62_500 ms is NOT on a 60_000-ms boundary
103
- assertBucketAlignment(validBar({ timeMs: 62_500, time: 62 }), '1m', 'test');
104
- expect(violations.length).toBeGreaterThan(0);
105
- expect(violations[0]).toContain('timeMs');
106
- });
107
- it('passes for 1h boundary', () => {
108
- const hourStart = new Date('2025-03-09T14:00:00Z').getTime();
109
- assertBucketAlignment(validBar({ timeMs: hourStart, time: hourStart / 1000 }), '1h', 'test');
110
- expect(violations).toHaveLength(0);
111
- });
112
- it('detects misaligned 1h timestamp (30 min off)', () => {
113
- const thirtyMin = new Date('2025-03-09T14:30:00Z').getTime();
114
- assertBucketAlignment(validBar({ timeMs: thirtyMin, time: thirtyMin / 1000 }), '1h', 'test');
115
- expect(violations.length).toBeGreaterThan(0);
116
- });
117
- it('passes for a Monday 00:00 UTC timestamp with 1w', () => {
118
- const monday = new Date('2025-03-03T00:00:00Z').getTime();
119
- assertBucketAlignment(validBar({ timeMs: monday, time: monday / 1000 }), '1w', 'test');
120
- expect(violations).toHaveLength(0);
121
- });
122
- it('detects misaligned 1w timestamp (mid-week)', () => {
123
- const wednesday = new Date('2025-03-05T12:00:00Z').getTime();
124
- assertBucketAlignment(validBar({ timeMs: wednesday, time: wednesday / 1000 }), '1w', 'test');
125
- expect(violations.length).toBeGreaterThan(0);
126
- });
127
- it('passes for first-of-month timestamp with 1M', () => {
128
- const monthStart = new Date('2025-03-01T00:00:00Z').getTime();
129
- assertBucketAlignment(validBar({ timeMs: monthStart, time: monthStart / 1000 }), '1M', 'test');
130
- expect(violations).toHaveLength(0);
131
- });
132
- it('detects mid-month timestamp with 1M', () => {
133
- const midMonth = new Date('2025-03-15T00:00:00Z').getTime();
134
- assertBucketAlignment(validBar({ timeMs: midMonth, time: midMonth / 1000 }), '1M', 'test');
135
- expect(violations.length).toBeGreaterThan(0);
136
- });
137
- });
138
- // ─── 3. assertNotFinalized ────────────────────────────────────────────────────
139
- describe('assertNotFinalized', () => {
140
- it('passes for an open (live) candle', () => {
141
- assertNotFinalized(validBar({ isClosed: false }), 'test');
142
- expect(violations).toHaveLength(0);
143
- });
144
- it('fires for a closed candle', () => {
145
- assertNotFinalized(validBar({ isClosed: true }), 'test');
146
- expect(violations.length).toBeGreaterThan(0);
147
- expect(violations[0]).toContain('finalized');
148
- });
149
- it('violation message contains context and timeMs', () => {
150
- assertNotFinalized(validBar({ isClosed: true, timeMs: 180_000 }), 'liveUpdate');
151
- expect(violations[0]).toContain('liveUpdate');
152
- expect(violations[0]).toContain('180000');
153
- });
154
- });
155
- // ─── 4. assertOpenImmutability ────────────────────────────────────────────────
156
- describe('assertOpenImmutability', () => {
157
- it('passes when open is unchanged', () => {
158
- const bar = validBar({ open: 100 });
159
- assertOpenImmutability(100, bar, 'test');
160
- expect(violations).toHaveLength(0);
161
- });
162
- it('fires when open changed', () => {
163
- const bar = validBar({ open: 200 });
164
- assertOpenImmutability(100, bar, 'ctx');
165
- expect(violations.length).toBeGreaterThan(0);
166
- expect(violations[0]).toContain('open');
167
- });
168
- it('violation message shows previous and new open', () => {
169
- const bar = validBar({ open: 200, timeMs: 120_000 });
170
- assertOpenImmutability(100, bar, 'ctx');
171
- expect(violations[0]).toContain('100');
172
- expect(violations[0]).toContain('200');
173
- expect(violations[0]).toContain('120000');
174
- });
175
- });
176
- // ─── 5. assertNoDuplicateAppend ───────────────────────────────────────────────
177
- describe('assertNoDuplicateAppend', () => {
178
- it('passes when count is unchanged', () => {
179
- assertNoDuplicateAppend(5, 5, 'test');
180
- expect(violations).toHaveLength(0);
181
- });
182
- it('fires when count increased (spurious append)', () => {
183
- assertNoDuplicateAppend(5, 6, 'ctx');
184
- expect(violations.length).toBeGreaterThan(0);
185
- expect(violations[0]).toContain('same-bucket');
186
- });
187
- });
188
- // ─── 6. assertFinalizedUnchanged ─────────────────────────────────────────────
189
- describe('assertFinalizedUnchanged', () => {
190
- it('passes when the previous bar is now isClosed', () => {
191
- const prev = validBar({ timeMs: 60_000, isClosed: false });
192
- const current = [
193
- { ...prev, isClosed: true },
194
- validBar({ timeMs: 120_000, isClosed: false }),
195
- ];
196
- assertFinalizedUnchanged(prev, current, 'test');
197
- expect(violations).toHaveLength(0);
198
- });
199
- it('fires when the previous bar is still open after a new-bucket append', () => {
200
- const prev = validBar({ timeMs: 60_000, isClosed: false });
201
- const current = [
202
- { ...prev, isClosed: false }, // not closed — violation
203
- validBar({ timeMs: 120_000, isClosed: false }),
204
- ];
205
- assertFinalizedUnchanged(prev, current, 'test');
206
- expect(violations.length).toBeGreaterThan(0);
207
- expect(violations[0]).toContain('isClosed');
208
- });
209
- it('passes when the bar was removed (e.g. after a merge)', () => {
210
- const prev = validBar({ timeMs: 60_000 });
211
- // prev is not in `current` at all — should not fire
212
- assertFinalizedUnchanged(prev, [], 'test');
213
- expect(violations).toHaveLength(0);
214
- });
215
- });
216
- // ─── 7. CandleEngine integration — no spurious warnings ──────────────────────
217
- describe('CandleEngine integration — clean operation produces no violations', () => {
218
- const TF = '1m';
219
- const T0 = sec('2025-03-09T14:00:00Z');
220
- const T1 = sec('2025-03-09T14:01:00Z');
221
- const T2 = sec('2025-03-09T14:02:00Z');
222
- it('single tick produces no invariant violations', () => {
223
- const engine = new CandleEngine();
224
- engine.initialize([], TF);
225
- engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105));
226
- expect(violations).toHaveLength(0);
227
- });
228
- it('same-bucket updates produce no violations', () => {
229
- const engine = new CandleEngine();
230
- engine.initialize([], TF);
231
- engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105));
232
- engine.applyLiveUpdate(tick(T0 + 30, 100, 120, 85, 115));
233
- engine.applyLiveUpdate(tick(T0 + 45, 100, 120, 85, 112));
234
- expect(violations).toHaveLength(0);
235
- });
236
- it('new-bucket append produces no violations', () => {
237
- const engine = new CandleEngine();
238
- engine.initialize([], TF);
239
- engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105));
240
- engine.applyLiveUpdate(tick(T1, 106, 120, 100, 115));
241
- engine.applyLiveUpdate(tick(T2, 116, 125, 110, 120));
242
- expect(violations).toHaveLength(0);
243
- });
244
- it('backfillGap produces no violations', () => {
245
- const T4 = sec('2025-03-09T14:04:00Z');
246
- const engine = new CandleEngine();
247
- engine.initialize([tick(T0, 100, 110, 90, 105)], TF);
248
- engine.applyLiveUpdate(tick(T4, 130, 140, 120, 135));
249
- engine.backfillGap([
250
- tick(T1, 106, 115, 100, 112),
251
- tick(T2, 112, 118, 105, 116),
252
- ]);
253
- expect(violations).toHaveLength(0);
254
- });
255
- it('handleReconnect produces no violations', () => {
256
- const engine = new CandleEngine();
257
- engine.initialize([
258
- tick(T0, 100, 110, 90, 105),
259
- tick(T1, 106, 112, 100, 110),
260
- ], TF);
261
- engine.handleReconnect([
262
- tick(T0, 100, 115, 88, 112),
263
- tick(T1, 106, 118, 96, 115),
264
- ]);
265
- expect(violations).toHaveLength(0);
266
- });
267
- it('weekly timeframe: calendar-aligned ticks produce no violations', () => {
268
- const MONDAY = sec('2025-03-03T00:00:00Z');
269
- const WEDNESDAY = sec('2025-03-05T12:00:00Z');
270
- const FRIDAY = sec('2025-03-07T18:00:00Z');
271
- const engine = new CandleEngine();
272
- engine.initialize([], '1w');
273
- engine.applyLiveUpdate(tick(MONDAY, 40000, 42000, 39000, 41000));
274
- // Wed and Fri are in the same 1w bucket — updates only
275
- engine.applyLiveUpdate(tick(WEDNESDAY, 40000, 45000, 38000, 44000));
276
- engine.applyLiveUpdate(tick(FRIDAY, 40000, 46000, 37500, 43000));
277
- expect(violations).toHaveLength(0);
278
- expect(engine.getBars().length).toBe(1); // still the same weekly candle
279
- });
280
- it('monthly timeframe: calendar-aligned ticks produce no violations', () => {
281
- const MAR_01 = sec('2025-03-01T00:00:00Z');
282
- const MAR_15 = sec('2025-03-15T12:00:00Z');
283
- const APR_01 = sec('2025-04-01T00:00:00Z');
284
- const engine = new CandleEngine();
285
- engine.initialize([], '1M');
286
- engine.applyLiveUpdate(tick(MAR_01, 40000, 42000, 39000, 41000));
287
- engine.applyLiveUpdate(tick(MAR_15, 40000, 45000, 38000, 44000)); // same month
288
- engine.applyLiveUpdate(tick(APR_01, 44000, 46000, 43000, 45000)); // new month
289
- expect(violations).toHaveLength(0);
290
- expect(engine.getBars().length).toBe(2); // March + April
291
- });
292
- });
293
- // ─── 8. barDivergenceCheck ────────────────────────────────────────────────────
294
- describe('compareSources — identical sources', () => {
295
- const BARS = {
296
- source: 'provider',
297
- bars: [
298
- { time: 1_000_000, open: 100, high: 110, low: 90, close: 105 },
299
- { time: 1_000_060, open: 105, high: 115, low: 100, close: 112 },
300
- { time: 1_000_120, open: 112, high: 120, low: 108, close: 118 },
301
- ],
302
- };
303
- const DB_BARS = { source: 'database', bars: BARS.bars };
304
- it('returns diverged=false when both sources are identical', () => {
305
- const report = compareSources(BARS, DB_BARS, '1m', 'BTC', 1_000_000, 1_000_180);
306
- expect(report.diverged).toBe(false);
307
- expect(report.totalMismatches).toBe(0);
308
- expect(report.firstMismatch).toBeNull();
309
- });
310
- it('correct source counts', () => {
311
- const report = compareSources(BARS, DB_BARS, '1m', 'BTC', 1_000_000, 1_000_180);
312
- expect(report.sourceACount).toBe(3);
313
- expect(report.sourceBCount).toBe(3);
314
- });
315
- });
316
- describe('compareSources — OHLC divergence', () => {
317
- it('detects first high mismatch and reports field name', () => {
318
- const provider = {
319
- source: 'provider',
320
- bars: [
321
- { time: 1_000_000, open: 100, high: 110, low: 90, close: 105 },
322
- { time: 1_000_060, open: 105, high: 115, low: 100, close: 112 },
323
- ],
324
- };
325
- const db = {
326
- source: 'database',
327
- bars: [
328
- { time: 1_000_000, open: 100, high: 110, low: 90, close: 105 },
329
- { time: 1_000_060, open: 105, high: 999, low: 100, close: 112 }, // high differs
330
- ],
331
- };
332
- const report = compareSources(provider, db, '1m', 'BTC', 1_000_000, 1_000_120);
333
- expect(report.diverged).toBe(true);
334
- expect(report.firstMismatch).not.toBeNull();
335
- expect(report.firstMismatch.time).toBe(1_000_060);
336
- expect(report.firstMismatch.differences.some(d => d.field === 'high')).toBe(true);
337
- });
338
- it('detects missing bar in one source', () => {
339
- const provider = {
340
- source: 'provider',
341
- bars: [
342
- { time: 1_000_000, open: 100, high: 110, low: 90, close: 105 },
343
- { time: 1_000_060, open: 105, high: 115, low: 100, close: 112 },
344
- ],
345
- };
346
- const db = {
347
- source: 'database',
348
- bars: [
349
- { time: 1_000_000, open: 100, high: 110, low: 90, close: 105 },
350
- // 1_000_060 is missing
351
- ],
352
- };
353
- const report = compareSources(provider, db, '1m', 'BTC', 1_000_000, 1_000_120);
354
- expect(report.diverged).toBe(true);
355
- expect(report.firstMismatch.time).toBe(1_000_060);
356
- expect(report.firstMismatch.notes.some(n => n.includes('missing'))).toBe(true);
357
- });
358
- it('reports first mismatch in time order even if later mismatches exist', () => {
359
- const provider = {
360
- source: 'provider',
361
- bars: [
362
- { time: 1_000_000, open: 100, high: 200, low: 90, close: 150 }, // high differs
363
- { time: 1_000_060, open: 105, high: 300, low: 100, close: 200 }, // high also differs
364
- ],
365
- };
366
- const db = {
367
- source: 'database',
368
- bars: [
369
- { time: 1_000_000, open: 100, high: 110, low: 90, close: 150 },
370
- { time: 1_000_060, open: 105, high: 115, low: 100, close: 200 },
371
- ],
372
- };
373
- const report = compareSources(provider, db, '1m', 'BTC', 1_000_000, 1_000_120);
374
- expect(report.firstMismatch.time).toBe(1_000_000); // oldest first
375
- expect(report.totalMismatches).toBe(2);
376
- });
377
- });
378
- describe('checkAllSources', () => {
379
- it('produces N*(N-1)/2 pairwise reports', () => {
380
- const sources = [
381
- { source: 'provider', bars: [] },
382
- { source: 'database', bars: [] },
383
- { source: 'sdk', bars: [] },
384
- ];
385
- const reports = checkAllSources(sources, 'BTC', '1h', 0, 100_000);
386
- expect(reports.length).toBe(3); // C(3,2) = 3
387
- });
388
- });
389
- describe('formatReport', () => {
390
- it('includes IDENTICAL when no divergence', () => {
391
- const bars = {
392
- source: 'provider',
393
- bars: [{ time: 1_000_000, open: 100, high: 110, low: 90, close: 105 }],
394
- };
395
- const report = compareSources(bars, { source: 'database', bars: bars.bars }, '1m', 'BTC', 1_000_000, 1_000_060);
396
- const text = formatReport(report);
397
- expect(text).toContain('IDENTICAL');
398
- });
399
- it('includes DIVERGED and mismatch details when sources differ', () => {
400
- const provider = {
401
- source: 'provider',
402
- bars: [{ time: 1_000_000, open: 100, high: 999, low: 90, close: 105 }],
403
- };
404
- const db = {
405
- source: 'database',
406
- bars: [{ time: 1_000_000, open: 100, high: 110, low: 90, close: 105 }],
407
- };
408
- const report = compareSources(provider, db, '1m', 'BTC', 1_000_000, 1_000_060);
409
- const text = formatReport(report);
410
- expect(text).toContain('DIVERGED');
411
- expect(text).toContain('1000000'); // time
412
- expect(text).toContain('high');
413
- });
414
- });
415
- //# sourceMappingURL=candleInvariant.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"candleInvariant.test.js","sourceRoot":"","sources":["../../src/__tests__/candleInvariant.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAM,MAAM,QAAQ,CAAC;AACzE,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,YAAY,EACZ,cAAc,GACf,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,EACL,cAAc,EACd,eAAe,EACf,YAAY,GACb,MAAM,6BAA6B,CAAC;AAGrC,iFAAiF;AAEjF;;;GAGG;AACH,IAAI,UAAU,GAAa,EAAE,CAAC;AAE9B,UAAU,CAAC,GAAG,EAAE;IACd,UAAU,GAAG,EAAE,CAAC;IAChB,YAAY,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,cAAc,EAAE,CAAC;AACnB,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,uCAAuC;AACvC,SAAS,QAAQ,CAAC,YAAgC,EAAE;IAClD,OAAO;QACL,MAAM,EAAI,MAAM;QAChB,IAAI,EAAM,EAAE;QACZ,IAAI,EAAM,GAAG;QACb,IAAI,EAAM,GAAG;QACb,GAAG,EAAQ,EAAE;QACb,KAAK,EAAK,GAAG;QACb,MAAM,EAAM,CAAC;QACb,QAAQ,EAAE,IAAI;QACd,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,2BAA2B;AAC3B,MAAM,GAAG,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;AAEpE,oDAAoD;AACpD,SAAS,IAAI,CACX,OAAe,EACf,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,KAAK,GAAG,GAAG,EAAE,MAAM,GAAG,CAAC;IAEzD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3D,CAAC;AAED,iFAAiF;AAEjF,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,uBAAuB,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,uBAAuB,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACnE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,uBAAuB,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACpE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,uBAAuB,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAChE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,uBAAuB,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAChE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,uBAAuB,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACjE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,uBAAuB,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACzF,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,uBAAuB,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QACrF,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACtD,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,kEAAkE;QAClE,qBAAqB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5E,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,2CAA2C;QAC3C,qBAAqB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5E,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,OAAO,EAAE,CAAC;QAC7D,qBAAqB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7F,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,OAAO,EAAE,CAAC;QAC7D,qBAAqB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7F,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,OAAO,EAAE,CAAC;QAC1D,qBAAqB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACvF,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,OAAO,EAAE,CAAC;QAC7D,qBAAqB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7F,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9D,qBAAqB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/F,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,OAAO,EAAE,CAAC;QAC5D,qBAAqB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3F,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,kBAAkB,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACzD,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,kBAAkB,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;QAChF,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC9C,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACpC,sBAAsB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACpC,sBAAsB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACrD,sBAAsB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,uBAAuB,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,uBAAuB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACrC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAgB;YAC3B,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC3B,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;SAC/C,CAAC;QACF,wBAAwB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAgB;YAC3B,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,yBAAyB;YACvD,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;SAC/C,CAAC;QACF,wBAAwB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1C,oDAAoD;QACpD,wBAAwB,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QAC3C,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,mEAAmE,EAAE,GAAG,EAAE;IACjF,MAAM,EAAE,GAAG,IAAI,CAAC;IAChB,MAAM,EAAE,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACvC,MAAM,EAAE,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACvC,MAAM,EAAE,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAEvC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,EAAS,CAAC,CAAC;QACjC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,EAAS,CAAC,CAAC;QACjC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,EAAS,CAAC,CAAC;QACjC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,EAAE,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,EAAS,CAAC,CAAC;QAC5D,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,WAAW,CAAC;YACjB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;YAC5B,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;SAC7B,CAAC,CAAC;QACH,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,UAAU,CAAC;YAChB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;YAC3B,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;SAC7B,EAAE,EAAS,CAAC,CAAC;QACd,MAAM,CAAC,eAAe,CAAC;YACrB,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;YAC3B,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;SAC5B,CAAC,CAAC;QACH,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,MAAM,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAE3C,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,IAAW,CAAC,CAAC;QAEnC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACjE,uDAAuD;QACvD,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACpE,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAEjE,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,+BAA+B;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,MAAM,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAE3C,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,IAAW,CAAC,CAAC;QAEnC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa;QAC/E,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA,YAAY;QAE7E,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,MAAM,IAAI,GAAe;QACvB,MAAM,EAAE,UAAU;QAClB,IAAI,EAAE;YACJ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAG,KAAK,EAAE,GAAG,EAAE;YAC/D,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;YAC/D,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;SAChE;KACF,CAAC;IACF,MAAM,OAAO,GAAe,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAEpE,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAChF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAChF,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,QAAQ,GAAe;YAC3B,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE;gBACJ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;gBAC9D,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;aAChE;SACF,CAAC;QACF,MAAM,EAAE,GAAe;YACrB,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE;gBACJ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;gBAC9D,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,eAAe;aACjF;SACF,CAAC;QACF,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAC/E,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,aAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,aAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,QAAQ,GAAe;YAC3B,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE;gBACJ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;gBAC9D,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;aAChE;SACF,CAAC;QACF,MAAM,EAAE,GAAe;YACrB,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE;gBACJ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;gBAC9D,uBAAuB;aACxB;SACF,CAAC;QACF,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAC/E,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,aAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,aAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,QAAQ,GAAe;YAC3B,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE;gBACJ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,eAAe;gBAC/E,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,oBAAoB;aACtF;SACF,CAAC;QACF,MAAM,EAAE,GAAe;YACrB,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE;gBACJ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;gBAC9D,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;aAChE;SACF,CAAC;QACF,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAC/E,MAAM,CAAC,MAAM,CAAC,aAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe;QACnE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,OAAO,GAAG;YACd,EAAE,MAAM,EAAE,UAAmB,EAAE,IAAI,EAAE,EAAE,EAAE;YACzC,EAAE,MAAM,EAAE,UAAmB,EAAE,IAAI,EAAE,EAAE,EAAE;YACzC,EAAE,MAAM,EAAE,KAAmB,EAAE,IAAI,EAAE,EAAE,EAAE;SAC1C,CAAC;QACF,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAClE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,IAAI,GAAe;YACvB,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;SACvE,CAAC;QACF,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAChH,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,QAAQ,GAAe;YAC3B,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;SACvE,CAAC;QACF,MAAM,EAAE,GAAe;YACrB,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;SACvE,CAAC;QACF,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAC/E,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;QAC1C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}