oakscriptjs 0.8.1 → 0.9.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.
- package/LICENSE +1 -1
- package/README.md +31 -9
- package/dist/cjs/array/index.d.ts +701 -0
- package/dist/cjs/array/index.d.ts.map +1 -0
- package/dist/cjs/array/index.js +392 -0
- package/dist/cjs/array/index.js.map +7 -0
- package/dist/cjs/box/index.d.ts +444 -0
- package/dist/cjs/box/index.d.ts.map +1 -0
- package/dist/cjs/box/index.js +246 -0
- package/dist/cjs/box/index.js.map +7 -0
- package/dist/cjs/callsite/index.d.ts +61 -0
- package/dist/cjs/callsite/index.d.ts.map +1 -0
- package/dist/cjs/callsite/index.js +65 -0
- package/dist/cjs/callsite/index.js.map +7 -0
- package/dist/cjs/chartpoint/index.d.ts +90 -0
- package/dist/cjs/chartpoint/index.d.ts.map +1 -0
- package/dist/cjs/chartpoint/index.js +56 -0
- package/dist/cjs/chartpoint/index.js.map +7 -0
- package/dist/cjs/color/index.d.ts +285 -0
- package/dist/cjs/color/index.d.ts.map +1 -0
- package/dist/cjs/color/index.js +143 -0
- package/dist/cjs/color/index.js.map +7 -0
- package/dist/cjs/compare/index.d.ts +26 -0
- package/dist/cjs/compare/index.d.ts.map +1 -0
- package/dist/cjs/compare/index.js +50 -0
- package/dist/cjs/compare/index.js.map +7 -0
- package/dist/cjs/drawing/registry.d.ts +42 -0
- package/dist/cjs/drawing/registry.d.ts.map +1 -0
- package/dist/cjs/drawing/registry.js +87 -0
- package/dist/cjs/drawing/registry.js.map +7 -0
- package/dist/cjs/index.d.ts +85 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +184 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/indicator.d.ts +117 -0
- package/dist/cjs/indicator.d.ts.map +1 -0
- package/dist/cjs/indicator.js +74 -0
- package/dist/cjs/indicator.js.map +7 -0
- package/dist/cjs/input.d.ts +196 -0
- package/dist/cjs/input.d.ts.map +1 -0
- package/dist/cjs/input.js +197 -0
- package/dist/cjs/input.js.map +7 -0
- package/dist/cjs/label/index.d.ts +303 -0
- package/dist/cjs/label/index.d.ts.map +1 -0
- package/dist/cjs/label/index.js +190 -0
- package/dist/cjs/label/index.js.map +7 -0
- package/dist/cjs/lib/index.d.ts +8 -0
- package/dist/cjs/lib/index.d.ts.map +1 -0
- package/dist/cjs/lib/index.js +19 -0
- package/dist/cjs/lib/index.js.map +7 -0
- package/dist/{lib → cjs/lib}/zigzag/index.d.ts +4 -1
- package/dist/cjs/lib/zigzag/index.d.ts.map +1 -0
- package/dist/cjs/lib/zigzag/index.js +27 -0
- package/dist/cjs/lib/zigzag/index.js.map +7 -0
- package/dist/cjs/lib/zigzag/zigzag.d.ts +100 -0
- package/dist/cjs/lib/zigzag/zigzag.d.ts.map +1 -0
- package/dist/cjs/lib/zigzag/zigzag.js +207 -0
- package/dist/cjs/lib/zigzag/zigzag.js.map +7 -0
- package/dist/cjs/line/index.d.ts +342 -0
- package/dist/cjs/line/index.d.ts.map +1 -0
- package/dist/cjs/line/index.js +193 -0
- package/dist/cjs/line/index.js.map +7 -0
- package/dist/cjs/linefill/index.d.ts +124 -0
- package/dist/cjs/linefill/index.d.ts.map +1 -0
- package/dist/cjs/linefill/index.js +56 -0
- package/dist/cjs/linefill/index.js.map +7 -0
- package/dist/cjs/map/index.d.ts +69 -0
- package/dist/cjs/map/index.d.ts.map +1 -0
- package/dist/cjs/map/index.js +80 -0
- package/dist/cjs/map/index.js.map +7 -0
- package/dist/cjs/math/index.d.ts +560 -0
- package/dist/cjs/math/index.d.ts.map +1 -0
- package/dist/cjs/math/index.js +441 -0
- package/dist/cjs/math/index.js.map +7 -0
- package/dist/cjs/matrix/index.d.ts +1231 -0
- package/dist/cjs/matrix/index.d.ts.map +1 -0
- package/dist/cjs/matrix/index.js +1200 -0
- package/dist/cjs/matrix/index.js.map +7 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/plot.d.ts +76 -0
- package/dist/cjs/plot.d.ts.map +1 -0
- package/dist/cjs/plot.js +51 -0
- package/dist/cjs/plot.js.map +7 -0
- package/dist/cjs/polyline/index.d.ts +115 -0
- package/dist/cjs/polyline/index.d.ts.map +1 -0
- package/dist/cjs/polyline/index.js +76 -0
- package/dist/cjs/polyline/index.js.map +7 -0
- package/dist/cjs/runtime/adapters/LightweightChartsAdapter.d.ts +86 -0
- package/dist/cjs/runtime/adapters/LightweightChartsAdapter.d.ts.map +1 -0
- package/dist/cjs/runtime/adapters/LightweightChartsAdapter.js +141 -0
- package/dist/cjs/runtime/adapters/LightweightChartsAdapter.js.map +7 -0
- package/dist/cjs/runtime/adapters/SimpleInputAdapter.d.ts +59 -0
- package/dist/cjs/runtime/adapters/SimpleInputAdapter.d.ts.map +1 -0
- package/dist/cjs/runtime/adapters/SimpleInputAdapter.js +117 -0
- package/dist/cjs/runtime/adapters/SimpleInputAdapter.js.map +7 -0
- package/dist/{runtime → cjs/runtime}/index.d.ts +12 -5
- package/dist/cjs/runtime/index.d.ts.map +1 -0
- package/dist/cjs/runtime/index.js +49 -0
- package/dist/cjs/runtime/index.js.map +7 -0
- package/dist/cjs/runtime/inputs.d.ts +91 -0
- package/dist/cjs/runtime/inputs.d.ts.map +1 -0
- package/dist/cjs/runtime/inputs.js +262 -0
- package/dist/cjs/runtime/inputs.js.map +7 -0
- package/dist/cjs/runtime/runtime.d.ts +70 -0
- package/dist/cjs/runtime/runtime.d.ts.map +1 -0
- package/dist/cjs/runtime/runtime.js +148 -0
- package/dist/cjs/runtime/runtime.js.map +7 -0
- package/dist/cjs/runtime/series.d.ts +362 -0
- package/dist/cjs/runtime/series.d.ts.map +1 -0
- package/dist/cjs/runtime/series.js +560 -0
- package/dist/cjs/runtime/series.js.map +7 -0
- package/dist/cjs/runtime/types.d.ts +282 -0
- package/dist/cjs/runtime/types.d.ts.map +1 -0
- package/dist/cjs/runtime/types.js +17 -0
- package/dist/cjs/runtime/types.js.map +7 -0
- package/dist/cjs/script/index.d.ts +987 -0
- package/dist/cjs/script/index.d.ts.map +1 -0
- package/dist/cjs/script/index.js +1169 -0
- package/dist/cjs/script/index.js.map +7 -0
- package/dist/cjs/security/resample.d.ts +63 -0
- package/dist/cjs/security/resample.d.ts.map +1 -0
- package/dist/cjs/security/resample.js +84 -0
- package/dist/cjs/security/resample.js.map +7 -0
- package/dist/cjs/session/bars.d.ts +80 -0
- package/dist/cjs/session/bars.d.ts.map +1 -0
- package/dist/cjs/session/bars.js +219 -0
- package/dist/cjs/session/bars.js.map +7 -0
- package/dist/cjs/session/calendar.d.ts +70 -0
- package/dist/cjs/session/calendar.d.ts.map +1 -0
- package/dist/cjs/session/calendar.js +164 -0
- package/dist/cjs/session/calendar.js.map +7 -0
- package/dist/cjs/str/dateformat.d.ts +15 -0
- package/dist/cjs/str/dateformat.d.ts.map +1 -0
- package/dist/cjs/str/dateformat.js +149 -0
- package/dist/cjs/str/dateformat.js.map +7 -0
- package/dist/cjs/str/index.d.ts +459 -0
- package/dist/cjs/str/index.d.ts.map +1 -0
- package/dist/cjs/str/index.js +143 -0
- package/dist/cjs/str/index.js.map +7 -0
- package/dist/cjs/str/messageformat.d.ts +14 -0
- package/dist/cjs/str/messageformat.d.ts.map +1 -0
- package/dist/cjs/str/messageformat.js +114 -0
- package/dist/cjs/str/messageformat.js.map +7 -0
- package/dist/cjs/str/numberformat.d.ts +19 -0
- package/dist/cjs/str/numberformat.d.ts.map +1 -0
- package/dist/cjs/str/numberformat.js +170 -0
- package/dist/cjs/str/numberformat.js.map +7 -0
- package/dist/{strategy → cjs/strategy}/index.d.ts +50 -0
- package/dist/cjs/strategy/index.d.ts.map +1 -0
- package/dist/cjs/strategy/index.js +92 -0
- package/dist/cjs/strategy/index.js.map +7 -0
- package/dist/cjs/ta/index.d.ts +1397 -0
- package/dist/cjs/ta/index.d.ts.map +1 -0
- package/dist/cjs/ta/index.js +1715 -0
- package/dist/cjs/ta/index.js.map +7 -0
- package/dist/cjs/ta/running-sum.d.ts +30 -0
- package/dist/cjs/ta/running-sum.d.ts.map +1 -0
- package/dist/cjs/ta/running-sum.js +99 -0
- package/dist/cjs/ta/running-sum.js.map +7 -0
- package/dist/cjs/ta-series.d.ts +558 -0
- package/dist/cjs/ta-series.d.ts.map +1 -0
- package/dist/cjs/ta-series.js +606 -0
- package/dist/cjs/ta-series.js.map +7 -0
- package/dist/cjs/text/index.d.ts +14 -0
- package/dist/cjs/text/index.d.ts.map +1 -0
- package/dist/cjs/text/index.js +29 -0
- package/dist/cjs/text/index.js.map +7 -0
- package/dist/cjs/time/datestring.d.ts +23 -0
- package/dist/cjs/time/datestring.d.ts.map +1 -0
- package/dist/cjs/time/datestring.js +106 -0
- package/dist/cjs/time/datestring.js.map +7 -0
- package/dist/cjs/time/index.d.ts +89 -0
- package/dist/cjs/time/index.d.ts.map +1 -0
- package/dist/cjs/time/index.js +85 -0
- package/dist/cjs/time/index.js.map +7 -0
- package/dist/cjs/time/session.d.ts +17 -0
- package/dist/cjs/time/session.d.ts.map +1 -0
- package/dist/cjs/time/session.js +65 -0
- package/dist/cjs/time/session.js.map +7 -0
- package/dist/cjs/time/timezone.d.ts +40 -0
- package/dist/cjs/time/timezone.d.ts.map +1 -0
- package/dist/cjs/time/timezone.js +125 -0
- package/dist/cjs/time/timezone.js.map +7 -0
- package/dist/cjs/timeframe/index.d.ts +73 -0
- package/dist/cjs/timeframe/index.d.ts.map +1 -0
- package/dist/cjs/timeframe/index.js +85 -0
- package/dist/cjs/timeframe/index.js.map +7 -0
- package/dist/cjs/types/index.d.ts +343 -0
- package/dist/cjs/types/index.d.ts.map +1 -0
- package/dist/cjs/types/index.js +32 -0
- package/dist/cjs/types/index.js.map +7 -0
- package/dist/cjs/types/metadata.d.ts +300 -0
- package/dist/cjs/types/metadata.d.ts.map +1 -0
- package/dist/cjs/types/metadata.js +17 -0
- package/dist/cjs/types/metadata.js.map +7 -0
- package/dist/cjs/utils/index.d.ts +167 -0
- package/dist/cjs/utils/index.d.ts.map +1 -0
- package/dist/cjs/utils/index.js +209 -0
- package/dist/cjs/utils/index.js.map +7 -0
- package/dist/esm/array/index.d.ts +701 -0
- package/dist/esm/array/index.d.ts.map +1 -0
- package/dist/esm/array/index.js +983 -0
- package/dist/esm/array/index.js.map +1 -0
- package/dist/esm/box/index.d.ts +444 -0
- package/dist/esm/box/index.d.ts.map +1 -0
- package/dist/esm/box/index.js +602 -0
- package/dist/esm/box/index.js.map +1 -0
- package/dist/esm/callsite/index.d.ts +61 -0
- package/dist/esm/callsite/index.d.ts.map +1 -0
- package/dist/esm/callsite/index.js +97 -0
- package/dist/esm/callsite/index.js.map +1 -0
- package/dist/esm/chartpoint/index.d.ts +90 -0
- package/dist/esm/chartpoint/index.d.ts.map +1 -0
- package/dist/esm/chartpoint/index.js +113 -0
- package/dist/esm/chartpoint/index.js.map +1 -0
- package/dist/esm/color/index.d.ts +285 -0
- package/dist/esm/color/index.d.ts.map +1 -0
- package/dist/esm/color/index.js +373 -0
- package/dist/esm/color/index.js.map +1 -0
- package/dist/esm/compare/index.d.ts +26 -0
- package/dist/esm/compare/index.d.ts.map +1 -0
- package/dist/esm/compare/index.js +39 -0
- package/dist/esm/compare/index.js.map +1 -0
- package/dist/esm/drawing/registry.d.ts +42 -0
- package/dist/esm/drawing/registry.d.ts.map +1 -0
- package/dist/esm/drawing/registry.js +89 -0
- package/dist/esm/drawing/registry.js.map +1 -0
- package/dist/esm/index.d.ts +85 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +96 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/indicator.d.ts +117 -0
- package/dist/esm/indicator.d.ts.map +1 -0
- package/dist/esm/indicator.js +84 -0
- package/dist/esm/indicator.js.map +1 -0
- package/dist/esm/input.d.ts +196 -0
- package/dist/esm/input.d.ts.map +1 -0
- package/dist/esm/input.js +183 -0
- package/dist/esm/input.js.map +1 -0
- package/dist/esm/label/index.d.ts +303 -0
- package/dist/esm/label/index.d.ts.map +1 -0
- package/dist/esm/label/index.js +417 -0
- package/dist/esm/label/index.js.map +1 -0
- package/dist/esm/lib/index.d.ts +8 -0
- package/dist/esm/lib/index.d.ts.map +1 -0
- package/dist/esm/lib/index.js +8 -0
- package/dist/esm/lib/index.js.map +1 -0
- package/dist/esm/lib/zigzag/index.d.ts +5 -0
- package/dist/esm/lib/zigzag/index.d.ts.map +1 -0
- package/dist/esm/lib/zigzag/index.js +5 -0
- package/dist/esm/lib/zigzag/index.js.map +1 -0
- package/dist/esm/lib/zigzag/zigzag.d.ts +100 -0
- package/dist/esm/lib/zigzag/zigzag.d.ts.map +1 -0
- package/dist/esm/lib/zigzag/zigzag.js +229 -0
- package/dist/esm/lib/zigzag/zigzag.js.map +1 -0
- package/dist/esm/line/index.d.ts +342 -0
- package/dist/esm/line/index.d.ts.map +1 -0
- package/dist/esm/line/index.js +470 -0
- package/dist/esm/line/index.js.map +1 -0
- package/dist/esm/linefill/index.d.ts +124 -0
- package/dist/esm/linefill/index.d.ts.map +1 -0
- package/dist/esm/linefill/index.js +144 -0
- package/dist/esm/linefill/index.js.map +1 -0
- package/dist/esm/map/index.d.ts +69 -0
- package/dist/esm/map/index.d.ts.map +1 -0
- package/dist/esm/map/index.js +106 -0
- package/dist/esm/map/index.js.map +1 -0
- package/dist/esm/math/index.d.ts +560 -0
- package/dist/esm/math/index.d.ts.map +1 -0
- package/dist/esm/math/index.js +495 -0
- package/dist/esm/math/index.js.map +1 -0
- package/dist/esm/matrix/index.d.ts +1231 -0
- package/dist/esm/matrix/index.d.ts.map +1 -0
- package/dist/esm/matrix/index.js +2450 -0
- package/dist/esm/matrix/index.js.map +1 -0
- package/dist/esm/plot.d.ts +76 -0
- package/dist/esm/plot.d.ts.map +1 -0
- package/dist/esm/plot.js +63 -0
- package/dist/esm/plot.js.map +1 -0
- package/dist/esm/polyline/index.d.ts +115 -0
- package/dist/esm/polyline/index.d.ts.map +1 -0
- package/dist/esm/polyline/index.js +157 -0
- package/dist/esm/polyline/index.js.map +1 -0
- package/dist/esm/runtime/adapters/LightweightChartsAdapter.d.ts +86 -0
- package/dist/esm/runtime/adapters/LightweightChartsAdapter.d.ts.map +1 -0
- package/dist/esm/runtime/adapters/LightweightChartsAdapter.js +140 -0
- package/dist/esm/runtime/adapters/LightweightChartsAdapter.js.map +1 -0
- package/dist/esm/runtime/adapters/SimpleInputAdapter.d.ts +59 -0
- package/dist/esm/runtime/adapters/SimpleInputAdapter.d.ts.map +1 -0
- package/dist/esm/runtime/adapters/SimpleInputAdapter.js +115 -0
- package/dist/esm/runtime/adapters/SimpleInputAdapter.js.map +1 -0
- package/dist/esm/runtime/index.d.ts +13 -0
- package/dist/esm/runtime/index.d.ts.map +1 -0
- package/dist/esm/runtime/index.js +14 -0
- package/dist/esm/runtime/index.js.map +1 -0
- package/dist/esm/runtime/inputs.d.ts +91 -0
- package/dist/esm/runtime/inputs.d.ts.map +1 -0
- package/dist/esm/runtime/inputs.js +334 -0
- package/dist/esm/runtime/inputs.js.map +1 -0
- package/dist/esm/runtime/runtime.d.ts +70 -0
- package/dist/esm/runtime/runtime.d.ts.map +1 -0
- package/dist/esm/runtime/runtime.js +193 -0
- package/dist/esm/runtime/runtime.js.map +1 -0
- package/dist/esm/runtime/series.d.ts +362 -0
- package/dist/esm/runtime/series.d.ts.map +1 -0
- package/dist/esm/runtime/series.js +583 -0
- package/dist/esm/runtime/series.js.map +1 -0
- package/dist/esm/runtime/types.d.ts +282 -0
- package/dist/esm/runtime/types.d.ts.map +1 -0
- package/dist/esm/runtime/types.js +7 -0
- package/dist/esm/runtime/types.js.map +1 -0
- package/dist/esm/script/index.d.ts +987 -0
- package/dist/esm/script/index.d.ts.map +1 -0
- package/dist/esm/script/index.js +1289 -0
- package/dist/esm/script/index.js.map +1 -0
- package/dist/esm/security/resample.d.ts +63 -0
- package/dist/esm/security/resample.d.ts.map +1 -0
- package/dist/esm/security/resample.js +110 -0
- package/dist/esm/security/resample.js.map +1 -0
- package/dist/esm/session/bars.d.ts +80 -0
- package/dist/esm/session/bars.d.ts.map +1 -0
- package/dist/esm/session/bars.js +232 -0
- package/dist/esm/session/bars.js.map +1 -0
- package/dist/esm/session/calendar.d.ts +70 -0
- package/dist/esm/session/calendar.d.ts.map +1 -0
- package/dist/esm/session/calendar.js +172 -0
- package/dist/esm/session/calendar.js.map +1 -0
- package/dist/esm/str/dateformat.d.ts +15 -0
- package/dist/esm/str/dateformat.d.ts.map +1 -0
- package/dist/esm/str/dateformat.js +136 -0
- package/dist/esm/str/dateformat.js.map +1 -0
- package/dist/esm/str/index.d.ts +459 -0
- package/dist/esm/str/index.d.ts.map +1 -0
- package/dist/esm/str/index.js +540 -0
- package/dist/esm/str/index.js.map +1 -0
- package/dist/esm/str/messageformat.d.ts +14 -0
- package/dist/esm/str/messageformat.d.ts.map +1 -0
- package/dist/esm/str/messageformat.js +111 -0
- package/dist/esm/str/messageformat.js.map +1 -0
- package/dist/esm/str/numberformat.d.ts +19 -0
- package/dist/esm/str/numberformat.d.ts.map +1 -0
- package/dist/esm/str/numberformat.js +189 -0
- package/dist/esm/str/numberformat.js.map +1 -0
- package/dist/esm/strategy/index.d.ts +245 -0
- package/dist/esm/strategy/index.d.ts.map +1 -0
- package/dist/esm/strategy/index.js +84 -0
- package/dist/esm/strategy/index.js.map +1 -0
- package/dist/esm/ta/index.d.ts +1397 -0
- package/dist/esm/ta/index.d.ts.map +1 -0
- package/dist/esm/ta/index.js +3227 -0
- package/dist/esm/ta/index.js.map +1 -0
- package/dist/esm/ta/running-sum.d.ts +30 -0
- package/dist/esm/ta/running-sum.d.ts.map +1 -0
- package/dist/esm/ta/running-sum.js +113 -0
- package/dist/esm/ta/running-sum.js.map +1 -0
- package/dist/esm/ta-series.d.ts +558 -0
- package/dist/esm/ta-series.d.ts.map +1 -0
- package/dist/esm/ta-series.js +910 -0
- package/dist/esm/ta-series.js.map +1 -0
- package/dist/esm/text/index.d.ts +14 -0
- package/dist/esm/text/index.d.ts.map +1 -0
- package/dist/esm/text/index.js +14 -0
- package/dist/esm/text/index.js.map +1 -0
- package/dist/esm/time/datestring.d.ts +23 -0
- package/dist/esm/time/datestring.d.ts.map +1 -0
- package/dist/esm/time/datestring.js +94 -0
- package/dist/esm/time/datestring.js.map +1 -0
- package/dist/esm/time/index.d.ts +89 -0
- package/dist/esm/time/index.d.ts.map +1 -0
- package/dist/esm/time/index.js +108 -0
- package/dist/esm/time/index.js.map +1 -0
- package/dist/esm/time/session.d.ts +17 -0
- package/dist/esm/time/session.d.ts.map +1 -0
- package/dist/esm/time/session.js +69 -0
- package/dist/esm/time/session.js.map +1 -0
- package/dist/esm/time/timezone.d.ts +40 -0
- package/dist/esm/time/timezone.d.ts.map +1 -0
- package/dist/esm/time/timezone.js +144 -0
- package/dist/esm/time/timezone.js.map +1 -0
- package/dist/esm/timeframe/index.d.ts +73 -0
- package/dist/esm/timeframe/index.d.ts.map +1 -0
- package/dist/esm/timeframe/index.js +131 -0
- package/dist/esm/timeframe/index.js.map +1 -0
- package/dist/esm/types/index.d.ts +343 -0
- package/dist/esm/types/index.d.ts.map +1 -0
- package/dist/esm/types/index.js +17 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/metadata.d.ts +300 -0
- package/dist/esm/types/metadata.d.ts.map +1 -0
- package/dist/esm/types/metadata.js +7 -0
- package/dist/esm/types/metadata.js.map +1 -0
- package/dist/esm/utils/index.d.ts +167 -0
- package/dist/esm/utils/index.d.ts.map +1 -0
- package/dist/esm/utils/index.js +295 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/package.json +53 -23
- package/src/array/index.ts +1056 -0
- package/src/box/index.ts +680 -0
- package/src/callsite/index.ts +104 -0
- package/src/chartpoint/index.ts +126 -0
- package/src/color/index.ts +411 -0
- package/src/compare/index.ts +46 -0
- package/src/drawing/registry.ts +106 -0
- package/src/index.ts +201 -0
- package/src/indicator.ts +185 -0
- package/src/input.ts +280 -0
- package/src/label/index.ts +490 -0
- package/src/lib/index.ts +8 -0
- package/src/lib/zigzag/index.ts +13 -0
- package/src/lib/zigzag/zigzag.ts +318 -0
- package/src/line/index.ts +530 -0
- package/src/linefill/index.ts +152 -0
- package/src/map/index.ts +115 -0
- package/src/math/index.ts +1071 -0
- package/src/matrix/index.ts +2697 -0
- package/src/plot.ts +121 -0
- package/src/polyline/index.ts +184 -0
- package/src/runtime/adapters/LightweightChartsAdapter.ts +201 -0
- package/src/runtime/adapters/SimpleInputAdapter.ts +132 -0
- package/src/runtime/index.ts +52 -0
- package/src/runtime/inputs.ts +377 -0
- package/src/runtime/runtime.ts +241 -0
- package/src/runtime/series.ts +644 -0
- package/src/runtime/types.ts +292 -0
- package/src/script/index.ts +1865 -0
- package/src/security/resample.ts +119 -0
- package/src/session/bars.ts +262 -0
- package/src/session/calendar.ts +199 -0
- package/src/str/dateformat.ts +104 -0
- package/src/str/index.ts +557 -0
- package/src/str/messageformat.ts +109 -0
- package/src/str/numberformat.ts +197 -0
- package/src/strategy/index.ts +281 -0
- package/src/ta/index.ts +3580 -0
- package/src/ta/running-sum.ts +117 -0
- package/src/ta-series.ts +1036 -0
- package/src/text/index.ts +14 -0
- package/src/time/datestring.ts +96 -0
- package/src/time/index.ts +161 -0
- package/src/time/session.ts +79 -0
- package/src/time/timezone.ts +180 -0
- package/src/timeframe/index.ts +144 -0
- package/src/types/index.ts +398 -0
- package/src/types/metadata.ts +334 -0
- package/src/utils/index.ts +334 -0
- package/dist/array/index.d.ts +0 -57
- package/dist/array/index.d.ts.map +0 -1
- package/dist/box/index.d.ts +0 -37
- package/dist/box/index.d.ts.map +0 -1
- package/dist/callsite/index.d.ts +0 -7
- package/dist/callsite/index.d.ts.map +0 -1
- package/dist/chartpoint/index.d.ts +0 -8
- package/dist/chartpoint/index.d.ts.map +0 -1
- package/dist/color/index.d.ts +0 -28
- package/dist/color/index.d.ts.map +0 -1
- package/dist/compare/index.d.ts +0 -8
- package/dist/compare/index.d.ts.map +0 -1
- package/dist/drawing/registry.d.ts +0 -19
- package/dist/drawing/registry.d.ts.map +0 -1
- package/dist/index.cjs +0 -7979
- package/dist/index.d.ts +0 -64
- package/dist/index.d.ts.map +0 -1
- package/dist/index.mjs +0 -7962
- package/dist/indicator.d.ts +0 -42
- package/dist/indicator.d.ts.map +0 -1
- package/dist/input.d.ts +0 -47
- package/dist/input.d.ts.map +0 -1
- package/dist/label/index.d.ts +0 -30
- package/dist/label/index.d.ts.map +0 -1
- package/dist/lib/index.d.ts +0 -2
- package/dist/lib/index.d.ts.map +0 -1
- package/dist/lib/zigzag/index.d.ts.map +0 -1
- package/dist/lib/zigzag/zigzag.d.ts +0 -47
- package/dist/lib/zigzag/zigzag.d.ts.map +0 -1
- package/dist/line/index.d.ts +0 -30
- package/dist/line/index.d.ts.map +0 -1
- package/dist/linefill/index.d.ts +0 -10
- package/dist/linefill/index.d.ts.map +0 -1
- package/dist/map/index.d.ts +0 -14
- package/dist/map/index.d.ts.map +0 -1
- package/dist/math/index.d.ts +0 -53
- package/dist/math/index.d.ts.map +0 -1
- package/dist/matrix/index.d.ts +0 -52
- package/dist/matrix/index.d.ts.map +0 -1
- package/dist/plot.d.ts +0 -20
- package/dist/plot.d.ts.map +0 -1
- package/dist/polyline/index.d.ts +0 -11
- package/dist/polyline/index.d.ts.map +0 -1
- package/dist/runtime/adapters/LightweightChartsAdapter.d.ts +0 -15
- package/dist/runtime/adapters/LightweightChartsAdapter.d.ts.map +0 -1
- package/dist/runtime/adapters/SimpleInputAdapter.d.ts +0 -16
- package/dist/runtime/adapters/SimpleInputAdapter.d.ts.map +0 -1
- package/dist/runtime/index.cjs +0 -600
- package/dist/runtime/index.d.ts.map +0 -1
- package/dist/runtime/index.mjs +0 -577
- package/dist/runtime/inputs.d.ts +0 -13
- package/dist/runtime/inputs.d.ts.map +0 -1
- package/dist/runtime/runtime.d.ts +0 -16
- package/dist/runtime/runtime.d.ts.map +0 -1
- package/dist/runtime/series.d.ts +0 -60
- package/dist/runtime/series.d.ts.map +0 -1
- package/dist/runtime/types.d.ts +0 -122
- package/dist/runtime/types.d.ts.map +0 -1
- package/dist/script/index.cjs +0 -6372
- package/dist/script/index.d.ts +0 -709
- package/dist/script/index.d.ts.map +0 -1
- package/dist/script/index.mjs +0 -6355
- package/dist/security/resample.d.ts +0 -13
- package/dist/security/resample.d.ts.map +0 -1
- package/dist/session/bars.d.ts +0 -34
- package/dist/session/bars.d.ts.map +0 -1
- package/dist/session/calendar.d.ts +0 -31
- package/dist/session/calendar.d.ts.map +0 -1
- package/dist/str/dateformat.d.ts +0 -2
- package/dist/str/dateformat.d.ts.map +0 -1
- package/dist/str/index.d.ts +0 -24
- package/dist/str/index.d.ts.map +0 -1
- package/dist/str/messageformat.d.ts +0 -2
- package/dist/str/messageformat.d.ts.map +0 -1
- package/dist/str/numberformat.d.ts +0 -3
- package/dist/str/numberformat.d.ts.map +0 -1
- package/dist/strategy/index.d.ts.map +0 -1
- package/dist/ta/index.d.ts +0 -72
- package/dist/ta/index.d.ts.map +0 -1
- package/dist/ta-series.d.ts +0 -143
- package/dist/ta-series.d.ts.map +0 -1
- package/dist/text/index.d.ts +0 -4
- package/dist/text/index.d.ts.map +0 -1
- package/dist/time/datestring.d.ts +0 -2
- package/dist/time/datestring.d.ts.map +0 -1
- package/dist/time/index.d.ts +0 -15
- package/dist/time/index.d.ts.map +0 -1
- package/dist/time/session.d.ts +0 -2
- package/dist/time/session.d.ts.map +0 -1
- package/dist/time/timezone.d.ts +0 -13
- package/dist/time/timezone.d.ts.map +0 -1
- package/dist/timeframe/index.d.ts +0 -17
- package/dist/timeframe/index.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -181
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/metadata.d.ts +0 -131
- package/dist/types/metadata.d.ts.map +0 -1
- package/dist/utils/index.d.ts +0 -26
- package/dist/utils/index.d.ts.map +0 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/matrix/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Matrix namespace\n * Mirrors PineScript's matrix.* functions\n */\n\nimport type { PineMatrix, PineArray, simple_int, int, bool, float } from '../types/index.js';\n\n/**\n * Creates a new matrix\n *\n * @param rows - Number of rows\n * @param columns - Number of columns\n * @param initial_value - Initial value for all elements\n * @returns A new matrix object\n *\n * @example\n * ```typescript\n * // Create a 2x3 matrix filled with zeros\n * const m = matrix.new_matrix(2, 3, 0);\n *\n * // Create a 3x3 identity-like matrix\n * const m2 = matrix.new_matrix(3, 3, 1);\n * ```\n */\nexport function new_matrix<T>(\n rows: simple_int,\n columns: simple_int,\n initial_value?: T\n): PineMatrix<T> {\n const data: T[][] = [];\n for (let i = 0; i < rows; i++) {\n const row: T[] = [];\n for (let j = 0; j < columns; j++) {\n row.push(initial_value as T);\n }\n data.push(row);\n }\n return { rows, columns, data };\n}\n\n/**\n * Get element at position\n *\n * The function returns the element with the specified index of the matrix.\n *\n * @param id - A matrix object\n * @param row - Index of the required row\n * @param column - Index of the required column\n * @returns The value of the element at the row and column index\n *\n * @remarks\n * Indexing of the rows and columns starts at zero.\n *\n * @example\n * ```typescript\n * // Create a 2x3 matrix with value 5\n * const m = matrix.new_matrix(2, 3, 5);\n *\n * // Get element at row 0, column 0\n * const x = matrix.get(m, 0, 0); // Returns: 5\n * ```\n */\nexport function get<T>(id: PineMatrix<T>, row: simple_int, column: simple_int): T {\n if (row < 0 || row >= id.rows || column < 0 || column >= id.columns) {\n throw new Error(`Matrix index out of bounds: [${row}, ${column}] for matrix of size [${id.rows}, ${id.columns}]`);\n }\n return id.data[row]![column]!;\n}\n\n/**\n * Set element at position\n *\n * The function assigns value to the element at the row and column of the matrix.\n *\n * @param id - A matrix object\n * @param row - The row index of the element to be modified\n * @param column - The column index of the element to be modified\n * @param value - The new value to be set\n *\n * @remarks\n * Indexing of the rows and columns starts at zero.\n *\n * @example\n * ```typescript\n * // Create a 2x3 matrix with value 4\n * const m = matrix.new_matrix(2, 3, 4);\n *\n * // Replace value at row 0, column 1 with 3\n * matrix.set(m, 0, 1, 3);\n *\n * // Now m[0][1] === 3\n * ```\n */\nexport function set<T>(id: PineMatrix<T>, row: simple_int, column: simple_int, value: T): void {\n if (row < 0 || row >= id.rows || column < 0 || column >= id.columns) {\n throw new Error(`Matrix index out of bounds: [${row}, ${column}] for matrix of size [${id.rows}, ${id.columns}]`);\n }\n id.data[row]![column] = value;\n}\n\n/**\n * Get number of rows\n *\n * The function returns the number of rows in the matrix.\n *\n * @param id - A matrix object\n * @returns The number of rows in the matrix\n *\n * @example\n * ```typescript\n * // Create a 2x6 matrix\n * const m = matrix.new_matrix(2, 6, 0);\n *\n * // Get the quantity of rows\n * const x = matrix.rows(m); // Returns: 2\n * ```\n */\nexport function rows<T>(id: PineMatrix<T>): int {\n return id.rows;\n}\n\n/**\n * Get number of columns\n *\n * The function returns the number of columns in the matrix.\n *\n * @param id - A matrix object\n * @returns The number of columns in the matrix\n *\n * @example\n * ```typescript\n * // Create a 2x6 matrix\n * const m = matrix.new_matrix(2, 6, 0);\n *\n * // Get the quantity of columns\n * const x = matrix.columns(m); // Returns: 6\n * ```\n */\nexport function columns<T>(id: PineMatrix<T>): int {\n return id.columns;\n}\n\n/**\n * Get total number of elements\n *\n * The function returns the total number of all matrix elements.\n *\n * @param id - A matrix object\n * @returns The total number of elements (rows * columns)\n *\n * @example\n * ```typescript\n * // Create a 3x4 matrix\n * const m = matrix.new_matrix(3, 4, 0);\n *\n * // Get total element count\n * const count = matrix.elements_count(m); // Returns: 12\n * ```\n */\nexport function elements_count<T>(id: PineMatrix<T>): int {\n return id.rows * id.columns;\n}\n\n/**\n * Get row as array\n *\n * The function creates a one-dimensional array from the elements of a matrix row.\n *\n * @param id - A matrix object\n * @param row_index - Index of the required row\n * @returns An array containing the values of the specified row\n *\n * @remarks\n * Indexing of rows starts at 0.\n * Returns a copy of the row data.\n *\n * @example\n * ```typescript\n * // Create a 2x3 matrix\n * const m = matrix.new_matrix(2, 3, 5);\n * matrix.set(m, 0, 0, 1);\n * matrix.set(m, 0, 1, 2);\n * matrix.set(m, 0, 2, 3);\n *\n * // Get the first row as an array\n * const a = matrix.row(m, 0); // Returns: [1, 2, 3]\n * ```\n */\nexport function row<T>(id: PineMatrix<T>, row_index: simple_int): PineArray<T> {\n if (row_index < 0 || row_index >= id.rows) {\n throw new Error(`Row index out of bounds: ${row_index} for matrix with ${id.rows} rows`);\n }\n return [...id.data[row_index]!] as PineArray<T>;\n}\n\n/**\n * Get column as array\n *\n * The function creates a one-dimensional array from the elements of a matrix column.\n *\n * @param id - A matrix object\n * @param column_index - Index of the required column\n * @returns An array containing the values of the specified column\n *\n * @remarks\n * Indexing of columns starts at 0.\n * Returns a copy of the column data.\n *\n * @example\n * ```typescript\n * // Create a 3x2 matrix\n * const m = matrix.new_matrix(3, 2, 0);\n * matrix.set(m, 0, 0, 1);\n * matrix.set(m, 1, 0, 2);\n * matrix.set(m, 2, 0, 3);\n *\n * // Get the first column as an array\n * const a = matrix.col(m, 0); // Returns: [1, 2, 3]\n * ```\n */\nexport function col<T>(id: PineMatrix<T>, column_index: simple_int): PineArray<T> {\n if (column_index < 0 || column_index >= id.columns) {\n throw new Error(`Column index out of bounds: ${column_index} for matrix with ${id.columns} columns`);\n }\n return id.data.map(r => r[column_index]!) as PineArray<T>;\n}\n\n/**\n * Create a deep copy of a matrix\n *\n * The function creates a new matrix which is a copy of the original.\n *\n * @param id - A matrix object to copy\n * @returns A new matrix object that is a deep copy of the original\n *\n * @remarks\n * Unlike a simple assignment operation which would only copy the reference,\n * this function creates an actual copy of the matrix data.\n *\n * @example\n * ```typescript\n * // Create a 2x3 matrix with value 1\n * const m1 = matrix.new_matrix(2, 3, 1);\n *\n * // Copy the matrix\n * const m2 = matrix.copy(m1);\n *\n * // Modifying m2 will not affect m1\n * matrix.set(m2, 0, 0, 99);\n * // m1[0][0] is still 1\n * // m2[0][0] is now 99\n * ```\n */\nexport function copy<T>(id: PineMatrix<T>): PineMatrix<T> {\n const newData: T[][] = id.data.map(r => [...r]);\n return {\n rows: id.rows,\n columns: id.columns,\n data: newData\n };\n}\n\n/**\n * Fill matrix with value\n *\n * The function fills a rectangular area of the matrix defined by the indices\n * from_row to to_row (not including it) and from_column to to_column (not including it)\n * with the specified value.\n *\n * @param id - A matrix object\n * @param value - The value to fill with\n * @param from_row - Row index from which the fill will begin (inclusive). Default: 0\n * @param to_row - Row index where the fill will end (not inclusive). Default: matrix.rows\n * @param from_column - Column index from which the fill will begin (inclusive). Default: 0\n * @param to_column - Column index where the fill will end (not inclusive). Default: matrix.columns\n *\n * @example\n * ```typescript\n * // Create a 4x5 matrix with value 0\n * const m = matrix.new_matrix(4, 5, 0);\n *\n * // Fill rows 0-1 and columns 1-2 with value 9\n * matrix.fill(m, 9, 0, 2, 1, 3);\n *\n * // Result: positions [0,1], [0,2], [1,1], [1,2] are now 9\n * ```\n */\nexport function fill<T>(\n id: PineMatrix<T>,\n value: T,\n from_row: simple_int = 0,\n to_row?: simple_int,\n from_column: simple_int = 0,\n to_column?: simple_int\n): void {\n const endRow = to_row ?? id.rows;\n const endCol = to_column ?? id.columns;\n\n for (let i = from_row; i < endRow; i++) {\n for (let j = from_column; j < endCol; j++) {\n id.data[i]![j] = value;\n }\n }\n}\n\n/**\n * Test if matrix is square\n *\n * The function determines if the matrix is square (it has the same number of rows and columns).\n *\n * @param id - Matrix object to test\n * @returns true if the matrix is square, false otherwise\n *\n * @example\n * ```typescript\n * // Create a 3x3 square matrix\n * const m1 = matrix.new_matrix(3, 3, 0);\n * const isSquare1 = matrix.is_square(m1); // Returns: true\n *\n * // Create a 2x3 non-square matrix\n * const m2 = matrix.new_matrix(2, 3, 0);\n * const isSquare2 = matrix.is_square(m2); // Returns: false\n * ```\n */\nexport function is_square<T>(id: PineMatrix<T>): bool {\n return id.rows === id.columns;\n}\n\n/**\n * Test if matrix is a zero matrix\n *\n * The function determines if all elements of the matrix are zero.\n *\n * @param id - Matrix object to check (int/float)\n * @returns true if all elements are zero, false otherwise\n *\n * @example\n * ```typescript\n * // Create a 2x2 zero matrix\n * const m1 = matrix.new_matrix(2, 2, 0);\n * const isZero1 = matrix.is_zero(m1); // Returns: true\n *\n * // Create a matrix with non-zero element\n * const m2 = matrix.new_matrix(2, 2, 0);\n * matrix.set(m2, 0, 0, 1);\n * const isZero2 = matrix.is_zero(m2); // Returns: false\n * ```\n */\nexport function is_zero(id: PineMatrix<float>): bool {\n for (let i = 0; i < id.rows; i++) {\n for (let j = 0; j < id.columns; j++) {\n if (id.data[i]![j] !== 0) {\n return false;\n }\n }\n }\n return true;\n}\n\n/**\n * Test if matrix is binary\n *\n * The function determines if the matrix is binary (when all elements are 0 or 1).\n *\n * @param id - Matrix object to test (int/float)\n * @returns true if the matrix is binary, false otherwise\n *\n * @example\n * ```typescript\n * // Create a binary matrix\n * const m1 = matrix.new_matrix(2, 2, 0);\n * matrix.set(m1, 0, 0, 1);\n * matrix.set(m1, 1, 1, 1);\n * const isBinary1 = matrix.is_binary(m1); // Returns: true\n *\n * // Create a non-binary matrix\n * const m2 = matrix.new_matrix(2, 2, 0);\n * matrix.set(m2, 0, 0, 2);\n * const isBinary2 = matrix.is_binary(m2); // Returns: false\n * ```\n */\nexport function is_binary(id: PineMatrix<float>): bool {\n for (let i = 0; i < id.rows; i++) {\n for (let j = 0; j < id.columns; j++) {\n const val = id.data[i]![j];\n if (val !== 0 && val !== 1) {\n return false;\n }\n }\n }\n return true;\n}\n\n// ==========================================\n// Row/Column Operations\n// ==========================================\n\n/**\n * Add row to matrix\n *\n * Inserts a new row at the specified index of the matrix.\n *\n * @param id - A matrix object\n * @param row - Optional. The index of the new row. Must be a value from 0 to matrix.rows(id).\n * All existing rows with indices >= this value increase their index by one.\n * Default is matrix.rows(id) (append at end).\n * @param array_id - Optional. An array to use as the new row. If the matrix is empty, the array\n * can be of any size. Otherwise, its size must equal matrix.columns(id).\n * By default, inserts a row of undefined values.\n *\n * @remarks\n * Indexing of rows starts at zero.\n * Rather than add rows to an empty matrix, it is far more efficient to declare a matrix\n * with explicit dimensions and fill it with values.\n *\n * @example\n * ```typescript\n * // Create a 2x3 matrix with zeros\n * const m = matrix.new_matrix(2, 3, 0);\n *\n * // Add a row at the end with default values\n * matrix.add_row(m);\n *\n * // Add an array as the first row\n * const arr = [1, 2, 3];\n * matrix.add_row(m, 0, arr);\n * ```\n */\nexport function add_row<T>(id: PineMatrix<T>, row?: simple_int, array_id?: PineArray<T>): void {\n const insertIndex = row ?? id.rows;\n\n if (insertIndex < 0 || insertIndex > id.rows) {\n throw new Error(`Row index out of bounds: ${insertIndex} for matrix with ${id.rows} rows`);\n }\n\n let newRow: T[];\n\n if (array_id !== undefined) {\n // If matrix is not empty, array size must match columns\n if (id.columns > 0 && array_id.length !== id.columns) {\n throw new Error(`Array size ${array_id.length} does not match matrix columns ${id.columns}`);\n }\n newRow = [...array_id];\n // If matrix was empty, set columns based on array\n if (id.rows === 0 && id.columns === 0) {\n id.columns = array_id.length;\n }\n } else {\n // Create row with undefined values\n newRow = new Array(id.columns).fill(undefined) as T[];\n }\n\n // Insert row at specified index\n id.data.splice(insertIndex, 0, newRow);\n id.rows++;\n}\n\n/**\n * Add column to matrix\n *\n * Inserts a new column at the specified index of the matrix.\n *\n * @param id - A matrix object\n * @param column - Optional. The index of the new column. Must be a value from 0 to matrix.columns(id).\n * All existing columns with indices >= this value increase their index by one.\n * Default is matrix.columns(id) (append at end).\n * @param array_id - Optional. An array to use as the new column. If the matrix is empty, the array\n * can be of any size. Otherwise, its size must equal matrix.rows(id).\n * By default, inserts a column of undefined values.\n *\n * @remarks\n * Rather than add columns to an empty matrix, it is far more efficient to declare a matrix\n * with explicit dimensions and fill it with values. Adding a column is also much slower\n * than adding a row with matrix.add_row().\n *\n * @example\n * ```typescript\n * // Create a 2x3 matrix with zeros\n * const m = matrix.new_matrix(2, 3, 0);\n *\n * // Add a column at the end with default values\n * matrix.add_col(m);\n *\n * // Add an array as the first column\n * const arr = [1, 2];\n * matrix.add_col(m, 0, arr);\n * ```\n */\nexport function add_col<T>(id: PineMatrix<T>, column?: simple_int, array_id?: PineArray<T>): void {\n const insertIndex = column ?? id.columns;\n\n if (insertIndex < 0 || insertIndex > id.columns) {\n throw new Error(`Column index out of bounds: ${insertIndex} for matrix with ${id.columns} columns`);\n }\n\n if (array_id !== undefined) {\n // If matrix is not empty, array size must match rows\n if (id.rows > 0 && array_id.length !== id.rows) {\n throw new Error(`Array size ${array_id.length} does not match matrix rows ${id.rows}`);\n }\n // If matrix was empty, set rows based on array and create empty rows\n if (id.rows === 0 && id.columns === 0) {\n id.rows = array_id.length;\n for (let i = 0; i < array_id.length; i++) {\n id.data.push([]);\n }\n }\n // Insert value at specified column index for each row\n for (let i = 0; i < id.rows; i++) {\n id.data[i]!.splice(insertIndex, 0, array_id[i]!);\n }\n } else {\n // Insert undefined value at specified column index for each row\n for (let i = 0; i < id.rows; i++) {\n id.data[i]!.splice(insertIndex, 0, undefined as T);\n }\n }\n\n id.columns++;\n}\n\n/**\n * Remove row from matrix\n *\n * Removes the row at the specified index and returns an array containing the removed row's values.\n *\n * @param id - A matrix object\n * @param row - Optional. The index of the row to be deleted.\n * Default is matrix.rows(id) - 1 (last row).\n * @returns An array containing the elements of the removed row\n *\n * @remarks\n * Indexing of rows starts at zero.\n * It is far more efficient to declare matrices with explicit dimensions than to build them\n * by adding or removing rows.\n *\n * @example\n * ```typescript\n * // Create a 2x2 matrix\n * const m = matrix.new_matrix(2, 2, 1);\n * matrix.set(m, 0, 1, 2);\n * matrix.set(m, 1, 0, 3);\n * matrix.set(m, 1, 1, 4);\n *\n * // Remove the first row\n * const arr = matrix.remove_row(m, 0); // Returns: [1, 2]\n * // Matrix now has 1 row\n * ```\n */\nexport function remove_row<T>(id: PineMatrix<T>, row?: simple_int): PineArray<T> {\n const removeIndex = row ?? (id.rows - 1);\n\n if (removeIndex < 0 || removeIndex >= id.rows) {\n throw new Error(`Row index out of bounds: ${removeIndex} for matrix with ${id.rows} rows`);\n }\n\n const removedRow = id.data.splice(removeIndex, 1)[0]!;\n id.rows--;\n\n return removedRow as PineArray<T>;\n}\n\n/**\n * Remove column from matrix\n *\n * Removes the column at the specified index and returns an array containing the removed column's values.\n *\n * @param id - A matrix object\n * @param column - Optional. The index of the column to be removed.\n * Default is matrix.columns(id) - 1 (last column).\n * @returns An array containing the elements of the removed column\n *\n * @remarks\n * Indexing of columns starts at zero.\n * It is far more efficient to declare matrices with explicit dimensions than to build them\n * by adding or removing columns. Deleting a column is also much slower than deleting a row\n * with matrix.remove_row().\n *\n * @example\n * ```typescript\n * // Create a 2x2 matrix\n * const m = matrix.new_matrix(2, 2, 1);\n * matrix.set(m, 0, 1, 2);\n * matrix.set(m, 1, 0, 3);\n * matrix.set(m, 1, 1, 4);\n *\n * // Remove the first column\n * const arr = matrix.remove_col(m, 0); // Returns: [1, 3]\n * // Matrix now has 1 column\n * ```\n */\nexport function remove_col<T>(id: PineMatrix<T>, column?: simple_int): PineArray<T> {\n const removeIndex = column ?? (id.columns - 1);\n\n if (removeIndex < 0 || removeIndex >= id.columns) {\n throw new Error(`Column index out of bounds: ${removeIndex} for matrix with ${id.columns} columns`);\n }\n\n const removedCol: T[] = [];\n for (let i = 0; i < id.rows; i++) {\n removedCol.push(id.data[i]!.splice(removeIndex, 1)[0]!);\n }\n id.columns--;\n\n return removedCol as PineArray<T>;\n}\n\n/**\n * Swap two rows\n *\n * Swaps the rows at the index row1 and row2 in the matrix.\n *\n * @param id - A matrix object\n * @param row1 - Index of the first row to be swapped\n * @param row2 - Index of the second row to be swapped\n *\n * @remarks\n * Indexing of rows starts at zero.\n *\n * @example\n * ```typescript\n * // Create a 3x2 matrix\n * const m = matrix.new_matrix(3, 2, 0);\n * matrix.set(m, 0, 0, 1); matrix.set(m, 0, 1, 2);\n * matrix.set(m, 1, 0, 3); matrix.set(m, 1, 1, 4);\n * matrix.set(m, 2, 0, 5); matrix.set(m, 2, 1, 6);\n *\n * // Swap first and second rows\n * matrix.swap_rows(m, 0, 1);\n * // Now row 0 is [3, 4] and row 1 is [1, 2]\n * ```\n */\nexport function swap_rows<T>(id: PineMatrix<T>, row1: simple_int, row2: simple_int): void {\n if (row1 < 0 || row1 >= id.rows) {\n throw new Error(`Row1 index out of bounds: ${row1} for matrix with ${id.rows} rows`);\n }\n if (row2 < 0 || row2 >= id.rows) {\n throw new Error(`Row2 index out of bounds: ${row2} for matrix with ${id.rows} rows`);\n }\n\n const temp = id.data[row1]!;\n id.data[row1] = id.data[row2]!;\n id.data[row2] = temp;\n}\n\n/**\n * Swap two columns\n *\n * Swaps the columns at the index column1 and column2 in the matrix.\n *\n * @param id - A matrix object\n * @param column1 - Index of the first column to be swapped\n * @param column2 - Index of the second column to be swapped\n *\n * @remarks\n * Indexing of columns starts at zero.\n *\n * @example\n * ```typescript\n * // Create a 2x2 matrix\n * const m = matrix.new_matrix(2, 2, 0);\n * matrix.set(m, 0, 0, 1); matrix.set(m, 0, 1, 2);\n * matrix.set(m, 1, 0, 3); matrix.set(m, 1, 1, 4);\n *\n * // Swap first and second columns\n * matrix.swap_columns(m, 0, 1);\n * // Now column 0 is [2, 4] and column 1 is [1, 3]\n * ```\n */\nexport function swap_columns<T>(id: PineMatrix<T>, column1: simple_int, column2: simple_int): void {\n if (column1 < 0 || column1 >= id.columns) {\n throw new Error(`Column1 index out of bounds: ${column1} for matrix with ${id.columns} columns`);\n }\n if (column2 < 0 || column2 >= id.columns) {\n throw new Error(`Column2 index out of bounds: ${column2} for matrix with ${id.columns} columns`);\n }\n\n for (let i = 0; i < id.rows; i++) {\n const temp = id.data[i]![column1]!;\n id.data[i]![column1] = id.data[i]![column2]!;\n id.data[i]![column2] = temp;\n }\n}\n\n// ==========================================\n// Matrix Transformations\n// ==========================================\n\n/**\n * Matrix transpose\n *\n * Creates a new, transposed version of the matrix. This interchanges the row and column\n * index of each element.\n *\n * @param id - A matrix object\n * @returns A new matrix containing the transposed version\n *\n * @example\n * ```typescript\n * // Create a 2x3 matrix\n * const m1 = matrix.new_matrix(2, 3, 0);\n * matrix.set(m1, 0, 0, 1); matrix.set(m1, 0, 1, 2); matrix.set(m1, 0, 2, 3);\n * matrix.set(m1, 1, 0, 4); matrix.set(m1, 1, 1, 5); matrix.set(m1, 1, 2, 6);\n *\n * // Transpose to get a 3x2 matrix\n * const m2 = matrix.transpose(m1);\n * // m2 = [[1, 4], [2, 5], [3, 6]]\n * ```\n */\nexport function transpose<T>(id: PineMatrix<T>): PineMatrix<T> {\n const newData: T[][] = [];\n for (let j = 0; j < id.columns; j++) {\n const newRow: T[] = [];\n for (let i = 0; i < id.rows; i++) {\n newRow.push(id.data[i]![j]!);\n }\n newData.push(newRow);\n }\n return {\n rows: id.columns,\n columns: id.rows,\n data: newData\n };\n}\n\n/**\n * Concatenate matrices\n *\n * Appends the rows of m2 matrix to m1 matrix (vertical concatenation).\n *\n * @param id1 - Matrix object to concatenate into\n * @param id2 - Matrix object whose rows will be appended to id1\n * @returns Returns the id1 matrix concatenated with the id2 matrix\n *\n * @remarks\n * The number of columns in both matrices must be identical.\n *\n * @example\n * ```typescript\n * // Create two 2x4 matrices\n * const m1 = matrix.new_matrix(2, 4, 0);\n * const m2 = matrix.new_matrix(2, 4, 1);\n *\n * // Append m2 to m1\n * matrix.concat(m1, m2);\n * // m1 is now 4x4\n * ```\n */\nexport function concat<T>(id1: PineMatrix<T>, id2: PineMatrix<T>): PineMatrix<T> {\n if (id1.columns !== id2.columns) {\n throw new Error(`Column count mismatch: ${id1.columns} vs ${id2.columns}`);\n }\n\n // Append all rows from id2 to id1\n for (let i = 0; i < id2.rows; i++) {\n id1.data.push([...id2.data[i]!]);\n }\n id1.rows += id2.rows;\n\n return id1;\n}\n\n/**\n * Extract submatrix\n *\n * Extracts a submatrix from the matrix within the specified indices.\n *\n * @param id - A matrix object\n * @param from_row - Row index from which extraction begins (inclusive). Default: 0\n * @param to_row - Row index where extraction ends (exclusive). Default: matrix.rows(id)\n * @param from_column - Column index from which extraction begins (inclusive). Default: 0\n * @param to_column - Column index where extraction ends (exclusive). Default: matrix.columns(id)\n * @returns A new matrix object containing the submatrix\n *\n * @remarks\n * Indexing of rows and columns starts at zero.\n *\n * @example\n * ```typescript\n * // Create a 2x3 matrix\n * const m1 = matrix.new_matrix(2, 3, 0);\n * matrix.set(m1, 0, 0, 1); matrix.set(m1, 0, 1, 2); matrix.set(m1, 0, 2, 3);\n * matrix.set(m1, 1, 0, 4); matrix.set(m1, 1, 1, 5); matrix.set(m1, 1, 2, 6);\n *\n * // Extract a 2x2 submatrix (columns 1-2)\n * const m2 = matrix.submatrix(m1, 0, 2, 1, 3);\n * // m2 = [[2, 3], [5, 6]]\n * ```\n */\nexport function submatrix<T>(\n id: PineMatrix<T>,\n from_row: simple_int = 0,\n to_row?: simple_int,\n from_column: simple_int = 0,\n to_column?: simple_int\n): PineMatrix<T> {\n const endRow = to_row ?? id.rows;\n const endCol = to_column ?? id.columns;\n\n if (from_row < 0 || from_row > id.rows) {\n throw new Error(`from_row index out of bounds: ${from_row}`);\n }\n if (endRow < 0 || endRow > id.rows) {\n throw new Error(`to_row index out of bounds: ${endRow}`);\n }\n if (from_column < 0 || from_column > id.columns) {\n throw new Error(`from_column index out of bounds: ${from_column}`);\n }\n if (endCol < 0 || endCol > id.columns) {\n throw new Error(`to_column index out of bounds: ${endCol}`);\n }\n\n const newRows = endRow - from_row;\n const newCols = endCol - from_column;\n const newData: T[][] = [];\n\n for (let i = from_row; i < endRow; i++) {\n const newRow: T[] = [];\n for (let j = from_column; j < endCol; j++) {\n newRow.push(id.data[i]![j]!);\n }\n newData.push(newRow);\n }\n\n return {\n rows: newRows,\n columns: newCols,\n data: newData\n };\n}\n\n/**\n * Reshape matrix\n *\n * Rebuilds the matrix to new dimensions. The total number of elements must remain the same.\n *\n * @param id - A matrix object\n * @param rows - The number of rows of the reshaped matrix\n * @param columns - The number of columns of the reshaped matrix\n *\n * @remarks\n * The product of rows * columns must equal the current element count.\n * Elements are read row by row and placed in the new shape row by row.\n *\n * @example\n * ```typescript\n * // Create a 2x3 matrix\n * const m = matrix.new_matrix(2, 3, 0);\n * matrix.set(m, 0, 0, 1); matrix.set(m, 0, 1, 2); matrix.set(m, 0, 2, 3);\n * matrix.set(m, 1, 0, 4); matrix.set(m, 1, 1, 5); matrix.set(m, 1, 2, 6);\n *\n * // Reshape to 3x2\n * matrix.reshape(m, 3, 2);\n * // m = [[1, 2], [3, 4], [5, 6]]\n * ```\n */\nexport function reshape<T>(id: PineMatrix<T>, rows: simple_int, columns: simple_int): void {\n const totalElements = id.rows * id.columns;\n const newTotalElements = rows * columns;\n\n if (totalElements !== newTotalElements) {\n throw new Error(`Cannot reshape ${id.rows}x${id.columns} (${totalElements} elements) to ${rows}x${columns} (${newTotalElements} elements)`);\n }\n\n // Flatten the matrix\n const flat: T[] = [];\n for (let i = 0; i < id.rows; i++) {\n for (let j = 0; j < id.columns; j++) {\n flat.push(id.data[i]![j]!);\n }\n }\n\n // Rebuild with new dimensions\n const newData: T[][] = [];\n let index = 0;\n for (let i = 0; i < rows; i++) {\n const newRow: T[] = [];\n for (let j = 0; j < columns; j++) {\n newRow.push(flat[index++]!);\n }\n newData.push(newRow);\n }\n\n id.rows = rows;\n id.columns = columns;\n id.data = newData;\n}\n\n/**\n * Reverse matrix\n *\n * Reverses the order of rows and columns in the matrix. The first row and first column\n * become the last, and the last become the first.\n *\n * @param id - A matrix object\n *\n * @remarks\n * This modifies the matrix in place. Both rows and columns are reversed.\n *\n * @example\n * ```typescript\n * // Create a 2x2 matrix\n * const m = matrix.new_matrix(2, 2, 0);\n * matrix.set(m, 0, 0, 1); matrix.set(m, 0, 1, 2);\n * matrix.set(m, 1, 0, 3); matrix.set(m, 1, 1, 4);\n *\n * // Reverse the matrix\n * matrix.reverse(m);\n * // m = [[4, 3], [2, 1]]\n * ```\n */\nexport function reverse<T>(id: PineMatrix<T>): void {\n // Reverse the order of rows\n id.data.reverse();\n // Reverse each row (columns)\n for (let i = 0; i < id.rows; i++) {\n id.data[i]!.reverse();\n }\n}\n\n/**\n * Sort matrix by column\n *\n * Rearranges the rows in the matrix following the sorted order of values in the specified column.\n *\n * @param id - A matrix object to be sorted\n * @param column - Index of the column whose values determine the new order of rows. Default: 0\n * @param order - The sort order: 'ascending' or 'descending'. Default: 'ascending'\n *\n * @remarks\n * This modifies the matrix in place.\n *\n * @example\n * ```typescript\n * // Create a 2x2 matrix\n * const m = matrix.new_matrix(2, 2, 0);\n * matrix.set(m, 0, 0, 3); matrix.set(m, 0, 1, 4);\n * matrix.set(m, 1, 0, 1); matrix.set(m, 1, 1, 2);\n *\n * // Sort by first column (ascending)\n * matrix.sort(m);\n * // m = [[1, 2], [3, 4]]\n * ```\n */\nexport function sort<T extends number | string>(id: PineMatrix<T>, column: simple_int = 0, order: 'ascending' | 'descending' = 'ascending'): void {\n if (column < 0 || column >= id.columns) {\n throw new Error(`Column index out of bounds: ${column} for matrix with ${id.columns} columns`);\n }\n\n id.data.sort((a, b) => {\n const valA = a[column]!;\n const valB = b[column]!;\n if (typeof valA === 'number' && typeof valB === 'number') {\n return order === 'ascending' ? valA - valB : valB - valA;\n }\n // String comparison\n if (order === 'ascending') {\n return valA < valB ? -1 : valA > valB ? 1 : 0;\n } else {\n return valB < valA ? -1 : valB > valA ? 1 : 0;\n }\n });\n}\n\n// ==========================================\n// Element-wise Arithmetic\n// ==========================================\n\n/**\n * Matrix addition (sum)\n *\n * Returns a new matrix resulting from the element-wise sum of two matrices,\n * or of a matrix and a scalar.\n *\n * @param id1 - First matrix object\n * @param id2 - Second matrix object, or scalar value\n * @returns A new matrix containing the sum\n *\n * @remarks\n * When adding two matrices, they must have the same dimensions.\n *\n * @example\n * ```typescript\n * // Sum of two matrices\n * const m1 = matrix.new_matrix(2, 3, 5);\n * const m2 = matrix.new_matrix(2, 3, 4);\n * const m3 = matrix.sum(m1, m2); // All elements are 9\n *\n * // Sum of matrix and scalar\n * const m4 = matrix.new_matrix(2, 3, 4);\n * const m5 = matrix.sum(m4, 1); // All elements are 5\n * ```\n */\nexport function sum(id1: PineMatrix<float>, id2: PineMatrix<float> | float): PineMatrix<float> {\n const newData: float[][] = [];\n\n if (typeof id2 === 'number') {\n // Add scalar to each element\n for (let i = 0; i < id1.rows; i++) {\n const newRow: float[] = [];\n for (let j = 0; j < id1.columns; j++) {\n newRow.push(id1.data[i]![j]! + id2);\n }\n newData.push(newRow);\n }\n return {\n rows: id1.rows,\n columns: id1.columns,\n data: newData\n };\n } else {\n // Add two matrices element-wise\n if (id1.rows !== id2.rows || id1.columns !== id2.columns) {\n throw new Error(`Matrix dimensions must match: ${id1.rows}x${id1.columns} vs ${id2.rows}x${id2.columns}`);\n }\n\n for (let i = 0; i < id1.rows; i++) {\n const newRow: float[] = [];\n for (let j = 0; j < id1.columns; j++) {\n newRow.push(id1.data[i]![j]! + id2.data[i]![j]!);\n }\n newData.push(newRow);\n }\n return {\n rows: id1.rows,\n columns: id1.columns,\n data: newData\n };\n }\n}\n\n/**\n * Matrix subtraction (diff)\n *\n * Returns a new matrix resulting from the element-wise subtraction between two matrices,\n * or of a matrix and a scalar.\n *\n * @param id1 - Matrix to subtract from\n * @param id2 - Matrix object or scalar value to be subtracted\n * @returns A new matrix containing the difference\n *\n * @remarks\n * When subtracting two matrices, they must have the same dimensions.\n *\n * @example\n * ```typescript\n * // Difference between two matrices\n * const m1 = matrix.new_matrix(2, 3, 5);\n * const m2 = matrix.new_matrix(2, 3, 4);\n * const m3 = matrix.diff(m1, m2); // All elements are 1\n *\n * // Difference between matrix and scalar\n * const m4 = matrix.new_matrix(2, 3, 4);\n * const m5 = matrix.diff(m4, 1); // All elements are 3\n * ```\n */\nexport function diff(id1: PineMatrix<float>, id2: PineMatrix<float> | float): PineMatrix<float> {\n const newData: float[][] = [];\n\n if (typeof id2 === 'number') {\n // Subtract scalar from each element\n for (let i = 0; i < id1.rows; i++) {\n const newRow: float[] = [];\n for (let j = 0; j < id1.columns; j++) {\n newRow.push(id1.data[i]![j]! - id2);\n }\n newData.push(newRow);\n }\n return {\n rows: id1.rows,\n columns: id1.columns,\n data: newData\n };\n } else {\n // Subtract two matrices element-wise\n if (id1.rows !== id2.rows || id1.columns !== id2.columns) {\n throw new Error(`Matrix dimensions must match: ${id1.rows}x${id1.columns} vs ${id2.rows}x${id2.columns}`);\n }\n\n for (let i = 0; i < id1.rows; i++) {\n const newRow: float[] = [];\n for (let j = 0; j < id1.columns; j++) {\n newRow.push(id1.data[i]![j]! - id2.data[i]![j]!);\n }\n newData.push(newRow);\n }\n return {\n rows: id1.rows,\n columns: id1.columns,\n data: newData\n };\n }\n}\n\n// ==========================================\n// Statistical Functions\n// ==========================================\n\n/**\n * Average of all elements\n *\n * Calculates the average of all elements in the matrix.\n *\n * @param id - A matrix object\n * @returns The average value from the matrix\n *\n * @example\n * ```typescript\n * // Create a 2x2 matrix\n * const m = matrix.new_matrix(2, 2, 0);\n * matrix.set(m, 0, 0, 1); matrix.set(m, 0, 1, 2);\n * matrix.set(m, 1, 0, 3); matrix.set(m, 1, 1, 4);\n *\n * const avg = matrix.avg(m); // Returns: 2.5\n * ```\n */\nexport function avg(id: PineMatrix<float>): float {\n if (id.rows === 0 || id.columns === 0) {\n return NaN;\n }\n\n let total = 0;\n let count = 0;\n for (let i = 0; i < id.rows; i++) {\n for (let j = 0; j < id.columns; j++) {\n const val = id.data[i]![j];\n if (val !== null && val !== undefined && !isNaN(val)) {\n total += val;\n count++;\n }\n }\n }\n\n return count === 0 ? NaN : total / count;\n}\n\n/**\n * Minimum element\n *\n * Returns the smallest value from the matrix elements.\n *\n * @param id - A matrix object\n * @returns The smallest value from the matrix\n *\n * @example\n * ```typescript\n * // Create a 2x2 matrix\n * const m = matrix.new_matrix(2, 2, 0);\n * matrix.set(m, 0, 0, 1); matrix.set(m, 0, 1, 2);\n * matrix.set(m, 1, 0, 3); matrix.set(m, 1, 1, 4);\n *\n * const minVal = matrix.min(m); // Returns: 1\n * ```\n */\nexport function min(id: PineMatrix<float>): float {\n if (id.rows === 0 || id.columns === 0) {\n return NaN;\n }\n\n let minVal = Infinity;\n for (let i = 0; i < id.rows; i++) {\n for (let j = 0; j < id.columns; j++) {\n const val = id.data[i]![j];\n if (val !== null && val !== undefined && !isNaN(val) && val < minVal) {\n minVal = val;\n }\n }\n }\n\n return minVal === Infinity ? NaN : minVal;\n}\n\n/**\n * Maximum element\n *\n * Returns the largest value from the matrix elements.\n *\n * @param id - A matrix object\n * @returns The largest value from the matrix\n *\n * @example\n * ```typescript\n * // Create a 2x2 matrix\n * const m = matrix.new_matrix(2, 2, 0);\n * matrix.set(m, 0, 0, 1); matrix.set(m, 0, 1, 2);\n * matrix.set(m, 1, 0, 3); matrix.set(m, 1, 1, 4);\n *\n * const maxVal = matrix.max(m); // Returns: 4\n * ```\n */\nexport function max(id: PineMatrix<float>): float {\n if (id.rows === 0 || id.columns === 0) {\n return NaN;\n }\n\n let maxVal = -Infinity;\n for (let i = 0; i < id.rows; i++) {\n for (let j = 0; j < id.columns; j++) {\n const val = id.data[i]![j];\n if (val !== null && val !== undefined && !isNaN(val) && val > maxVal) {\n maxVal = val;\n }\n }\n }\n\n return maxVal === -Infinity ? NaN : maxVal;\n}\n\n/**\n * Median element\n *\n * Calculates the median (\"the middle\" value) of matrix elements.\n *\n * @param id - A matrix object\n * @returns The median value from the matrix\n *\n * @remarks\n * NA elements of the matrix are not considered when calculating the median.\n *\n * @example\n * ```typescript\n * // Create a 2x2 matrix\n * const m = matrix.new_matrix(2, 2, 0);\n * matrix.set(m, 0, 0, 1); matrix.set(m, 0, 1, 2);\n * matrix.set(m, 1, 0, 3); matrix.set(m, 1, 1, 4);\n *\n * const medianVal = matrix.median(m); // Returns: 2.5\n * ```\n */\nexport function median(id: PineMatrix<float>): float {\n if (id.rows === 0 || id.columns === 0) {\n return NaN;\n }\n\n // Flatten and filter out NaN/null/undefined\n const values: float[] = [];\n for (let i = 0; i < id.rows; i++) {\n for (let j = 0; j < id.columns; j++) {\n const val = id.data[i]![j];\n if (val !== null && val !== undefined && !isNaN(val)) {\n values.push(val);\n }\n }\n }\n\n if (values.length === 0) {\n return NaN;\n }\n\n values.sort((a, b) => a - b);\n const mid = Math.floor(values.length / 2);\n\n if (values.length % 2 === 0) {\n return (values[mid - 1]! + values[mid]!) / 2;\n } else {\n return values[mid]!;\n }\n}\n\n/**\n * Mode (most frequent element)\n *\n * Calculates the mode of the matrix, which is the most frequently occurring value.\n * When there are multiple values occurring equally frequently, returns the smallest.\n *\n * @param id - A matrix object\n * @returns The most frequently occurring value, or the smallest if tie\n *\n * @remarks\n * NA elements of the matrix are not considered when calculating the mode.\n *\n * @example\n * ```typescript\n * // Create a 2x2 matrix\n * const m = matrix.new_matrix(2, 2, 0);\n * matrix.set(m, 0, 0, 0); matrix.set(m, 0, 1, 0);\n * matrix.set(m, 1, 0, 1); matrix.set(m, 1, 1, 1);\n *\n * const modeVal = matrix.mode(m); // Returns: 0 (tie, so smallest)\n * ```\n */\nexport function mode(id: PineMatrix<float>): float {\n if (id.rows === 0 || id.columns === 0) {\n return NaN;\n }\n\n const frequency = new Map<float, int>();\n let maxFreq = 0;\n let modeValue: float = NaN;\n\n for (let i = 0; i < id.rows; i++) {\n for (let j = 0; j < id.columns; j++) {\n const val = id.data[i]![j];\n if (val !== null && val !== undefined && !isNaN(val)) {\n const freq = (frequency.get(val) || 0) + 1;\n frequency.set(val, freq);\n\n // Update mode if higher frequency, or same frequency but smaller value\n if (freq > maxFreq || (freq === maxFreq && val < modeValue)) {\n maxFreq = freq;\n modeValue = val;\n }\n }\n }\n }\n\n return modeValue;\n}\n\n/**\n * Matrix trace\n *\n * Calculates the trace of a matrix (the sum of the main diagonal's elements).\n *\n * @param id - A matrix object (must be square)\n * @returns The trace of the matrix\n *\n * @remarks\n * The matrix must be square. Throws an error for non-square matrices.\n *\n * @example\n * ```typescript\n * // Create a 2x2 matrix\n * const m = matrix.new_matrix(2, 2, 0);\n * matrix.set(m, 0, 0, 1); matrix.set(m, 0, 1, 2);\n * matrix.set(m, 1, 0, 3); matrix.set(m, 1, 1, 4);\n *\n * const tr = matrix.trace(m); // Returns: 5 (1 + 4)\n * ```\n */\nexport function trace(id: PineMatrix<float>): float {\n if (!is_square(id)) {\n throw new Error(`Matrix must be square for trace calculation: ${id.rows}x${id.columns}`);\n }\n\n if (id.rows === 0) {\n return 0;\n }\n\n let sum = 0;\n for (let i = 0; i < id.rows; i++) {\n const val = id.data[i]![i];\n if (val !== null && val !== undefined && !isNaN(val)) {\n sum += val;\n }\n }\n\n return sum;\n}\n\n// ==========================================\n// Boolean Checks\n// ==========================================\n\n/**\n * Test if diagonal matrix\n *\n * Determines if the matrix is diagonal (all elements outside the main diagonal are zero).\n *\n * @param id - Matrix object to test\n * @returns true if the matrix is diagonal, false otherwise\n *\n * @remarks\n * Returns false with non-square matrices.\n *\n * @example\n * ```typescript\n * // Create a diagonal matrix\n * const m = matrix.new_matrix(3, 3, 0);\n * matrix.set(m, 0, 0, 1);\n * matrix.set(m, 1, 1, 2);\n * matrix.set(m, 2, 2, 3);\n *\n * const isDiag = matrix.is_diagonal(m); // Returns: true\n * ```\n */\nexport function is_diagonal(id: PineMatrix<float>): bool {\n if (!is_square(id)) {\n return false;\n }\n\n for (let i = 0; i < id.rows; i++) {\n for (let j = 0; j < id.columns; j++) {\n if (i !== j && id.data[i]![j] !== 0) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * Test if identity matrix\n *\n * Determines if a matrix is an identity matrix (elements with ones on the main diagonal\n * and zeros elsewhere).\n *\n * @param id - Matrix object to test\n * @returns true if id is an identity matrix, false otherwise\n *\n * @remarks\n * Returns false with non-square matrices.\n *\n * @example\n * ```typescript\n * // Create an identity matrix\n * const m = matrix.new_matrix(3, 3, 0);\n * matrix.set(m, 0, 0, 1);\n * matrix.set(m, 1, 1, 1);\n * matrix.set(m, 2, 2, 1);\n *\n * const isIdent = matrix.is_identity(m); // Returns: true\n * ```\n */\nexport function is_identity(id: PineMatrix<float>): bool {\n if (!is_square(id)) {\n return false;\n }\n\n for (let i = 0; i < id.rows; i++) {\n for (let j = 0; j < id.columns; j++) {\n const val = id.data[i]![j];\n if (i === j) {\n if (val !== 1) {\n return false;\n }\n } else {\n if (val !== 0) {\n return false;\n }\n }\n }\n }\n\n return true;\n}\n\n/**\n * Test if symmetric matrix\n *\n * Determines if a square matrix is symmetric (elements are symmetric with respect\n * to the main diagonal, i.e., matrix equals its transpose).\n *\n * @param id - Matrix object to test\n * @returns true if the matrix is symmetric, false otherwise\n *\n * @remarks\n * Returns false with non-square matrices.\n *\n * @example\n * ```typescript\n * // Create a symmetric matrix\n * const m = matrix.new_matrix(3, 3, 0);\n * matrix.set(m, 0, 0, 1); matrix.set(m, 0, 1, 2); matrix.set(m, 0, 2, 3);\n * matrix.set(m, 1, 0, 2); matrix.set(m, 1, 1, 4); matrix.set(m, 1, 2, 5);\n * matrix.set(m, 2, 0, 3); matrix.set(m, 2, 1, 5); matrix.set(m, 2, 2, 6);\n *\n * const isSym = matrix.is_symmetric(m); // Returns: true\n * ```\n */\nexport function is_symmetric(id: PineMatrix<float>): bool {\n if (!is_square(id)) {\n return false;\n }\n\n for (let i = 0; i < id.rows; i++) {\n for (let j = i + 1; j < id.columns; j++) {\n if (id.data[i]![j] !== id.data[j]![i]) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * Test if antisymmetric (skew-symmetric) matrix\n *\n * Determines if a matrix is antisymmetric (its transpose equals its negative).\n * A[i][j] = -A[j][i] for all i, j, and diagonal elements must be 0.\n *\n * @param id - Matrix object to test\n * @returns true if the matrix is antisymmetric, false otherwise\n *\n * @remarks\n * Returns false with non-square matrices.\n *\n * @example\n * ```typescript\n * // Create an antisymmetric matrix\n * const m = matrix.new_matrix(3, 3, 0);\n * matrix.set(m, 0, 1, 2); matrix.set(m, 0, 2, -1);\n * matrix.set(m, 1, 0, -2); matrix.set(m, 1, 2, 3);\n * matrix.set(m, 2, 0, 1); matrix.set(m, 2, 1, -3);\n *\n * const isAntiSym = matrix.is_antisymmetric(m); // Returns: true\n * ```\n */\nexport function is_antisymmetric(id: PineMatrix<float>): bool {\n if (!is_square(id)) {\n return false;\n }\n\n for (let i = 0; i < id.rows; i++) {\n // Diagonal elements must be 0\n if (id.data[i]![i] !== 0) {\n return false;\n }\n\n for (let j = i + 1; j < id.columns; j++) {\n const upperVal = id.data[i]![j]!;\n const lowerVal = id.data[j]![i]!;\n if (upperVal !== -lowerVal) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * Test if triangular matrix\n *\n * Determines if the matrix is triangular (if all elements above or below the main\n * diagonal are zero).\n *\n * @param id - Matrix object to test\n * @returns true if the matrix is triangular (upper or lower), false otherwise\n *\n * @remarks\n * Returns false with non-square matrices.\n * Returns true if the matrix is either upper triangular or lower triangular.\n *\n * @example\n * ```typescript\n * // Create an upper triangular matrix\n * const m = matrix.new_matrix(3, 3, 0);\n * matrix.set(m, 0, 0, 1); matrix.set(m, 0, 1, 2); matrix.set(m, 0, 2, 3);\n * matrix.set(m, 1, 1, 4); matrix.set(m, 1, 2, 5);\n * matrix.set(m, 2, 2, 6);\n *\n * const isTri = matrix.is_triangular(m); // Returns: true\n * ```\n */\nexport function is_triangular(id: PineMatrix<float>): bool {\n if (!is_square(id)) {\n return false;\n }\n\n // Check if upper triangular (all elements below diagonal are 0)\n let isUpper = true;\n for (let i = 1; i < id.rows && isUpper; i++) {\n for (let j = 0; j < i && isUpper; j++) {\n if (id.data[i]![j] !== 0) {\n isUpper = false;\n }\n }\n }\n\n if (isUpper) {\n return true;\n }\n\n // Check if lower triangular (all elements above diagonal are 0)\n let isLower = true;\n for (let i = 0; i < id.rows - 1 && isLower; i++) {\n for (let j = i + 1; j < id.columns && isLower; j++) {\n if (id.data[i]![j] !== 0) {\n isLower = false;\n }\n }\n }\n\n return isLower;\n}\n\n/**\n * Test if antidiagonal matrix\n *\n * Determines if the matrix is anti-diagonal (all elements outside the secondary\n * diagonal are zero).\n *\n * @param id - Matrix object to test\n * @returns true if the matrix is anti-diagonal, false otherwise\n *\n * @remarks\n * Returns false with non-square matrices.\n * The anti-diagonal runs from top-right to bottom-left.\n *\n * @example\n * ```typescript\n * // Create an antidiagonal matrix\n * const m = matrix.new_matrix(3, 3, 0);\n * matrix.set(m, 0, 2, 1);\n * matrix.set(m, 1, 1, 2);\n * matrix.set(m, 2, 0, 3);\n *\n * const isAntiDiag = matrix.is_antidiagonal(m); // Returns: true\n * ```\n */\nexport function is_antidiagonal(id: PineMatrix<float>): bool {\n if (!is_square(id)) {\n return false;\n }\n\n const n = id.rows;\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n // Anti-diagonal position: i + j === n - 1\n const isAntiDiag = (i + j === n - 1);\n if (!isAntiDiag && id.data[i]![j] !== 0) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * Test if stochastic matrix\n *\n * Determines if the matrix is stochastic (all elements are non-negative and all\n * row sums equal 1).\n *\n * @param id - Matrix object to test\n * @returns true if the matrix is stochastic, false otherwise\n *\n * @remarks\n * A right stochastic matrix has rows that sum to 1.\n *\n * @example\n * ```typescript\n * // Create a stochastic matrix\n * const m = matrix.new_matrix(2, 2, 0);\n * matrix.set(m, 0, 0, 0.5); matrix.set(m, 0, 1, 0.5);\n * matrix.set(m, 1, 0, 0.3); matrix.set(m, 1, 1, 0.7);\n *\n * const isStoch = matrix.is_stochastic(m); // Returns: true\n * ```\n */\nexport function is_stochastic(id: PineMatrix<float>): bool {\n if (id.rows === 0 || id.columns === 0) {\n return false;\n }\n\n const tolerance = 1e-10;\n\n for (let i = 0; i < id.rows; i++) {\n let rowSum = 0;\n for (let j = 0; j < id.columns; j++) {\n const val = id.data[i]![j]!;\n // All elements must be non-negative\n if (val < 0) {\n return false;\n }\n rowSum += val;\n }\n // Row sum must equal 1 (with tolerance for floating point errors)\n if (Math.abs(rowSum - 1) > tolerance) {\n return false;\n }\n }\n\n return true;\n}\n\n// ==========================================\n// Linear Algebra Functions (Phase 3)\n// ==========================================\n\n/**\n * Epsilon for floating-point comparisons\n */\nconst EPSILON = 1e-10;\n\n/**\n * Helper: Create identity matrix of given size\n */\nfunction createIdentity(n: simple_int): PineMatrix<float> {\n const m = new_matrix<float>(n, n, 0);\n for (let i = 0; i < n; i++) {\n m.data[i]![i] = 1;\n }\n return m;\n}\n\n/**\n * Matrix multiplication\n *\n * Returns a new matrix resulting from the product between two matrices,\n * or between a matrix and a scalar, or between a matrix and a vector (array).\n *\n * @param id1 - First matrix object\n * @param id2 - Second matrix object, scalar value, or array (vector)\n * @returns A new matrix containing the product, or array for matrix \u00D7 vector\n *\n * @remarks\n * For matrix \u00D7 matrix: id1's columns must equal id2's rows.\n * For matrix \u00D7 vector: the array length must equal id1's columns.\n * Time complexity: O(n\u00B3) for n\u00D7n matrices.\n *\n * @example\n * ```typescript\n * // Product of two matrices\n * const m1 = matrix.new_matrix(6, 2, 5);\n * const m2 = matrix.new_matrix(2, 3, 4);\n * const m3 = matrix.mult(m1, m2); // 6x3 matrix with values 40\n *\n * // Product of matrix and scalar\n * const m4 = matrix.new_matrix(2, 3, 4);\n * const m5 = matrix.mult(m4, 5); // All elements are 20\n *\n * // Product of matrix and vector\n * const m6 = matrix.new_matrix(2, 3, 4);\n * const arr = [1, 1, 1];\n * const result = matrix.mult(m6, arr); // [12, 12]\n * ```\n */\nexport function mult(id1: PineMatrix<float>, id2: PineMatrix<float> | float | PineArray<float>): PineMatrix<float> | PineArray<float> {\n // Matrix \u00D7 Scalar\n if (typeof id2 === 'number') {\n const newData: float[][] = [];\n for (let i = 0; i < id1.rows; i++) {\n const newRow: float[] = [];\n for (let j = 0; j < id1.columns; j++) {\n newRow.push(id1.data[i]![j]! * id2);\n }\n newData.push(newRow);\n }\n return {\n rows: id1.rows,\n columns: id1.columns,\n data: newData\n };\n }\n\n // Matrix \u00D7 Vector (array)\n if (Array.isArray(id2) && !('rows' in id2)) {\n const vec = id2 as float[];\n if (vec.length !== id1.columns) {\n throw new Error(`Vector length ${vec.length} must equal matrix columns ${id1.columns}`);\n }\n const result: float[] = [];\n for (let i = 0; i < id1.rows; i++) {\n let sum = 0;\n for (let j = 0; j < id1.columns; j++) {\n sum += id1.data[i]![j]! * vec[j]!;\n }\n result.push(sum);\n }\n return result as PineArray<float>;\n }\n\n // Matrix \u00D7 Matrix\n const m2 = id2 as PineMatrix<float>;\n if (id1.columns !== m2.rows) {\n throw new Error(`Matrix multiplication dimension mismatch: ${id1.rows}x${id1.columns} \u00D7 ${m2.rows}x${m2.columns}. First matrix columns (${id1.columns}) must equal second matrix rows (${m2.rows})`);\n }\n\n const newRows = id1.rows;\n const newCols = m2.columns;\n const newData: float[][] = [];\n\n for (let i = 0; i < newRows; i++) {\n const newRow: float[] = [];\n for (let j = 0; j < newCols; j++) {\n let sum = 0;\n for (let k = 0; k < id1.columns; k++) {\n sum += id1.data[i]![k]! * m2.data[k]![j]!;\n }\n newRow.push(sum);\n }\n newData.push(newRow);\n }\n\n return {\n rows: newRows,\n columns: newCols,\n data: newData\n };\n}\n\n/**\n * Matrix power\n *\n * Calculates the product of the matrix by itself 'power' times.\n * Uses repeated squaring for efficiency: O(n\u00B3 log p) for n\u00D7n matrix and power p.\n *\n * @param id - A matrix object (must be square)\n * @param power - The number of times the matrix will be multiplied by itself\n * @returns A new matrix that is id raised to the specified power\n *\n * @remarks\n * The matrix must be square.\n * power=0 returns the identity matrix.\n * Negative powers compute the inverse first, then raise to the positive power.\n *\n * @example\n * ```typescript\n * // Create a 2x2 matrix\n * const m1 = matrix.new_matrix(2, 2, 2);\n * // Calculate the power of three\n * const m2 = matrix.pow(m1, 3);\n * // m2 = m1 \u00D7 m1 \u00D7 m1\n * ```\n */\nexport function pow(id: PineMatrix<float>, power: int): PineMatrix<float> {\n if (!is_square(id)) {\n throw new Error(`Matrix must be square for power calculation: ${id.rows}x${id.columns}`);\n }\n\n const n = id.rows;\n\n // Handle power = 0: return identity matrix\n if (power === 0) {\n return createIdentity(n);\n }\n\n // Handle negative powers: compute inverse then raise to positive power\n let base: PineMatrix<float>;\n let p = power;\n if (power < 0) {\n const inverse = inv(id);\n if (inverse === null) {\n throw new Error('Cannot compute negative power of singular matrix');\n }\n base = inverse;\n p = -power;\n } else {\n base = copy(id);\n }\n\n // Repeated squaring algorithm\n let result = createIdentity(n);\n\n while (p > 0) {\n if (p % 2 === 1) {\n result = mult(result, base) as PineMatrix<float>;\n }\n base = mult(base, base) as PineMatrix<float>;\n p = Math.floor(p / 2);\n }\n\n return result;\n}\n\n/**\n * Matrix determinant\n *\n * Computes the determinant of a square matrix using LU decomposition\n * with partial pivoting.\n *\n * @param id - A matrix object (must be square)\n * @returns The determinant value\n *\n * @remarks\n * Function calculation based on the LU decomposition algorithm.\n * Time complexity: O(n\u00B3)\n *\n * @example\n * ```typescript\n * // Create a 2x2 matrix\n * const m = matrix.new_matrix(2, 2, NaN);\n * matrix.set(m, 0, 0, 3);\n * matrix.set(m, 0, 1, 7);\n * matrix.set(m, 1, 0, 1);\n * matrix.set(m, 1, 1, -4);\n *\n * const d = matrix.det(m); // Returns: -19\n * ```\n */\nexport function det(id: PineMatrix<float>): float {\n if (!is_square(id)) {\n throw new Error(`Matrix must be square for determinant calculation: ${id.rows}x${id.columns}`);\n }\n\n const n = id.rows;\n\n if (n === 0) {\n return 1; // Empty matrix has determinant 1 by convention\n }\n\n if (n === 1) {\n return id.data[0]![0]!;\n }\n\n if (n === 2) {\n return id.data[0]![0]! * id.data[1]![1]! - id.data[0]![1]! * id.data[1]![0]!;\n }\n\n // LU decomposition with partial pivoting\n // Make a copy to work with\n const a: float[][] = id.data.map(row => [...row]);\n let determinant = 1;\n let swapCount = 0;\n\n for (let col = 0; col < n; col++) {\n // Find pivot (partial pivoting)\n let maxRow = col;\n let maxVal = Math.abs(a[col]![col]!);\n for (let row = col + 1; row < n; row++) {\n const absVal = Math.abs(a[row]![col]!);\n if (absVal > maxVal) {\n maxVal = absVal;\n maxRow = row;\n }\n }\n\n // Swap rows if needed\n if (maxRow !== col) {\n const temp = a[col]!;\n a[col] = a[maxRow]!;\n a[maxRow] = temp;\n swapCount++;\n }\n\n // If pivot is zero, determinant is zero\n const pivot = a[col]![col]!;\n if (Math.abs(pivot) < EPSILON) {\n return 0;\n }\n\n determinant *= pivot;\n\n // Eliminate below pivot\n for (let row = col + 1; row < n; row++) {\n const factor = a[row]![col]! / pivot;\n for (let j = col; j < n; j++) {\n a[row]![j] = a[row]![j]! - factor * a[col]![j]!;\n }\n }\n }\n\n // Adjust sign based on row swaps\n if (swapCount % 2 === 1) {\n determinant = -determinant;\n }\n\n return determinant;\n}\n\n/**\n * Matrix inverse\n *\n * Computes the inverse of a square matrix using Gauss-Jordan elimination\n * with partial pivoting.\n *\n * @param id - A matrix object (must be square and non-singular)\n * @returns A new matrix that is the inverse, or null if singular\n *\n * @remarks\n * Function calculation based on the LU decomposition algorithm.\n * Returns null for singular matrices (det = 0).\n * Time complexity: O(n\u00B3)\n *\n * @example\n * ```typescript\n * // Create a 2x2 matrix\n * const m1 = matrix.new_matrix(2, 2, NaN);\n * matrix.set(m1, 0, 0, 1);\n * matrix.set(m1, 0, 1, 2);\n * matrix.set(m1, 1, 0, 3);\n * matrix.set(m1, 1, 1, 4);\n *\n * const m2 = matrix.inv(m1);\n * // m2 = [[-2, 1], [1.5, -0.5]]\n * ```\n */\nexport function inv(id: PineMatrix<float>): PineMatrix<float> | null {\n if (!is_square(id)) {\n throw new Error(`Matrix must be square for inverse calculation: ${id.rows}x${id.columns}`);\n }\n\n const n = id.rows;\n\n if (n === 0) {\n return new_matrix<float>(0, 0, 0);\n }\n\n // Create augmented matrix [A | I]\n const aug: float[][] = [];\n for (let i = 0; i < n; i++) {\n const row: float[] = [];\n for (let j = 0; j < n; j++) {\n row.push(id.data[i]![j]!);\n }\n for (let j = 0; j < n; j++) {\n row.push(i === j ? 1 : 0);\n }\n aug.push(row);\n }\n\n // Gauss-Jordan elimination with partial pivoting\n for (let col = 0; col < n; col++) {\n // Find pivot\n let maxRow = col;\n let maxVal = Math.abs(aug[col]![col]!);\n for (let row = col + 1; row < n; row++) {\n const absVal = Math.abs(aug[row]![col]!);\n if (absVal > maxVal) {\n maxVal = absVal;\n maxRow = row;\n }\n }\n\n // Swap rows if needed\n if (maxRow !== col) {\n const temp = aug[col]!;\n aug[col] = aug[maxRow]!;\n aug[maxRow] = temp;\n }\n\n // Check for singular matrix\n const pivot = aug[col]![col]!;\n if (Math.abs(pivot) < EPSILON) {\n return null; // Singular matrix\n }\n\n // Scale pivot row\n for (let j = 0; j < 2 * n; j++) {\n aug[col]![j] = aug[col]![j]! / pivot;\n }\n\n // Eliminate column in all other rows\n for (let row = 0; row < n; row++) {\n if (row !== col) {\n const factor = aug[row]![col]!;\n for (let j = 0; j < 2 * n; j++) {\n aug[row]![j] = aug[row]![j]! - factor * aug[col]![j]!;\n }\n }\n }\n }\n\n // Extract inverse from augmented matrix\n const inverse: float[][] = [];\n for (let i = 0; i < n; i++) {\n const row: float[] = [];\n for (let j = 0; j < n; j++) {\n row.push(aug[i]![n + j]!);\n }\n inverse.push(row);\n }\n\n return {\n rows: n,\n columns: n,\n data: inverse\n };\n}\n\n/**\n * Matrix pseudo-inverse (Moore-Penrose)\n *\n * Computes the pseudo-inverse of a matrix. For non-singular square matrices,\n * this returns the same result as inv().\n *\n * @param id - A matrix object (can be any shape)\n * @returns A new matrix containing the pseudo-inverse\n *\n * @remarks\n * Uses the formula: A\u207A = (A\u1D40A)\u207B\u00B9A\u1D40 for full column rank matrices,\n * or A\u1D40(AA\u1D40)\u207B\u00B9 for full row rank matrices.\n * For singular matrices, uses iterative refinement approach.\n *\n * @example\n * ```typescript\n * // Create a 2x2 matrix\n * const m1 = matrix.new_matrix(2, 2, NaN);\n * matrix.set(m1, 0, 0, 1);\n * matrix.set(m1, 0, 1, 2);\n * matrix.set(m1, 1, 0, 3);\n * matrix.set(m1, 1, 1, 4);\n *\n * const m2 = matrix.pinv(m1);\n * ```\n */\nexport function pinv(id: PineMatrix<float>): PineMatrix<float> {\n const m = id.rows;\n const n = id.columns;\n\n if (m === 0 || n === 0) {\n return new_matrix<float>(n, m, 0);\n }\n\n // For square non-singular matrices, use regular inverse\n if (m === n) {\n const inverse = inv(id);\n if (inverse !== null) {\n return inverse;\n }\n }\n\n const At = transpose(id);\n\n // If matrix has more rows than columns (m >= n), use (A\u1D40A)\u207B\u00B9A\u1D40\n if (m >= n) {\n const AtA = mult(At, id) as PineMatrix<float>;\n const AtA_inv = inv(AtA);\n if (AtA_inv !== null) {\n return mult(AtA_inv, At) as PineMatrix<float>;\n }\n }\n\n // If matrix has more columns than rows (n > m), use A\u1D40(AA\u1D40)\u207B\u00B9\n const AAt = mult(id, At) as PineMatrix<float>;\n const AAt_inv = inv(AAt);\n if (AAt_inv !== null) {\n return mult(At, AAt_inv) as PineMatrix<float>;\n }\n\n // Fallback: Use regularization for rank-deficient matrices\n // Add small regularization term: (A\u1D40A + \u03BBI)\u207B\u00B9A\u1D40\n const lambda = 1e-10;\n const AtA = mult(At, id) as PineMatrix<float>;\n\n // Add regularization\n for (let i = 0; i < AtA.rows; i++) {\n AtA.data[i]![i] = AtA.data[i]![i]! + lambda;\n }\n\n const AtA_inv = inv(AtA);\n if (AtA_inv !== null) {\n return mult(AtA_inv, At) as PineMatrix<float>;\n }\n\n // If all else fails, return zero matrix of appropriate dimensions\n return new_matrix<float>(n, m, 0);\n}\n\n/**\n * Matrix rank\n *\n * Calculates the rank of a matrix (number of linearly independent rows/columns)\n * using Gaussian elimination to row echelon form.\n *\n * @param id - A matrix object\n * @returns The rank of the matrix\n *\n * @remarks\n * Uses row reduction with partial pivoting.\n * Time complexity: O(n\u00B3)\n *\n * @example\n * ```typescript\n * // Create a 2x2 matrix\n * const m1 = matrix.new_matrix(2, 2, NaN);\n * matrix.set(m1, 0, 0, 1);\n * matrix.set(m1, 0, 1, 2);\n * matrix.set(m1, 1, 0, 3);\n * matrix.set(m1, 1, 1, 4);\n *\n * const r = matrix.rank(m1); // Returns: 2\n * ```\n */\nexport function rank(id: PineMatrix<float>): int {\n if (id.rows === 0 || id.columns === 0) {\n return 0;\n }\n\n // Make a copy to work with\n const a: float[][] = id.data.map(row => [...row]);\n const m = id.rows;\n const n = id.columns;\n\n let r = 0; // Current rank (and current pivot row)\n\n for (let col = 0; col < n && r < m; col++) {\n // Find pivot\n let maxRow = r;\n let maxVal = Math.abs(a[r]![col]!);\n for (let row = r + 1; row < m; row++) {\n const absVal = Math.abs(a[row]![col]!);\n if (absVal > maxVal) {\n maxVal = absVal;\n maxRow = row;\n }\n }\n\n // Skip column if all values below are effectively zero\n if (maxVal < EPSILON) {\n continue;\n }\n\n // Swap rows if needed\n if (maxRow !== r) {\n const temp = a[r]!;\n a[r] = a[maxRow]!;\n a[maxRow] = temp;\n }\n\n // Eliminate below pivot\n const pivot = a[r]![col]!;\n for (let row = r + 1; row < m; row++) {\n const factor = a[row]![col]! / pivot;\n for (let j = col; j < n; j++) {\n a[row]![j] = a[row]![j]! - factor * a[r]![j]!;\n }\n }\n\n r++;\n }\n\n return r;\n}\n\n/**\n * Matrix eigenvalues\n *\n * Computes the eigenvalues of a square matrix using the QR algorithm.\n *\n * @param id - A matrix object (must be square)\n * @returns An array containing the eigenvalues\n *\n * @remarks\n * Uses the Implicit QL Algorithm with shifts.\n * For non-symmetric matrices, only real eigenvalues are returned accurately.\n * Complex eigenvalues return their real part for 2x2 matrices.\n * Time complexity: O(n\u00B3) per iteration, typically converges in O(n) iterations.\n *\n * @example\n * ```typescript\n * // Create a 2x2 matrix\n * const m1 = matrix.new_matrix(2, 2, NaN);\n * matrix.set(m1, 0, 0, 2);\n * matrix.set(m1, 0, 1, 4);\n * matrix.set(m1, 1, 0, 6);\n * matrix.set(m1, 1, 1, 8);\n *\n * const ev = matrix.eigenvalues(m1); // Returns eigenvalues\n * ```\n */\nexport function eigenvalues(id: PineMatrix<float>): PineArray<float> {\n if (!is_square(id)) {\n throw new Error(`Matrix must be square for eigenvalue calculation: ${id.rows}x${id.columns}`);\n }\n\n const n = id.rows;\n\n if (n === 0) {\n return [] as PineArray<float>;\n }\n\n if (n === 1) {\n return [id.data[0]![0]!] as PineArray<float>;\n }\n\n // For 2x2 matrices, use quadratic formula\n if (n === 2) {\n const a = id.data[0]![0]!;\n const b = id.data[0]![1]!;\n const c = id.data[1]![0]!;\n const d = id.data[1]![1]!;\n\n // Characteristic polynomial: \u03BB\u00B2 - (a+d)\u03BB + (ad-bc) = 0\n const trace = a + d;\n const determinant = a * d - b * c;\n const discriminant = trace * trace - 4 * determinant;\n\n if (discriminant >= 0) {\n const sqrtDisc = Math.sqrt(discriminant);\n return [(trace + sqrtDisc) / 2, (trace - sqrtDisc) / 2] as PineArray<float>;\n } else {\n // Complex eigenvalues - return real parts\n return [trace / 2, trace / 2] as PineArray<float>;\n }\n }\n\n // For larger matrices, use QR algorithm\n // First, reduce to Hessenberg form (more efficient for QR)\n const h = toHessenberg(id);\n const result = qrAlgorithm(h, 100); // Max 100 iterations\n\n return result as PineArray<float>;\n}\n\n/**\n * Helper: Convert matrix to upper Hessenberg form\n */\nfunction toHessenberg(m: PineMatrix<float>): PineMatrix<float> {\n const n = m.rows;\n const h: float[][] = m.data.map(row => [...row]);\n\n for (let k = 0; k < n - 2; k++) {\n // Find the largest element in column k below diagonal\n let maxVal = 0;\n for (let i = k + 1; i < n; i++) {\n maxVal = Math.max(maxVal, Math.abs(h[i]![k]!));\n }\n\n if (maxVal < EPSILON) continue;\n\n // Compute Householder vector\n let sigma = 0;\n for (let i = k + 1; i < n; i++) {\n sigma += h[i]![k]! * h[i]![k]!;\n }\n sigma = Math.sqrt(sigma);\n\n if (h[k + 1]![k]! < 0) sigma = -sigma;\n\n const u: float[] = new Array(n).fill(0);\n u[k + 1] = h[k + 1]![k]! + sigma;\n for (let i = k + 2; i < n; i++) {\n u[i] = h[i]![k]!;\n }\n\n let uTu = 0;\n for (let i = k + 1; i < n; i++) {\n uTu += u[i]! * u[i]!;\n }\n\n if (uTu < EPSILON) continue;\n\n // Apply H = I - 2*u*u'/u'u from left and right\n // H * A\n for (let j = k; j < n; j++) {\n let dot = 0;\n for (let i = k + 1; i < n; i++) {\n dot += u[i]! * h[i]![j]!;\n }\n const factor = 2 * dot / uTu;\n for (let i = k + 1; i < n; i++) {\n h[i]![j] = h[i]![j]! - factor * u[i]!;\n }\n }\n\n // A * H\n for (let i = 0; i < n; i++) {\n let dot = 0;\n for (let j = k + 1; j < n; j++) {\n dot += h[i]![j]! * u[j]!;\n }\n const factor = 2 * dot / uTu;\n for (let j = k + 1; j < n; j++) {\n h[i]![j] = h[i]![j]! - factor * u[j]!;\n }\n }\n }\n\n return { rows: n, columns: n, data: h };\n}\n\n/**\n * Helper: QR algorithm for eigenvalues\n */\nfunction qrAlgorithm(h: PineMatrix<float>, maxIter: int): float[] {\n const n = h.rows;\n const a: float[][] = h.data.map(row => [...row]);\n const eigenvals: float[] = [];\n\n let remaining = n;\n\n for (let iter = 0; iter < maxIter && remaining > 1; iter++) {\n // Check for convergence (subdiagonal element near zero)\n let converged = false;\n for (let i = remaining - 1; i >= 1; i--) {\n if (Math.abs(a[i]![i - 1]!) < EPSILON * (Math.abs(a[i - 1]![i - 1]!) + Math.abs(a[i]![i]!))) {\n a[i]![i - 1] = 0;\n if (i === remaining - 1) {\n eigenvals.push(a[remaining - 1]![remaining - 1]!);\n remaining--;\n converged = true;\n break;\n }\n }\n }\n\n if (converged) continue;\n if (remaining <= 1) break;\n\n // Wilkinson shift\n const d = (a[remaining - 2]![remaining - 2]! - a[remaining - 1]![remaining - 1]!) / 2;\n const sign = d >= 0 ? 1 : -1;\n const mu = a[remaining - 1]![remaining - 1]! -\n sign * a[remaining - 1]![remaining - 2]! * a[remaining - 1]![remaining - 2]! /\n (Math.abs(d) + Math.sqrt(d * d + a[remaining - 1]![remaining - 2]! * a[remaining - 1]![remaining - 2]!));\n\n // QR step with shift\n let x = a[0]![0]! - mu;\n let z = a[1]![0]!;\n\n for (let k = 0; k < remaining - 1; k++) {\n // Givens rotation\n let r = Math.sqrt(x * x + z * z);\n if (r < EPSILON) {\n r = EPSILON;\n }\n const c = x / r;\n const s = z / r;\n\n // Apply rotation from left\n for (let j = Math.max(0, k - 1); j < remaining; j++) {\n const temp = c * a[k]![j]! + s * a[k + 1]![j]!;\n a[k + 1]![j] = -s * a[k]![j]! + c * a[k + 1]![j]!;\n a[k]![j] = temp;\n }\n\n // Apply rotation from right\n for (let i = 0; i < Math.min(k + 3, remaining); i++) {\n const temp = c * a[i]![k]! + s * a[i]![k + 1]!;\n a[i]![k + 1] = -s * a[i]![k]! + c * a[i]![k + 1]!;\n a[i]![k] = temp;\n }\n\n if (k < remaining - 2) {\n x = a[k + 1]![k]!;\n z = a[k + 2]![k]!;\n }\n }\n }\n\n // Extract remaining eigenvalues from diagonal\n for (let i = 0; i < remaining; i++) {\n eigenvals.push(a[i]![i]!);\n }\n\n // Sort eigenvalues in descending order by absolute value\n eigenvals.sort((a, b) => Math.abs(b) - Math.abs(a));\n\n return eigenvals;\n}\n\n/**\n * Matrix eigenvectors\n *\n * Returns a matrix of eigenvectors, where each column is an eigenvector\n * corresponding to an eigenvalue.\n *\n * @param id - A matrix object (must be square)\n * @returns A new matrix where columns are eigenvectors\n *\n * @remarks\n * Uses inverse iteration method to compute eigenvectors from eigenvalues.\n * Eigenvectors are normalized to unit length.\n * Time complexity: O(n\u00B3)\n *\n * @example\n * ```typescript\n * // Create a 2x2 matrix\n * const m1 = matrix.new_matrix(2, 2, 1);\n * matrix.set(m1, 0, 0, 2);\n * matrix.set(m1, 0, 1, 4);\n * matrix.set(m1, 1, 0, 6);\n * matrix.set(m1, 1, 1, 8);\n *\n * const evecs = matrix.eigenvectors(m1);\n * // Each column is an eigenvector\n * ```\n */\nexport function eigenvectors(id: PineMatrix<float>): PineMatrix<float> {\n if (!is_square(id)) {\n throw new Error(`Matrix must be square for eigenvector calculation: ${id.rows}x${id.columns}`);\n }\n\n const n = id.rows;\n\n if (n === 0) {\n return new_matrix<float>(0, 0, 0);\n }\n\n // Get eigenvalues first\n const evals = eigenvalues(id);\n\n // For each eigenvalue, compute eigenvector using inverse iteration\n const vectors: float[][] = [];\n\n for (let i = 0; i < n; i++) {\n const lambda = evals[i]!;\n const vec = inverseIteration(id, lambda);\n vectors.push(vec);\n }\n\n // Transpose to get eigenvectors as columns\n const result: float[][] = [];\n for (let i = 0; i < n; i++) {\n const row: float[] = [];\n for (let j = 0; j < n; j++) {\n row.push(vectors[j]![i]!);\n }\n result.push(row);\n }\n\n return {\n rows: n,\n columns: n,\n data: result\n };\n}\n\n/**\n * Helper: Inverse iteration for eigenvector computation\n */\nfunction inverseIteration(m: PineMatrix<float>, lambda: float): float[] {\n const n = m.rows;\n\n // Create (A - \u03BBI)\n const shifted: float[][] = m.data.map((row, i) =>\n row.map((val, j) => i === j ? val - lambda : val)\n );\n\n // Add small perturbation to avoid singular matrix\n for (let i = 0; i < n; i++) {\n if (Math.abs(shifted[i]![i]!) < EPSILON) {\n shifted[i]![i] = EPSILON;\n }\n }\n\n // Initialize random vector\n let v: float[] = new Array(n).fill(1);\n\n // Iterate\n for (let iter = 0; iter < 50; iter++) {\n // Solve (A - \u03BBI) * w = v using LU decomposition\n const w = solveLinearSystem(shifted, v);\n\n // Normalize\n let norm = 0;\n for (let i = 0; i < n; i++) {\n norm += w[i]! * w[i]!;\n }\n norm = Math.sqrt(norm);\n\n if (norm < EPSILON) {\n return v;\n }\n\n const newV: float[] = [];\n for (let i = 0; i < n; i++) {\n newV.push(w[i]! / norm);\n }\n\n // Check convergence\n let diff = 0;\n for (let i = 0; i < n; i++) {\n diff += Math.abs(Math.abs(newV[i]!) - Math.abs(v[i]!));\n }\n\n v = newV;\n\n if (diff < EPSILON) {\n break;\n }\n }\n\n return v;\n}\n\n/**\n * Helper: Solve linear system Ax = b using Gaussian elimination\n */\nfunction solveLinearSystem(a: float[][], b: float[]): float[] {\n const n = a.length;\n\n // Create augmented matrix\n const aug: float[][] = a.map((row, i) => [...row, b[i]!]);\n\n // Forward elimination with partial pivoting\n for (let col = 0; col < n; col++) {\n // Find pivot\n let maxRow = col;\n let maxVal = Math.abs(aug[col]![col]!);\n for (let row = col + 1; row < n; row++) {\n const absVal = Math.abs(aug[row]![col]!);\n if (absVal > maxVal) {\n maxVal = absVal;\n maxRow = row;\n }\n }\n\n // Swap rows\n if (maxRow !== col) {\n const temp = aug[col]!;\n aug[col] = aug[maxRow]!;\n aug[maxRow] = temp;\n }\n\n const pivot = aug[col]![col]!;\n if (Math.abs(pivot) < EPSILON) {\n continue;\n }\n\n // Eliminate\n for (let row = col + 1; row < n; row++) {\n const factor = aug[row]![col]! / pivot;\n for (let j = col; j <= n; j++) {\n aug[row]![j] = aug[row]![j]! - factor * aug[col]![j]!;\n }\n }\n }\n\n // Back substitution\n const x: float[] = new Array(n).fill(0);\n for (let i = n - 1; i >= 0; i--) {\n let sum = aug[i]![n]!;\n for (let j = i + 1; j < n; j++) {\n sum -= aug[i]![j]! * x[j]!;\n }\n const diag = aug[i]![i]!;\n x[i] = Math.abs(diag) < EPSILON ? 0 : sum / diag;\n }\n\n return x;\n}\n\n/**\n * Kronecker product\n *\n * Computes the Kronecker (tensor) product of two matrices.\n * Each element of id1 is multiplied by the entire id2 matrix.\n *\n * @param id1 - First matrix object\n * @param id2 - Second matrix object\n * @returns A new matrix containing the Kronecker product\n *\n * @remarks\n * Result size: (m\u2081\u00D7m\u2082) rows by (n\u2081\u00D7n\u2082) columns.\n * Time complexity: O(m\u2081\u00D7m\u2082\u00D7n\u2081\u00D7n\u2082)\n *\n * @example\n * ```typescript\n * // Create two 2x2 matrices\n * const m1 = matrix.new_matrix(2, 2, 1);\n * const m2 = matrix.new_matrix(2, 2, 2);\n *\n * const m3 = matrix.kron(m1, m2);\n * // Result is a 4x4 matrix\n * ```\n */\nexport function kron(id1: PineMatrix<float>, id2: PineMatrix<float>): PineMatrix<float> {\n const m1 = id1.rows;\n const n1 = id1.columns;\n const m2 = id2.rows;\n const n2 = id2.columns;\n\n const resultRows = m1 * m2;\n const resultCols = n1 * n2;\n const data: float[][] = [];\n\n for (let i = 0; i < resultRows; i++) {\n data.push(new Array(resultCols).fill(0));\n }\n\n for (let i1 = 0; i1 < m1; i1++) {\n for (let j1 = 0; j1 < n1; j1++) {\n const a = id1.data[i1]![j1]!;\n for (let i2 = 0; i2 < m2; i2++) {\n for (let j2 = 0; j2 < n2; j2++) {\n const row = i1 * m2 + i2;\n const col = j1 * n2 + j2;\n data[row]![col] = a * id2.data[i2]![j2]!;\n }\n }\n }\n }\n\n return {\n rows: resultRows,\n columns: resultCols,\n data\n };\n}\n\n/**\n * Create matrix of user-defined type\n *\n * Creates a new matrix that can hold user-defined types.\n * This is a placeholder that functions identically to new_matrix() for now,\n * as JavaScript doesn't have the same type system as PineScript.\n *\n * @param rows - Initial row count\n * @param columns - Initial column count\n * @param initial_value - Initial value for all elements\n * @returns A new matrix object\n *\n * @remarks\n * In PineScript, this is used for matrices containing user-defined types (UDTs).\n * In JavaScript, this behaves the same as new_matrix() since type handling\n * is done at runtime.\n *\n * @example\n * ```typescript\n * // Create a 2x2 matrix that could hold any type\n * const m = matrix.newtype(2, 2, { name: 'default', value: 0 });\n * ```\n */\nexport function newtype<T>(\n rows: simple_int = 0,\n columns: simple_int = 0,\n initial_value?: T\n): PineMatrix<T> {\n return new_matrix(rows, columns, initial_value);\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBO,SAAS,WACdA,OACAC,UACA,eACe;AACf,QAAM,OAAc,CAAC;AACrB,WAAS,IAAI,GAAG,IAAID,OAAM,KAAK;AAC7B,UAAME,OAAW,CAAC;AAClB,aAAS,IAAI,GAAG,IAAID,UAAS,KAAK;AAChC,MAAAC,KAAI,KAAK,aAAkB;AAAA,IAC7B;AACA,SAAK,KAAKA,IAAG;AAAA,EACf;AACA,SAAO,EAAE,MAAAF,OAAM,SAAAC,UAAS,KAAK;AAC/B;AAwBO,SAAS,IAAO,IAAmBC,MAAiB,QAAuB;AAChF,MAAIA,OAAM,KAAKA,QAAO,GAAG,QAAQ,SAAS,KAAK,UAAU,GAAG,SAAS;AACnE,UAAM,IAAI,MAAM,gCAAgCA,IAAG,KAAK,MAAM,yBAAyB,GAAG,IAAI,KAAK,GAAG,OAAO,GAAG;AAAA,EAClH;AACA,SAAO,GAAG,KAAKA,IAAG,EAAG,MAAM;AAC7B;AA0BO,SAAS,IAAO,IAAmBA,MAAiB,QAAoB,OAAgB;AAC7F,MAAIA,OAAM,KAAKA,QAAO,GAAG,QAAQ,SAAS,KAAK,UAAU,GAAG,SAAS;AACnE,UAAM,IAAI,MAAM,gCAAgCA,IAAG,KAAK,MAAM,yBAAyB,GAAG,IAAI,KAAK,GAAG,OAAO,GAAG;AAAA,EAClH;AACA,KAAG,KAAKA,IAAG,EAAG,MAAM,IAAI;AAC1B;AAmBO,SAAS,KAAQ,IAAwB;AAC9C,SAAO,GAAG;AACZ;AAmBO,SAAS,QAAW,IAAwB;AACjD,SAAO,GAAG;AACZ;AAmBO,SAAS,eAAkB,IAAwB;AACxD,SAAO,GAAG,OAAO,GAAG;AACtB;AA2BO,SAAS,IAAO,IAAmB,WAAqC;AAC7E,MAAI,YAAY,KAAK,aAAa,GAAG,MAAM;AACzC,UAAM,IAAI,MAAM,4BAA4B,SAAS,oBAAoB,GAAG,IAAI,OAAO;AAAA,EACzF;AACA,SAAO,CAAC,GAAG,GAAG,KAAK,SAAS,CAAE;AAChC;AA2BO,SAAS,IAAO,IAAmB,cAAwC;AAChF,MAAI,eAAe,KAAK,gBAAgB,GAAG,SAAS;AAClD,UAAM,IAAI,MAAM,+BAA+B,YAAY,oBAAoB,GAAG,OAAO,UAAU;AAAA,EACrG;AACA,SAAO,GAAG,KAAK,IAAI,OAAK,EAAE,YAAY,CAAE;AAC1C;AA4BO,SAAS,KAAQ,IAAkC;AACxD,QAAM,UAAiB,GAAG,KAAK,IAAI,OAAK,CAAC,GAAG,CAAC,CAAC;AAC9C,SAAO;AAAA,IACL,MAAM,GAAG;AAAA,IACT,SAAS,GAAG;AAAA,IACZ,MAAM;AAAA,EACR;AACF;AA2BO,SAAS,KACd,IACA,OACA,WAAuB,GACvB,QACA,cAA0B,GAC1B,WACM;AACN,QAAM,SAAS,UAAU,GAAG;AAC5B,QAAM,SAAS,aAAa,GAAG;AAE/B,WAAS,IAAI,UAAU,IAAI,QAAQ,KAAK;AACtC,aAAS,IAAI,aAAa,IAAI,QAAQ,KAAK;AACzC,SAAG,KAAK,CAAC,EAAG,CAAC,IAAI;AAAA,IACnB;AAAA,EACF;AACF;AAqBO,SAAS,UAAa,IAAyB;AACpD,SAAO,GAAG,SAAS,GAAG;AACxB;AAsBO,SAAS,QAAQ,IAA6B;AACnD,WAAS,IAAI,GAAG,IAAI,GAAG,MAAM,KAAK;AAChC,aAAS,IAAI,GAAG,IAAI,GAAG,SAAS,KAAK;AACnC,UAAI,GAAG,KAAK,CAAC,EAAG,CAAC,MAAM,GAAG;AACxB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAwBO,SAAS,UAAU,IAA6B;AACrD,WAAS,IAAI,GAAG,IAAI,GAAG,MAAM,KAAK;AAChC,aAAS,IAAI,GAAG,IAAI,GAAG,SAAS,KAAK;AACnC,YAAM,MAAM,GAAG,KAAK,CAAC,EAAG,CAAC;AACzB,UAAI,QAAQ,KAAK,QAAQ,GAAG;AAC1B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAqCO,SAAS,QAAW,IAAmBA,MAAkB,UAA+B;AAC7F,QAAM,cAAcA,QAAO,GAAG;AAE9B,MAAI,cAAc,KAAK,cAAc,GAAG,MAAM;AAC5C,UAAM,IAAI,MAAM,4BAA4B,WAAW,oBAAoB,GAAG,IAAI,OAAO;AAAA,EAC3F;AAEA,MAAI;AAEJ,MAAI,aAAa,QAAW;AAE1B,QAAI,GAAG,UAAU,KAAK,SAAS,WAAW,GAAG,SAAS;AACpD,YAAM,IAAI,MAAM,cAAc,SAAS,MAAM,kCAAkC,GAAG,OAAO,EAAE;AAAA,IAC7F;AACA,aAAS,CAAC,GAAG,QAAQ;AAErB,QAAI,GAAG,SAAS,KAAK,GAAG,YAAY,GAAG;AACrC,SAAG,UAAU,SAAS;AAAA,IACxB;AAAA,EACF,OAAO;AAEL,aAAS,IAAI,MAAM,GAAG,OAAO,EAAE,KAAK,MAAS;AAAA,EAC/C;AAGA,KAAG,KAAK,OAAO,aAAa,GAAG,MAAM;AACrC,KAAG;AACL;AAiCO,SAAS,QAAW,IAAmB,QAAqB,UAA+B;AAChG,QAAM,cAAc,UAAU,GAAG;AAEjC,MAAI,cAAc,KAAK,cAAc,GAAG,SAAS;AAC/C,UAAM,IAAI,MAAM,+BAA+B,WAAW,oBAAoB,GAAG,OAAO,UAAU;AAAA,EACpG;AAEA,MAAI,aAAa,QAAW;AAE1B,QAAI,GAAG,OAAO,KAAK,SAAS,WAAW,GAAG,MAAM;AAC9C,YAAM,IAAI,MAAM,cAAc,SAAS,MAAM,+BAA+B,GAAG,IAAI,EAAE;AAAA,IACvF;AAEA,QAAI,GAAG,SAAS,KAAK,GAAG,YAAY,GAAG;AACrC,SAAG,OAAO,SAAS;AACnB,eAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,WAAG,KAAK,KAAK,CAAC,CAAC;AAAA,MACjB;AAAA,IACF;AAEA,aAAS,IAAI,GAAG,IAAI,GAAG,MAAM,KAAK;AAChC,SAAG,KAAK,CAAC,EAAG,OAAO,aAAa,GAAG,SAAS,CAAC,CAAE;AAAA,IACjD;AAAA,EACF,OAAO;AAEL,aAAS,IAAI,GAAG,IAAI,GAAG,MAAM,KAAK;AAChC,SAAG,KAAK,CAAC,EAAG,OAAO,aAAa,GAAG,MAAc;AAAA,IACnD;AAAA,EACF;AAEA,KAAG;AACL;AA8BO,SAAS,WAAc,IAAmBA,MAAgC;AAC/E,QAAM,cAAcA,QAAQ,GAAG,OAAO;AAEtC,MAAI,cAAc,KAAK,eAAe,GAAG,MAAM;AAC7C,UAAM,IAAI,MAAM,4BAA4B,WAAW,oBAAoB,GAAG,IAAI,OAAO;AAAA,EAC3F;AAEA,QAAM,aAAa,GAAG,KAAK,OAAO,aAAa,CAAC,EAAE,CAAC;AACnD,KAAG;AAEH,SAAO;AACT;AA+BO,SAAS,WAAc,IAAmB,QAAmC;AAClF,QAAM,cAAc,UAAW,GAAG,UAAU;AAE5C,MAAI,cAAc,KAAK,eAAe,GAAG,SAAS;AAChD,UAAM,IAAI,MAAM,+BAA+B,WAAW,oBAAoB,GAAG,OAAO,UAAU;AAAA,EACpG;AAEA,QAAM,aAAkB,CAAC;AACzB,WAAS,IAAI,GAAG,IAAI,GAAG,MAAM,KAAK;AAChC,eAAW,KAAK,GAAG,KAAK,CAAC,EAAG,OAAO,aAAa,CAAC,EAAE,CAAC,CAAE;AAAA,EACxD;AACA,KAAG;AAEH,SAAO;AACT;AA2BO,SAAS,UAAa,IAAmB,MAAkB,MAAwB;AACxF,MAAI,OAAO,KAAK,QAAQ,GAAG,MAAM;AAC/B,UAAM,IAAI,MAAM,6BAA6B,IAAI,oBAAoB,GAAG,IAAI,OAAO;AAAA,EACrF;AACA,MAAI,OAAO,KAAK,QAAQ,GAAG,MAAM;AAC/B,UAAM,IAAI,MAAM,6BAA6B,IAAI,oBAAoB,GAAG,IAAI,OAAO;AAAA,EACrF;AAEA,QAAM,OAAO,GAAG,KAAK,IAAI;AACzB,KAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI;AAC5B,KAAG,KAAK,IAAI,IAAI;AAClB;AA0BO,SAAS,aAAgB,IAAmB,SAAqB,SAA2B;AACjG,MAAI,UAAU,KAAK,WAAW,GAAG,SAAS;AACxC,UAAM,IAAI,MAAM,gCAAgC,OAAO,oBAAoB,GAAG,OAAO,UAAU;AAAA,EACjG;AACA,MAAI,UAAU,KAAK,WAAW,GAAG,SAAS;AACxC,UAAM,IAAI,MAAM,gCAAgC,OAAO,oBAAoB,GAAG,OAAO,UAAU;AAAA,EACjG;AAEA,WAAS,IAAI,GAAG,IAAI,GAAG,MAAM,KAAK;AAChC,UAAM,OAAO,GAAG,KAAK,CAAC,EAAG,OAAO;AAChC,OAAG,KAAK,CAAC,EAAG,OAAO,IAAI,GAAG,KAAK,CAAC,EAAG,OAAO;AAC1C,OAAG,KAAK,CAAC,EAAG,OAAO,IAAI;AAAA,EACzB;AACF;AA2BO,SAAS,UAAa,IAAkC;AAC7D,QAAM,UAAiB,CAAC;AACxB,WAAS,IAAI,GAAG,IAAI,GAAG,SAAS,KAAK;AACnC,UAAM,SAAc,CAAC;AACrB,aAAS,IAAI,GAAG,IAAI,GAAG,MAAM,KAAK;AAChC,aAAO,KAAK,GAAG,KAAK,CAAC,EAAG,CAAC,CAAE;AAAA,IAC7B;AACA,YAAQ,KAAK,MAAM;AAAA,EACrB;AACA,SAAO;AAAA,IACL,MAAM,GAAG;AAAA,IACT,SAAS,GAAG;AAAA,IACZ,MAAM;AAAA,EACR;AACF;AAyBO,SAAS,OAAU,KAAoB,KAAmC;AAC/E,MAAI,IAAI,YAAY,IAAI,SAAS;AAC/B,UAAM,IAAI,MAAM,0BAA0B,IAAI,OAAO,OAAO,IAAI,OAAO,EAAE;AAAA,EAC3E;AAGA,WAAS,IAAI,GAAG,IAAI,IAAI,MAAM,KAAK;AACjC,QAAI,KAAK,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,CAAE,CAAC;AAAA,EACjC;AACA,MAAI,QAAQ,IAAI;AAEhB,SAAO;AACT;AA6BO,SAAS,UACd,IACA,WAAuB,GACvB,QACA,cAA0B,GAC1B,WACe;AACf,QAAM,SAAS,UAAU,GAAG;AAC5B,QAAM,SAAS,aAAa,GAAG;AAE/B,MAAI,WAAW,KAAK,WAAW,GAAG,MAAM;AACtC,UAAM,IAAI,MAAM,iCAAiC,QAAQ,EAAE;AAAA,EAC7D;AACA,MAAI,SAAS,KAAK,SAAS,GAAG,MAAM;AAClC,UAAM,IAAI,MAAM,+BAA+B,MAAM,EAAE;AAAA,EACzD;AACA,MAAI,cAAc,KAAK,cAAc,GAAG,SAAS;AAC/C,UAAM,IAAI,MAAM,oCAAoC,WAAW,EAAE;AAAA,EACnE;AACA,MAAI,SAAS,KAAK,SAAS,GAAG,SAAS;AACrC,UAAM,IAAI,MAAM,kCAAkC,MAAM,EAAE;AAAA,EAC5D;AAEA,QAAM,UAAU,SAAS;AACzB,QAAM,UAAU,SAAS;AACzB,QAAM,UAAiB,CAAC;AAExB,WAAS,IAAI,UAAU,IAAI,QAAQ,KAAK;AACtC,UAAM,SAAc,CAAC;AACrB,aAAS,IAAI,aAAa,IAAI,QAAQ,KAAK;AACzC,aAAO,KAAK,GAAG,KAAK,CAAC,EAAG,CAAC,CAAE;AAAA,IAC7B;AACA,YAAQ,KAAK,MAAM;AAAA,EACrB;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AACF;AA2BO,SAAS,QAAW,IAAmBF,OAAkBC,UAA2B;AACzF,QAAM,gBAAgB,GAAG,OAAO,GAAG;AACnC,QAAM,mBAAmBD,QAAOC;AAEhC,MAAI,kBAAkB,kBAAkB;AACtC,UAAM,IAAI,MAAM,kBAAkB,GAAG,IAAI,IAAI,GAAG,OAAO,KAAK,aAAa,iBAAiBD,KAAI,IAAIC,QAAO,KAAK,gBAAgB,YAAY;AAAA,EAC5I;AAGA,QAAM,OAAY,CAAC;AACnB,WAAS,IAAI,GAAG,IAAI,GAAG,MAAM,KAAK;AAChC,aAAS,IAAI,GAAG,IAAI,GAAG,SAAS,KAAK;AACnC,WAAK,KAAK,GAAG,KAAK,CAAC,EAAG,CAAC,CAAE;AAAA,IAC3B;AAAA,EACF;AAGA,QAAM,UAAiB,CAAC;AACxB,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAID,OAAM,KAAK;AAC7B,UAAM,SAAc,CAAC;AACrB,aAAS,IAAI,GAAG,IAAIC,UAAS,KAAK;AAChC,aAAO,KAAK,KAAK,OAAO,CAAE;AAAA,IAC5B;AACA,YAAQ,KAAK,MAAM;AAAA,EACrB;AAEA,KAAG,OAAOD;AACV,KAAG,UAAUC;AACb,KAAG,OAAO;AACZ;AAyBO,SAAS,QAAW,IAAyB;AAElD,KAAG,KAAK,QAAQ;AAEhB,WAAS,IAAI,GAAG,IAAI,GAAG,MAAM,KAAK;AAChC,OAAG,KAAK,CAAC,EAAG,QAAQ;AAAA,EACtB;AACF;AA0BO,SAAS,KAAgC,IAAmB,SAAqB,GAAG,QAAoC,aAAmB;AAChJ,MAAI,SAAS,KAAK,UAAU,GAAG,SAAS;AACtC,UAAM,IAAI,MAAM,+BAA+B,MAAM,oBAAoB,GAAG,OAAO,UAAU;AAAA,EAC/F;AAEA,KAAG,KAAK,KAAK,CAAC,GAAG,MAAM;AACrB,UAAM,OAAO,EAAE,MAAM;AACrB,UAAM,OAAO,EAAE,MAAM;AACrB,QAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAAU;AACxD,aAAO,UAAU,cAAc,OAAO,OAAO,OAAO;AAAA,IACtD;AAEA,QAAI,UAAU,aAAa;AACzB,aAAO,OAAO,OAAO,KAAK,OAAO,OAAO,IAAI;AAAA,IAC9C,OAAO;AACL,aAAO,OAAO,OAAO,KAAK,OAAO,OAAO,IAAI;AAAA,IAC9C;AAAA,EACF,CAAC;AACH;AA+BO,SAAS,IAAI,KAAwB,KAAmD;AAC7F,QAAM,UAAqB,CAAC;AAE5B,MAAI,OAAO,QAAQ,UAAU;AAE3B,aAAS,IAAI,GAAG,IAAI,IAAI,MAAM,KAAK;AACjC,YAAM,SAAkB,CAAC;AACzB,eAAS,IAAI,GAAG,IAAI,IAAI,SAAS,KAAK;AACpC,eAAO,KAAK,IAAI,KAAK,CAAC,EAAG,CAAC,IAAK,GAAG;AAAA,MACpC;AACA,cAAQ,KAAK,MAAM;AAAA,IACrB;AACA,WAAO;AAAA,MACL,MAAM,IAAI;AAAA,MACV,SAAS,IAAI;AAAA,MACb,MAAM;AAAA,IACR;AAAA,EACF,OAAO;AAEL,QAAI,IAAI,SAAS,IAAI,QAAQ,IAAI,YAAY,IAAI,SAAS;AACxD,YAAM,IAAI,MAAM,iCAAiC,IAAI,IAAI,IAAI,IAAI,OAAO,OAAO,IAAI,IAAI,IAAI,IAAI,OAAO,EAAE;AAAA,IAC1G;AAEA,aAAS,IAAI,GAAG,IAAI,IAAI,MAAM,KAAK;AACjC,YAAM,SAAkB,CAAC;AACzB,eAAS,IAAI,GAAG,IAAI,IAAI,SAAS,KAAK;AACpC,eAAO,KAAK,IAAI,KAAK,CAAC,EAAG,CAAC,IAAK,IAAI,KAAK,CAAC,EAAG,CAAC,CAAE;AAAA,MACjD;AACA,cAAQ,KAAK,MAAM;AAAA,IACrB;AACA,WAAO;AAAA,MACL,MAAM,IAAI;AAAA,MACV,SAAS,IAAI;AAAA,MACb,MAAM;AAAA,IACR;AAAA,EACF;AACF;AA2BO,SAAS,KAAK,KAAwB,KAAmD;AAC9F,QAAM,UAAqB,CAAC;AAE5B,MAAI,OAAO,QAAQ,UAAU;AAE3B,aAAS,IAAI,GAAG,IAAI,IAAI,MAAM,KAAK;AACjC,YAAM,SAAkB,CAAC;AACzB,eAAS,IAAI,GAAG,IAAI,IAAI,SAAS,KAAK;AACpC,eAAO,KAAK,IAAI,KAAK,CAAC,EAAG,CAAC,IAAK,GAAG;AAAA,MACpC;AACA,cAAQ,KAAK,MAAM;AAAA,IACrB;AACA,WAAO;AAAA,MACL,MAAM,IAAI;AAAA,MACV,SAAS,IAAI;AAAA,MACb,MAAM;AAAA,IACR;AAAA,EACF,OAAO;AAEL,QAAI,IAAI,SAAS,IAAI,QAAQ,IAAI,YAAY,IAAI,SAAS;AACxD,YAAM,IAAI,MAAM,iCAAiC,IAAI,IAAI,IAAI,IAAI,OAAO,OAAO,IAAI,IAAI,IAAI,IAAI,OAAO,EAAE;AAAA,IAC1G;AAEA,aAAS,IAAI,GAAG,IAAI,IAAI,MAAM,KAAK;AACjC,YAAM,SAAkB,CAAC;AACzB,eAAS,IAAI,GAAG,IAAI,IAAI,SAAS,KAAK;AACpC,eAAO,KAAK,IAAI,KAAK,CAAC,EAAG,CAAC,IAAK,IAAI,KAAK,CAAC,EAAG,CAAC,CAAE;AAAA,MACjD;AACA,cAAQ,KAAK,MAAM;AAAA,IACrB;AACA,WAAO;AAAA,MACL,MAAM,IAAI;AAAA,MACV,SAAS,IAAI;AAAA,MACb,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAwBO,SAAS,IAAI,IAA8B;AAChD,MAAI,GAAG,SAAS,KAAK,GAAG,YAAY,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ;AACZ,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,GAAG,MAAM,KAAK;AAChC,aAAS,IAAI,GAAG,IAAI,GAAG,SAAS,KAAK;AACnC,YAAM,MAAM,GAAG,KAAK,CAAC,EAAG,CAAC;AACzB,UAAI,QAAQ,QAAQ,QAAQ,UAAa,CAAC,MAAM,GAAG,GAAG;AACpD,iBAAS;AACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,UAAU,IAAI,MAAM,QAAQ;AACrC;AAoBO,SAAS,IAAI,IAA8B;AAChD,MAAI,GAAG,SAAS,KAAK,GAAG,YAAY,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,GAAG,MAAM,KAAK;AAChC,aAAS,IAAI,GAAG,IAAI,GAAG,SAAS,KAAK;AACnC,YAAM,MAAM,GAAG,KAAK,CAAC,EAAG,CAAC;AACzB,UAAI,QAAQ,QAAQ,QAAQ,UAAa,CAAC,MAAM,GAAG,KAAK,MAAM,QAAQ;AACpE,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,SAAO,WAAW,WAAW,MAAM;AACrC;AAoBO,SAAS,IAAI,IAA8B;AAChD,MAAI,GAAG,SAAS,KAAK,GAAG,YAAY,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,GAAG,MAAM,KAAK;AAChC,aAAS,IAAI,GAAG,IAAI,GAAG,SAAS,KAAK;AACnC,YAAM,MAAM,GAAG,KAAK,CAAC,EAAG,CAAC;AACzB,UAAI,QAAQ,QAAQ,QAAQ,UAAa,CAAC,MAAM,GAAG,KAAK,MAAM,QAAQ;AACpE,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,SAAO,WAAW,YAAY,MAAM;AACtC;AAuBO,SAAS,OAAO,IAA8B;AACnD,MAAI,GAAG,SAAS,KAAK,GAAG,YAAY,GAAG;AACrC,WAAO;AAAA,EACT;AAGA,QAAM,SAAkB,CAAC;AACzB,WAAS,IAAI,GAAG,IAAI,GAAG,MAAM,KAAK;AAChC,aAAS,IAAI,GAAG,IAAI,GAAG,SAAS,KAAK;AACnC,YAAM,MAAM,GAAG,KAAK,CAAC,EAAG,CAAC;AACzB,UAAI,QAAQ,QAAQ,QAAQ,UAAa,CAAC,MAAM,GAAG,GAAG;AACpD,eAAO,KAAK,GAAG;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC3B,QAAM,MAAM,KAAK,MAAM,OAAO,SAAS,CAAC;AAExC,MAAI,OAAO,SAAS,MAAM,GAAG;AAC3B,YAAQ,OAAO,MAAM,CAAC,IAAK,OAAO,GAAG,KAAM;AAAA,EAC7C,OAAO;AACL,WAAO,OAAO,GAAG;AAAA,EACnB;AACF;AAwBO,SAAS,KAAK,IAA8B;AACjD,MAAI,GAAG,SAAS,KAAK,GAAG,YAAY,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,oBAAI,IAAgB;AACtC,MAAI,UAAU;AACd,MAAI,YAAmB;AAEvB,WAAS,IAAI,GAAG,IAAI,GAAG,MAAM,KAAK;AAChC,aAAS,IAAI,GAAG,IAAI,GAAG,SAAS,KAAK;AACnC,YAAM,MAAM,GAAG,KAAK,CAAC,EAAG,CAAC;AACzB,UAAI,QAAQ,QAAQ,QAAQ,UAAa,CAAC,MAAM,GAAG,GAAG;AACpD,cAAM,QAAQ,UAAU,IAAI,GAAG,KAAK,KAAK;AACzC,kBAAU,IAAI,KAAK,IAAI;AAGvB,YAAI,OAAO,WAAY,SAAS,WAAW,MAAM,WAAY;AAC3D,oBAAU;AACV,sBAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAuBO,SAAS,MAAM,IAA8B;AAClD,MAAI,CAAC,UAAU,EAAE,GAAG;AAClB,UAAM,IAAI,MAAM,gDAAgD,GAAG,IAAI,IAAI,GAAG,OAAO,EAAE;AAAA,EACzF;AAEA,MAAI,GAAG,SAAS,GAAG;AACjB,WAAO;AAAA,EACT;AAEA,MAAIE,OAAM;AACV,WAAS,IAAI,GAAG,IAAI,GAAG,MAAM,KAAK;AAChC,UAAM,MAAM,GAAG,KAAK,CAAC,EAAG,CAAC;AACzB,QAAI,QAAQ,QAAQ,QAAQ,UAAa,CAAC,MAAM,GAAG,GAAG;AACpD,MAAAA,QAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAOA;AACT;AA4BO,SAAS,YAAY,IAA6B;AACvD,MAAI,CAAC,UAAU,EAAE,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,WAAS,IAAI,GAAG,IAAI,GAAG,MAAM,KAAK;AAChC,aAAS,IAAI,GAAG,IAAI,GAAG,SAAS,KAAK;AACnC,UAAI,MAAM,KAAK,GAAG,KAAK,CAAC,EAAG,CAAC,MAAM,GAAG;AACnC,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAyBO,SAAS,YAAY,IAA6B;AACvD,MAAI,CAAC,UAAU,EAAE,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,WAAS,IAAI,GAAG,IAAI,GAAG,MAAM,KAAK;AAChC,aAAS,IAAI,GAAG,IAAI,GAAG,SAAS,KAAK;AACnC,YAAM,MAAM,GAAG,KAAK,CAAC,EAAG,CAAC;AACzB,UAAI,MAAM,GAAG;AACX,YAAI,QAAQ,GAAG;AACb,iBAAO;AAAA,QACT;AAAA,MACF,OAAO;AACL,YAAI,QAAQ,GAAG;AACb,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAyBO,SAAS,aAAa,IAA6B;AACxD,MAAI,CAAC,UAAU,EAAE,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,WAAS,IAAI,GAAG,IAAI,GAAG,MAAM,KAAK;AAChC,aAAS,IAAI,IAAI,GAAG,IAAI,GAAG,SAAS,KAAK;AACvC,UAAI,GAAG,KAAK,CAAC,EAAG,CAAC,MAAM,GAAG,KAAK,CAAC,EAAG,CAAC,GAAG;AACrC,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAyBO,SAAS,iBAAiB,IAA6B;AAC5D,MAAI,CAAC,UAAU,EAAE,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,WAAS,IAAI,GAAG,IAAI,GAAG,MAAM,KAAK;AAEhC,QAAI,GAAG,KAAK,CAAC,EAAG,CAAC,MAAM,GAAG;AACxB,aAAO;AAAA,IACT;AAEA,aAAS,IAAI,IAAI,GAAG,IAAI,GAAG,SAAS,KAAK;AACvC,YAAM,WAAW,GAAG,KAAK,CAAC,EAAG,CAAC;AAC9B,YAAM,WAAW,GAAG,KAAK,CAAC,EAAG,CAAC;AAC9B,UAAI,aAAa,CAAC,UAAU;AAC1B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AA0BO,SAAS,cAAc,IAA6B;AACzD,MAAI,CAAC,UAAU,EAAE,GAAG;AAClB,WAAO;AAAA,EACT;AAGA,MAAI,UAAU;AACd,WAAS,IAAI,GAAG,IAAI,GAAG,QAAQ,SAAS,KAAK;AAC3C,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,KAAK;AACrC,UAAI,GAAG,KAAK,CAAC,EAAG,CAAC,MAAM,GAAG;AACxB,kBAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS;AACX,WAAO;AAAA,EACT;AAGA,MAAI,UAAU;AACd,WAAS,IAAI,GAAG,IAAI,GAAG,OAAO,KAAK,SAAS,KAAK;AAC/C,aAAS,IAAI,IAAI,GAAG,IAAI,GAAG,WAAW,SAAS,KAAK;AAClD,UAAI,GAAG,KAAK,CAAC,EAAG,CAAC,MAAM,GAAG;AACxB,kBAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AA0BO,SAAS,gBAAgB,IAA6B;AAC3D,MAAI,CAAC,UAAU,EAAE,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,GAAG;AACb,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAE1B,YAAM,aAAc,IAAI,MAAM,IAAI;AAClC,UAAI,CAAC,cAAc,GAAG,KAAK,CAAC,EAAG,CAAC,MAAM,GAAG;AACvC,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAwBO,SAAS,cAAc,IAA6B;AACzD,MAAI,GAAG,SAAS,KAAK,GAAG,YAAY,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAElB,WAAS,IAAI,GAAG,IAAI,GAAG,MAAM,KAAK;AAChC,QAAI,SAAS;AACb,aAAS,IAAI,GAAG,IAAI,GAAG,SAAS,KAAK;AACnC,YAAM,MAAM,GAAG,KAAK,CAAC,EAAG,CAAC;AAEzB,UAAI,MAAM,GAAG;AACX,eAAO;AAAA,MACT;AACA,gBAAU;AAAA,IACZ;AAEA,QAAI,KAAK,IAAI,SAAS,CAAC,IAAI,WAAW;AACpC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AASA,MAAM,UAAU;AAKhB,SAAS,eAAe,GAAkC;AACxD,QAAM,IAAI,WAAkB,GAAG,GAAG,CAAC;AACnC,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,MAAE,KAAK,CAAC,EAAG,CAAC,IAAI;AAAA,EAClB;AACA,SAAO;AACT;AAkCO,SAAS,KAAK,KAAwB,KAAyF;AAEpI,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAMC,WAAqB,CAAC;AAC5B,aAAS,IAAI,GAAG,IAAI,IAAI,MAAM,KAAK;AACjC,YAAM,SAAkB,CAAC;AACzB,eAAS,IAAI,GAAG,IAAI,IAAI,SAAS,KAAK;AACpC,eAAO,KAAK,IAAI,KAAK,CAAC,EAAG,CAAC,IAAK,GAAG;AAAA,MACpC;AACA,MAAAA,SAAQ,KAAK,MAAM;AAAA,IACrB;AACA,WAAO;AAAA,MACL,MAAM,IAAI;AAAA,MACV,SAAS,IAAI;AAAA,MACb,MAAMA;AAAA,IACR;AAAA,EACF;AAGA,MAAI,MAAM,QAAQ,GAAG,KAAK,EAAE,UAAU,MAAM;AAC1C,UAAM,MAAM;AACZ,QAAI,IAAI,WAAW,IAAI,SAAS;AAC9B,YAAM,IAAI,MAAM,iBAAiB,IAAI,MAAM,8BAA8B,IAAI,OAAO,EAAE;AAAA,IACxF;AACA,UAAM,SAAkB,CAAC;AACzB,aAAS,IAAI,GAAG,IAAI,IAAI,MAAM,KAAK;AACjC,UAAID,OAAM;AACV,eAAS,IAAI,GAAG,IAAI,IAAI,SAAS,KAAK;AACpC,QAAAA,QAAO,IAAI,KAAK,CAAC,EAAG,CAAC,IAAK,IAAI,CAAC;AAAA,MACjC;AACA,aAAO,KAAKA,IAAG;AAAA,IACjB;AACA,WAAO;AAAA,EACT;AAGA,QAAM,KAAK;AACX,MAAI,IAAI,YAAY,GAAG,MAAM;AAC3B,UAAM,IAAI,MAAM,6CAA6C,IAAI,IAAI,IAAI,IAAI,OAAO,SAAM,GAAG,IAAI,IAAI,GAAG,OAAO,2BAA2B,IAAI,OAAO,oCAAoC,GAAG,IAAI,GAAG;AAAA,EACrM;AAEA,QAAM,UAAU,IAAI;AACpB,QAAM,UAAU,GAAG;AACnB,QAAM,UAAqB,CAAC;AAE5B,WAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAChC,UAAM,SAAkB,CAAC;AACzB,aAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAChC,UAAIA,OAAM;AACV,eAAS,IAAI,GAAG,IAAI,IAAI,SAAS,KAAK;AACpC,QAAAA,QAAO,IAAI,KAAK,CAAC,EAAG,CAAC,IAAK,GAAG,KAAK,CAAC,EAAG,CAAC;AAAA,MACzC;AACA,aAAO,KAAKA,IAAG;AAAA,IACjB;AACA,YAAQ,KAAK,MAAM;AAAA,EACrB;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AACF;AA0BO,SAAS,IAAI,IAAuB,OAA+B;AACxE,MAAI,CAAC,UAAU,EAAE,GAAG;AAClB,UAAM,IAAI,MAAM,gDAAgD,GAAG,IAAI,IAAI,GAAG,OAAO,EAAE;AAAA,EACzF;AAEA,QAAM,IAAI,GAAG;AAGb,MAAI,UAAU,GAAG;AACf,WAAO,eAAe,CAAC;AAAA,EACzB;AAGA,MAAI;AACJ,MAAI,IAAI;AACR,MAAI,QAAQ,GAAG;AACb,UAAM,UAAU,IAAI,EAAE;AACtB,QAAI,YAAY,MAAM;AACpB,YAAM,IAAI,MAAM,kDAAkD;AAAA,IACpE;AACA,WAAO;AACP,QAAI,CAAC;AAAA,EACP,OAAO;AACL,WAAO,KAAK,EAAE;AAAA,EAChB;AAGA,MAAI,SAAS,eAAe,CAAC;AAE7B,SAAO,IAAI,GAAG;AACZ,QAAI,IAAI,MAAM,GAAG;AACf,eAAS,KAAK,QAAQ,IAAI;AAAA,IAC5B;AACA,WAAO,KAAK,MAAM,IAAI;AACtB,QAAI,KAAK,MAAM,IAAI,CAAC;AAAA,EACtB;AAEA,SAAO;AACT;AA2BO,SAAS,IAAI,IAA8B;AAChD,MAAI,CAAC,UAAU,EAAE,GAAG;AAClB,UAAM,IAAI,MAAM,sDAAsD,GAAG,IAAI,IAAI,GAAG,OAAO,EAAE;AAAA,EAC/F;AAEA,QAAM,IAAI,GAAG;AAEb,MAAI,MAAM,GAAG;AACX,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,GAAG;AACX,WAAO,GAAG,KAAK,CAAC,EAAG,CAAC;AAAA,EACtB;AAEA,MAAI,MAAM,GAAG;AACX,WAAO,GAAG,KAAK,CAAC,EAAG,CAAC,IAAK,GAAG,KAAK,CAAC,EAAG,CAAC,IAAK,GAAG,KAAK,CAAC,EAAG,CAAC,IAAK,GAAG,KAAK,CAAC,EAAG,CAAC;AAAA,EAC5E;AAIA,QAAM,IAAe,GAAG,KAAK,IAAI,CAAAD,SAAO,CAAC,GAAGA,IAAG,CAAC;AAChD,MAAI,cAAc;AAClB,MAAI,YAAY;AAEhB,WAASG,OAAM,GAAGA,OAAM,GAAGA,QAAO;AAEhC,QAAI,SAASA;AACb,QAAI,SAAS,KAAK,IAAI,EAAEA,IAAG,EAAGA,IAAG,CAAE;AACnC,aAASH,OAAMG,OAAM,GAAGH,OAAM,GAAGA,QAAO;AACtC,YAAM,SAAS,KAAK,IAAI,EAAEA,IAAG,EAAGG,IAAG,CAAE;AACrC,UAAI,SAAS,QAAQ;AACnB,iBAAS;AACT,iBAASH;AAAA,MACX;AAAA,IACF;AAGA,QAAI,WAAWG,MAAK;AAClB,YAAM,OAAO,EAAEA,IAAG;AAClB,QAAEA,IAAG,IAAI,EAAE,MAAM;AACjB,QAAE,MAAM,IAAI;AACZ;AAAA,IACF;AAGA,UAAM,QAAQ,EAAEA,IAAG,EAAGA,IAAG;AACzB,QAAI,KAAK,IAAI,KAAK,IAAI,SAAS;AAC7B,aAAO;AAAA,IACT;AAEA,mBAAe;AAGf,aAASH,OAAMG,OAAM,GAAGH,OAAM,GAAGA,QAAO;AACtC,YAAM,SAAS,EAAEA,IAAG,EAAGG,IAAG,IAAK;AAC/B,eAAS,IAAIA,MAAK,IAAI,GAAG,KAAK;AAC5B,UAAEH,IAAG,EAAG,CAAC,IAAI,EAAEA,IAAG,EAAG,CAAC,IAAK,SAAS,EAAEG,IAAG,EAAG,CAAC;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAGA,MAAI,YAAY,MAAM,GAAG;AACvB,kBAAc,CAAC;AAAA,EACjB;AAEA,SAAO;AACT;AA6BO,SAAS,IAAI,IAAiD;AACnE,MAAI,CAAC,UAAU,EAAE,GAAG;AAClB,UAAM,IAAI,MAAM,kDAAkD,GAAG,IAAI,IAAI,GAAG,OAAO,EAAE;AAAA,EAC3F;AAEA,QAAM,IAAI,GAAG;AAEb,MAAI,MAAM,GAAG;AACX,WAAO,WAAkB,GAAG,GAAG,CAAC;AAAA,EAClC;AAGA,QAAM,MAAiB,CAAC;AACxB,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAMH,OAAe,CAAC;AACtB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,MAAAA,KAAI,KAAK,GAAG,KAAK,CAAC,EAAG,CAAC,CAAE;AAAA,IAC1B;AACA,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,MAAAA,KAAI,KAAK,MAAM,IAAI,IAAI,CAAC;AAAA,IAC1B;AACA,QAAI,KAAKA,IAAG;AAAA,EACd;AAGA,WAASG,OAAM,GAAGA,OAAM,GAAGA,QAAO;AAEhC,QAAI,SAASA;AACb,QAAI,SAAS,KAAK,IAAI,IAAIA,IAAG,EAAGA,IAAG,CAAE;AACrC,aAASH,OAAMG,OAAM,GAAGH,OAAM,GAAGA,QAAO;AACtC,YAAM,SAAS,KAAK,IAAI,IAAIA,IAAG,EAAGG,IAAG,CAAE;AACvC,UAAI,SAAS,QAAQ;AACnB,iBAAS;AACT,iBAASH;AAAA,MACX;AAAA,IACF;AAGA,QAAI,WAAWG,MAAK;AAClB,YAAM,OAAO,IAAIA,IAAG;AACpB,UAAIA,IAAG,IAAI,IAAI,MAAM;AACrB,UAAI,MAAM,IAAI;AAAA,IAChB;AAGA,UAAM,QAAQ,IAAIA,IAAG,EAAGA,IAAG;AAC3B,QAAI,KAAK,IAAI,KAAK,IAAI,SAAS;AAC7B,aAAO;AAAA,IACT;AAGA,aAAS,IAAI,GAAG,IAAI,IAAI,GAAG,KAAK;AAC9B,UAAIA,IAAG,EAAG,CAAC,IAAI,IAAIA,IAAG,EAAG,CAAC,IAAK;AAAA,IACjC;AAGA,aAASH,OAAM,GAAGA,OAAM,GAAGA,QAAO;AAChC,UAAIA,SAAQG,MAAK;AACf,cAAM,SAAS,IAAIH,IAAG,EAAGG,IAAG;AAC5B,iBAAS,IAAI,GAAG,IAAI,IAAI,GAAG,KAAK;AAC9B,cAAIH,IAAG,EAAG,CAAC,IAAI,IAAIA,IAAG,EAAG,CAAC,IAAK,SAAS,IAAIG,IAAG,EAAG,CAAC;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,UAAqB,CAAC;AAC5B,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAMH,OAAe,CAAC;AACtB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,MAAAA,KAAI,KAAK,IAAI,CAAC,EAAG,IAAI,CAAC,CAAE;AAAA,IAC1B;AACA,YAAQ,KAAKA,IAAG;AAAA,EAClB;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AACF;AA4BO,SAAS,KAAK,IAA0C;AAC7D,QAAM,IAAI,GAAG;AACb,QAAM,IAAI,GAAG;AAEb,MAAI,MAAM,KAAK,MAAM,GAAG;AACtB,WAAO,WAAkB,GAAG,GAAG,CAAC;AAAA,EAClC;AAGA,MAAI,MAAM,GAAG;AACX,UAAM,UAAU,IAAI,EAAE;AACtB,QAAI,YAAY,MAAM;AACpB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,KAAK,UAAU,EAAE;AAGvB,MAAI,KAAK,GAAG;AACV,UAAMI,OAAM,KAAK,IAAI,EAAE;AACvB,UAAMC,WAAU,IAAID,IAAG;AACvB,QAAIC,aAAY,MAAM;AACpB,aAAO,KAAKA,UAAS,EAAE;AAAA,IACzB;AAAA,EACF;AAGA,QAAM,MAAM,KAAK,IAAI,EAAE;AACvB,QAAM,UAAU,IAAI,GAAG;AACvB,MAAI,YAAY,MAAM;AACpB,WAAO,KAAK,IAAI,OAAO;AAAA,EACzB;AAIA,QAAM,SAAS;AACf,QAAM,MAAM,KAAK,IAAI,EAAE;AAGvB,WAAS,IAAI,GAAG,IAAI,IAAI,MAAM,KAAK;AACjC,QAAI,KAAK,CAAC,EAAG,CAAC,IAAI,IAAI,KAAK,CAAC,EAAG,CAAC,IAAK;AAAA,EACvC;AAEA,QAAM,UAAU,IAAI,GAAG;AACvB,MAAI,YAAY,MAAM;AACpB,WAAO,KAAK,SAAS,EAAE;AAAA,EACzB;AAGA,SAAO,WAAkB,GAAG,GAAG,CAAC;AAClC;AA2BO,SAAS,KAAK,IAA4B;AAC/C,MAAI,GAAG,SAAS,KAAK,GAAG,YAAY,GAAG;AACrC,WAAO;AAAA,EACT;AAGA,QAAM,IAAe,GAAG,KAAK,IAAI,CAAAL,SAAO,CAAC,GAAGA,IAAG,CAAC;AAChD,QAAM,IAAI,GAAG;AACb,QAAM,IAAI,GAAG;AAEb,MAAI,IAAI;AAER,WAASG,OAAM,GAAGA,OAAM,KAAK,IAAI,GAAGA,QAAO;AAEzC,QAAI,SAAS;AACb,QAAI,SAAS,KAAK,IAAI,EAAE,CAAC,EAAGA,IAAG,CAAE;AACjC,aAASH,OAAM,IAAI,GAAGA,OAAM,GAAGA,QAAO;AACpC,YAAM,SAAS,KAAK,IAAI,EAAEA,IAAG,EAAGG,IAAG,CAAE;AACrC,UAAI,SAAS,QAAQ;AACnB,iBAAS;AACT,iBAASH;AAAA,MACX;AAAA,IACF;AAGA,QAAI,SAAS,SAAS;AACpB;AAAA,IACF;AAGA,QAAI,WAAW,GAAG;AAChB,YAAM,OAAO,EAAE,CAAC;AAChB,QAAE,CAAC,IAAI,EAAE,MAAM;AACf,QAAE,MAAM,IAAI;AAAA,IACd;AAGA,UAAM,QAAQ,EAAE,CAAC,EAAGG,IAAG;AACvB,aAASH,OAAM,IAAI,GAAGA,OAAM,GAAGA,QAAO;AACpC,YAAM,SAAS,EAAEA,IAAG,EAAGG,IAAG,IAAK;AAC/B,eAAS,IAAIA,MAAK,IAAI,GAAG,KAAK;AAC5B,UAAEH,IAAG,EAAG,CAAC,IAAI,EAAEA,IAAG,EAAG,CAAC,IAAK,SAAS,EAAE,CAAC,EAAG,CAAC;AAAA,MAC7C;AAAA,IACF;AAEA;AAAA,EACF;AAEA,SAAO;AACT;AA4BO,SAAS,YAAY,IAAyC;AACnE,MAAI,CAAC,UAAU,EAAE,GAAG;AAClB,UAAM,IAAI,MAAM,qDAAqD,GAAG,IAAI,IAAI,GAAG,OAAO,EAAE;AAAA,EAC9F;AAEA,QAAM,IAAI,GAAG;AAEb,MAAI,MAAM,GAAG;AACX,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,MAAM,GAAG;AACX,WAAO,CAAC,GAAG,KAAK,CAAC,EAAG,CAAC,CAAE;AAAA,EACzB;AAGA,MAAI,MAAM,GAAG;AACX,UAAM,IAAI,GAAG,KAAK,CAAC,EAAG,CAAC;AACvB,UAAM,IAAI,GAAG,KAAK,CAAC,EAAG,CAAC;AACvB,UAAM,IAAI,GAAG,KAAK,CAAC,EAAG,CAAC;AACvB,UAAM,IAAI,GAAG,KAAK,CAAC,EAAG,CAAC;AAGvB,UAAMM,SAAQ,IAAI;AAClB,UAAM,cAAc,IAAI,IAAI,IAAI;AAChC,UAAM,eAAeA,SAAQA,SAAQ,IAAI;AAEzC,QAAI,gBAAgB,GAAG;AACrB,YAAM,WAAW,KAAK,KAAK,YAAY;AACvC,aAAO,EAAEA,SAAQ,YAAY,IAAIA,SAAQ,YAAY,CAAC;AAAA,IACxD,OAAO;AAEL,aAAO,CAACA,SAAQ,GAAGA,SAAQ,CAAC;AAAA,IAC9B;AAAA,EACF;AAIA,QAAM,IAAI,aAAa,EAAE;AACzB,QAAM,SAAS,YAAY,GAAG,GAAG;AAEjC,SAAO;AACT;AAKA,SAAS,aAAa,GAAyC;AAC7D,QAAM,IAAI,EAAE;AACZ,QAAM,IAAe,EAAE,KAAK,IAAI,CAAAN,SAAO,CAAC,GAAGA,IAAG,CAAC;AAE/C,WAAS,IAAI,GAAG,IAAI,IAAI,GAAG,KAAK;AAE9B,QAAI,SAAS;AACb,aAAS,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;AAC9B,eAAS,KAAK,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC,EAAG,CAAC,CAAE,CAAC;AAAA,IAC/C;AAEA,QAAI,SAAS,QAAS;AAGtB,QAAI,QAAQ;AACZ,aAAS,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;AAC9B,eAAS,EAAE,CAAC,EAAG,CAAC,IAAK,EAAE,CAAC,EAAG,CAAC;AAAA,IAC9B;AACA,YAAQ,KAAK,KAAK,KAAK;AAEvB,QAAI,EAAE,IAAI,CAAC,EAAG,CAAC,IAAK,EAAG,SAAQ,CAAC;AAEhC,UAAM,IAAa,IAAI,MAAM,CAAC,EAAE,KAAK,CAAC;AACtC,MAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAG,CAAC,IAAK;AAC3B,aAAS,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;AAC9B,QAAE,CAAC,IAAI,EAAE,CAAC,EAAG,CAAC;AAAA,IAChB;AAEA,QAAI,MAAM;AACV,aAAS,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;AAC9B,aAAO,EAAE,CAAC,IAAK,EAAE,CAAC;AAAA,IACpB;AAEA,QAAI,MAAM,QAAS;AAInB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAI,MAAM;AACV,eAAS,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;AAC9B,eAAO,EAAE,CAAC,IAAK,EAAE,CAAC,EAAG,CAAC;AAAA,MACxB;AACA,YAAM,SAAS,IAAI,MAAM;AACzB,eAAS,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;AAC9B,UAAE,CAAC,EAAG,CAAC,IAAI,EAAE,CAAC,EAAG,CAAC,IAAK,SAAS,EAAE,CAAC;AAAA,MACrC;AAAA,IACF;AAGA,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAI,MAAM;AACV,eAAS,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;AAC9B,eAAO,EAAE,CAAC,EAAG,CAAC,IAAK,EAAE,CAAC;AAAA,MACxB;AACA,YAAM,SAAS,IAAI,MAAM;AACzB,eAAS,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;AAC9B,UAAE,CAAC,EAAG,CAAC,IAAI,EAAE,CAAC,EAAG,CAAC,IAAK,SAAS,EAAE,CAAC;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE;AACxC;AAKA,SAAS,YAAY,GAAsB,SAAuB;AAChE,QAAM,IAAI,EAAE;AACZ,QAAM,IAAe,EAAE,KAAK,IAAI,CAAAA,SAAO,CAAC,GAAGA,IAAG,CAAC;AAC/C,QAAM,YAAqB,CAAC;AAE5B,MAAI,YAAY;AAEhB,WAAS,OAAO,GAAG,OAAO,WAAW,YAAY,GAAG,QAAQ;AAE1D,QAAI,YAAY;AAChB,aAAS,IAAI,YAAY,GAAG,KAAK,GAAG,KAAK;AACvC,UAAI,KAAK,IAAI,EAAE,CAAC,EAAG,IAAI,CAAC,CAAE,IAAI,WAAW,KAAK,IAAI,EAAE,IAAI,CAAC,EAAG,IAAI,CAAC,CAAE,IAAI,KAAK,IAAI,EAAE,CAAC,EAAG,CAAC,CAAE,IAAI;AAC3F,UAAE,CAAC,EAAG,IAAI,CAAC,IAAI;AACf,YAAI,MAAM,YAAY,GAAG;AACvB,oBAAU,KAAK,EAAE,YAAY,CAAC,EAAG,YAAY,CAAC,CAAE;AAChD;AACA,sBAAY;AACZ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,UAAW;AACf,QAAI,aAAa,EAAG;AAGpB,UAAM,KAAK,EAAE,YAAY,CAAC,EAAG,YAAY,CAAC,IAAK,EAAE,YAAY,CAAC,EAAG,YAAY,CAAC,KAAM;AACpF,UAAM,OAAO,KAAK,IAAI,IAAI;AAC1B,UAAM,KAAK,EAAE,YAAY,CAAC,EAAG,YAAY,CAAC,IACxC,OAAO,EAAE,YAAY,CAAC,EAAG,YAAY,CAAC,IAAK,EAAE,YAAY,CAAC,EAAG,YAAY,CAAC,KACzE,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,EAAE,YAAY,CAAC,EAAG,YAAY,CAAC,IAAK,EAAE,YAAY,CAAC,EAAG,YAAY,CAAC,CAAE;AAGxG,QAAI,IAAI,EAAE,CAAC,EAAG,CAAC,IAAK;AACpB,QAAI,IAAI,EAAE,CAAC,EAAG,CAAC;AAEf,aAAS,IAAI,GAAG,IAAI,YAAY,GAAG,KAAK;AAEtC,UAAI,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC;AAC/B,UAAI,IAAI,SAAS;AACf,YAAI;AAAA,MACN;AACA,YAAM,IAAI,IAAI;AACd,YAAM,IAAI,IAAI;AAGd,eAAS,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,WAAW,KAAK;AACnD,cAAM,OAAO,IAAI,EAAE,CAAC,EAAG,CAAC,IAAK,IAAI,EAAE,IAAI,CAAC,EAAG,CAAC;AAC5C,UAAE,IAAI,CAAC,EAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAG,CAAC,IAAK,IAAI,EAAE,IAAI,CAAC,EAAG,CAAC;AAC/C,UAAE,CAAC,EAAG,CAAC,IAAI;AAAA,MACb;AAGA,eAAS,IAAI,GAAG,IAAI,KAAK,IAAI,IAAI,GAAG,SAAS,GAAG,KAAK;AACnD,cAAM,OAAO,IAAI,EAAE,CAAC,EAAG,CAAC,IAAK,IAAI,EAAE,CAAC,EAAG,IAAI,CAAC;AAC5C,UAAE,CAAC,EAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAG,CAAC,IAAK,IAAI,EAAE,CAAC,EAAG,IAAI,CAAC;AAC/C,UAAE,CAAC,EAAG,CAAC,IAAI;AAAA,MACb;AAEA,UAAI,IAAI,YAAY,GAAG;AACrB,YAAI,EAAE,IAAI,CAAC,EAAG,CAAC;AACf,YAAI,EAAE,IAAI,CAAC,EAAG,CAAC;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAGA,WAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,cAAU,KAAK,EAAE,CAAC,EAAG,CAAC,CAAE;AAAA,EAC1B;AAGA,YAAU,KAAK,CAACO,IAAG,MAAM,KAAK,IAAI,CAAC,IAAI,KAAK,IAAIA,EAAC,CAAC;AAElD,SAAO;AACT;AA6BO,SAAS,aAAa,IAA0C;AACrE,MAAI,CAAC,UAAU,EAAE,GAAG;AAClB,UAAM,IAAI,MAAM,sDAAsD,GAAG,IAAI,IAAI,GAAG,OAAO,EAAE;AAAA,EAC/F;AAEA,QAAM,IAAI,GAAG;AAEb,MAAI,MAAM,GAAG;AACX,WAAO,WAAkB,GAAG,GAAG,CAAC;AAAA,EAClC;AAGA,QAAM,QAAQ,YAAY,EAAE;AAG5B,QAAM,UAAqB,CAAC;AAE5B,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,SAAS,MAAM,CAAC;AACtB,UAAM,MAAM,iBAAiB,IAAI,MAAM;AACvC,YAAQ,KAAK,GAAG;AAAA,EAClB;AAGA,QAAM,SAAoB,CAAC;AAC3B,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAMP,OAAe,CAAC;AACtB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,MAAAA,KAAI,KAAK,QAAQ,CAAC,EAAG,CAAC,CAAE;AAAA,IAC1B;AACA,WAAO,KAAKA,IAAG;AAAA,EACjB;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AACF;AAKA,SAAS,iBAAiB,GAAsB,QAAwB;AACtE,QAAM,IAAI,EAAE;AAGZ,QAAM,UAAqB,EAAE,KAAK;AAAA,IAAI,CAACA,MAAK,MAC1CA,KAAI,IAAI,CAAC,KAAK,MAAM,MAAM,IAAI,MAAM,SAAS,GAAG;AAAA,EAClD;AAGA,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,QAAI,KAAK,IAAI,QAAQ,CAAC,EAAG,CAAC,CAAE,IAAI,SAAS;AACvC,cAAQ,CAAC,EAAG,CAAC,IAAI;AAAA,IACnB;AAAA,EACF;AAGA,MAAI,IAAa,IAAI,MAAM,CAAC,EAAE,KAAK,CAAC;AAGpC,WAAS,OAAO,GAAG,OAAO,IAAI,QAAQ;AAEpC,UAAM,IAAI,kBAAkB,SAAS,CAAC;AAGtC,QAAI,OAAO;AACX,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAQ,EAAE,CAAC,IAAK,EAAE,CAAC;AAAA,IACrB;AACA,WAAO,KAAK,KAAK,IAAI;AAErB,QAAI,OAAO,SAAS;AAClB,aAAO;AAAA,IACT;AAEA,UAAM,OAAgB,CAAC;AACvB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,WAAK,KAAK,EAAE,CAAC,IAAK,IAAI;AAAA,IACxB;AAGA,QAAIQ,QAAO;AACX,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,MAAAA,SAAQ,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,CAAE,IAAI,KAAK,IAAI,EAAE,CAAC,CAAE,CAAC;AAAA,IACvD;AAEA,QAAI;AAEJ,QAAIA,QAAO,SAAS;AAClB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,kBAAkB,GAAc,GAAqB;AAC5D,QAAM,IAAI,EAAE;AAGZ,QAAM,MAAiB,EAAE,IAAI,CAACR,MAAK,MAAM,CAAC,GAAGA,MAAK,EAAE,CAAC,CAAE,CAAC;AAGxD,WAASG,OAAM,GAAGA,OAAM,GAAGA,QAAO;AAEhC,QAAI,SAASA;AACb,QAAI,SAAS,KAAK,IAAI,IAAIA,IAAG,EAAGA,IAAG,CAAE;AACrC,aAASH,OAAMG,OAAM,GAAGH,OAAM,GAAGA,QAAO;AACtC,YAAM,SAAS,KAAK,IAAI,IAAIA,IAAG,EAAGG,IAAG,CAAE;AACvC,UAAI,SAAS,QAAQ;AACnB,iBAAS;AACT,iBAASH;AAAA,MACX;AAAA,IACF;AAGA,QAAI,WAAWG,MAAK;AAClB,YAAM,OAAO,IAAIA,IAAG;AACpB,UAAIA,IAAG,IAAI,IAAI,MAAM;AACrB,UAAI,MAAM,IAAI;AAAA,IAChB;AAEA,UAAM,QAAQ,IAAIA,IAAG,EAAGA,IAAG;AAC3B,QAAI,KAAK,IAAI,KAAK,IAAI,SAAS;AAC7B;AAAA,IACF;AAGA,aAASH,OAAMG,OAAM,GAAGH,OAAM,GAAGA,QAAO;AACtC,YAAM,SAAS,IAAIA,IAAG,EAAGG,IAAG,IAAK;AACjC,eAAS,IAAIA,MAAK,KAAK,GAAG,KAAK;AAC7B,YAAIH,IAAG,EAAG,CAAC,IAAI,IAAIA,IAAG,EAAG,CAAC,IAAK,SAAS,IAAIG,IAAG,EAAG,CAAC;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAGA,QAAM,IAAa,IAAI,MAAM,CAAC,EAAE,KAAK,CAAC;AACtC,WAAS,IAAI,IAAI,GAAG,KAAK,GAAG,KAAK;AAC/B,QAAIF,OAAM,IAAI,CAAC,EAAG,CAAC;AACnB,aAAS,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;AAC9B,MAAAA,QAAO,IAAI,CAAC,EAAG,CAAC,IAAK,EAAE,CAAC;AAAA,IAC1B;AACA,UAAM,OAAO,IAAI,CAAC,EAAG,CAAC;AACtB,MAAE,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,UAAU,IAAIA,OAAM;AAAA,EAC9C;AAEA,SAAO;AACT;AA0BO,SAAS,KAAK,KAAwB,KAA2C;AACtF,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,IAAI;AAEf,QAAM,aAAa,KAAK;AACxB,QAAM,aAAa,KAAK;AACxB,QAAM,OAAkB,CAAC;AAEzB,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,SAAK,KAAK,IAAI,MAAM,UAAU,EAAE,KAAK,CAAC,CAAC;AAAA,EACzC;AAEA,WAAS,KAAK,GAAG,KAAK,IAAI,MAAM;AAC9B,aAAS,KAAK,GAAG,KAAK,IAAI,MAAM;AAC9B,YAAM,IAAI,IAAI,KAAK,EAAE,EAAG,EAAE;AAC1B,eAAS,KAAK,GAAG,KAAK,IAAI,MAAM;AAC9B,iBAAS,KAAK,GAAG,KAAK,IAAI,MAAM;AAC9B,gBAAMD,OAAM,KAAK,KAAK;AACtB,gBAAMG,OAAM,KAAK,KAAK;AACtB,eAAKH,IAAG,EAAGG,IAAG,IAAI,IAAI,IAAI,KAAK,EAAE,EAAG,EAAE;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT;AAAA,EACF;AACF;AAyBO,SAAS,QACdL,QAAmB,GACnBC,WAAsB,GACtB,eACe;AACf,SAAO,WAAWD,OAAMC,UAAS,aAAa;AAChD;",
|
|
6
|
+
"names": ["rows", "columns", "row", "sum", "newData", "col", "AtA", "AtA_inv", "trace", "a", "diff"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Plot helper functions for indicator visualization
|
|
3
|
+
* These functions help format and prepare data for plotting.
|
|
4
|
+
* @module plot
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Time value type (can be number timestamp or string date)
|
|
8
|
+
*/
|
|
9
|
+
export type Time = number | string;
|
|
10
|
+
/**
|
|
11
|
+
* Time-value pair for chart data
|
|
12
|
+
*/
|
|
13
|
+
export interface TimeValuePair {
|
|
14
|
+
/** Time (timestamp or date string) */
|
|
15
|
+
time: Time;
|
|
16
|
+
/** Value at this time point */
|
|
17
|
+
value: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Options for plot function
|
|
21
|
+
*/
|
|
22
|
+
export interface PlotOptions {
|
|
23
|
+
/** Plot color */
|
|
24
|
+
color?: string;
|
|
25
|
+
/** Display title */
|
|
26
|
+
title?: string;
|
|
27
|
+
/** Line width (1-4) */
|
|
28
|
+
lineWidth?: number;
|
|
29
|
+
/** Line style */
|
|
30
|
+
lineStyle?: 'solid' | 'dashed' | 'dotted';
|
|
31
|
+
/** Offset from current bar */
|
|
32
|
+
offset?: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Prepare values for plotting by combining with time data
|
|
36
|
+
*
|
|
37
|
+
* @param values - Array of values to plot (null values create gaps)
|
|
38
|
+
* @param times - Array of time values corresponding to each value
|
|
39
|
+
* @param options - Plot options (color, title, lineWidth, etc.)
|
|
40
|
+
* @returns Array of time-value pairs ready for charting
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const smaValues = ta.sma(ctx.close, 14);
|
|
45
|
+
* const plotData = plot(smaValues, ctx.time, { color: '#2196F3', title: 'SMA' });
|
|
46
|
+
* // Returns: [{ time: 1000, value: 100.5 }, { time: 2000, value: 101.2 }, ...]
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export declare function plot(values: (number | null)[], times: Time[], options?: PlotOptions): TimeValuePair[];
|
|
50
|
+
/**
|
|
51
|
+
* Plot result with metadata
|
|
52
|
+
*/
|
|
53
|
+
export interface PlotResult {
|
|
54
|
+
/** Plot identifier */
|
|
55
|
+
id: string;
|
|
56
|
+
/** Time-value data pairs */
|
|
57
|
+
data: TimeValuePair[];
|
|
58
|
+
/** Plot options */
|
|
59
|
+
options: PlotOptions;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Create a named plot with data and options
|
|
63
|
+
*
|
|
64
|
+
* @param id - Unique identifier for this plot
|
|
65
|
+
* @param values - Array of values to plot
|
|
66
|
+
* @param times - Array of time values
|
|
67
|
+
* @param options - Plot options
|
|
68
|
+
* @returns PlotResult with id, data, and options
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* const smaPlot = createPlot('sma', smaValues, ctx.time, { color: '#2196F3' });
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
export declare function createPlot(id: string, values: (number | null)[], times: Time[], options?: PlotOptions): PlotResult;
|
|
76
|
+
//# sourceMappingURL=plot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plot.d.ts","sourceRoot":"","sources":["../../src/plot.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,sCAAsC;IACtC,IAAI,EAAE,IAAI,CAAC;IACX,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB;IACjB,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,IAAI,CAClB,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EACzB,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,GAAE,WAAgB,GACxB,aAAa,EAAE,CAyBjB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,sBAAsB;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,4BAA4B;IAC5B,IAAI,EAAE,aAAa,EAAE,CAAC;IACtB,mBAAmB;IACnB,OAAO,EAAE,WAAW,CAAC;CACtB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CACxB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EACzB,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,GAAE,WAAgB,GACxB,UAAU,CAMZ"}
|
package/dist/cjs/plot.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var plot_exports = {};
|
|
20
|
+
__export(plot_exports, {
|
|
21
|
+
createPlot: () => createPlot,
|
|
22
|
+
plot: () => plot
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(plot_exports);
|
|
25
|
+
function plot(values, times, options = {}) {
|
|
26
|
+
const result = [];
|
|
27
|
+
const offset = options.offset ?? 0;
|
|
28
|
+
for (let i = 0; i < values.length; i++) {
|
|
29
|
+
const value = values[i];
|
|
30
|
+
const timeIndex = i + offset;
|
|
31
|
+
if (value === null || value === void 0 || Number.isNaN(value)) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (timeIndex < 0 || timeIndex >= times.length) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const time = times[timeIndex];
|
|
38
|
+
if (time !== void 0) {
|
|
39
|
+
result.push({ time, value });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
function createPlot(id, values, times, options = {}) {
|
|
45
|
+
return {
|
|
46
|
+
id,
|
|
47
|
+
data: plot(values, times, options),
|
|
48
|
+
options
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=plot.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/plot.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * @fileoverview Plot helper functions for indicator visualization\n * These functions help format and prepare data for plotting.\n * @module plot\n */\n\n/**\n * Time value type (can be number timestamp or string date)\n */\nexport type Time = number | string;\n\n/**\n * Time-value pair for chart data\n */\nexport interface TimeValuePair {\n /** Time (timestamp or date string) */\n time: Time;\n /** Value at this time point */\n value: number;\n}\n\n/**\n * Options for plot function\n */\nexport interface PlotOptions {\n /** Plot color */\n color?: string;\n /** Display title */\n title?: string;\n /** Line width (1-4) */\n lineWidth?: number;\n /** Line style */\n lineStyle?: 'solid' | 'dashed' | 'dotted';\n /** Offset from current bar */\n offset?: number;\n}\n\n/**\n * Prepare values for plotting by combining with time data\n * \n * @param values - Array of values to plot (null values create gaps)\n * @param times - Array of time values corresponding to each value\n * @param options - Plot options (color, title, lineWidth, etc.)\n * @returns Array of time-value pairs ready for charting\n * \n * @example\n * ```typescript\n * const smaValues = ta.sma(ctx.close, 14);\n * const plotData = plot(smaValues, ctx.time, { color: '#2196F3', title: 'SMA' });\n * // Returns: [{ time: 1000, value: 100.5 }, { time: 2000, value: 101.2 }, ...]\n * ```\n */\nexport function plot(\n values: (number | null)[],\n times: Time[],\n options: PlotOptions = {}\n): TimeValuePair[] {\n const result: TimeValuePair[] = [];\n const offset = options.offset ?? 0;\n\n for (let i = 0; i < values.length; i++) {\n const value = values[i];\n const timeIndex = i + offset;\n \n // Skip null/undefined/NaN values (creates gaps in the chart)\n if (value === null || value === undefined || Number.isNaN(value)) {\n continue;\n }\n\n // Skip if time index is out of bounds\n if (timeIndex < 0 || timeIndex >= times.length) {\n continue;\n }\n\n const time = times[timeIndex];\n if (time !== undefined) {\n result.push({ time, value });\n }\n }\n\n return result;\n}\n\n/**\n * Plot result with metadata\n */\nexport interface PlotResult {\n /** Plot identifier */\n id: string;\n /** Time-value data pairs */\n data: TimeValuePair[];\n /** Plot options */\n options: PlotOptions;\n}\n\n/**\n * Create a named plot with data and options\n * \n * @param id - Unique identifier for this plot\n * @param values - Array of values to plot\n * @param times - Array of time values\n * @param options - Plot options\n * @returns PlotResult with id, data, and options\n * \n * @example\n * ```typescript\n * const smaPlot = createPlot('sma', smaValues, ctx.time, { color: '#2196F3' });\n * ```\n */\nexport function createPlot(\n id: string,\n values: (number | null)[],\n times: Time[],\n options: PlotOptions = {}\n): PlotResult {\n return {\n id,\n data: plot(values, times, options),\n options,\n };\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoDO,SAAS,KACd,QACA,OACA,UAAuB,CAAC,GACP;AACjB,QAAM,SAA0B,CAAC;AACjC,QAAM,SAAS,QAAQ,UAAU;AAEjC,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,QAAQ,OAAO,CAAC;AACtB,UAAM,YAAY,IAAI;AAGtB,QAAI,UAAU,QAAQ,UAAU,UAAa,OAAO,MAAM,KAAK,GAAG;AAChE;AAAA,IACF;AAGA,QAAI,YAAY,KAAK,aAAa,MAAM,QAAQ;AAC9C;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,SAAS;AAC5B,QAAI,SAAS,QAAW;AACtB,aAAO,KAAK,EAAE,MAAM,MAAM,CAAC;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO;AACT;AA4BO,SAAS,WACd,IACA,QACA,OACA,UAAuB,CAAC,GACZ;AACZ,SAAO;AAAA,IACL;AAAA,IACA,MAAM,KAAK,QAAQ,OAAO,OAAO;AAAA,IACjC;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Polyline namespace
|
|
3
|
+
* Functions for creating and manipulating polyline drawing objects.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* Polylines allow connecting multiple points with line segments, enabling complex chart drawings
|
|
7
|
+
* like trend channels, patterns, and custom shapes. This implementation focuses on basic
|
|
8
|
+
* polylines (straight lines) - curved polylines can be added in a future iteration.
|
|
9
|
+
*
|
|
10
|
+
* @version 6
|
|
11
|
+
*/
|
|
12
|
+
import type { ChartPoint, Polyline, color } from '../types/index.js';
|
|
13
|
+
export type { Polyline };
|
|
14
|
+
/**
|
|
15
|
+
* Creates a new polyline connecting all points.
|
|
16
|
+
*
|
|
17
|
+
* @param points - Array of chart.point objects to connect
|
|
18
|
+
* @param curved - If true, use curved line segments (default: false, NOT YET SUPPORTED)
|
|
19
|
+
* @param closed - If true, connect first point to last point (default: false)
|
|
20
|
+
* @param xloc - X-coordinate mode: 'bar_index' or 'bar_time' (default: 'bar_index')
|
|
21
|
+
* @param line_color - Color of line segments (default: '#2196F3' - blue)
|
|
22
|
+
* @param fill_color - Fill color for closed polylines (default: null)
|
|
23
|
+
* @param line_style - Line style (default: 'solid')
|
|
24
|
+
* @param line_width - Line width in pixels (default: 1)
|
|
25
|
+
* @param force_overlay - Force display on main pane (default: false)
|
|
26
|
+
* @returns New Polyline object
|
|
27
|
+
*
|
|
28
|
+
* @remarks
|
|
29
|
+
* - The curved parameter is accepted but currently logs a warning as curved lines
|
|
30
|
+
* are not yet supported. Straight-line connections are used instead.
|
|
31
|
+
* - For meaningful polylines, provide at least 2 points.
|
|
32
|
+
* - Closed polylines can be filled with a color by setting fill_color.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* import { chartPoint, polyline } from 'oakscriptjs';
|
|
37
|
+
*
|
|
38
|
+
* // Create points
|
|
39
|
+
* const points = [
|
|
40
|
+
* chartPoint.from_index(0, 100),
|
|
41
|
+
* chartPoint.from_index(10, 120),
|
|
42
|
+
* chartPoint.from_index(20, 110)
|
|
43
|
+
* ];
|
|
44
|
+
*
|
|
45
|
+
* // Create a basic polyline
|
|
46
|
+
* const myPolyline = polyline.new(points);
|
|
47
|
+
*
|
|
48
|
+
* // Create a closed polygon with fill
|
|
49
|
+
* const polygon = polyline.new(
|
|
50
|
+
* points,
|
|
51
|
+
* false, // curved
|
|
52
|
+
* true, // closed
|
|
53
|
+
* 'bar_index', // xloc
|
|
54
|
+
* '#FF5722', // line_color
|
|
55
|
+
* 'rgba(255, 87, 34, 0.3)' // fill_color
|
|
56
|
+
* );
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export declare function new_polyline(points: ChartPoint[], curved?: boolean, closed?: boolean, xloc?: 'bar_index' | 'bar_time', line_color?: color, fill_color?: color | null, line_style?: 'solid' | 'dotted' | 'dashed', line_width?: number, force_overlay?: boolean): Polyline;
|
|
60
|
+
/**
|
|
61
|
+
* Deletes a polyline.
|
|
62
|
+
*
|
|
63
|
+
* @param id - Polyline object to delete
|
|
64
|
+
*
|
|
65
|
+
* @remarks
|
|
66
|
+
* Removes the polyline from `polyline.all()` (the drawing registry, see drawing/registry).
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* const myPolyline = polyline.new(points);
|
|
71
|
+
* polyline.delete(myPolyline);
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export declare function delete_polyline(id: Polyline): void;
|
|
75
|
+
/**
|
|
76
|
+
* Gets all active polylines.
|
|
77
|
+
*
|
|
78
|
+
* @returns Array of all active polylines
|
|
79
|
+
*
|
|
80
|
+
* @remarks
|
|
81
|
+
* Returns a copy of the internal polylines array to prevent external modification.
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* console.log('Total polylines:', polyline.all.length);
|
|
86
|
+
*
|
|
87
|
+
* for (const p of polyline.all) {
|
|
88
|
+
* console.log('Polyline ID:', p.id, 'Points:', p.points.length);
|
|
89
|
+
* }
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
export declare function get_all(): readonly Polyline[];
|
|
93
|
+
/**
|
|
94
|
+
* All live polylines, in creation order (PineScript `polyline.all`). A new array.
|
|
95
|
+
*/
|
|
96
|
+
export declare function all(): Polyline[];
|
|
97
|
+
/**
|
|
98
|
+
* Deletes all polylines.
|
|
99
|
+
*
|
|
100
|
+
* @remarks
|
|
101
|
+
* This is useful for resetting state, especially in tests.
|
|
102
|
+
* Not part of the PineScript API.
|
|
103
|
+
*/
|
|
104
|
+
export declare function clear_all(): void;
|
|
105
|
+
/**
|
|
106
|
+
* Resets the polyline ID counter.
|
|
107
|
+
*
|
|
108
|
+
* @remarks
|
|
109
|
+
* This is useful for resetting state, especially in tests.
|
|
110
|
+
* Not part of the PineScript API.
|
|
111
|
+
*/
|
|
112
|
+
export declare function reset_id_counter(): void;
|
|
113
|
+
export { new_polyline as new };
|
|
114
|
+
export { delete_polyline as delete };
|
|
115
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/polyline/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAIrE,YAAY,EAAE,QAAQ,EAAE,CAAC;AAYzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,UAAU,EAAE,EACpB,MAAM,GAAE,OAAe,EACvB,MAAM,GAAE,OAAe,EACvB,IAAI,GAAE,WAAW,GAAG,UAAwB,EAC5C,UAAU,GAAE,KAAiB,EAC7B,UAAU,GAAE,KAAK,GAAG,IAAW,EAC/B,UAAU,GAAE,OAAO,GAAG,QAAQ,GAAG,QAAkB,EACnD,UAAU,GAAE,MAAU,EACtB,aAAa,GAAE,OAAe,GAC7B,QAAQ,CA4BV;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAElD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,OAAO,IAAI,SAAS,QAAQ,EAAE,CAE7C;AAED;;GAEG;AACH,wBAAgB,GAAG,IAAI,QAAQ,EAAE,CAEhC;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAGD,OAAO,EAAE,YAAY,IAAI,GAAG,EAAE,CAAC;AAC/B,OAAO,EAAE,eAAe,IAAI,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all2) => {
|
|
7
|
+
for (var name in all2)
|
|
8
|
+
__defProp(target, name, { get: all2[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var polyline_exports = {};
|
|
20
|
+
__export(polyline_exports, {
|
|
21
|
+
all: () => all,
|
|
22
|
+
clear_all: () => clear_all,
|
|
23
|
+
delete: () => delete_polyline,
|
|
24
|
+
delete_polyline: () => delete_polyline,
|
|
25
|
+
get_all: () => get_all,
|
|
26
|
+
new: () => new_polyline,
|
|
27
|
+
new_polyline: () => new_polyline,
|
|
28
|
+
reset_id_counter: () => reset_id_counter
|
|
29
|
+
});
|
|
30
|
+
module.exports = __toCommonJS(polyline_exports);
|
|
31
|
+
var import_registry = require("../drawing/registry.js");
|
|
32
|
+
let polylineIdCounter = 0;
|
|
33
|
+
function generateId() {
|
|
34
|
+
return `polyline_${++polylineIdCounter}`;
|
|
35
|
+
}
|
|
36
|
+
function new_polyline(points, curved = false, closed = false, xloc = "bar_index", line_color = "#2196F3", fill_color = null, line_style = "solid", line_width = 1, force_overlay = false) {
|
|
37
|
+
if (curved) {
|
|
38
|
+
console.warn(
|
|
39
|
+
"polyline.new(): curved polylines are not yet supported. Using straight-line connections."
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
if (line_width < 1) {
|
|
43
|
+
console.warn("polyline.new(): line_width must be at least 1. Using 1.");
|
|
44
|
+
line_width = 1;
|
|
45
|
+
}
|
|
46
|
+
const polyline = {
|
|
47
|
+
id: generateId(),
|
|
48
|
+
points: [...points],
|
|
49
|
+
// Create a copy of the points array
|
|
50
|
+
curved,
|
|
51
|
+
closed,
|
|
52
|
+
xloc,
|
|
53
|
+
line_color,
|
|
54
|
+
fill_color,
|
|
55
|
+
line_style,
|
|
56
|
+
line_width,
|
|
57
|
+
force_overlay
|
|
58
|
+
};
|
|
59
|
+
return (0, import_registry.register)("polyline", polyline);
|
|
60
|
+
}
|
|
61
|
+
function delete_polyline(id) {
|
|
62
|
+
(0, import_registry.remove)("polyline", id);
|
|
63
|
+
}
|
|
64
|
+
function get_all() {
|
|
65
|
+
return (0, import_registry.all)("polyline");
|
|
66
|
+
}
|
|
67
|
+
function all() {
|
|
68
|
+
return (0, import_registry.all)("polyline");
|
|
69
|
+
}
|
|
70
|
+
function clear_all() {
|
|
71
|
+
for (const p of (0, import_registry.all)("polyline")) (0, import_registry.remove)("polyline", p);
|
|
72
|
+
}
|
|
73
|
+
function reset_id_counter() {
|
|
74
|
+
polylineIdCounter = 0;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/polyline/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Polyline namespace\n * Functions for creating and manipulating polyline drawing objects.\n *\n * @remarks\n * Polylines allow connecting multiple points with line segments, enabling complex chart drawings\n * like trend channels, patterns, and custom shapes. This implementation focuses on basic\n * polylines (straight lines) - curved polylines can be added in a future iteration.\n *\n * @version 6\n */\n\nimport type { ChartPoint, Polyline, color } from '../types/index.js';\nimport { all as allDrawings, register, remove } from '../drawing/registry.js';\n\n// Re-export the Polyline type for convenience\nexport type { Polyline };\n\n// Internal counter for generating unique IDs\nlet polylineIdCounter = 0;\n\n/**\n * Generates a unique ID for a polyline\n */\nfunction generateId(): string {\n return `polyline_${++polylineIdCounter}`;\n}\n\n/**\n * Creates a new polyline connecting all points.\n *\n * @param points - Array of chart.point objects to connect\n * @param curved - If true, use curved line segments (default: false, NOT YET SUPPORTED)\n * @param closed - If true, connect first point to last point (default: false)\n * @param xloc - X-coordinate mode: 'bar_index' or 'bar_time' (default: 'bar_index')\n * @param line_color - Color of line segments (default: '#2196F3' - blue)\n * @param fill_color - Fill color for closed polylines (default: null)\n * @param line_style - Line style (default: 'solid')\n * @param line_width - Line width in pixels (default: 1)\n * @param force_overlay - Force display on main pane (default: false)\n * @returns New Polyline object\n *\n * @remarks\n * - The curved parameter is accepted but currently logs a warning as curved lines\n * are not yet supported. Straight-line connections are used instead.\n * - For meaningful polylines, provide at least 2 points.\n * - Closed polylines can be filled with a color by setting fill_color.\n *\n * @example\n * ```typescript\n * import { chartPoint, polyline } from 'oakscriptjs';\n *\n * // Create points\n * const points = [\n * chartPoint.from_index(0, 100),\n * chartPoint.from_index(10, 120),\n * chartPoint.from_index(20, 110)\n * ];\n *\n * // Create a basic polyline\n * const myPolyline = polyline.new(points);\n *\n * // Create a closed polygon with fill\n * const polygon = polyline.new(\n * points,\n * false, // curved\n * true, // closed\n * 'bar_index', // xloc\n * '#FF5722', // line_color\n * 'rgba(255, 87, 34, 0.3)' // fill_color\n * );\n * ```\n */\nexport function new_polyline(\n points: ChartPoint[],\n curved: boolean = false,\n closed: boolean = false,\n xloc: 'bar_index' | 'bar_time' = 'bar_index',\n line_color: color = '#2196F3',\n fill_color: color | null = null,\n line_style: 'solid' | 'dotted' | 'dashed' = 'solid',\n line_width: number = 1,\n force_overlay: boolean = false\n): Polyline {\n // Warn about curved polylines not being supported yet\n if (curved) {\n console.warn(\n 'polyline.new(): curved polylines are not yet supported. Using straight-line connections.'\n );\n }\n\n // Validate line_width is positive\n if (line_width < 1) {\n console.warn('polyline.new(): line_width must be at least 1. Using 1.');\n line_width = 1;\n }\n\n const polyline: Polyline = {\n id: generateId(),\n points: [...points], // Create a copy of the points array\n curved,\n closed,\n xloc,\n line_color,\n fill_color,\n line_style,\n line_width,\n force_overlay,\n };\n\n return register('polyline', polyline);\n}\n\n/**\n * Deletes a polyline.\n *\n * @param id - Polyline object to delete\n *\n * @remarks\n * Removes the polyline from `polyline.all()` (the drawing registry, see drawing/registry).\n *\n * @example\n * ```typescript\n * const myPolyline = polyline.new(points);\n * polyline.delete(myPolyline);\n * ```\n */\nexport function delete_polyline(id: Polyline): void {\n remove('polyline', id);\n}\n\n/**\n * Gets all active polylines.\n *\n * @returns Array of all active polylines\n *\n * @remarks\n * Returns a copy of the internal polylines array to prevent external modification.\n *\n * @example\n * ```typescript\n * console.log('Total polylines:', polyline.all.length);\n *\n * for (const p of polyline.all) {\n * console.log('Polyline ID:', p.id, 'Points:', p.points.length);\n * }\n * ```\n */\nexport function get_all(): readonly Polyline[] {\n return allDrawings('polyline');\n}\n\n/**\n * All live polylines, in creation order (PineScript `polyline.all`). A new array.\n */\nexport function all(): Polyline[] {\n return allDrawings('polyline');\n}\n\n/**\n * Deletes all polylines.\n *\n * @remarks\n * This is useful for resetting state, especially in tests.\n * Not part of the PineScript API.\n */\nexport function clear_all(): void {\n for (const p of allDrawings('polyline')) remove('polyline', p);\n}\n\n/**\n * Resets the polyline ID counter.\n *\n * @remarks\n * This is useful for resetting state, especially in tests.\n * Not part of the PineScript API.\n */\nexport function reset_id_counter(): void {\n polylineIdCounter = 0;\n}\n\n// Aliases to match PineScript API\nexport { new_polyline as new };\nexport { delete_polyline as delete };\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA,sBAAqD;AAMrD,IAAI,oBAAoB;AAKxB,SAAS,aAAqB;AAC5B,SAAO,YAAY,EAAE,iBAAiB;AACxC;AA+CO,SAAS,aACd,QACA,SAAkB,OAClB,SAAkB,OAClB,OAAiC,aACjC,aAAoB,WACpB,aAA2B,MAC3B,aAA4C,SAC5C,aAAqB,GACrB,gBAAyB,OACf;AAEV,MAAI,QAAQ;AACV,YAAQ;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAGA,MAAI,aAAa,GAAG;AAClB,YAAQ,KAAK,yDAAyD;AACtE,iBAAa;AAAA,EACf;AAEA,QAAM,WAAqB;AAAA,IACzB,IAAI,WAAW;AAAA,IACf,QAAQ,CAAC,GAAG,MAAM;AAAA;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAO,0BAAS,YAAY,QAAQ;AACtC;AAgBO,SAAS,gBAAgB,IAAoB;AAClD,8BAAO,YAAY,EAAE;AACvB;AAmBO,SAAS,UAA+B;AAC7C,aAAO,gBAAAA,KAAY,UAAU;AAC/B;AAKO,SAAS,MAAkB;AAChC,aAAO,gBAAAA,KAAY,UAAU;AAC/B;AASO,SAAS,YAAkB;AAChC,aAAW,SAAK,gBAAAA,KAAY,UAAU,EAAG,6BAAO,YAAY,CAAC;AAC/D;AASO,SAAS,mBAAyB;AACvC,sBAAoB;AACtB;",
|
|
6
|
+
"names": ["allDrawings"]
|
|
7
|
+
}
|