@tradingaction/series 2.0.13
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 +24 -0
- package/README.md +5 -0
- package/lib/AlternateDataSeries.d.ts +5 -0
- package/lib/AlternateDataSeries.js +16 -0
- package/lib/AlternateDataSeries.js.map +1 -0
- package/lib/AlternatingFillAreaSeries.d.ts +77 -0
- package/lib/AlternatingFillAreaSeries.js +69 -0
- package/lib/AlternatingFillAreaSeries.js.map +1 -0
- package/lib/AreaOnlySeries.d.ts +42 -0
- package/lib/AreaOnlySeries.js +53 -0
- package/lib/AreaOnlySeries.js.map +1 -0
- package/lib/AreaSeries.d.ts +46 -0
- package/lib/AreaSeries.js +21 -0
- package/lib/AreaSeries.js.map +1 -0
- package/lib/BarSeries.d.ts +36 -0
- package/lib/BarSeries.js +91 -0
- package/lib/BarSeries.js.map +1 -0
- package/lib/BollingerSeries.d.ts +33 -0
- package/lib/BollingerSeries.js +59 -0
- package/lib/BollingerSeries.js.map +1 -0
- package/lib/CandlestickSeries.d.ts +65 -0
- package/lib/CandlestickSeries.js +115 -0
- package/lib/CandlestickSeries.js.map +1 -0
- package/lib/ElderRaySeries.d.ts +45 -0
- package/lib/ElderRaySeries.js +66 -0
- package/lib/ElderRaySeries.js.map +1 -0
- package/lib/GroupedBarSeries.d.ts +33 -0
- package/lib/GroupedBarSeries.js +22 -0
- package/lib/GroupedBarSeries.js.map +1 -0
- package/lib/KagiSeries.d.ts +45 -0
- package/lib/KagiSeries.js +108 -0
- package/lib/KagiSeries.js.map +1 -0
- package/lib/LineSeries.d.ts +84 -0
- package/lib/LineSeries.js +102 -0
- package/lib/LineSeries.js.map +1 -0
- package/lib/MACDSeries.d.ts +55 -0
- package/lib/MACDSeries.js +62 -0
- package/lib/MACDSeries.js.map +1 -0
- package/lib/OHLCSeries.d.ts +32 -0
- package/lib/OHLCSeries.js +67 -0
- package/lib/OHLCSeries.js.map +1 -0
- package/lib/OverlayBarSeries.d.ts +35 -0
- package/lib/OverlayBarSeries.js +71 -0
- package/lib/OverlayBarSeries.js.map +1 -0
- package/lib/PointAndFigureSeries.d.ts +33 -0
- package/lib/PointAndFigureSeries.js +92 -0
- package/lib/PointAndFigureSeries.js.map +1 -0
- package/lib/RSISeries.d.ts +68 -0
- package/lib/RSISeries.js +82 -0
- package/lib/RSISeries.js.map +1 -0
- package/lib/RenkoSeries.d.ts +42 -0
- package/lib/RenkoSeries.js +65 -0
- package/lib/RenkoSeries.js.map +1 -0
- package/lib/SARSeries.d.ts +34 -0
- package/lib/SARSeries.js +69 -0
- package/lib/SARSeries.js.map +1 -0
- package/lib/SVGComponent.d.ts +8 -0
- package/lib/SVGComponent.js +9 -0
- package/lib/SVGComponent.js.map +1 -0
- package/lib/ScatterSeries.d.ts +24 -0
- package/lib/ScatterSeries.js +60 -0
- package/lib/ScatterSeries.js.map +1 -0
- package/lib/StackedBarSeries.d.ts +44 -0
- package/lib/StackedBarSeries.js +157 -0
- package/lib/StackedBarSeries.js.map +1 -0
- package/lib/StochasticSeries.d.ts +39 -0
- package/lib/StochasticSeries.js +42 -0
- package/lib/StochasticSeries.js.map +1 -0
- package/lib/StraightLine.d.ts +38 -0
- package/lib/StraightLine.js +81 -0
- package/lib/StraightLine.js.map +1 -0
- package/lib/VolumeProfileSeries.d.ts +45 -0
- package/lib/VolumeProfileSeries.js +161 -0
- package/lib/VolumeProfileSeries.js.map +1 -0
- package/lib/index.d.ts +23 -0
- package/lib/index.js +24 -0
- package/lib/index.js.map +1 -0
- package/lib/markers/CircleMarker.d.ts +25 -0
- package/lib/markers/CircleMarker.js +35 -0
- package/lib/markers/CircleMarker.js.map +1 -0
- package/lib/markers/SquareMarker.d.ts +25 -0
- package/lib/markers/SquareMarker.js +37 -0
- package/lib/markers/SquareMarker.js.map +1 -0
- package/lib/markers/TriangleMarker.d.ts +27 -0
- package/lib/markers/TriangleMarker.js +89 -0
- package/lib/markers/TriangleMarker.js.map +1 -0
- package/lib/markers/index.d.ts +3 -0
- package/lib/markers/index.js +4 -0
- package/lib/markers/index.js.map +1 -0
- package/package.json +52 -0
- package/src/AlternateDataSeries.tsx +29 -0
- package/src/AlternatingFillAreaSeries.tsx +159 -0
- package/src/AreaOnlySeries.tsx +106 -0
- package/src/AreaSeries.tsx +95 -0
- package/src/BarSeries.tsx +151 -0
- package/src/BollingerSeries.tsx +90 -0
- package/src/CandlestickSeries.tsx +188 -0
- package/src/ElderRaySeries.tsx +99 -0
- package/src/GroupedBarSeries.tsx +48 -0
- package/src/KagiSeries.tsx +155 -0
- package/src/LineSeries.tsx +223 -0
- package/src/MACDSeries.tsx +110 -0
- package/src/OHLCSeries.tsx +116 -0
- package/src/OverlayBarSeries.tsx +115 -0
- package/src/PointAndFigureSeries.tsx +140 -0
- package/src/RSISeries.tsx +158 -0
- package/src/RenkoSeries.tsx +118 -0
- package/src/SARSeries.tsx +111 -0
- package/src/SVGComponent.tsx +13 -0
- package/src/ScatterSeries.tsx +105 -0
- package/src/StackedBarSeries.tsx +272 -0
- package/src/StochasticSeries.tsx +70 -0
- package/src/StraightLine.tsx +166 -0
- package/src/VolumeProfileSeries.tsx +247 -0
- package/src/index.ts +23 -0
- package/src/markers/CircleMarker.tsx +69 -0
- package/src/markers/SquareMarker.tsx +71 -0
- package/src/markers/TriangleMarker.tsx +131 -0
- package/src/markers/index.ts +3 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { getClosestItemIndexes, getStrokeDasharrayCanvas, getAxisCanvas, getMouseCanvas, GenericChartComponent, } from "@tradingaction/core";
|
|
2
|
+
import { line } from "d3-shape";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
/**
|
|
5
|
+
* `LineSeries` component.
|
|
6
|
+
*/
|
|
7
|
+
export class LineSeries extends React.Component {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(...arguments);
|
|
10
|
+
this.drawOnCanvas = (lineDash) => (ctx, moreProps) => {
|
|
11
|
+
const { connectNulls, yAccessor, hoverStrokeWidth = LineSeries.defaultProps.hoverStrokeWidth, defined = LineSeries.defaultProps.defined, curve, canvasClip, strokeStyle, strokeWidth = LineSeries.defaultProps.strokeWidth, } = this.props;
|
|
12
|
+
const { xAccessor, xScale, chartConfig, plotData, hovering } = moreProps;
|
|
13
|
+
if (!chartConfig) {
|
|
14
|
+
console.warn("LineSeries received no chartConfig, is it inside of a Chart?");
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const { yScale } = chartConfig;
|
|
18
|
+
if (canvasClip !== undefined) {
|
|
19
|
+
ctx.save();
|
|
20
|
+
canvasClip(ctx, moreProps);
|
|
21
|
+
}
|
|
22
|
+
ctx.lineWidth = hovering ? hoverStrokeWidth : strokeWidth;
|
|
23
|
+
if (strokeStyle !== undefined) {
|
|
24
|
+
ctx.strokeStyle = strokeStyle;
|
|
25
|
+
}
|
|
26
|
+
if (lineDash !== undefined) {
|
|
27
|
+
ctx.setLineDash(lineDash);
|
|
28
|
+
}
|
|
29
|
+
const dataSeries = line()
|
|
30
|
+
.x((d) => Math.round(xScale(xAccessor(d))))
|
|
31
|
+
.y((d) => Math.round(yScale(yAccessor(d))));
|
|
32
|
+
if (curve !== undefined) {
|
|
33
|
+
dataSeries.curve(curve);
|
|
34
|
+
}
|
|
35
|
+
if (!connectNulls) {
|
|
36
|
+
dataSeries.defined((d) => defined(yAccessor(d)));
|
|
37
|
+
}
|
|
38
|
+
ctx.beginPath();
|
|
39
|
+
dataSeries.context(ctx)(plotData);
|
|
40
|
+
ctx.stroke();
|
|
41
|
+
if (canvasClip !== undefined) {
|
|
42
|
+
ctx.restore();
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
this.isHover = (moreProps) => {
|
|
46
|
+
const { highlightOnHover, yAccessor, hoverTolerance = LineSeries.defaultProps.hoverTolerance } = this.props;
|
|
47
|
+
if (!highlightOnHover) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
const { chartConfig: { yScale, origin }, xAccessor, mouseXY, currentItem, xScale, plotData, } = moreProps;
|
|
51
|
+
const [x, y] = mouseXY;
|
|
52
|
+
const radius = hoverTolerance;
|
|
53
|
+
const { left, right } = getClosestItemIndexes(plotData, xScale.invert(x), xAccessor);
|
|
54
|
+
if (left === right) {
|
|
55
|
+
const cy = yScale(yAccessor(currentItem)) + origin[1];
|
|
56
|
+
const cx = xScale(xAccessor(currentItem)) + origin[0];
|
|
57
|
+
const hovering1 = Math.pow(x - cx, 2) + Math.pow(y - cy, 2) < Math.pow(radius, 2);
|
|
58
|
+
return hovering1;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
const l = plotData[left];
|
|
62
|
+
const r = plotData[right];
|
|
63
|
+
const x1 = xScale(xAccessor(l)) + origin[0];
|
|
64
|
+
const y1 = yScale(yAccessor(l)) + origin[1];
|
|
65
|
+
const x2 = xScale(xAccessor(r)) + origin[0];
|
|
66
|
+
const y2 = yScale(yAccessor(r)) + origin[1];
|
|
67
|
+
// y = m * x + b
|
|
68
|
+
const m /* slope */ = (y2 - y1) / (x2 - x1);
|
|
69
|
+
const b /* y intercept */ = -1 * m * x1 + y1;
|
|
70
|
+
const desiredY = Math.round(m * x + b);
|
|
71
|
+
const hovering2 = y >= desiredY - radius && y <= desiredY + radius;
|
|
72
|
+
return hovering2;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
render() {
|
|
77
|
+
const { highlightOnHover, onClick, onContextMenu, onDoubleClick, onHover, onUnHover, strokeDasharray } = this.props;
|
|
78
|
+
const hoverProps = highlightOnHover || onHover || onUnHover
|
|
79
|
+
? {
|
|
80
|
+
isHover: this.isHover,
|
|
81
|
+
drawOn: ["mousemove", "pan"],
|
|
82
|
+
canvasToDraw: getMouseCanvas,
|
|
83
|
+
}
|
|
84
|
+
: {
|
|
85
|
+
drawOn: ["pan"],
|
|
86
|
+
canvasToDraw: getAxisCanvas,
|
|
87
|
+
};
|
|
88
|
+
const lineDash = getStrokeDasharrayCanvas(strokeDasharray);
|
|
89
|
+
return (React.createElement(GenericChartComponent, Object.assign({ canvasDraw: this.drawOnCanvas(lineDash), onClickWhenHover: onClick, onDoubleClickWhenHover: onDoubleClick, onContextMenuWhenHover: onContextMenu, onHover: onHover, onUnHover: onUnHover }, hoverProps)));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
LineSeries.defaultProps = {
|
|
93
|
+
connectNulls: false,
|
|
94
|
+
defined: (d) => d !== undefined && !isNaN(d),
|
|
95
|
+
hoverStrokeWidth: 4,
|
|
96
|
+
hoverTolerance: 6,
|
|
97
|
+
highlightOnHover: false,
|
|
98
|
+
strokeDasharray: "Solid",
|
|
99
|
+
strokeStyle: "#2196f3",
|
|
100
|
+
strokeWidth: 1,
|
|
101
|
+
};
|
|
102
|
+
//# sourceMappingURL=LineSeries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LineSeries.js","sourceRoot":"","sources":["../src/LineSeries.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { ScaleContinuousNumeric, ScaleTime } from "d3-scale";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
export interface MACDSeriesProps {
|
|
4
|
+
readonly className?: string;
|
|
5
|
+
readonly clip?: boolean;
|
|
6
|
+
readonly fillStyle?: {
|
|
7
|
+
divergence: string;
|
|
8
|
+
};
|
|
9
|
+
readonly strokeStyle?: {
|
|
10
|
+
macd: string;
|
|
11
|
+
signal: string;
|
|
12
|
+
zero: string;
|
|
13
|
+
};
|
|
14
|
+
readonly widthRatio?: number;
|
|
15
|
+
readonly width?: number | ((props: {
|
|
16
|
+
widthRatio: number;
|
|
17
|
+
}, moreProps: any) => number);
|
|
18
|
+
readonly yAccessor: (data: any) => {
|
|
19
|
+
divergence: number;
|
|
20
|
+
signal: number;
|
|
21
|
+
macd: number;
|
|
22
|
+
} | undefined;
|
|
23
|
+
readonly zeroLineStroke?: string;
|
|
24
|
+
readonly zeroLineOpacity?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The MACD turns two trend-following indicators, moving averages, into a momentum oscillator by subtracting the longer moving average from the shorter one.
|
|
28
|
+
*/
|
|
29
|
+
export declare class MACDSeries extends React.Component<MACDSeriesProps> {
|
|
30
|
+
static defaultProps: {
|
|
31
|
+
className: string;
|
|
32
|
+
clip: boolean;
|
|
33
|
+
fillStyle: {
|
|
34
|
+
divergence: string;
|
|
35
|
+
};
|
|
36
|
+
strokeStyle: {
|
|
37
|
+
macd: string;
|
|
38
|
+
signal: string;
|
|
39
|
+
zero: string;
|
|
40
|
+
};
|
|
41
|
+
widthRatio: number;
|
|
42
|
+
width: <T>(props: {
|
|
43
|
+
widthRatio: number;
|
|
44
|
+
}, moreProps: {
|
|
45
|
+
xAccessor: (datum: T) => number | Date;
|
|
46
|
+
xScale: ScaleContinuousNumeric<number, number, never> | ScaleTime<number, number, never>;
|
|
47
|
+
plotData: T[];
|
|
48
|
+
}) => number;
|
|
49
|
+
};
|
|
50
|
+
render(): JSX.Element;
|
|
51
|
+
private readonly yAccessorForDivergenceBase;
|
|
52
|
+
private readonly yAccessorForDivergence;
|
|
53
|
+
private readonly yAccessorForSignal;
|
|
54
|
+
private readonly yAccessorForMACD;
|
|
55
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { BarSeries } from "./BarSeries";
|
|
3
|
+
import { LineSeries } from "./LineSeries";
|
|
4
|
+
import { StraightLine } from "./StraightLine";
|
|
5
|
+
/**
|
|
6
|
+
* The MACD turns two trend-following indicators, moving averages, into a momentum oscillator by subtracting the longer moving average from the shorter one.
|
|
7
|
+
*/
|
|
8
|
+
export class MACDSeries extends React.Component {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(...arguments);
|
|
11
|
+
this.yAccessorForDivergenceBase = (xScale, yScale) => {
|
|
12
|
+
return yScale(0);
|
|
13
|
+
};
|
|
14
|
+
this.yAccessorForDivergence = (d) => {
|
|
15
|
+
const { yAccessor } = this.props;
|
|
16
|
+
const dataItem = yAccessor(d);
|
|
17
|
+
if (dataItem !== undefined) {
|
|
18
|
+
return dataItem.divergence;
|
|
19
|
+
}
|
|
20
|
+
return undefined;
|
|
21
|
+
};
|
|
22
|
+
this.yAccessorForSignal = (d) => {
|
|
23
|
+
const { yAccessor } = this.props;
|
|
24
|
+
const dataItem = yAccessor(d);
|
|
25
|
+
if (dataItem !== undefined) {
|
|
26
|
+
return dataItem.signal;
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
};
|
|
30
|
+
this.yAccessorForMACD = (d) => {
|
|
31
|
+
const { yAccessor } = this.props;
|
|
32
|
+
const dataItem = yAccessor(d);
|
|
33
|
+
if (dataItem !== undefined) {
|
|
34
|
+
return dataItem.macd;
|
|
35
|
+
}
|
|
36
|
+
return undefined;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
render() {
|
|
40
|
+
const { className, clip, fillStyle = MACDSeries.defaultProps.fillStyle, strokeStyle = MACDSeries.defaultProps.strokeStyle, widthRatio, width, } = this.props;
|
|
41
|
+
return (React.createElement("g", { className: className },
|
|
42
|
+
React.createElement(BarSeries, { baseAt: this.yAccessorForDivergenceBase, width: width, widthRatio: widthRatio, fillStyle: fillStyle.divergence, clip: clip, yAccessor: this.yAccessorForDivergence }),
|
|
43
|
+
React.createElement(LineSeries, { yAccessor: this.yAccessorForMACD, strokeStyle: strokeStyle.macd }),
|
|
44
|
+
React.createElement(LineSeries, { yAccessor: this.yAccessorForSignal, strokeStyle: strokeStyle.signal }),
|
|
45
|
+
React.createElement(StraightLine, { strokeStyle: strokeStyle.zero, yValue: 0 })));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
MACDSeries.defaultProps = {
|
|
49
|
+
className: "react-financial-charts-macd-series",
|
|
50
|
+
clip: true,
|
|
51
|
+
fillStyle: {
|
|
52
|
+
divergence: "rgba(70, 130, 180, 0.6)",
|
|
53
|
+
},
|
|
54
|
+
strokeStyle: {
|
|
55
|
+
macd: "#0093FF",
|
|
56
|
+
signal: "#D84315",
|
|
57
|
+
zero: "rgba(0, 0, 0, 0.3)",
|
|
58
|
+
},
|
|
59
|
+
widthRatio: 0.5,
|
|
60
|
+
width: BarSeries.defaultProps.width,
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=MACDSeries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MACDSeries.js","sourceRoot":"","sources":["../src/MACDSeries.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAoB9C;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,KAAK,CAAC,SAA0B;IAAhE;;QA2CqB,+BAA0B,GAAG,CAC1C,MAA0E,EAC1E,MAA8C,EAChD,EAAE;YACA,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC,CAAC;QAEe,2BAAsB,GAAG,CAAC,CAAM,EAAE,EAAE;YACjD,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;YAEjC,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,QAAQ,KAAK,SAAS,EAAE;gBACxB,OAAO,QAAQ,CAAC,UAAU,CAAC;aAC9B;YAED,OAAO,SAAS,CAAC;QACrB,CAAC,CAAC;QAEe,uBAAkB,GAAG,CAAC,CAAM,EAAE,EAAE;YAC7C,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;YAEjC,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,QAAQ,KAAK,SAAS,EAAE;gBACxB,OAAO,QAAQ,CAAC,MAAM,CAAC;aAC1B;YAED,OAAO,SAAS,CAAC;QACrB,CAAC,CAAC;QAEe,qBAAgB,GAAG,CAAC,CAAM,EAAE,EAAE;YAC3C,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;YAEjC,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,QAAQ,KAAK,SAAS,EAAE;gBACxB,OAAO,QAAQ,CAAC,IAAI,CAAC;aACxB;YAED,OAAO,SAAS,CAAC;QACrB,CAAC,CAAC;IACN,CAAC;IAlEU,MAAM;QACT,MAAM,EACF,SAAS,EACT,IAAI,EACJ,SAAS,GAAG,UAAU,CAAC,YAAY,CAAC,SAAS,EAC7C,WAAW,GAAG,UAAU,CAAC,YAAY,CAAC,WAAW,EACjD,UAAU,EACV,KAAK,GACR,GAAG,IAAI,CAAC,KAAK,CAAC;QAEf,OAAO,CACH,2BAAG,SAAS,EAAE,SAAS;YACnB,oBAAC,SAAS,IACN,MAAM,EAAE,IAAI,CAAC,0BAA0B,EACvC,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,CAAC,UAAU,EAC/B,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,IAAI,CAAC,sBAAsB,GACxC;YACF,oBAAC,UAAU,IAAC,SAAS,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,EAAE,WAAW,CAAC,IAAI,GAAI;YAC/E,oBAAC,UAAU,IAAC,SAAS,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,EAAE,WAAW,CAAC,MAAM,GAAI;YACnF,oBAAC,YAAY,IAAC,WAAW,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,GAAI,CAC1D,CACP,CAAC;IACN,CAAC;;AAxCa,uBAAY,GAAG;IACzB,SAAS,EAAE,oCAAoC;IAC/C,IAAI,EAAE,IAAI;IACV,SAAS,EAAE;QACP,UAAU,EAAE,yBAAyB;KACxC;IACD,WAAW,EAAE;QACT,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,oBAAoB;KAC7B;IACD,UAAU,EAAE,GAAG;IACf,KAAK,EAAE,SAAS,CAAC,YAAY,CAAC,KAAK;CACtC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
interface IOHLC {
|
|
3
|
+
readonly close?: number;
|
|
4
|
+
readonly high?: number;
|
|
5
|
+
readonly low?: number;
|
|
6
|
+
readonly open?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface OHLCSeriesProps {
|
|
9
|
+
readonly clip?: boolean;
|
|
10
|
+
readonly stroke?: string | ((datum: any) => string);
|
|
11
|
+
readonly strokeWidth?: number;
|
|
12
|
+
readonly yAccessor: (datum: any) => IOHLC;
|
|
13
|
+
}
|
|
14
|
+
export declare class OHLCSeries extends React.Component<OHLCSeriesProps> {
|
|
15
|
+
static defaultProps: {
|
|
16
|
+
yAccessor: (d: any) => {
|
|
17
|
+
open: any;
|
|
18
|
+
high: any;
|
|
19
|
+
low: any;
|
|
20
|
+
close: any;
|
|
21
|
+
};
|
|
22
|
+
classNames: (d: any) => "up" | "down" | "firstbar";
|
|
23
|
+
stroke: (d: any) => "#26a69a" | "#ef5350" | "#000000";
|
|
24
|
+
strokeWidth: number;
|
|
25
|
+
clip: boolean;
|
|
26
|
+
};
|
|
27
|
+
render(): JSX.Element;
|
|
28
|
+
private readonly drawOnCanvas;
|
|
29
|
+
private readonly getOHLCBars;
|
|
30
|
+
private readonly drawBarDataOnCanvas;
|
|
31
|
+
}
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { group } from "d3-array";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { functor, isDefined, getAxisCanvas, GenericChartComponent } from "@tradingaction/core";
|
|
4
|
+
export class OHLCSeries extends React.Component {
|
|
5
|
+
constructor() {
|
|
6
|
+
super(...arguments);
|
|
7
|
+
this.drawOnCanvas = (ctx, moreProps) => {
|
|
8
|
+
const { xAccessor, xScale, chartConfig: { yScale }, plotData, } = moreProps;
|
|
9
|
+
const barData = this.getOHLCBars(this.props, xAccessor, xScale, yScale, plotData);
|
|
10
|
+
this.drawBarDataOnCanvas(ctx, barData);
|
|
11
|
+
};
|
|
12
|
+
this.getOHLCBars = (props, xAccessor, xScale, yScale, plotData) => {
|
|
13
|
+
const { stroke: strokeProp, strokeWidth: strokeWidthProp = 1, yAccessor } = props;
|
|
14
|
+
const strokeFunc = functor(strokeProp);
|
|
15
|
+
const width = xScale(xAccessor(plotData[plotData.length - 1])) - xScale(xAccessor(plotData[0]));
|
|
16
|
+
const barWidth = Math.max(1, Math.round(width / (plotData.length - 1) / 2) - 1.5);
|
|
17
|
+
const strokeWidth = Math.min(barWidth, strokeWidthProp);
|
|
18
|
+
const bars = plotData
|
|
19
|
+
.filter((d) => yAccessor(d).close !== undefined)
|
|
20
|
+
.map((d) => {
|
|
21
|
+
const ohlc = yAccessor(d);
|
|
22
|
+
const x = Math.round(xScale(xAccessor(d)));
|
|
23
|
+
const y1 = yScale(ohlc.high);
|
|
24
|
+
const y2 = yScale(ohlc.low);
|
|
25
|
+
const openX1 = x - barWidth;
|
|
26
|
+
const openX2 = x + strokeWidth / 2;
|
|
27
|
+
const openY = yScale(ohlc.open);
|
|
28
|
+
const closeX1 = x - strokeWidth / 2;
|
|
29
|
+
const closeX2 = x + barWidth;
|
|
30
|
+
const closeY = yScale(ohlc.close);
|
|
31
|
+
const stroke = strokeFunc(d);
|
|
32
|
+
return { x, y1, y2, openX1, openX2, openY, closeX1, closeX2, closeY, stroke };
|
|
33
|
+
});
|
|
34
|
+
return { barWidth, strokeWidth, bars };
|
|
35
|
+
};
|
|
36
|
+
this.drawBarDataOnCanvas = (ctx, barData) => {
|
|
37
|
+
const { strokeWidth, bars } = barData;
|
|
38
|
+
const wickNest = group(bars, (d) => d.stroke);
|
|
39
|
+
ctx.lineWidth = strokeWidth;
|
|
40
|
+
wickNest.forEach((values, key) => {
|
|
41
|
+
ctx.strokeStyle = key;
|
|
42
|
+
values.forEach((d) => {
|
|
43
|
+
ctx.beginPath();
|
|
44
|
+
ctx.moveTo(d.x, d.y1);
|
|
45
|
+
ctx.lineTo(d.x, d.y2);
|
|
46
|
+
ctx.moveTo(d.openX1, d.openY);
|
|
47
|
+
ctx.lineTo(d.openX2, d.openY);
|
|
48
|
+
ctx.moveTo(d.closeX1, d.closeY);
|
|
49
|
+
ctx.lineTo(d.closeX2, d.closeY);
|
|
50
|
+
ctx.stroke();
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
render() {
|
|
56
|
+
const { clip } = this.props;
|
|
57
|
+
return (React.createElement(GenericChartComponent, { canvasToDraw: getAxisCanvas, canvasDraw: this.drawOnCanvas, clip: clip, drawOn: ["pan"] }));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
OHLCSeries.defaultProps = {
|
|
61
|
+
yAccessor: (d) => ({ open: d.open, high: d.high, low: d.low, close: d.close }),
|
|
62
|
+
classNames: (d) => (isDefined(d.absoluteChange) ? (d.absoluteChange > 0 ? "up" : "down") : "firstbar"),
|
|
63
|
+
stroke: (d) => (isDefined(d.absoluteChange) ? (d.absoluteChange > 0 ? "#26a69a" : "#ef5350") : "#000000"),
|
|
64
|
+
strokeWidth: 1,
|
|
65
|
+
clip: true,
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=OHLCSeries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OHLCSeries.js","sourceRoot":"","sources":["../src/OHLCSeries.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ScaleContinuousNumeric, ScaleTime } from "d3-scale";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
export interface OverlayBarSeriesProps {
|
|
4
|
+
readonly baseAt?: number | ((xScale: ScaleContinuousNumeric<number, number> | ScaleTime<number, number>, yScale: ScaleContinuousNumeric<number, number>, datum: any) => number);
|
|
5
|
+
readonly direction?: "up" | "down";
|
|
6
|
+
readonly stroke?: boolean;
|
|
7
|
+
readonly width?: any;
|
|
8
|
+
readonly widthRatio?: number;
|
|
9
|
+
readonly fillStyle?: string | ((data: any, y: number) => string);
|
|
10
|
+
readonly yAccessor: ((datum: any) => number | undefined)[];
|
|
11
|
+
readonly xScale?: ScaleContinuousNumeric<number, number>;
|
|
12
|
+
readonly yScale?: ScaleContinuousNumeric<number, number>;
|
|
13
|
+
readonly plotData?: number[];
|
|
14
|
+
readonly clip?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare class OverlayBarSeries extends React.Component<OverlayBarSeriesProps> {
|
|
17
|
+
static defaultProps: {
|
|
18
|
+
baseAt: (xScale: ScaleContinuousNumeric<number, number>, yScale: ScaleContinuousNumeric<number, number>) => any;
|
|
19
|
+
clip: boolean;
|
|
20
|
+
direction: string;
|
|
21
|
+
stroke: boolean;
|
|
22
|
+
fillStyle: string;
|
|
23
|
+
widthRatio: number;
|
|
24
|
+
width: <T>(props: {
|
|
25
|
+
widthRatio: number;
|
|
26
|
+
}, moreProps: {
|
|
27
|
+
xAccessor: (datum: T) => number | Date;
|
|
28
|
+
xScale: ScaleContinuousNumeric<number, number, never> | ScaleTime<number, number, never>;
|
|
29
|
+
plotData: T[];
|
|
30
|
+
}) => number;
|
|
31
|
+
};
|
|
32
|
+
render(): JSX.Element;
|
|
33
|
+
private readonly drawOnCanvas;
|
|
34
|
+
private readonly getBars;
|
|
35
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { merge } from "d3-array";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { first, functor, getAxisCanvas, GenericChartComponent, plotDataLengthBarWidth } from "@tradingaction/core";
|
|
4
|
+
import { drawOnCanvas2 } from "./StackedBarSeries";
|
|
5
|
+
export class OverlayBarSeries extends React.Component {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(...arguments);
|
|
8
|
+
this.drawOnCanvas = (ctx, moreProps) => {
|
|
9
|
+
const bars = this.getBars(moreProps);
|
|
10
|
+
drawOnCanvas2(this.props, ctx, bars);
|
|
11
|
+
};
|
|
12
|
+
this.getBars = (moreProps) => {
|
|
13
|
+
const { xScale, xAccessor, chartConfig: { yScale }, plotData, } = moreProps;
|
|
14
|
+
const { baseAt, fillStyle, stroke, yAccessor } = this.props;
|
|
15
|
+
const getFill = functor(fillStyle);
|
|
16
|
+
const getBase = functor(baseAt);
|
|
17
|
+
const widthFunctor = functor(this.props.width);
|
|
18
|
+
const width = widthFunctor(this.props, moreProps);
|
|
19
|
+
const offset = Math.floor(0.5 * width);
|
|
20
|
+
const bars = plotData.map((d) => {
|
|
21
|
+
const innerBars = yAccessor
|
|
22
|
+
.map((eachYAccessor, i) => {
|
|
23
|
+
const yValue = eachYAccessor(d);
|
|
24
|
+
if (yValue === undefined) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
const xValue = xAccessor(d);
|
|
28
|
+
const x = Math.round(xScale(xValue)) - offset;
|
|
29
|
+
const y = yScale(yValue);
|
|
30
|
+
return {
|
|
31
|
+
height: 0,
|
|
32
|
+
width: offset * 2,
|
|
33
|
+
x,
|
|
34
|
+
y,
|
|
35
|
+
stroke: stroke ? getFill(d, i) : "none",
|
|
36
|
+
fillStyle: getFill(d, i),
|
|
37
|
+
i,
|
|
38
|
+
};
|
|
39
|
+
})
|
|
40
|
+
.filter((yValue) => yValue !== undefined);
|
|
41
|
+
let b = getBase(xScale, yScale, d);
|
|
42
|
+
let h;
|
|
43
|
+
for (let i = innerBars.length - 1; i >= 0; i--) {
|
|
44
|
+
h = b - innerBars[i].y;
|
|
45
|
+
if (h < 0) {
|
|
46
|
+
innerBars[i].y = b;
|
|
47
|
+
h = -1 * h;
|
|
48
|
+
}
|
|
49
|
+
innerBars[i].height = h;
|
|
50
|
+
b = innerBars[i].y;
|
|
51
|
+
}
|
|
52
|
+
return innerBars;
|
|
53
|
+
});
|
|
54
|
+
return merge(bars);
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
render() {
|
|
58
|
+
const { clip } = this.props;
|
|
59
|
+
return (React.createElement(GenericChartComponent, { canvasToDraw: getAxisCanvas, canvasDraw: this.drawOnCanvas, clip: clip, drawOn: ["pan"] }));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
OverlayBarSeries.defaultProps = {
|
|
63
|
+
baseAt: (xScale, yScale) => first(yScale.range()),
|
|
64
|
+
clip: true,
|
|
65
|
+
direction: "up",
|
|
66
|
+
stroke: false,
|
|
67
|
+
fillStyle: "#4682B4",
|
|
68
|
+
widthRatio: 0.5,
|
|
69
|
+
width: plotDataLengthBarWidth,
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=OverlayBarSeries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OverlayBarSeries.js","sourceRoot":"","sources":["../src/OverlayBarSeries.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export interface PointAndFigureSeriesProps {
|
|
3
|
+
readonly className?: string;
|
|
4
|
+
readonly clip?: boolean;
|
|
5
|
+
readonly fill?: {
|
|
6
|
+
up: string;
|
|
7
|
+
down: string;
|
|
8
|
+
};
|
|
9
|
+
readonly stroke?: {
|
|
10
|
+
up: string;
|
|
11
|
+
down: string;
|
|
12
|
+
};
|
|
13
|
+
readonly strokeWidth?: number;
|
|
14
|
+
}
|
|
15
|
+
export declare class PointAndFigureSeries extends React.Component<PointAndFigureSeriesProps> {
|
|
16
|
+
static defaultProps: {
|
|
17
|
+
className: string;
|
|
18
|
+
strokeWidth: number;
|
|
19
|
+
stroke: {
|
|
20
|
+
up: string;
|
|
21
|
+
down: string;
|
|
22
|
+
};
|
|
23
|
+
fill: {
|
|
24
|
+
up: string;
|
|
25
|
+
down: string;
|
|
26
|
+
};
|
|
27
|
+
clip: boolean;
|
|
28
|
+
};
|
|
29
|
+
render(): JSX.Element;
|
|
30
|
+
private readonly drawOnCanvas;
|
|
31
|
+
private readonly getColumns;
|
|
32
|
+
private readonly drawOnCanvasPrivate;
|
|
33
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { isDefined, isNotDefined, getAxisCanvas, GenericChartComponent } from "@tradingaction/core";
|
|
3
|
+
export class PointAndFigureSeries extends React.Component {
|
|
4
|
+
constructor() {
|
|
5
|
+
super(...arguments);
|
|
6
|
+
this.drawOnCanvas = (ctx, moreProps) => {
|
|
7
|
+
const { xAccessor, xScale, chartConfig: { yScale }, plotData, } = moreProps;
|
|
8
|
+
const columns = this.getColumns(xScale, xAccessor, yScale, plotData);
|
|
9
|
+
this.drawOnCanvasPrivate(ctx, this.props, columns);
|
|
10
|
+
};
|
|
11
|
+
this.getColumns = (xScale, xAccessor, yScale, plotData) => {
|
|
12
|
+
const width = xScale(xAccessor(plotData[plotData.length - 1])) - xScale(xAccessor(plotData[0]));
|
|
13
|
+
const columnWidth = width / (plotData.length - 1);
|
|
14
|
+
let anyBox;
|
|
15
|
+
let j = 0;
|
|
16
|
+
while (isNotDefined(anyBox)) {
|
|
17
|
+
if (isDefined(plotData[j].close)) {
|
|
18
|
+
anyBox = plotData[j].boxes[0];
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
j++;
|
|
24
|
+
}
|
|
25
|
+
const boxHeight = Math.abs(yScale(anyBox.open) - yScale(anyBox.close));
|
|
26
|
+
const columns = plotData
|
|
27
|
+
.filter((d) => isDefined(d.close))
|
|
28
|
+
.map((d) => {
|
|
29
|
+
const boxes = d.boxes.map((box) => ({
|
|
30
|
+
columnWidth,
|
|
31
|
+
boxHeight,
|
|
32
|
+
open: yScale(box.open),
|
|
33
|
+
close: yScale(box.close),
|
|
34
|
+
}));
|
|
35
|
+
const xOffset = xScale(xAccessor(d)) - columnWidth / 2;
|
|
36
|
+
return {
|
|
37
|
+
boxes,
|
|
38
|
+
direction: d.direction,
|
|
39
|
+
offset: [xOffset, 0],
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
return columns;
|
|
43
|
+
};
|
|
44
|
+
this.drawOnCanvasPrivate = (ctx, props, columns) => {
|
|
45
|
+
const { stroke, fill, strokeWidth } = props;
|
|
46
|
+
ctx.lineWidth = strokeWidth;
|
|
47
|
+
columns.forEach((col) => {
|
|
48
|
+
const [offsetX, offsetY] = col.offset;
|
|
49
|
+
col.boxes.forEach((box) => {
|
|
50
|
+
if (col.direction > 0) {
|
|
51
|
+
ctx.fillStyle = fill.up;
|
|
52
|
+
ctx.strokeStyle = stroke.up;
|
|
53
|
+
ctx.beginPath();
|
|
54
|
+
ctx.moveTo(offsetX, offsetY + box.open);
|
|
55
|
+
ctx.lineTo(offsetX + box.columnWidth, offsetY + box.close);
|
|
56
|
+
ctx.moveTo(offsetX, offsetY + box.close);
|
|
57
|
+
ctx.lineTo(offsetX + box.columnWidth, offsetY + box.open);
|
|
58
|
+
ctx.stroke();
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
ctx.fillStyle = fill.down;
|
|
62
|
+
ctx.strokeStyle = stroke.down;
|
|
63
|
+
ctx.beginPath();
|
|
64
|
+
const [x, y] = [offsetX + box.columnWidth / 2, offsetY + box.open + box.boxHeight / 2];
|
|
65
|
+
const [rx, ry] = [box.columnWidth / 2, box.boxHeight / 2];
|
|
66
|
+
ctx.ellipse(x, y, rx, ry, 0, 0, 2 * Math.PI);
|
|
67
|
+
ctx.stroke();
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
ctx.stroke();
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
render() {
|
|
75
|
+
const { clip } = this.props;
|
|
76
|
+
return (React.createElement(GenericChartComponent, { clip: clip, canvasDraw: this.drawOnCanvas, canvasToDraw: getAxisCanvas, drawOn: ["pan"] }));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
PointAndFigureSeries.defaultProps = {
|
|
80
|
+
className: "react-financial-charts-point-and-figure",
|
|
81
|
+
strokeWidth: 1,
|
|
82
|
+
stroke: {
|
|
83
|
+
up: "#6BA583",
|
|
84
|
+
down: "#FF0000",
|
|
85
|
+
},
|
|
86
|
+
fill: {
|
|
87
|
+
up: "none",
|
|
88
|
+
down: "none",
|
|
89
|
+
},
|
|
90
|
+
clip: true,
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=PointAndFigureSeries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PointAndFigureSeries.js","sourceRoot":"","sources":["../src/PointAndFigureSeries.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAgBpG,MAAM,OAAO,oBAAqB,SAAQ,KAAK,CAAC,SAAoC;IAApF;;QA4BqB,iBAAY,GAAG,CAAC,GAA6B,EAAE,SAAc,EAAE,EAAE;YAC9E,MAAM,EACF,SAAS,EACT,MAAM,EACN,WAAW,EAAE,EAAE,MAAM,EAAE,EACvB,QAAQ,GACX,GAAG,SAAS,CAAC;YAEd,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAErE,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC,CAAC;QAEe,eAAU,GAAG,CAC1B,MAA8C,EAC9C,SAAc,EACd,MAA8C,EAC9C,QAAe,EACjB,EAAE;YACA,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAEhG,MAAM,WAAW,GAAG,KAAK,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAElD,IAAI,MAAM,CAAC;YACX,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,OAAO,YAAY,CAAC,MAAM,CAAC,EAAE;gBACzB,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;oBAC9B,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;iBACjC;qBAAM;oBACH,MAAM;iBACT;gBACD,CAAC,EAAE,CAAC;aACP;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAEvE,MAAM,OAAO,GAAG,QAAQ;iBACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;iBACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACP,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;oBACrC,WAAW;oBACX,SAAS;oBACT,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;oBACtB,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;iBAC3B,CAAC,CAAC,CAAC;gBAEJ,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,GAAG,CAAC,CAAC;gBACvD,OAAO;oBACH,KAAK;oBACL,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;iBACvB,CAAC;YACN,CAAC,CAAC,CAAC;YACP,OAAO,OAAO,CAAC;QACnB,CAAC,CAAC;QAEe,wBAAmB,GAAG,CAAC,GAA6B,EAAE,KAAU,EAAE,OAAc,EAAE,EAAE;YACjG,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;YAE5C,GAAG,CAAC,SAAS,GAAG,WAAW,CAAC;YAE5B,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACpB,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;gBACtC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,EAAE;oBAC3B,IAAI,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE;wBACnB,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC;wBACxB,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC;wBAE5B,GAAG,CAAC,SAAS,EAAE,CAAC;wBAEhB,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;wBACxC,GAAG,CAAC,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;wBAC3D,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;wBACzC,GAAG,CAAC,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;wBAE1D,GAAG,CAAC,MAAM,EAAE,CAAC;qBAChB;yBAAM;wBACH,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;wBAC1B,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC;wBAE9B,GAAG,CAAC,SAAS,EAAE,CAAC;wBAEhB,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,WAAW,GAAG,CAAC,EAAE,OAAO,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;wBACvF,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,EAAE,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;wBAE1D,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;wBAC7C,GAAG,CAAC,MAAM,EAAE,CAAC;qBAChB;gBACL,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,MAAM,EAAE,CAAC;QACjB,CAAC,CAAC;IACN,CAAC;IA1GU,MAAM;QACT,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAE5B,OAAO,CACH,oBAAC,qBAAqB,IAClB,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,IAAI,CAAC,YAAY,EAC7B,YAAY,EAAE,aAAa,EAC3B,MAAM,EAAE,CAAC,KAAK,CAAC,GACjB,CACL,CAAC;IACN,CAAC;;AAzBa,iCAAY,GAAG;IACzB,SAAS,EAAE,yCAAyC;IACpD,WAAW,EAAE,CAAC;IACd,MAAM,EAAE;QACJ,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,SAAS;KAClB;IACD,IAAI,EAAE;QACF,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,MAAM;KACf;IACD,IAAI,EAAE,IAAI;CACb,CAAC"}
|