@tradecanvas/core 1.2.0 โ†’ 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +4 -6
  3. package/dist/axis/GridRenderer.d.ts.map +1 -1
  4. package/dist/axis/PriceAxis.d.ts +6 -0
  5. package/dist/axis/PriceAxis.d.ts.map +1 -1
  6. package/dist/axis/TimeAxis.d.ts +2 -0
  7. package/dist/axis/TimeAxis.d.ts.map +1 -1
  8. package/dist/charts/AreaRenderer.d.ts.map +1 -1
  9. package/dist/charts/BarRenderer.d.ts.map +1 -1
  10. package/dist/charts/BaselineRenderer.d.ts.map +1 -1
  11. package/dist/charts/CandlestickRenderer.d.ts.map +1 -1
  12. package/dist/charts/EquivolumeRenderer.d.ts.map +1 -1
  13. package/dist/charts/HLCAreaRenderer.d.ts.map +1 -1
  14. package/dist/charts/HollowCandleRenderer.d.ts.map +1 -1
  15. package/dist/charts/KagiRenderer.d.ts.map +1 -1
  16. package/dist/charts/LineRenderer.d.ts.map +1 -1
  17. package/dist/charts/LineWithMarkersRenderer.d.ts.map +1 -1
  18. package/dist/charts/MarketProfileRenderer.d.ts.map +1 -1
  19. package/dist/charts/PivotMarkersRenderer.d.ts.map +1 -1
  20. package/dist/charts/PointAndFigureRenderer.d.ts.map +1 -1
  21. package/dist/charts/RenkoRenderer.d.ts.map +1 -1
  22. package/dist/charts/StepLineRenderer.d.ts.map +1 -1
  23. package/dist/charts/VolumeCandleRenderer.d.ts.map +1 -1
  24. package/dist/charts/VolumeProfileRenderer.d.ts.map +1 -1
  25. package/dist/drawings/DrawingManager.d.ts +60 -0
  26. package/dist/drawings/DrawingManager.d.ts.map +1 -1
  27. package/dist/drawings/tools/AnchoredVWAP.d.ts +7 -0
  28. package/dist/drawings/tools/AnchoredVWAP.d.ts.map +1 -1
  29. package/dist/drawings/tools/RiskReward.d.ts +1 -1
  30. package/dist/engine/LayerManager.d.ts +8 -1
  31. package/dist/engine/LayerManager.d.ts.map +1 -1
  32. package/dist/engine/RenderEngine.d.ts +22 -4
  33. package/dist/engine/RenderEngine.d.ts.map +1 -1
  34. package/dist/engine/RenderLoop.d.ts.map +1 -1
  35. package/dist/features/AlertManager.d.ts.map +1 -1
  36. package/dist/features/ChartState.d.ts +18 -12
  37. package/dist/features/ChartState.d.ts.map +1 -1
  38. package/dist/features/MeasureOverlay.d.ts +1 -1
  39. package/dist/features/MeasureOverlay.d.ts.map +1 -1
  40. package/dist/features/ReplayManager.d.ts +16 -1
  41. package/dist/features/ReplayManager.d.ts.map +1 -1
  42. package/dist/features/SelectionBoxOverlay.d.ts +29 -0
  43. package/dist/features/SelectionBoxOverlay.d.ts.map +1 -0
  44. package/dist/features/UndoRedoManager.d.ts +3 -1
  45. package/dist/features/UndoRedoManager.d.ts.map +1 -1
  46. package/dist/features/index.d.ts +4 -1
  47. package/dist/features/index.d.ts.map +1 -1
  48. package/dist/finance/GaugeRenderer.d.ts +39 -1
  49. package/dist/finance/GaugeRenderer.d.ts.map +1 -1
  50. package/dist/index.cjs +11 -11
  51. package/dist/index.cjs.map +1 -1
  52. package/dist/index.js +2509 -1737
  53. package/dist/index.js.map +1 -1
  54. package/dist/indicators/IndicatorEngine.d.ts +2 -0
  55. package/dist/indicators/IndicatorEngine.d.ts.map +1 -1
  56. package/dist/indicators/panel/VolumeProfile.d.ts.map +1 -1
  57. package/dist/interaction/AxisDragHandler.d.ts +1 -1
  58. package/dist/interaction/CrosshairHandler.d.ts +25 -1
  59. package/dist/interaction/CrosshairHandler.d.ts.map +1 -1
  60. package/dist/interaction/CrosshairTooltip.d.ts +50 -15
  61. package/dist/interaction/CrosshairTooltip.d.ts.map +1 -1
  62. package/dist/interaction/InteractionManager.d.ts +26 -1
  63. package/dist/interaction/InteractionManager.d.ts.map +1 -1
  64. package/dist/interaction/PanHandler.d.ts +11 -3
  65. package/dist/interaction/PanHandler.d.ts.map +1 -1
  66. package/dist/interaction/index.d.ts +2 -1
  67. package/dist/interaction/index.d.ts.map +1 -1
  68. package/dist/realtime/CurrentPriceLine.d.ts +1 -0
  69. package/dist/realtime/CurrentPriceLine.d.ts.map +1 -1
  70. package/dist/trading/OrderRenderer.d.ts +1 -1
  71. package/dist/trading/PositionRenderer.d.ts +1 -1
  72. package/dist/trading/TradingManager.d.ts +4 -2
  73. package/dist/trading/TradingManager.d.ts.map +1 -1
  74. package/dist/trading/TradingRenderer.d.ts +1 -1
  75. package/dist/ui/ChartLegend.d.ts +7 -1
  76. package/dist/ui/ChartLegend.d.ts.map +1 -1
  77. package/dist/viewport/ScaleMapping.d.ts +40 -4
  78. package/dist/viewport/ScaleMapping.d.ts.map +1 -1
  79. package/dist/viewport/Viewport.d.ts +30 -1
  80. package/dist/viewport/Viewport.d.ts.map +1 -1
  81. package/dist/viewport/index.d.ts +3 -1
  82. package/dist/viewport/index.d.ts.map +1 -1
  83. package/dist/viewport/rangePresets.d.ts +10 -0
  84. package/dist/viewport/rangePresets.d.ts.map +1 -0
  85. package/package.json +3 -2
package/dist/index.cjs CHANGED
@@ -1,14 +1,14 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@tradecanvas/commons`);var t=class{canvas;ctx;dpr=1;constructor(e,t){this.canvas=document.createElement(`canvas`),this.canvas.style.position=`absolute`,this.canvas.style.top=`0`,this.canvas.style.left=`0`,this.canvas.style.zIndex=String(t),this.canvas.style.pointerEvents=`none`,this.ctx=this.canvas.getContext(`2d`),e.appendChild(this.canvas)}resize(e,t){this.dpr=t;let n=Math.round(e.width*t),r=Math.round(e.height*t);(this.canvas.width!==n||this.canvas.height!==r)&&(this.canvas.width=n,this.canvas.height=r),this.canvas.style.width=`${e.width}px`,this.canvas.style.height=`${e.height}px`,this.ctx.setTransform(t,0,0,t,0,0)}clear(){this.ctx.setTransform(1,0,0,1,0,0),this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.setTransform(this.dpr,0,0,this.dpr,0,0)}getSize(){return{width:this.canvas.width/this.dpr,height:this.canvas.height/this.dpr}}destroy(){this.canvas.remove()}},n=class{layers=new Map;constructor(e){this.container=e}createLayers(){this.destroy();for(let n of[e.LayerType.Background,e.LayerType.Main,e.LayerType.Overlay,e.LayerType.UI])this.layers.set(n,new t(this.container,n))}getLayer(e){return this.layers.get(e)}resize(e,t){for(let n of this.layers.values())n.resize(e,t)}destroy(){for(let e of this.layers.values())e.destroy();this.layers.clear()}},r=class{animFrameId=0;running=!1;dirtyLayers=new Set;swapLayers=new Set;callback=null;setCallback(e){this.callback=e}markDirty(e){this.dirtyLayers.add(e),this.running&&!this.animFrameId&&this.scheduleFrame()}markAllDirty(){this.dirtyLayers.add(e.LayerType.Background),this.dirtyLayers.add(e.LayerType.Main),this.dirtyLayers.add(e.LayerType.Overlay),this.dirtyLayers.add(e.LayerType.UI),this.running&&!this.animFrameId&&this.scheduleFrame()}start(){this.running=!0,this.markAllDirty()}stop(){this.running=!1,this.animFrameId&&=(cancelAnimationFrame(this.animFrameId),0)}scheduleFrame(){this.animFrameId=requestAnimationFrame(()=>{if(this.animFrameId=0,!(!this.running||!this.callback)&&this.dirtyLayers.size>0){let e=this.dirtyLayers;this.dirtyLayers=this.swapLayers,this.callback(e),e.clear(),this.swapLayers=e}})}},i=class{observer=null;callback=null;currentDpr=1;resizeScheduled=!1;cachedSize;constructor(e){this.container=e,this.currentDpr=window.devicePixelRatio||1,this.cachedSize={width:e.clientWidth,height:e.clientHeight}}getDpr(){return this.currentDpr}getContainerSize(){return this.cachedSize}readContainerSize(){let e=this.container.clientWidth,t=this.container.clientHeight;return(e!==this.cachedSize.width||t!==this.cachedSize.height)&&(this.cachedSize={width:e,height:t}),this.cachedSize}onResize(e){this.callback=e,this.observer=new ResizeObserver(()=>{this.resizeScheduled||(this.resizeScheduled=!0,requestAnimationFrame(()=>{this.resizeScheduled=!1,this.currentDpr=window.devicePixelRatio||1;let e=this.container.clientWidth,t=this.container.clientHeight;e===this.cachedSize.width&&t===this.cachedSize.height||(this.cachedSize={width:e,height:t},this.callback?.(this.cachedSize,this.currentDpr))}))}),this.observer.observe(this.container)}destroy(){this.observer?.disconnect(),this.observer=null,this.callback=null}};function a(e,t){return e*(t.barWidth+t.barSpacing)-t.offset+t.chartRect.x+t.barWidth/2}function o(e,t){let{min:n,max:r}=t.priceRange;if(t.logScale&&n>0&&r>0){let i=Math.log(n),a=Math.log(r)-i;if(a===0)return t.chartRect.y+t.chartRect.height/2;let o=(Math.log(Math.max(e,2**-52))-i)/a;return t.chartRect.y+t.chartRect.height*(1-o)}let i=r-n;if(i===0)return t.chartRect.y+t.chartRect.height/2;let a=(e-n)/i;return t.chartRect.y+t.chartRect.height*(1-a)}function s(e,t){let n=t.barWidth+t.barSpacing;return Math.round((e-t.chartRect.x-t.barWidth/2+t.offset)/n)}function c(e,t){let{min:n,max:r}=t.priceRange,i=1-(e-t.chartRect.y)/t.chartRect.height;if(t.logScale&&n>0&&r>0){let e=Math.log(n);return Math.exp(e+(Math.log(r)-e)*i)}return n+(r-n)*i}function l(e,t){if(t.length===0)return-1;if(e<=t[0].time)return 0;if(e>=t[t.length-1].time)return t.length-1;let n=0,r=t.length-1;for(;n<=r;){let i=n+r>>>1;if(t[i].time===e)return i;t[i].time<e?n=i+1:r=i-1}if(n>=t.length)return t.length-1;if(r<0)return 0;let i=t[r].time,a=t[n].time,o=a===i?0:(e-i)/(a-i);return r+o}function u(e,t){let n=t.data;return n&&n.length>0?l(e,n):e}function d(e,t){return a(u(e,t),t)}function f(e,t){let n=s(e,t),r=t.data;return r&&r.length>0?r[Math.max(0,Math.min(r.length-1,n))].time:n}var p=class{layerManager;renderLoop;dprManager;renderCtx=null;bgLayer;mainLayer;overlayLayer;uiLayer;onContainerResize=null;constructor(e){this.layerManager=new n(e),this.renderLoop=new r,this.dprManager=new i(e),this.layerManager.createLayers(),this.cacheLayerRefs(),this.renderLoop.setCallback(e=>this.render(e)),this.dprManager.onResize((e,t)=>{this.layerManager.resize(e,t),this.renderLoop.markAllDirty(),this.onContainerResize?.(e)});let t=this.dprManager.getContainerSize(),a=this.dprManager.getDpr();this.layerManager.resize(t,a)}cacheLayerRefs(){this.bgLayer=this.layerManager.getLayer(e.LayerType.Background),this.mainLayer=this.layerManager.getLayer(e.LayerType.Main),this.overlayLayer=this.layerManager.getLayer(e.LayerType.Overlay),this.uiLayer=this.layerManager.getLayer(e.LayerType.UI)}setRenderContext(e){this.renderCtx=e}start(){this.renderLoop.start()}stop(){this.renderLoop.stop()}requestRender(e){e===void 0?this.renderLoop.markAllDirty():this.renderLoop.markDirty(e)}render(t){let n=this.renderCtx;if(!n)return;let{viewport:r,theme:i,data:l}=n,u=n.numberLocale??`en-US`;if(!(r.chartRect.width<=0||r.chartRect.height<=0)){if(t.has(e.LayerType.Background)&&this.bgLayer&&(this.bgLayer.clear(),n.gridRenderer?.render(this.bgLayer.ctx,r,i),n.sessionShading?.render(this.bgLayer.ctx,l,r,i),n.sessionBreaks?.render(this.bgLayer.ctx,r,i,l),n.watermark?.render(this.bgLayer.ctx,r,i)),t.has(e.LayerType.Main)&&this.mainLayer){this.mainLayer.clear();let e=this.mainLayer.ctx;e.save(),e.beginPath(),e.rect(r.chartRect.x,r.chartRect.y,r.chartRect.width,r.chartRect.height),e.clip(),n.depthHeatmap?.render(e,r,i),n.volumeRenderer?.render(e,l,r,i),n.volumeProfile?.render(e,l,r,i),n.marketProfile?.render(e,l,r,i),n.chartRenderer?.render(e,l,r,i),n.compareRenderer?.render(e,l,r,i),n.indicatorEngine?.renderOverlays(e,r),n.periodLevels?.render(e,l,r,i),n.pivotMarkers?.render(e,l,r,i),n.renderOverlayPlugins?.(e,`main`),e.restore();let t=n.panels,a=n.indicatorEngine;if(a&&t.length>0){let n=`10px ${i.font.family}`,r=a.getPanelIndicators(),o=new Map;for(let e of r)o.set(e.instanceId,e);for(let r of t){if(r.rect.width<=0||r.rect.height<=0)continue;e.save(),e.beginPath(),e.rect(r.rect.x,r.rect.y,r.rect.width,r.rect.height),e.clip(),e.fillStyle=i.background,e.fillRect(r.rect.x,r.rect.y,r.rect.width,r.rect.height),e.fillStyle=i.axisLine,e.fillRect(r.rect.x,r.rect.y,r.rect.width,3),e.fillStyle=i.textSecondary,e.font=n,e.textBaseline=`top`,e.textAlign=`left`;let t=o.get(r.instanceId);t&&e.fillText(t.descriptor.name,r.rect.x+6,r.rect.y+6),e.save(),e.beginPath(),e.rect(r.rect.x,r.rect.y+20,r.rect.width,r.rect.height-20),e.clip(),a.renderPanel(e,r.instanceId,r.viewport),e.restore(),e.restore()}}}if(t.has(e.LayerType.Overlay)&&this.overlayLayer){this.overlayLayer.clear();let e=this.overlayLayer.ctx;n.priceLimits&&this.renderPriceLimits(e,r,i,n.priceLimits),n.tradeZoneManager?.render(e,r,i),n.drawingRenderer?.render(e,r),n.tradingRenderer?.render(e,r,i),n.signalMarkerManager?.render(e,r,i),n.alertManager?.render(e,r,i),n.measureOverlay?.render(e,r,i),n.crosshairHandler?.render(e,r,i),n.renderOverlayPlugins?.(e,`overlay`);let t=n.crosshairHandler?.getPosition();if(t&&n.panels.length>0)for(let r of n.panels){let o=r.rect;if(t.x>=o.x&&t.x<=o.x+o.width&&t.y>=o.y&&t.y<=o.y+o.height){let c=r.viewport,l=t.x,u=s(l,c);l=a(Math.max(0,Math.min((n.data?.length??1)-1,Math.round(u))),c),e.save(),e.beginPath(),e.rect(o.x,o.y,o.width,o.height),e.clip(),e.setLineDash([4,4]),e.strokeStyle=i.crosshair,e.lineWidth=1,e.beginPath(),e.moveTo(Math.round(l)+.5,o.y),e.lineTo(Math.round(l)+.5,o.y+o.height),e.stroke(),e.beginPath(),e.moveTo(o.x,Math.round(t.y)+.5),e.lineTo(o.x+o.width,Math.round(t.y)+.5),e.stroke(),e.setLineDash([]),e.restore();break}}}if(t.has(e.LayerType.UI)&&this.uiLayer){this.uiLayer.clear();let t=this.uiLayer.ctx;if(n.priceAxis?.render(t,r,i),n.tradingRenderer?.renderAxisBadges(t,r,i),n.currentPriceLine?.render(t,r,i),n.timeAxis?.render(t,r,i,l,n.timeAxisY),n.crosshairHandler?.renderAxisLabels(t,r,i,l,n.timeAxisY),n.chartLegend?.render(t,r,i,l),n.barCountdown?.render(t,r,i,l),n.renderOverlayPlugins?.(t,`ui`),n.panels.length>0){let a=n.crosshairHandler?.getPosition(),d=n.indicatorEngine,f=`${i.font.sizeSmall}px ${i.font.family}`,p;if(d){let e=d.getPanelIndicators();p=new Map;for(let t of e)p.set(t.instanceId,t)}for(let m of n.panels){let n=m.viewport,h=m.rect,{min:g,max:_}=n.priceRange;if(_-g<=0||h.height<=0)continue;let v=h.x+h.width,y=n.chartRect;t.strokeStyle=i.axisLine,t.lineWidth=1,t.beginPath(),t.moveTo(v+.5,h.y),t.lineTo(v+.5,h.y+h.height),t.stroke();let b=(0,e.computeTickStep)(g,_,4),x=Math.ceil(g/b)*b,S=b<1?Math.ceil(-Math.log10(b))+1:+(b<10);t.font=f,t.textBaseline=`middle`,t.textAlign=`left`;for(let r=x;r<=_;r+=b){let a=o(r,n);a<y.y||a>y.y+y.height||(t.strokeStyle=i.axisLine,t.beginPath(),t.moveTo(v,Math.round(a)+.5),t.lineTo(v+4,Math.round(a)+.5),t.stroke(),t.fillStyle=i.axisLabel,t.fillText((0,e.formatPrice)(r,S,u),v+6,a))}if(a&&a.x>=h.x&&a.x<=h.x+h.width&&a.y>=h.y&&a.y<=h.y+h.height){let o=(0,e.formatPrice)(c(a.y,n),S,u);t.font=`bold ${i.font.sizeSmall}px ${i.font.family}`;let s=t.measureText(o).width,l=Math.min(s+10,(r.priceAxisWidth??e.PRICE_AXIS_WIDTH)-2);t.fillStyle=i.crosshair,t.fillRect(v+1,a.y-9,l,18),t.fillStyle=i.background,t.textBaseline=`middle`,t.textAlign=`left`,t.fillText(o,v+5,a.y)}if(a&&d){let e=s(a.x,n),r=Math.max(0,Math.min((l?.length??1)-1,Math.round(e))),o=d.getOutput(m.instanceId);if(o?.series&&r<o.series.length){let e=o.series[r];if(e){let n=[];for(let t in e){let r=e[t];r!==void 0&&n.push(`${t}: ${r.toFixed(S)}`)}if(n.length>0){let e=p?.get(m.instanceId),r=e?t.measureText(e.descriptor.name).width+14:10;t.font=f,t.fillStyle=i.textSecondary,t.textBaseline=`top`,t.textAlign=`left`,t.fillText(n.join(` `),h.x+r,h.y+6)}}}}}}}}}renderPriceLimits(t,n,r,i){let{chartRect:a}=n,s=[{price:i.ceiling,color:i.colors?.ceiling??`#FF00FF`,label:`CE`},{price:i.floor,color:i.colors?.floor??`#00FFFF`,label:`FL`},{price:i.reference,color:i.colors?.reference??`#FFD700`,label:`REF`}],c=`bold 9px ${r.font.family}`,l=`10px ${r.font.family}`;for(let{price:r,color:i,label:u}of s){let s=o(r,n);if(s<a.y||s>a.y+a.height)continue;t.setLineDash([8,4]),t.strokeStyle=i,t.lineWidth=1,t.beginPath(),t.moveTo(a.x,Math.round(s)+.5),t.lineTo(a.x+a.width,Math.round(s)+.5),t.stroke(),t.setLineDash([]),t.font=c,t.fillStyle=i,t.textBaseline=`bottom`,t.textAlign=`left`,t.fillText(`${u} ${r.toFixed(2)}`,a.x+4,s-2);let d=a.x+a.width+1;t.fillStyle=i,t.fillRect(d,s-7,(n.priceAxisWidth??e.PRICE_AXIS_WIDTH)-2,14),t.fillStyle=`#000`,t.font=l,t.textBaseline=`middle`,t.textAlign=`left`,t.fillText(r.toFixed(2),d+4,s)}}destroy(){this.renderLoop.stop(),this.dprManager.destroy(),this.layerManager.destroy()}},m=class{state;priceAxisWidth=e.PRICE_AXIS_WIDTH;stateCache=null;dataLength=0;minBarWidth;maxBarWidth;rightMarginBars;constructor(t,n,r=2,i=30,a=5){this.minBarWidth=r,this.maxBarWidth=i,this.rightMarginBars=a;let o=this.computeChartRect(t,n);this.state={visibleRange:{from:0,to:0},priceRange:{min:0,max:1},barWidth:e.DEFAULT_BAR_WIDTH,barSpacing:e.DEFAULT_BAR_SPACING,offset:0,chartRect:o}}getState(){return this.stateCache||={visibleRange:{...this.state.visibleRange},priceRange:{...this.state.priceRange},barWidth:this.state.barWidth,barSpacing:this.state.barSpacing,offset:this.state.offset,chartRect:{...this.state.chartRect},logScale:this.state.logScale,scaleMode:this.state.scaleMode,scaleBaseline:this.state.scaleBaseline,priceAxisWidth:this.state.priceAxisWidth},this.stateCache}invalidate(){this.stateCache=null}setLogScale(e){this.setScaleMode(e?`logarithmic`:`regular`)}isLogScale(){return(this.state.scaleMode??(this.state.logScale?`logarithmic`:`regular`))===`logarithmic`}setScaleMode(e){this.state.scaleMode=e,this.state.logScale=e===`logarithmic`,this.invalidate()}getScaleMode(){return this.state.scaleMode??(this.state.logScale?`logarithmic`:`regular`)}setScaleBaseline(e){this.state.scaleBaseline=e,this.invalidate()}setRightMargin(e){this.rightMarginBars=e}setPriceAxisWidth(e){this.priceAxisWidth!==e&&(this.priceAxisWidth=e,this.state.priceAxisWidth=e,this.invalidate())}computeChartRect(t,n){return{x:0,y:0,width:Math.max(0,t-this.priceAxisWidth),height:Math.max(0,n-e.TIME_AXIS_HEIGHT)}}resize(e,t){this.state.chartRect=this.computeChartRect(e,t),this.invalidate(),this.clampOffset()}setChartRect(e){this.state.chartRect={x:e.x,y:e.y,width:Math.max(0,e.width),height:Math.max(0,e.height)},this.invalidate(),this.clampOffset(),this.updateVisibleRange()}updateData(t,n){this.dataLength=t.length,this.dataLength!==0&&(this.clampOffset(),this.updateVisibleRange(),n&&(this.state.priceRange=(0,e.computePriceRange)(t,this.state.visibleRange.from,Math.min(this.state.visibleRange.to,this.dataLength-1),.08),this.invalidate()))}setPriceRange(e,t){this.state.priceRange={min:e,max:t},this.invalidate()}scalePriceRange(e){if(!Number.isFinite(e)||e<=0)return;let{min:t,max:n}=this.state.priceRange,r=(t+n)/2,i=(n-t)/2,a=Math.max(i*e,1e-9);this.state.priceRange={min:r-a,max:r+a},this.invalidate()}scrollBy(e){this.state.offset+=e,this.invalidate(),this.clampOffset(),this.updateVisibleRange()}panPriceRange(e){let t=this.state.chartRect.height;if(t<=0||e===0)return;let{min:n,max:r}=this.state.priceRange,i=e/t;if(this.isLogScale()&&n>0&&r>0){let e=Math.log(n),t=Math.log(r),a=(t-e)*i;this.state.priceRange={min:Math.exp(e-a),max:Math.exp(t-a)},this.invalidate();return}let a=(r-n)*i;this.state.priceRange={min:n-a,max:r-a},this.invalidate()}isAtEnd(){let e=this.state.barWidth+this.state.barSpacing,t=this.rightMarginBars*e,n=this.dataLength*e-this.state.chartRect.width+t;return this.state.offset>=n-e*2}scrollToEnd(){let e=this.state.barWidth+this.state.barSpacing,t=this.rightMarginBars*e,n=this.dataLength*e;this.state.offset=n-this.state.chartRect.width+t,this.invalidate(),this.updateVisibleRange()}zoom(t,n){let r=this.state.barWidth,i=(0,e.clamp)(r*(1+t),this.minBarWidth,this.maxBarWidth);if(i===r)return;let a=this.state.barWidth+this.state.barSpacing,o=(this.state.offset+n)/a;this.state.barWidth=i;let s=i+this.state.barSpacing;this.state.offset=o*s-n,this.invalidate(),this.clampOffset(),this.updateVisibleRange()}clampOffset(){if(this.state.chartRect.width<=0)return;let t=this.state.barWidth+this.state.barSpacing,n=this.dataLength*t,r=this.rightMarginBars*t,i=n-this.state.chartRect.width+r,a,o;if(i>0)a=-(this.state.chartRect.width*.5),o=i;else{let e=this.state.chartRect.width*.5;a=i-e,o=i+e}this.state.offset=(0,e.clamp)(this.state.offset,a,o),this.invalidate()}updateVisibleRange(){let e=this.state.barWidth+this.state.barSpacing;if(e<=0||this.state.chartRect.width<=0)return;let t=Math.floor(this.state.offset/e),n=Math.ceil(this.state.chartRect.width/e)+1,r=Math.min(t+n,this.dataLength-1);this.state.visibleRange={from:Math.max(0,t),to:Math.max(0,r)},this.invalidate()}};function h(t,n){return(0,e.sliceVisibleData)(t,n.visibleRange.from,n.visibleRange.to)}var g=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,s=o/2,c=o+n.barSpacing,l=-n.offset+n.chartRect.x+s,{min:u,max:d}=n.priceRange,f=d-u;if(f===0)return;let p=n.chartRect.y,m=n.chartRect.height/f,h=e=>e*c+l,g=e=>p+(d-e)*m,_=new Path2D,v=new Path2D,y=new Path2D,b=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=h(e),i=g(n.high),a=g(n.low),c=g(n.open),l=g(n.close),u=n.close>=n.open,d=u?_:v;d.moveTo(r,i),d.lineTo(r,a);let f=u?l:c,p=Math.max(Math.abs(l-c),1);(u?y:b).rect(r-s,f,o,p)}e.strokeStyle=r.candleUpWick,e.lineWidth=1,e.stroke(_),e.strokeStyle=r.candleDownWick,e.stroke(v),e.fillStyle=r.candleUp,e.fill(y),e.fillStyle=r.candleDown,e.fill(b)}};function _(e,t,n){if(t>=e){let t=Array(Math.max(0,e));for(let n=0;n<e;n++)t[n]=n;return t}if(t<=2)return e>=2?[0,e-1]:e===1?[0]:[];let r=[0],i=(e-2)/(t-2),a=0;for(let o=0;o<t-2;o++){let t=Math.floor((o+1)*i)+1,s=Math.floor((o+2)*i)+1;s>e&&(s=e);let c=0,l=0,u=0;for(let e=t;e<s;e++)c+=e,l+=n(e),u++;if(u>0)c/=u,l/=u;else{let r=Math.min(t,e-1);c=r,l=n(r)}let d=Math.floor(o*i)+1,f=Math.floor((o+1)*i)+1,p=n(a),m=-1,h=d;for(let e=d;e<f;e++){let t=Math.abs((a-c)*(n(e)-p)-(a-e)*(l-p));t>m&&(m=t,h=e)}r.push(h),a=h}return r.push(e-1),r}var v=64;function y(e,t,n,r,i){let a=Math.max(0,e),o=Math.min(t,n-1);if(o<a)return[];let s=o-a+1,c=Math.max(v,Math.ceil(r*2));if(s<=c){let e=Array(s);for(let t=0;t<s;t++)e[t]=a+t;return e}let l=_(s,c,e=>i(a+e));for(let e=0;e<l.length;e++)l[e]+=a;return l}var b=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let o=n.barWidth+n.barSpacing,s=-n.offset+n.chartRect.x+n.barWidth/2,{min:c,max:l}=n.priceRange,u=l-c;if(u===0)return;let d=n.chartRect.y,f=n.chartRect.height/u;e.beginPath(),e.strokeStyle=r.lineColor,e.lineWidth=2,e.lineJoin=`round`;let p=y(i,a,t.length,n.chartRect.width,e=>t[e].close),m=!1;for(let n of p){let r=n*o+s,i=d+(l-t[n].close)*f;m?e.lineTo(r,i):(e.moveTo(r,i),m=!0)}e.stroke()}},x=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let o=n.barWidth+n.barSpacing,s=-n.offset+n.chartRect.x+n.barWidth/2,{min:c,max:l}=n.priceRange,u=l-c;if(u===0)return;let d=n.chartRect.y,f=n.chartRect.height,p=f/u,m=d+f,h=y(i,a,t.length,n.chartRect.width,e=>t[e].close);if(h.length===0)return;let g=h[0],_=g*o+s,v=d+(l-t[g].close)*p,b=e.createLinearGradient(0,d,0,m);b.addColorStop(0,r.areaTopColor),b.addColorStop(1,r.areaBottomColor),e.beginPath(),e.moveTo(_,m),e.lineTo(_,v);let x=_;for(let n=1;n<h.length;n++){let r=h[n];x=r*o+s,e.lineTo(x,d+(l-t[r].close)*p)}e.lineTo(x,m),e.closePath(),e.fillStyle=b,e.fill(),e.beginPath(),e.strokeStyle=r.lineColor,e.lineWidth=2,e.lineJoin=`round`,e.moveTo(_,v);for(let n=1;n<h.length;n++){let r=h[n];e.lineTo(r*o+s,d+(l-t[r].close)*p)}e.stroke()}},S=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,s=o/2,c=o+n.barSpacing,l=-n.offset+n.chartRect.x+s,{min:u,max:d}=n.priceRange,f=d-u;if(f===0)return;let p=n.chartRect.y,m=n.chartRect.height/f,h=e=>e*c+l,g=e=>p+(d-e)*m,_=new Path2D,v=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=h(e),i=n.close>=n.open?_:v,a=g(n.high),o=g(n.low),c=g(n.open),l=g(n.close);i.moveTo(r,a),i.lineTo(r,o),i.moveTo(r-s,c),i.lineTo(r,c),i.moveTo(r,l),i.lineTo(r+s,l)}e.lineWidth=1,e.strokeStyle=r.candleUp,e.stroke(_),e.strokeStyle=r.candleDown,e.stroke(v)}},C=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,s=o/2,c=o+n.barSpacing,l=-n.offset+n.chartRect.x+s,{min:u,max:d}=n.priceRange,f=d-u;if(f===0)return;let p=n.chartRect.y,m=n.chartRect.height/f,h=e=>e*c+l,g=e=>p+(d-e)*m,_=new Path2D,v=new Path2D,y=[],b=[],x=new Path2D,S=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=h(e),i=n.close>=n.open,a=e===0||n.close>=t[e-1].close,c=g(n.high),l=g(n.low),u=g(n.open),d=g(n.close),f=Math.min(u,d),p=Math.max(Math.abs(d-u),1),m=a?_:v;m.moveTo(r,c),m.lineTo(r,l),i?(a?y:b).push({x:r-s,y:f,w:o,h:p}):(a?x:S).rect(r-s,f,o,p)}e.lineWidth=1,e.strokeStyle=r.candleUp,e.stroke(_),e.strokeStyle=r.candleDown,e.stroke(v),e.fillStyle=r.candleUp,e.fill(x),e.fillStyle=r.candleDown,e.fill(S),e.lineWidth=1.5,e.strokeStyle=r.candleUp;for(let t of y)e.strokeRect(t.x,t.y,t.w,t.h);e.strokeStyle=r.candleDown;for(let t of b)e.strokeRect(t.x,t.y,t.w,t.h)}},w=class{baselinePrice=null;setBaseline(e){this.baselinePrice=e}render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let o=n.barWidth,s=o/2,c=o+n.barSpacing,l=-n.offset+n.chartRect.x+s,{min:u,max:d}=n.priceRange,f=d-u;if(f===0)return;let p=n.chartRect.y,m=n.chartRect.height/f,h=e=>e*c+l,g=e=>p+(d-e)*m,_=g(this.baselinePrice??this.computeBaseline(t,i,a)),{chartRect:v}=n,y=[],b=[];for(let e=i;e<=a&&e<t.length;e++)y.push(h(e)),b.push(g(t[e].close));if(y.length<2)return;let x=y.length-1;e.save();let S=new Path2D;S.rect(v.x,v.y,v.width,_-v.y),e.clip(S);let C=new Path2D;C.moveTo(y[0],_);for(let e=0;e<=x;e++)C.lineTo(y[e],b[e]);C.lineTo(y[x],_),C.closePath(),e.fillStyle=`${r.candleUp}20`,e.fill(C),e.restore(),e.save();let w=new Path2D;w.rect(v.x,_,v.width,v.y+v.height-_),e.clip(w);let T=new Path2D;T.moveTo(y[0],_);for(let e=0;e<=x;e++)T.lineTo(y[e],b[e]);T.lineTo(y[x],_),T.closePath(),e.fillStyle=`${r.candleDown}20`,e.fill(T),e.restore();let E=new Path2D,D=new Path2D;for(let e=1;e<=x;e++){let t=b[e]<=_?E:D;t.moveTo(y[e-1],b[e-1]),t.lineTo(y[e],b[e])}e.lineWidth=2,e.strokeStyle=r.candleUp,e.stroke(E),e.strokeStyle=r.candleDown,e.stroke(D),e.setLineDash([6,4]),e.strokeStyle=r.textSecondary,e.lineWidth=1;let O=new Path2D;O.moveTo(v.x,_),O.lineTo(v.x+v.width,_),e.stroke(O),e.setLineDash([])}computeBaseline(e,t,n){let r=0,i=0;for(let a=t;a<=n&&a<e.length;a++)r+=e[a].close,i++;return i>0?r/i:0}},T=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,s=o/2,c=o+n.barSpacing,l=-n.offset+n.chartRect.x+s,{min:u,max:d}=n.priceRange,f=d-u;if(f===0)return;let p=n.chartRect.y,m=n.chartRect.height/f,h=e=>e*c+l,g=e=>p+(d-e)*m,_=new Path2D,v=new Path2D,y=new Path2D,b=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=h(e),i=n.close>=n.open,a=g(Math.max(n.open,n.close)),c=g(Math.min(n.open,n.close)),l=Math.max(c-a,1),u=r-s;i?(_.rect(u,a,o,l),y.rect(u,a,o,l)):(v.rect(u,a,o,l),b.rect(u,a,o,l))}e.fillStyle=r.candleUp,e.fill(_),e.fillStyle=r.candleDown,e.fill(v),e.lineWidth=1,e.strokeStyle=r.candleUp,e.stroke(y),e.strokeStyle=r.candleDown,e.stroke(b)}},E=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,s=o/2,c=o+n.barSpacing,l=-n.offset+n.chartRect.x+s,{min:u,max:d}=n.priceRange,f=d-u;if(f===0)return;let p=n.chartRect.y,m=n.chartRect.height/f,h=e=>e*c+l,g=e=>p+(d-e)*m,_=new Path2D,v=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=h(e),i=n.close>=n.open,o=g(n.high),s=g(n.low),c=i?_:v;if(c.moveTo(r,o),c.lineTo(r,s),e<a&&e+1<t.length){let t=h(e+1),n=i?s:o;c.moveTo(r,n),c.lineTo(t,n)}}e.strokeStyle=r.candleUp,e.lineWidth=3,e.stroke(_),e.strokeStyle=r.candleDown,e.lineWidth=1,e.stroke(v)}},D=class{boxSize=1;setBoxSize(e){this.boxSize=e}render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,s=o/2,c=o+n.barSpacing,l=-n.offset+n.chartRect.x+s,{min:u,max:d}=n.priceRange,f=d-u;if(f===0)return;let p=n.chartRect.y,m=n.chartRect.height/f,h=e=>e*c+l,g=e=>p+(d-e)*m,_=Math.abs(this.boxSize*m),v=Math.min(s*.8,_*.8)*.5,y=new Path2D,b=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=h(e),i=n.close>=n.open,a=n.high,o=n.low,s=Math.max(1,Math.round((a-o)/this.boxSize));for(let e=0;e<s;e++){let t=g(o+(e+.5)*this.boxSize);i?(y.moveTo(r-v,t-v),y.lineTo(r+v,t+v),y.moveTo(r+v,t-v),y.lineTo(r-v,t+v)):(b.moveTo(r+v,t),b.arc(r,t,v,0,Math.PI*2))}}e.lineWidth=1.5,e.strokeStyle=r.candleUp,e.stroke(y),e.strokeStyle=r.candleDown,e.stroke(b)}},O=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,{min:o,max:s}=n.priceRange,c=s-o;if(c===0||i>a||t.length===0)return;let l=n.barWidth+n.barSpacing,u=-n.offset+n.chartRect.x+n.barWidth/2,d=n.chartRect.y,f=n.chartRect.height/c,p=n.barWidth,m=0;for(let e=i;e<=a&&e<t.length;e++)t[e].volume>m&&(m=t[e].volume);m===0&&(m=1);let h=new Path2D,g=new Path2D,_=new Path2D,v=new Path2D,y=e=>e*l+u,b=e=>d+(s-e)*f;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=y(e),i=b(n.high),a=b(n.low),o=b(n.open),s=b(n.close),c=n.close>=n.open,l=p*Math.max(.2,n.volume/m),u=l/2,d=c?h:g;d.moveTo(r,i),d.lineTo(r,a);let f=c?s:o,x=Math.max(Math.abs(s-o),1);(c?_:v).rect(r-u,f,l,x)}e.strokeStyle=r.candleUpWick,e.lineWidth=1,e.stroke(h),e.strokeStyle=r.candleDownWick,e.stroke(g),e.fillStyle=r.candleUp,e.fill(_),e.fillStyle=r.candleDown,e.fill(v)}},k=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,{min:o,max:s}=n.priceRange,c=s-o;if(c===0||i>a||t.length===0)return;let l=n.barWidth+n.barSpacing,u=-n.offset+n.chartRect.x+n.barWidth/2,d=n.chartRect.y,f=n.chartRect.height/c,p=n.barWidth,m=0;for(let e=i;e<=a&&e<t.length;e++)t[e].volume>m&&(m=t[e].volume);m===0&&(m=1);let h=new Path2D,g=new Path2D,_=new Path2D,v=new Path2D,y=e=>e*l+u,b=e=>d+(s-e)*f;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=e>0?t[e-1]:n,i=y(e),a=b(n.high),o=b(n.low),s=n.close>=r.close,c=p*Math.max(.15,n.volume/m),l=c/2,u=Math.max(o-a,1),d=s?h:g,f=s?_:v;d.rect(i-l,a,c,u),f.rect(i-l,a,c,u)}e.fillStyle=A(r.candleUp,.55),e.fill(h),e.fillStyle=A(r.candleDown,.55),e.fill(g),e.lineWidth=1,e.strokeStyle=r.candleUpWick,e.stroke(_),e.strokeStyle=r.candleDownWick,e.stroke(v)}};function A(e,t){if(e.startsWith(`#`)){let n=Math.round(Math.max(0,Math.min(1,t))*255).toString(16).padStart(2,`0`);if(e.length===7)return`${e}${n}`;if(e.length===9)return`${e.slice(0,7)}${n}`}return e}var ee=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let{min:o,max:s}=n.priceRange,c=s-o;if(c===0)return;let l=n.barWidth+n.barSpacing,u=-n.offset+n.chartRect.x+n.barWidth/2,d=n.chartRect.y,f=n.chartRect.height/c,p=e=>e*l+u,m=e=>d+(s-e)*f,h=[],g=[];for(let e=i;e<=a&&e<t.length;e++){let n=p(e);h.push({x:n,y:m(t[e].high)}),g.push({x:n,y:m(t[e].low)})}if(h.length===0)return;let _=e.createLinearGradient(0,d,0,d+n.chartRect.height);_.addColorStop(0,r.areaTopColor),_.addColorStop(1,r.areaBottomColor),e.beginPath(),e.moveTo(h[0].x,h[0].y);for(let t=1;t<h.length;t++)e.lineTo(h[t].x,h[t].y);for(let t=g.length-1;t>=0;t--)e.lineTo(g[t].x,g[t].y);e.closePath(),e.fillStyle=_,e.fill(),e.beginPath(),e.strokeStyle=r.lineColor,e.lineWidth=2,e.lineJoin=`round`;for(let n=i;n<=a&&n<t.length;n++){let r=p(n),a=m(t[n].close);n===i?e.moveTo(r,a):e.lineTo(r,a)}e.stroke()}},te=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let{min:o,max:s}=n.priceRange,c=s-o;if(c===0)return;let l=n.barWidth+n.barSpacing,u=-n.offset+n.chartRect.x+n.barWidth/2,d=n.chartRect.y,f=n.chartRect.height/c,p=e=>e*l+u,m=e=>d+(s-e)*f;e.beginPath(),e.strokeStyle=r.lineColor,e.lineWidth=2,e.lineJoin=`miter`;let h=0;for(let n=i;n<=a&&n<t.length;n++){let r=p(n),a=m(t[n].close);n===i?e.moveTo(r,a):(e.lineTo(r,h),e.lineTo(r,a)),h=a}e.stroke()}},ne=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let{min:o,max:s}=n.priceRange,c=s-o;if(c===0)return;let l=n.barWidth+n.barSpacing,u=-n.offset+n.chartRect.x+n.barWidth/2,d=n.chartRect.y,f=n.chartRect.height/c,p=e=>e*l+u,m=e=>d+(s-e)*f;e.beginPath(),e.strokeStyle=r.lineColor,e.lineWidth=2,e.lineJoin=`round`;let h=[];for(let n=i;n<=a&&n<t.length;n++){let r=p(n),a=m(t[n].close);h.push({x:r,y:a}),n===i?e.moveTo(r,a):e.lineTo(r,a)}e.stroke();let g=Math.max(2,Math.min(4,n.barWidth*.3)),_=new Path2D;for(let{x:e,y:t}of h)_.moveTo(e+g,t),_.arc(e,t,g,0,Math.PI*2);e.fillStyle=r.lineColor,e.fill(_),e.strokeStyle=r.background,e.lineWidth=1,e.stroke(_)}},re=class{visible=!0;heightRatio=.2;setVisible(e){this.visible=e}setHeightRatio(e){this.heightRatio=Math.max(.05,Math.min(.5,e))}render(e,t,n,r){if(!this.visible||t.length===0)return;let{from:i,to:a}=n.visibleRange,{chartRect:o}=n,s=n.barWidth,c=s/2,l=s+n.barSpacing,u=-n.offset+o.x+c,d=0;for(let e=i;e<=a&&e<t.length;e++)t[e].volume>d&&(d=t[e].volume);if(d===0)return;let f=o.height*this.heightRatio,p=o.y+o.height,m=f/d,h=new Path2D,g=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=e*l+u,i=n.volume*m;(n.close>=n.open?h:g).rect(r-c,p-i,s,i)}e.globalAlpha=.35,e.fillStyle=r.candleUp,e.fill(h),e.fillStyle=r.candleDown,e.fill(g),e.globalAlpha=1}},ie=class{visible=!1;buckets=48;widthRatio=.18;opacity=.32;highlightPoC=!0;setVisible(e){this.visible=e}isVisible(){return this.visible}setBuckets(e){this.buckets=Math.max(8,Math.min(200,Math.floor(e)))}setWidthRatio(e){this.widthRatio=Math.max(.05,Math.min(.5,e))}setOpacity(e){this.opacity=Math.max(.05,Math.min(1,e))}setHighlightPoC(e){this.highlightPoC=e}render(e,t,n,r){if(!this.visible||t.length===0)return;let{from:i,to:a}=n.visibleRange,{chartRect:o,priceRange:s}=n,c=s.max-s.min;if(c<=0)return;let l=new Float64Array(this.buckets),u=new Float64Array(this.buckets),d=new Float64Array(this.buckets);for(let e=i;e<=a&&e<t.length;e++){let n=t[e];if(n.volume<=0)continue;let r=Math.max(n.low,s.min),i=Math.min(n.high,s.max);if(i<=r)continue;let a=(r-s.min)/c,o=(i-s.min)/c,f=Math.max(0,Math.floor(a*this.buckets)),p=Math.min(this.buckets-1,Math.floor(o*this.buckets)),m=Math.max(1,p-f+1),h=n.volume/m,g=n.close>=n.open;for(let e=f;e<=p;e++)l[e]+=h,g?u[e]+=h:d[e]+=h}let f=0,p=-1;for(let e=0;e<l.length;e++)l[e]>f&&(f=l[e],p=e);if(f===0)return;let m=o.width*this.widthRatio,h=o.x+o.width,g=o.height/this.buckets,_=1/f;e.save(),e.globalAlpha=this.opacity;for(let t=0;t<this.buckets;t++){let n=l[t];if(n===0)continue;let i=o.y+o.height-(t+1)*g,a=n*_*m,s=u[t]*_*m,c=d[t]*_*m;s>0&&(e.fillStyle=r.candleUp,e.fillRect(h-s,i+.5,s,g-1)),c>0&&(e.fillStyle=r.candleDown,e.fillRect(h-a,i+.5,c,g-1)),this.highlightPoC&&t===p&&(e.globalAlpha=1,e.strokeStyle=r.crosshair,e.lineWidth=1,e.setLineDash([3,2]),e.beginPath(),e.moveTo(o.x,i+g/2+.5),e.lineTo(h-a-2,i+g/2+.5),e.stroke(),e.setLineDash([]),e.globalAlpha=this.opacity)}e.restore()}};function ae(e,t){return e<0?0:e>t?t:e}function oe(e,t,n,r={}){let i=Math.max(4,Math.min(500,Math.floor(r.buckets??48))),a=n-t;if(a<=0||e.length===0)return null;let o=a/i,s=new Float64Array(i);for(let r of e){let e=Math.min(r.low,r.high),a=Math.max(r.low,r.high);if(a<t||e>n)continue;let c=ae(Math.floor((e-t)/o),i-1),l=ae(Math.floor((a-t)/o),i-1);for(let e=c;e<=l;e++)s[e]+=1}let c=0,l=0,u=0;for(let e=0;e<i;e++)u+=s[e],s[e]>l&&(l=s[e],c=e);if(u===0)return null;let d=u*(r.valueAreaPct??.7),f=c,p=c,m=s[c];for(;m<d&&(f>0||p<i-1);){let e=f>0?s[f-1]:-1;(p<i-1?s[p+1]:-1)>=e?(p+=1,m+=s[p]):(--f,m+=s[f])}let h=[];for(let e=0;e<i;e++){let n=t+e*o;h.push({low:n,high:n+o,mid:n+o/2,count:s[e]})}return{buckets:h,pocIndex:c,maxCount:l,totalCount:u,valueAreaLow:t+f*o,valueAreaHigh:t+(p+1)*o}}function se(e){let t=(e%52+52)%52;return t<26?String.fromCharCode(65+t):String.fromCharCode(97+t-26)}function ce(e,t,n,r=48){let i=Math.max(4,Math.min(500,Math.floor(r))),a=n-t,o=Array.from({length:i},()=>[]);if(a<=0)return o;let s=a/i;return e.forEach((e,r)=>{let a=Math.min(e.low,e.high),c=Math.max(e.low,e.high);if(c<t||a>n)return;let l=Math.max(0,Math.min(i-1,Math.floor((a-t)/s))),u=Math.max(0,Math.min(i-1,Math.floor((c-t)/s)));for(let e=l;e<=u;e++)o[e].push(r)}),o}function le(t,n,r,i={}){if(t.length===0||r-n<=0)return[];let a=[],o=0,s=(0,e.timeframeBucketStart)(t[0].time,`1d`),c=(e,o,s)=>{let c=oe(t.slice(e,o+1),n,r,i);c&&a.push({startIndex:e,endIndex:o,startTime:s,profile:c})};for(let n=1;n<t.length;n++){let r=(0,e.timeframeBucketStart)(t[n].time,`1d`);r!==s&&(c(o,n-1,s),o=n,s=r)}return c(o,t.length-1,s),a}var ue=class{visible=!1;buckets=48;widthRatio=.18;opacity=.32;valueAreaPct=.7;highlightPoC=!0;showStats=!0;splitBySession=!1;letters=!1;lastStats=null;setVisible(e){this.visible=e,e||(this.lastStats=null)}isVisible(){return this.visible}setBuckets(e){this.buckets=Math.max(8,Math.min(200,Math.floor(e)))}setWidthRatio(e){this.widthRatio=Math.max(.05,Math.min(.5,e))}setOpacity(e){this.opacity=Math.max(.05,Math.min(1,e))}setValueAreaPct(e){this.valueAreaPct=Math.max(.3,Math.min(.95,e))}setHighlightPoC(e){this.highlightPoC=e}setShowStats(e){this.showStats=e}setSplitBySession(e){this.splitBySession=e}isSplitBySession(){return this.splitBySession}setLetters(e){this.letters=e}getStats(){return this.lastStats}render(e,t,n,r){if(!this.visible||t.length===0)return;let{from:i,to:a}=n.visibleRange,{chartRect:o,priceRange:s}=n,c=Math.max(0,i),l=Math.min(a,t.length-1);if(l<c)return;let u=t.slice(c,l+1);if(this.splitBySession){this.lastStats=null,this.renderSplit(e,u,c,n,r);return}let d=oe(u,s.min,s.max,{buckets:this.buckets,valueAreaPct:this.valueAreaPct});if(!d){this.lastStats=null;return}let f=d.buckets[d.pocIndex].mid;this.lastStats={poc:f,vah:d.valueAreaHigh,val:d.valueAreaLow,valueAreaPct:this.valueAreaPct};let p=d.buckets.length,m=o.width*this.widthRatio,h=o.x,g=o.height/p,_=1/d.maxCount;e.save();for(let t=0;t<p;t++){let n=d.buckets[t];if(n.count===0)continue;let i=o.y+o.height-(t+1)*g,a=n.count*_*m,s=n.mid>=d.valueAreaLow&&n.mid<=d.valueAreaHigh;e.globalAlpha=s?Math.min(1,this.opacity+.18):this.opacity,e.fillStyle=s?r.candleUp:r.textSecondary,e.fillRect(h,i+.5,a,g-1)}let v=e=>o.y+o.height*(1-(e-s.min)/(s.max-s.min));e.globalAlpha=.6,e.strokeStyle=r.candleUp,e.lineWidth=1,e.setLineDash([1,3]);for(let t of[d.valueAreaHigh,d.valueAreaLow]){let n=v(t);e.beginPath(),e.moveTo(h,Math.round(n)+.5),e.lineTo(o.x+o.width,Math.round(n)+.5),e.stroke()}if(e.setLineDash([]),this.highlightPoC){let t=v(f);e.globalAlpha=1,e.strokeStyle=r.crosshair,e.lineWidth=1,e.setLineDash([3,2]),e.beginPath(),e.moveTo(h,Math.round(t)+.5),e.lineTo(o.x+o.width,Math.round(t)+.5),e.stroke(),e.setLineDash([])}this.showStats&&this.drawStats(e,o.x+6,o.y+6,f,d.valueAreaHigh,d.valueAreaLow,r),e.restore()}renderSplit(e,t,n,r,i){let{chartRect:o,priceRange:s}=r,c=le(t,s.min,s.max,{buckets:this.buckets,valueAreaPct:this.valueAreaPct});if(c.length===0)return;let l=s.max-s.min,u=e=>o.y+o.height*(1-(e-s.min)/l),d=r.barWidth/2;e.save();for(let l of c){let c=l.profile,f=c.buckets.length,p=o.height/f,m=a(n+l.startIndex,r)-d,h=a(n+l.endIndex,r)+d,g=Math.max(2,h-m),_=1/c.maxCount,v=this.letters&&p>=7,y=v?ce(t.slice(l.startIndex,l.endIndex+1),s.min,s.max,this.buckets):null;if(v&&y){e.font=`${Math.min(11,Math.floor(p))}px ui-monospace, monospace`,e.textBaseline=`middle`,e.textAlign=`left`;let t=Math.max(1,Math.floor(g/6));for(let n=0;n<f;n++){let r=y[n];if(r.length===0)continue;let a=o.y+o.height-(n+.5)*p,s=c.buckets[n].mid>=c.valueAreaLow&&c.buckets[n].mid<=c.valueAreaHigh;e.globalAlpha=s?.95:.6,e.fillStyle=s?i.candleUp:i.textSecondary;let l=Math.min(r.length,t);for(let t=0;t<l;t++)e.fillText(se(r[t]),m+t*6,a)}}else for(let t=0;t<f;t++){let n=c.buckets[t];if(n.count===0)continue;let r=o.y+o.height-(t+1)*p,a=n.count*_*g,s=n.mid>=c.valueAreaLow&&n.mid<=c.valueAreaHigh;e.globalAlpha=s?Math.min(1,this.opacity+.18):this.opacity,e.fillStyle=s?i.candleUp:i.textSecondary,e.fillRect(m,r+.5,a,p-1)}if(this.highlightPoC){let t=u(c.buckets[c.pocIndex].mid);e.globalAlpha=1,e.strokeStyle=i.crosshair,e.lineWidth=1,e.setLineDash([3,2]),e.beginPath(),e.moveTo(m,Math.round(t)+.5),e.lineTo(Math.min(h,o.x+o.width),Math.round(t)+.5),e.stroke(),e.setLineDash([])}}e.restore()}drawStats(e,t,n,r,i,a,o){let s=de(r),c=[[`POC`,r.toFixed(s),o.crosshair],[`VAH`,i.toFixed(s),o.candleUp],[`VAL`,a.toFixed(s),o.candleUp]];e.globalAlpha=1,e.font=`600 10px ${o.font.family}`,e.textBaseline=`middle`;let l=0;for(let[,t]of c)l=Math.max(l,e.measureText(t).width);let u=38+l,d=6+c.length*14;e.fillStyle=o.background,e.globalAlpha=.82,fe(e,t,n,u,d,4),e.fill(),e.globalAlpha=1,c.forEach(([r,i,a],s)=>{let c=n+6/2+14/2+s*14;e.fillStyle=a,e.textAlign=`left`,e.fillText(r,t+6,c),e.fillStyle=o.text,e.textAlign=`right`,e.fillText(i,t+u-6,c)}),e.textAlign=`left`}};function de(e){let t=Math.abs(e);return t>=1e3?2:t>=1?4:6}function fe(e,t,n,r,i,a){e.beginPath(),e.moveTo(t+a,n),e.arcTo(t+r,n,t+r,n+i,a),e.arcTo(t+r,n+i,t,n+i,a),e.arcTo(t,n+i,t,n,a),e.arcTo(t,n,t+r,n,a),e.closePath()}function pe(t,n){let r=n===`day`?`1d`:`1w`,i=[];for(let n of t){let t=(0,e.timeframeBucketStart)(n.time,r),a=i[i.length-1];a&&a.key===t?(a.high=Math.max(a.high,n.high),a.low=Math.min(a.low,n.low),a.close=n.close):i.push({key:t,open:n.open,high:n.high,low:n.low,close:n.close})}return i}function me(e,t=`day`){let n=pe(e,t);if(n.length<2)return[];let r=n[n.length-2],i=n[n.length-1],a=t===`day`?`D`:`W`;return[{id:`p${a}h`,label:`P${a}H`,price:r.high},{id:`p${a}c`,label:`P${a}C`,price:r.close},{id:`p${a}l`,label:`P${a}L`,price:r.low},{id:`open`,label:t===`day`?`Day Open`:`Week Open`,price:i.open}]}var he=class{visible=!1;period=`day`;setVisible(e){this.visible=e}isVisible(){return this.visible}setPeriod(e){this.period=e}getPeriod(){return this.period}render(e,t,n,r){if(!this.visible||t.length===0)return;let i=me(t,this.period);if(i.length===0)return;let{chartRect:a}=n,s=a.y,c=a.y+a.height;e.save(),e.font=`600 10px ${r.font.family}`,e.textBaseline=`middle`;for(let t of i){let i=o(t.price,n);if(i<s||i>c)continue;let l=ge(t,r);e.strokeStyle=l,e.globalAlpha=.7,e.lineWidth=1,e.setLineDash([5,4]),e.beginPath(),e.moveTo(a.x,Math.round(i)+.5),e.lineTo(a.x+a.width,Math.round(i)+.5),e.stroke(),e.setLineDash([]),e.globalAlpha=1;let u=t.label,d=e.measureText(u).width,f=a.x+a.width-d-10;e.fillStyle=r.background,e.globalAlpha=.85,e.fillRect(f-4,i-7,d+8,14),e.globalAlpha=1,e.fillStyle=l,e.textAlign=`left`,e.fillText(u,f,i+.5)}e.restore()}};function ge(e,t){return e.id.endsWith(`h`)?t.candleUp:e.id.endsWith(`l`)?t.candleDown:t.textSecondary}function _e(e){let t,n;return e.map(e=>{let r;return e.type===`high`?(r=t===void 0||e.price>t?`HH`:`LH`,t=e.price):(r=n===void 0||e.price<n?`LL`:`HL`,n=e.price),{...e,label:r}})}function ve(e,t=5,n=5){let r=Math.max(1,Math.floor(t)),i=Math.max(1,Math.floor(n)),a=[];for(let t=r;t<e.length-i;t++){let n=e[t].high,o=e[t].low,s=!0,c=!0;for(let a=t-r;a<=t+i&&!(a!==t&&(e[a].high>=n&&(s=!1),e[a].low<=o&&(c=!1),!s&&!c));a++);s?a.push({index:t,price:n,type:`high`}):c&&a.push({index:t,price:o,type:`low`})}return a}var ye=class{visible=!1;left=5;right=5;showLabels=!1;structureLabels=!1;setVisible(e){this.visible=e}isVisible(){return this.visible}setStrength(e,t){this.left=Math.max(1,Math.floor(e)),this.right=Math.max(1,Math.floor(t))}setShowLabels(e){this.showLabels=e}setStructureLabels(e){this.structureLabels=e}render(e,t,n,r){if(!this.visible||t.length===0)return;let i=ve(t,this.left,this.right);if(i.length===0)return;let s=this.structureLabels?_e(i):i,{from:c,to:l}=n.visibleRange;e.save(),e.font=`10px ${r.font.family}`,e.textAlign=`center`;for(let t of s){if(t.index<c-1||t.index>l+1)continue;let i=a(t.index,n),s=o(t.price,n),u=t.type===`high`,d=u?r.candleDown:r.candleUp,f=u?s-8:s+8;e.fillStyle=d,e.beginPath(),u?(e.moveTo(i-5,f-5),e.lineTo(i+5,f-5),e.lineTo(i,f)):(e.moveTo(i-5,f+5),e.lineTo(i+5,f+5),e.lineTo(i,f)),e.closePath(),e.fill();let p=this.structureLabels&&`label`in t?String(t.label):this.showLabels?be(t.price):null;p&&(e.textBaseline=u?`bottom`:`top`,e.fillText(p,i,u?f-5-1:f+5+1))}e.restore()}};function be(e){let t=Math.abs(e);return t>=1e3||t>=1?e.toFixed(2):e.toPrecision(4)}var xe=class{buffer=[];constructor(e=240){this.capacity=e,this.capacity=Math.max(1,Math.floor(e))}push(e,t){let n={time:e,bids:t.bids.map(e=>({...e})),asks:t.asks.map(e=>({...e}))},r=this.buffer[this.buffer.length-1];r&&r.time===e?this.buffer[this.buffer.length-1]=n:(this.buffer.push(n),this.buffer.length>this.capacity&&(this.buffer=this.buffer.slice(this.buffer.length-this.capacity)))}snapshots(){return this.buffer}maxVolume(){let e=0;for(let t of this.buffer){for(let n of t.bids)n.volume>e&&(e=n.volume);for(let n of t.asks)n.volume>e&&(e=n.volume)}return e}setCapacity(e){this.capacity=Math.max(1,Math.floor(e)),this.buffer.length>this.capacity&&(this.buffer=this.buffer.slice(this.buffer.length-this.capacity))}clear(){this.buffer=[]}get size(){return this.buffer.length}},Se=class{buffer=new xe(240);visible=!1;opacity=.7;setVisible(e){this.visible=e}isVisible(){return this.visible}setOpacity(e){this.opacity=Math.max(.1,Math.min(1,e))}setCapacity(e){this.buffer.setCapacity(e)}push(e,t){this.buffer.push(e,t)}clear(){this.buffer.clear()}render(e,t,n){if(!this.visible)return;let r=this.buffer.snapshots();if(r.length===0)return;let i=this.buffer.maxVolume();if(i<=0)return;let a=1/i,{chartRect:o}=t,s=Math.max(2,t.barWidth+t.barSpacing),c=o.x,l=o.x+o.width,u=o.y,f=o.y+o.height;e.save();for(let i of r){let r=d(i.time,t);if(r<c-s||r>l+s)continue;let o=r-s/2;this.drawSide(e,i.bids,n.candleUp,o,s,t,a,u,f),this.drawSide(e,i.asks,n.candleDown,o,s,t,a,u,f)}e.restore()}drawSide(e,t,n,r,i,a,s,c,l){if(t.length===0)return;let u=Ce(t,a);e.fillStyle=n;for(let n of t){let t=o(n.price,a);t<c-u||t>l+u||(e.globalAlpha=Math.min(1,Math.sqrt(n.volume*s))*this.opacity,e.fillRect(r,t-u/2,i,u))}e.globalAlpha=1}};function Ce(e,t){if(e.length<2)return 3;let n=e.map(e=>e.price).sort((e,t)=>e-t),r=[];for(let e=1;e<n.length;e++){let t=n[e]-n[e-1];t>0&&r.push(t)}if(r.length===0)return 3;r.sort((e,t)=>e-t);let i=r[Math.floor(r.length/2)],a=Math.abs(o(n[0],t)-o(n[0]+i,t));return Math.max(2,Math.min(a,12))}var we=class{symbols=new Map;mode=`percent`;setMode(e){this.mode=e}addSymbol(e){this.symbols.set(e.id,e)}removeSymbol(e){this.symbols.delete(e)}setSymbolData(e,t){let n=this.symbols.get(e);n&&(n.data=t)}setSymbolVisible(e,t){let n=this.symbols.get(e);n&&(n.visible=t)}getSymbols(){return Array.from(this.symbols.values())}clear(){this.symbols.clear()}render(e,t,n,r){if(this.symbols.size===0||t.length===0)return;let{chartRect:i}=n;e.save(),e.beginPath(),e.rect(i.x,i.y,i.width,i.height),e.clip();for(let i of this.symbols.values())!i.visible||i.data.length===0||this.renderSymbol(e,i,t,n,r);e.restore()}renderSymbol(e,t,n,r,i){let{chartRect:s}=r,c=r.barWidth+r.barSpacing,l=Math.max(0,Math.floor(r.offset/c));if(l>=n.length||l>=t.data.length)return;let u=n[l].close,d=t.data[l].close;if(u===0||d===0)return;e.strokeStyle=t.color,e.lineWidth=t.lineWidth??1.5,e.lineJoin=`round`,e.beginPath();let f=!1,p=Math.min(n.length,t.data.length);for(let n=l;n<p;n++){let i=a(n,r);if(i<s.x-c)continue;if(i>s.x+s.width+c)break;let l;l=this.mode===`percent`?o(u*(1+(t.data[n].close-d)/d),r):o(t.data[n].close,r),f?e.lineTo(i,l):(e.moveTo(i,l),f=!0)}if(e.stroke(),f){let n=Math.min(l+2,p-1),i=a(n,r)+4,s;s=this.mode===`percent`?o(u*(1+(t.data[n].close-d)/d),r)-4:o(t.data[n].close,r)-4,e.fillStyle=t.color,e.font=`bold 10px sans-serif`,e.textBaseline=`bottom`,e.textAlign=`left`,e.fillText(t.label,i,s)}}};function Te(e){if(e.length===0)return[];let t=[],n=e[0].open,r=(e[0].open+e[0].high+e[0].low+e[0].close)/4;for(let i=0;i<e.length;i++){let a=e[i],o=(a.open+a.high+a.low+a.close)/4,s=i===0?a.open:(n+r)/2,c=Math.max(a.high,s,o),l=Math.min(a.low,s,o);t.push({time:a.time,open:s,high:c,low:l,close:o,volume:a.volume}),n=s,r=o}return t}function Ee(e,t){if(e.length===0)return[];let n=t.brickSize;t.useATR&&e.length>(t.atrPeriod??14)&&(n=De(e,t.atrPeriod??14)),n<=0&&(n=1);let r=[],i=Math.round(e[0].close/n)*n,a=e[0].time;for(let t=1;t<e.length;t++){let o=e[t].close-i,s=Math.floor(Math.abs(o)/n);if(s>=1){let c=o>0?1:-1;for(let o=0;o<s;o++){let o=i;i+=c*n,r.push({time:a++,open:o,high:Math.max(o,i),low:Math.min(o,i),close:i,volume:e[t].volume/s})}}}return r}function De(e,t){let n=0;for(let r=1;r<=Math.min(t,e.length-1);r++){let t=Math.max(e[r].high-e[r].low,Math.abs(e[r].high-e[r-1].close),Math.abs(e[r].low-e[r-1].close));n+=t}return n/t}function Oe(e,t=3){if(e.length===0)return[];let n=[],r=0;n.push({time:r++,open:e[0].open,high:Math.max(e[0].open,e[0].close),low:Math.min(e[0].open,e[0].close),close:e[0].close,volume:e[0].volume});for(let i=1;i<e.length;i++){let a=e[i].close,o=n[n.length-1],s=o.close>=o.open,c=Math.min(t,n.length),l=-1/0,u=1/0;for(let e=n.length-c;e<n.length;e++)l=Math.max(l,n[e].high),u=Math.min(u,n[e].low);s&&a>o.close?n.push({time:r++,open:o.close,high:a,low:o.close,close:a,volume:e[i].volume}):!s&&a<o.close||s&&a<u?n.push({time:r++,open:o.close,high:o.close,low:a,close:a,volume:e[i].volume}):!s&&a>l&&n.push({time:r++,open:o.close,high:a,low:o.close,close:a,volume:e[i].volume})}return n}function ke(e,t=4){if(e.length<2)return e.slice();let n=[],r=e[1].close>=e[0].close?1:-1,i=e[0].close,a=e[0].close,o=e[0].close,s=0;for(let c=1;c<e.length;c++){let l=e[c].close,u=t/100*o;r===1?(l>i&&(i=l),i-l>=u&&(n.push({time:s++,open:o,high:i,low:o,close:i,volume:e[c].volume}),r=-1,o=i,a=l,i=l)):(l<a&&(a=l),l-a>=u&&(n.push({time:s++,open:o,high:o,low:a,close:a,volume:e[c].volume}),r=1,o=a,i=l,a=l))}return r===1?n.push({time:s,open:o,high:i,low:o,close:i,volume:0}):n.push({time:s,open:o,high:o,low:a,close:a,volume:0}),n}function Ae(e,t,n=3){if(e.length===0||t<=0)return[];let r=[],i=0,a=0,o=0,s=0,c=Math.round(e[0].close/t)*t;a=c,o=c,i=1;for(let c=1;c<e.length;c++){let l=e[c].close,u=Math.round(l/t)*t;i===1?u>a?a=u:a-u>=t*n&&(r.push({time:s++,open:o,high:a,low:o,close:a,volume:e[c].volume}),i=-1,o=u,a-=t):u<o?o=u:u-o>=t*n&&(r.push({time:s++,open:a,high:a,low:o,close:o,volume:e[c].volume}),i=1,a=u,o+=t)}return r.push({time:s,open:i===1?o:a,high:a,low:o,close:i===1?a:o,volume:0}),r}function je(e,t){if(e.length===0||t.rangeSize<=0)return[];let n=[],r=e[0].time,i=e[0].open,a=i,o=i,s=0,c=(e,c)=>{for(e>a&&(a=e),e<o&&(o=e),s+=c;a-o>=t.rangeSize;){let c=e>=i,l=c?i+t.rangeSize:i-t.rangeSize;n.push({time:r++,open:i,high:c?l:i,low:c?i:l,close:l,volume:s}),i=l,a=l,o=l,s=0}};for(let t of e){let e=t.close>=t.open?[t.low,t.high,t.close]:[t.high,t.low,t.close],n=t.volume/e.length;for(let t of e)c(t,n)}return n}var j=class{canResume(e,t,n){let r=t.series;if(!r||n<=0||n>r.length||r.length>e.length)return!1;for(let i=n;i<r.length;i++)if(r[i]&&!t.values.has(e[i].time))return!1;return!0}writePoint(e,t,n,r){e.series[n]=r,r?e.values.set(t[n].time,r):e.values.delete(t[n].time)}drawLine(e,t,n,r){if(!(t.length<2)){e.beginPath(),e.strokeStyle=n,e.lineWidth=r,e.lineJoin=`round`,e.moveTo(t[0].x,t[0].y);for(let n=1;n<t.length;n++)e.lineTo(t[n].x,t[n].y);e.stroke()}}drawBand(e,t,n,r){if(!(t.length<2||n.length<2)){e.beginPath(),e.moveTo(t[0].x,t[0].y);for(let n=1;n<t.length;n++)e.lineTo(t[n].x,t[n].y);for(let t=n.length-1;t>=0;t--)e.lineTo(n[t].x,n[t].y);e.closePath(),e.fillStyle=r,e.fill()}}drawHistogram(e,t,n){let r=n/2;for(let i of t){e.fillStyle=i.color;let t=Math.min(i.y,i.baseY),a=Math.abs(i.y-i.baseY);e.fillRect(i.x-r,t,n,Math.max(a,1))}}valuesToPoints(e,t,n,r){let i=[],{from:s,to:c}=r.visibleRange;for(let l=s;l<=c&&l<n.length;l++){let s=e.values.get(n[l].time);s&&s[t]!==void 0&&i.push({x:a(l,r),y:o(s[t],r)})}return i}},Me=1,Ne=class{registry=new Map;instances=new Map;register(e){this.registry.set(e.descriptor.id,e)}getAvailableIndicators(){return Array.from(this.registry.values()).map(e=>e.descriptor)}addIndicator(e,t={},n){let r=this.registry.get(e);if(!r)throw Error(`Unknown indicator: ${e}`);let i=`tc_${e}_${Me++}`,a={id:e,instanceId:i,params:{...r.descriptor.defaultConfig,...t},visible:!0},o={plugin:r,config:a,output:null,style:{colors:a.style?.colors??[`#2196F3`,`#FF9800`,`#4CAF50`,`#E91E63`,`#9C27B0`],lineWidths:a.style?.lineWidths??[1.5],opacity:a.style?.opacity??1}};return n&&(o.output=r.calculate(n,a)),this.instances.set(i,o),i}removeIndicator(e){this.instances.delete(e)}updateIndicator(e,t,n){let r=this.instances.get(e);r&&(Object.assign(r.config.params,t),n&&(r.output=r.plugin.calculate(n,r.config)))}recalculateAll(e){for(let t of this.instances.values())t.output=t.plugin.calculate(e,t.config)}recalculateFrom(e,t){for(let n of this.instances.values()){let r=n.output,i=null;r&&n.plugin.update&&t>0&&(i=n.plugin.update(e,n.config,r,t)),n.output=i??n.plugin.calculate(e,n.config)}}getOutput(e){return this.instances.get(e)?.output??null}renderOverlays(e,t){for(let n of this.instances.values())!n.output||!n.config.visible||n.plugin.descriptor.placement===`overlay`&&n.plugin.render(e,n.output,t,n.style)}renderPanel(e,t,n){let r=this.instances.get(t);!r?.output||!r.config.visible||r.plugin.render(e,r.output,n,r.style)}getIndicatorConfig(e){return this.instances.get(e)?.config??null}setVisible(e,t){let n=this.instances.get(e);return n?(n.config.visible=t,t):null}isVisible(e){return this.instances.get(e)?.config.visible??!1}getIndicatorDescriptor(e){return this.instances.get(e)?.plugin.descriptor??null}getActiveIndicators(){let e=[];for(let[t,n]of this.instances)e.push({instanceId:t,id:n.config.id,params:{...n.config.params},descriptor:n.plugin.descriptor,visible:n.config.visible??!0});return e}updateIndicatorStyle(e,t){let n=this.instances.get(e);n&&Object.assign(n.style,t)}getOverlayPriceRange(e,t){let n=1/0,r=-1/0;for(let i of this.instances.values()){if(!i.output||!i.config.visible||i.plugin.descriptor.placement!==`overlay`)continue;let a=i.output.series;if(!a)continue;let o=Math.min(t,a.length-1);for(let t=Math.max(0,e);t<=o;t++){let e=a[t];if(e)for(let t in e){let i=e[t];i!==void 0&&isFinite(i)&&(i<n&&(n=i),i>r&&(r=i))}}}return n===1/0?null:{min:n,max:r}}getPanelIndicators(){let e=[];for(let[t,n]of this.instances)n.plugin.descriptor.placement===`panel`&&e.push({instanceId:t,descriptor:n.plugin.descriptor});return e}},M=class extends Map{keyBuf=[];valBuf=[];folded=!1;constructor(){super()}set(e,t){if(this.folded)return super.set(e,t);let n=this.keyBuf,r=n.length;if(r===0||e>n[r-1])return n.push(e),this.valBuf.push(t),this;let i=this.indexOf(e);return i>=0?(this.valBuf[i]=t,this):(this.fold(),super.set(e,t))}get(e){if(this.folded)return super.get(e);let t=this.indexOf(e);return t>=0?this.valBuf[t]:void 0}has(e){return this.folded?super.has(e):this.indexOf(e)>=0}delete(e){if(this.folded)return super.delete(e);let t=this.indexOf(e);return t<0?!1:(this.keyBuf.splice(t,1),this.valBuf.splice(t,1),!0)}clear(){super.clear(),this.keyBuf=[],this.valBuf=[],this.folded=!1}get size(){return this.folded?super.size:this.keyBuf.length}forEach(e,t){this.fold(),super.forEach(e,t)}entries(){return this.fold(),super.entries()}keys(){return this.fold(),super.keys()}values(){return this.fold(),super.values()}[Symbol.iterator](){return this.fold(),super[Symbol.iterator]()}indexOf(e){let t=this.keyBuf,n=0,r=t.length-1;for(;n<=r;){let i=n+r>>1,a=t[i];if(a===e)return i;a<e?n=i+1:r=i-1}return-1}fold(){if(this.folded)return;this.folded=!0;let e=this.keyBuf,t=this.valBuf;for(let n=0;n<e.length;n++)super.set(e[n],t[n]);this.keyBuf=[],this.valBuf=[]}};function N(e,t,n){let r=e.params[t];if(typeof r==`number`&&Number.isFinite(r))return r;if(typeof r==`string`){let e=Number(r);if(Number.isFinite(e))return e}return n}function P(e,t,n,r=1){let i=N(e,t,n);return Math.max(r,Math.floor(i))}var Pe=class extends j{descriptor={id:`sma`,name:`Simple Moving Average`,placement:`overlay`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new M,i=Array(e.length).fill(null),a=0;for(let t=0;t<e.length;t++)if(a+=e[t].close,t>=n&&(a-=e[t-n].close),t>=n-1){let o={value:a/n};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=P(t,`period`,20,1);for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0;for(let n=t-i+1;n<=t;n++)r+=e[n].close;this.writePoint(n,e,t,{value:r/i})}return n}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},Fe=class extends j{descriptor={id:`ema`,name:`Exponential Moving Average`,placement:`overlay`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=2/(n+1),i=new M,a=Array(e.length).fill(null),o=0;for(let t=0;t<e.length;t++){if(t<n-1){o+=e[t].close;continue}o=t===n-1?(o+e[t].close)/n:(e[t].close-o)*r+o;let s={value:o};i.set(e[t].time,s),a[t]=s}return{values:i,series:a}}update(e,t,n,r){let i=P(t,`period`,20,1);if(r<i||!this.canResume(e,n,r))return null;let a=n.series[r-1]?.value;if(a===void 0)return null;let o=2/(i+1);for(let t=r;t<e.length;t++)a=(e[t].close-a)*o+a,this.writePoint(n,e,t,{value:a});return n}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},Ie=class extends j{descriptor={id:`bb`,name:`Bollinger Bands`,placement:`overlay`,defaultConfig:{period:20,stdDev:2}};calculate(e,t){let n=P(t,`period`,20,1),r=N(t,`stdDev`,2),i=new M,a=Array(e.length).fill(null),o=0,s=0;for(let t=0;t<e.length;t++){let c=e[t].close;if(o+=c,s+=c*c,t>=n){let r=e[t-n].close;o-=r,s-=r*r}if(t>=n-1){let c=o/n,l=s/n-c*c,u=Math.sqrt(Math.max(0,l)),d={middle:c,upper:c+r*u,lower:c-r*u};i.set(e[t].time,d),a[t]=d}}return{values:i,series:a}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=P(t,`period`,20,1),a=N(t,`stdDev`,2);for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0,o=0;for(let n=t-i+1;n<=t;n++){let t=e[n].close;r+=t,o+=t*t}let s=r/i,c=Math.sqrt(Math.max(0,o/i-s*s));this.writePoint(n,e,t,{middle:s,upper:s+a*c,lower:s-a*c})}return n}render(t,n,r,i){let s=n.series;if(!s)return;let{from:c,to:l}=r.visibleRange,u=0,d=l-c+1,f=new Float64Array(d),p=new Float64Array(d),m=new Float64Array(d),h=new Float64Array(d),g=new Float64Array(d),_=new Float64Array(d);for(let e=c;e<=l&&e<s.length;e++){let t=s[e];if(!t||t.upper===void 0)continue;let n=a(e,r);f[u]=n,p[u]=o(t.upper,r),m[u]=n,h[u]=o(t.middle,r),g[u]=n,_[u]=o(t.lower,r),u++}if(!(u<2)){t.beginPath(),t.moveTo(f[0],p[0]);for(let e=1;e<u;e++)t.lineTo(f[e],p[e]);for(let e=u-1;e>=0;e--)t.lineTo(g[e],_[e]);t.closePath(),t.fillStyle=(0,e.withAlpha)(i.colors[0],.1),t.fill(),t.beginPath(),t.strokeStyle=i.colors[0],t.lineWidth=i.lineWidths[0],t.lineJoin=`round`,t.moveTo(f[0],p[0]);for(let e=1;e<u;e++)t.lineTo(f[e],p[e]);t.stroke(),t.beginPath(),t.strokeStyle=i.colors[1]??i.colors[0],t.moveTo(m[0],h[0]);for(let e=1;e<u;e++)t.lineTo(m[e],h[e]);t.stroke(),t.beginPath(),t.strokeStyle=i.colors[0],t.moveTo(g[0],_[0]);for(let e=1;e<u;e++)t.lineTo(g[e],_[e]);t.stroke()}}},Le=class extends j{descriptor={id:`vwap`,name:`Volume Weighted Average Price`,placement:`overlay`,defaultConfig:{}};calculate(e,t){let n=new M,r=Array(e.length).fill(null),i=0,a=0;for(let t=0;t<e.length;t++){let o=(e[t].high+e[t].low+e[t].close)/3;if(i+=e[t].volume,a+=o*e[t].volume,i>0){let o={value:a/i};n.set(e[t].time,o),r[t]=o}}return{values:n,series:r}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},Re=class extends j{descriptor={id:`ichimoku`,name:`Ichimoku Cloud`,placement:`overlay`,defaultConfig:{tenkan:9,kijun:26,senkou:52,displacement:26}};calculate(e,t){let n=P(t,`tenkan`,9,1),r=P(t,`kijun`,26,1),i=P(t,`senkou`,52,1),a=new M,o=Array(e.length).fill(null),s=t=>{let n=new Float64Array(e.length),r=new Float64Array(e.length);for(let i=0;i<e.length;i++){let a=-1/0,o=1/0,s=Math.max(0,i-t+1);for(let t=s;t<=i;t++)e[t].high>a&&(a=e[t].high),e[t].low<o&&(o=e[t].low);n[i]=a,r[i]=o}return{highs:n,lows:r}},c=s(n),l=s(r),u=s(i);for(let t=0;t<e.length;t++){let s={};t>=n-1&&(s.tenkan=(c.highs[t]+c.lows[t])/2),t>=r-1&&(s.kijun=(l.highs[t]+l.lows[t])/2),s.tenkan!==void 0&&s.kijun!==void 0&&(s.senkouA=(s.tenkan+s.kijun)/2),t>=i-1&&(s.senkouB=(u.highs[t]+u.lows[t])/2),t>=r-1&&(s.chikou=e[t].close),(s.tenkan!==void 0||s.kijun!==void 0||s.senkouA!==void 0||s.senkouB!==void 0)&&(a.set(e[t].time,s),o[t]=s)}return{values:a,series:o}}render(t,n,r,i){let s=n.series;if(!s)return;let{from:c,to:l}=r.visibleRange,u=l-c+1,d=new Float64Array(u),f=new Float64Array(u),p=0,m=new Float64Array(u),h=new Float64Array(u),g=0,_=new Float64Array(u),v=new Float64Array(u),y=0,b=new Float64Array(u),x=new Float64Array(u),S=0;for(let e=c;e<=l&&e<s.length;e++){let t=s[e];if(!t)continue;let n=a(e,r);t.tenkan!==void 0&&(d[p]=n,f[p]=o(t.tenkan,r),p++),t.kijun!==void 0&&(m[g]=n,h[g]=o(t.kijun,r),g++),t.senkouA!==void 0&&(_[y]=n,v[y]=o(t.senkouA,r),y++),t.senkouB!==void 0&&(b[S]=n,x[S]=o(t.senkouB,r),S++)}if(y>1&&S>1){let n=Math.min(y,S);t.beginPath(),t.moveTo(_[0],v[0]);for(let e=1;e<n;e++)t.lineTo(_[e],v[e]);for(let e=n-1;e>=0;e--)t.lineTo(b[e],x[e]);t.closePath(),t.fillStyle=(0,e.withAlpha)(i.colors[2]??`#26A69A`,.15),t.fill()}let C=(e,n,r,i,a)=>{if(!(r<2)){t.beginPath(),t.strokeStyle=i,t.lineWidth=a,t.lineJoin=`round`,t.moveTo(e[0],n[0]);for(let i=1;i<r;i++)t.lineTo(e[i],n[i]);t.stroke()}};C(d,f,p,i.colors[0],i.lineWidths[0]),C(m,h,g,i.colors[1]??`#FF9800`,i.lineWidths[0]),C(_,v,y,i.colors[2]??`#26A69A`,1),C(b,x,S,i.colors[3]??`#EF5350`,1)}},ze=class extends j{descriptor={id:`psar`,name:`Parabolic SAR`,placement:`overlay`,defaultConfig:{step:.02,max:.2}};calculate(e,t){let n=N(t,`step`,.02),r=N(t,`max`,.2),i=new M,a=Array(e.length).fill(null);if(e.length<2)return{values:i,series:a};let o=e[1].close>e[0].close,s=n,c=o?e[0].high:e[0].low,l=o?e[0].low:e[0].high,u={value:l,trend:o?1:-1};i.set(e[0].time,u),a[0]=u;for(let t=1;t<e.length;t++){let u=l;l=u+s*(c-u),o?(l=Math.min(l,e[t-1].low),t>=2&&(l=Math.min(l,e[t-2].low)),e[t].low<l?(o=!1,l=c,c=e[t].low,s=n):e[t].high>c&&(c=e[t].high,s=Math.min(s+n,r))):(l=Math.max(l,e[t-1].high),t>=2&&(l=Math.max(l,e[t-2].high)),e[t].high>l?(o=!0,l=c,c=e[t].high,s=n):e[t].low<c&&(c=e[t].low,s=Math.min(s+n,r)));let d={value:l,trend:o?1:-1};i.set(e[t].time,d),a[t]=d}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange,l=Math.max(1.5,n.barWidth*.15);for(let t=s;t<=c&&t<i.length;t++){let s=i[t];if(!s||s.value===void 0)continue;let c=a(t,n),u=o(s.value,n);e.beginPath(),e.arc(c,u,l,0,Math.PI*2),e.fillStyle=s.trend===1?r.colors[0]:r.colors[1]??`#EF5350`,e.fill()}}},Be=class extends j{descriptor={id:`supertrend`,name:`Supertrend`,placement:`overlay`,defaultConfig:{period:10,multiplier:3}};calculate(e,t){let n=P(t,`period`,10,1),r=N(t,`multiplier`,3),i=new M,a=Array(e.length).fill(null);if(e.length<n)return{values:i,series:a};let o=[e[0].high-e[0].low];for(let t=1;t<e.length;t++)o.push(Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close)));let s=0;for(let e=0;e<n;e++)s+=o[e];s/=n;let c=0,l=0,u=0,d=0,f=0,p=0,m=1;for(let t=n-1;t<e.length;t++){t>n-1&&(s=(s*(n-1)+o[t])/n);let h=(e[t].high+e[t].low)/2,g=h+r*s,_=h-r*s;c=g<u||e[t-1].close>u?g:u,l=_>d||e[t-1].close<d?_:d,f=p===u?e[t].close<=c?c:l:e[t].close>=l?l:c,m=f===l?1:-1;let v={value:f,trend:m};i.set(e[t].time,v),a[t]=v,u=c,d=l,p=f}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange,l=r.colors[0],u=r.colors[1]??`#EF5350`,d=0,f=0,p=0;for(let t=s;t<=c&&t<i.length;t++){let s=i[t];if(!s||s.value===void 0)continue;let c=a(t,n),m=o(s.value,n),h=s.trend??1;p!==0&&(e.beginPath(),e.strokeStyle=h===1?l:u,e.lineWidth=r.lineWidths[0]+.5,e.moveTo(d,f),e.lineTo(c,m),e.stroke()),d=c,f=m,p=h}}},Ve=class extends j{descriptor={id:`keltner`,name:`Keltner Channel`,placement:`overlay`,defaultConfig:{emaPeriod:20,atrPeriod:10,multiplier:1.5}};calculate(e,t){let n=P(t,`emaPeriod`,20,1),r=P(t,`atrPeriod`,10,1),i=N(t,`multiplier`,1.5),a=new M;if(e.length<Math.max(n,r))return{values:a};let o=2/(n+1),s=e[0].close,c=[s];for(let t=1;t<e.length;t++)s=(e[t].close-s)*o+s,c.push(s);let l=[e[0].high-e[0].low];for(let t=1;t<e.length;t++)l.push(Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close)));let u=0;for(let e=0;e<r;e++)u+=l[e];u/=r;let d=Array(e.length).fill(null),f=Math.max(n,r)-1;for(let t=f;t<e.length;t++){t>f&&(u=(u*(r-1)+l[t])/r);let n={middle:c[t],upper:c[t]+i*u,lower:c[t]-i*u};a.set(e[t].time,n),d[t]=n}return{values:a,series:d}}render(t,n,r,i){let s=n.series;if(!s)return;let{from:c,to:l}=r.visibleRange,u=[],d=[],f=[];for(let e=c;e<=l&&e<s.length;e++){let t=s[e];if(!t)continue;let n=a(e,r);t.upper!==void 0&&u.push({x:n,y:o(t.upper,r)}),t.middle!==void 0&&d.push({x:n,y:o(t.middle,r)}),t.lower!==void 0&&f.push({x:n,y:o(t.lower,r)})}this.drawBand(t,u,f,(0,e.withAlpha)(i.colors[0],.08)),this.drawLine(t,u,i.colors[0],i.lineWidths[0]),this.drawLine(t,d,i.colors[1]??i.colors[0],i.lineWidths[0]),this.drawLine(t,f,i.colors[0],i.lineWidths[0])}},He=class extends j{descriptor={id:`donchian`,name:`Donchian Channel`,placement:`overlay`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new M,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=-1/0,o=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>a&&(a=e[r].high),e[r].low<o&&(o=e[r].low);let s={upper:a,middle:(a+o)/2,lower:o};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}render(t,n,r,i){let s=n.series;if(!s)return;let{from:c,to:l}=r.visibleRange,u=[],d=[],f=[];for(let e=c;e<=l&&e<s.length;e++){let t=s[e];if(!t)continue;let n=a(e,r);t.upper!==void 0&&u.push({x:n,y:o(t.upper,r)}),t.middle!==void 0&&d.push({x:n,y:o(t.middle,r)}),t.lower!==void 0&&f.push({x:n,y:o(t.lower,r)})}this.drawBand(t,u,f,(0,e.withAlpha)(i.colors[0],.08)),this.drawLine(t,u,i.colors[0],i.lineWidths[0]),this.drawLine(t,d,i.colors[1]??`#787B86`,1),this.drawLine(t,f,i.colors[0],i.lineWidths[0])}},Ue=[`s3`,`s2`,`s1`,`pp`,`r1`,`r2`,`r3`],We=class extends j{descriptor={id:`pivots`,name:`Pivot Points (Classic)`,placement:`overlay`,defaultConfig:{lookback:24}};calculate(e,t){let n=P(t,`lookback`,24,1),r=new M,i=Array(e.length).fill(null);if(e.length<=n)return{values:r,series:i};for(let t=n;t<e.length;t++){let a=-1/0,o=1/0;for(let r=t-n;r<t;r++)e[r].high>a&&(a=e[r].high),e[r].low<o&&(o=e[r].low);let s=e[t-1].close,c=(a+o+s)/3,l=a-o,u={pp:c,r1:2*c-o,s1:2*c-a,r2:c+l,s2:c-l,r3:a+2*(c-o),s3:o-2*(a-c)};r.set(e[t].time,u),i[t]=u}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange,l=r.colors[0],u=r.colors[1]??`#EF5350`,d=r.colors[2]??`#26A69A`,f=r.lineWidths[0],p=e=>e===`pp`?l:e.startsWith(`r`)?u:d;for(let t of Ue){e.beginPath(),e.strokeStyle=p(t),e.lineWidth=t===`pp`?f:Math.max(1,f-1),t!==`pp`&&e.setLineDash([4,3]);let r=!1;for(let l=s;l<=c&&l<i.length;l++){let s=i[l]?.[t];if(s===void 0)continue;let c=a(l,n),u=o(s,n);r?e.lineTo(c,u):(e.moveTo(c,u),r=!0)}e.stroke(),e.setLineDash([])}}},Ge=class extends j{descriptor={id:`avwap`,name:`Anchored VWAP`,placement:`overlay`,defaultConfig:{anchorTime:0}};calculate(e,t){let n=N(t,`anchorTime`,0),r=new M,i=Array(e.length).fill(null),a=0;if(n>0&&(a=e.findIndex(e=>e.time>=n),a<0))return{values:r,series:i};let o=0,s=0;for(let t=a;t<e.length;t++){let n=(e[t].high+e[t].low+e[t].close)/3;if(o+=e[t].volume,s+=n*e[t].volume,o>0){let n={value:s/o};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},Ke=class extends j{descriptor={id:`zigzag`,name:`ZigZag`,placement:`overlay`,defaultConfig:{deviation:5}};calculate(e,t){let n=Math.max(.01,N(t,`deviation`,5))/100,r=new M,i=Array(e.length).fill(null);if(e.length<2)return{values:r,series:i,meta:{pivots:[]}};let a=[],o=null,s=0,c=e[0].close;for(let t=1;t<e.length;t++){let r=e[t].high,i=e[t].low;if(o===null){r>=c*(1+n)?(a.push({idx:s,price:c,type:`low`}),o=`up`,s=t,c=r):i<=c*(1-n)&&(a.push({idx:s,price:c,type:`high`}),o=`down`,s=t,c=i);continue}o===`up`?r>c?(s=t,c=r):i<=c*(1-n)&&(a.push({idx:s,price:c,type:`high`}),o=`down`,s=t,c=i):i<c?(s=t,c=i):r>=c*(1+n)&&(a.push({idx:s,price:c,type:`low`}),o=`up`,s=t,c=r)}a.push({idx:s,price:c,type:o===`up`?`high`:`low`});for(let t of a){let n={pivot:t.price};r.set(e[t.idx].time,n),i[t.idx]=n}return{values:r,series:i,meta:{pivots:a}}}render(e,t,n,r){let i=t.meta?.pivots;if(!(!i||i.length<2)){e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;for(let t=0;t<i.length;t++){let r=i[t],s=a(r.idx,n),c=o(r.price,n);t===0?e.moveTo(s,c):e.lineTo(s,c)}e.stroke()}}},qe=class extends j{descriptor={id:`lrc`,name:`Linear Regression Channel`,placement:`overlay`,defaultConfig:{period:100,stdDev:2}};calculate(e,t){let n=P(t,`period`,100,2),r=N(t,`stdDev`,2),i=new M,a=Array(e.length).fill(null);if(e.length<n)return{values:i,series:a};for(let t=n-1;t<e.length;t++){let o=t-n+1,s=0,c=0,l=0,u=0;for(let t=0;t<n;t++){let n=t,r=e[o+t].close;s+=n,c+=r,l+=n*r,u+=n*n}let d=n*u-s*s;if(d===0)continue;let f=(n*l-s*c)/d,p=(c-f*s)/n,m=0;for(let t=0;t<n;t++){let n=f*t+p,r=e[o+t].close-n;m+=r*r}let h=Math.sqrt(m/n),g=f*(n-1)+p,_={middle:g,upper:g+r*h,lower:g-r*h,slope:f};i.set(e[t].time,_),a[t]=_}return{values:i,series:a}}render(t,n,r,i){let s=n.series;if(!s)return;let{from:c,to:l}=r.visibleRange,u=[],d=[],f=[];for(let e=c;e<=l&&e<s.length;e++){let t=s[e];if(!t)continue;let n=a(e,r);t.middle!==void 0&&d.push({x:n,y:o(t.middle,r)}),t.upper!==void 0&&u.push({x:n,y:o(t.upper,r)}),t.lower!==void 0&&f.push({x:n,y:o(t.lower,r)})}this.drawBand(t,u,f,(0,e.withAlpha)(i.colors[0],.08)),this.drawLine(t,u,i.colors[0],i.lineWidths[0]),this.drawLine(t,d,i.colors[1]??i.colors[0],i.lineWidths[0]),this.drawLine(t,f,i.colors[0],i.lineWidths[0])}},Je=class extends j{descriptor={id:`hma`,name:`Hull Moving Average`,placement:`overlay`,defaultConfig:{period:21}};calculate(e,t){let n=P(t,`period`,21,2),r=new M,i=Array(e.length).fill(null);if(e.length<n)return{values:r,series:i};let a=e.map(e=>e.close),o=Math.max(2,Math.floor(n/2)),s=Math.max(2,Math.floor(Math.sqrt(n))),c=Ye(a,n),l=Ye(a,o),u=Xe(a.map((e,t)=>c[t]===null||l[t]===null?null:2*l[t]-c[t]),s);for(let t=0;t<e.length;t++){if(u[t]===null)continue;let n={value:u[t]};r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}};function Ye(e,t){let n=Array(e.length).fill(null);if(e.length<t)return n;let r=t*(t+1)/2;for(let i=t-1;i<e.length;i++){let a=0;for(let n=0;n<t;n++)a+=e[i-n]*(t-n);n[i]=a/r}return n}function Xe(e,t){let n=Array(e.length).fill(null),r=t*(t+1)/2;for(let i=t-1;i<e.length;i++){let a=0,o=!0;for(let n=0;n<t;n++){let r=e[i-n];if(r===null){o=!1;break}a+=r*(t-n)}o&&(n[i]=a/r)}return n}var Ze=class extends j{descriptor={id:`mtfma`,name:`MTF Moving Average`,placement:`overlay`,defaultConfig:{period:50,timeframe:`1d`}};calculate(t,n){let r=P(n,`period`,50,1),i=String(n.params.timeframe??`1d`),a=new M,o=Array(t.length).fill(null);if(t.length===0)return{values:a,series:o};let s=[],c=(0,e.timeframeBucketStart)(t[0].time,i),l=t[0].close,u=null,d=()=>{if(s.length<r)return;let e=0;for(let t=s.length-r;t<s.length;t++)e+=s[t];u=e/r};for(let n=0;n<t.length;n++){let r=(0,e.timeframeBucketStart)(t[n].time,i);if(r!==c&&(s.push(l),d(),c=r),l=t[n].close,u!==null){let e={value:u};a.set(t[n].time,e),o[n]=e}}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},Qe=class extends j{descriptor={id:`svwap`,name:`Session VWAP`,placement:`overlay`,defaultConfig:{bands:1}};calculate(t,n){let r=Math.min(3,P(n,`bands`,1,0)),i=new M,a=Array(t.length).fill(null);if(t.length===0)return{values:i,series:a};let o=(0,e.timeframeBucketStart)(t[0].time,`1d`),s=0,c=0,l=0;for(let n=0;n<t.length;n++){let u=t[n],d=(0,e.timeframeBucketStart)(u.time,`1d`);d!==o&&(s=0,c=0,l=0,o=d);let f=(u.high+u.low+u.close)/3;if(s+=f*u.volume,c+=f*f*u.volume,l+=u.volume,l>0){let e=s/l,t={value:e,session:o};if(r>0){let n=Math.max(0,c/l-e*e),i=Math.sqrt(n);for(let n=1;n<=r;n++)t[`u${n}`]=e+n*i,t[`l${n}`]=e-n*i}i.set(u.time,t),a[n]=t}}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:a,to:o}=n.visibleRange;e.globalAlpha=.55,e.lineWidth=1,e.setLineDash([4,3]),e.strokeStyle=r.colors[1]??r.colors[0];for(let t=1;t<=3;t++)this.strokeBandSeries(e,i,n,a,o,e=>e[`u${t}`]),this.strokeBandSeries(e,i,n,a,o,e=>e[`l${t}`]);e.setLineDash([]),e.globalAlpha=1,e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`,this.strokeBandSeries(e,i,n,a,o,e=>e.value)}strokeBandSeries(e,t,n,r,i,s){e.beginPath();let c,l=!1;for(let u=r;u<=i&&u<t.length;u++){let r=t[u],i=r?s(r):void 0;if(r===null||i===void 0){l=!1;continue}let d=a(u,n),f=o(i,n),p=r.session!==c;!l||p?(e.moveTo(d,f),l=!0):e.lineTo(d,f),c=r.session}e.stroke()}},$e=class extends j{descriptor={id:`chandelier`,name:`Chandelier Exit`,placement:`overlay`,defaultConfig:{period:22,multiplier:3}};calculate(e,t){let n=P(t,`period`,22,1),r=N(t,`multiplier`,3),i=new M,a=Array(e.length).fill(null),o=e.length;if(o<=n)return{values:i,series:a};let s=Array(o).fill(0);for(let t=1;t<o;t++){let n=e[t-1].close;s[t]=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-n),Math.abs(e[t].low-n))}let c=0;for(let e=1;e<=n;e++)c+=s[e];c/=n;for(let t=n;t<o;t++){t>n&&(c=(c*(n-1)+s[t])/n);let o=-1/0,l=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>o&&(o=e[r].high),e[r].low<l&&(l=e[r].low);let u={long:o-r*c,short:l+r*c};i.set(e[t].time,u),a[t]=u}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange,l=(t,l)=>{e.beginPath(),e.strokeStyle=l,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`,e.setLineDash([5,3]);let u=!1;for(let r=s;r<=c&&r<i.length;r++){let s=i[r];if(!s||s[t]===void 0){u=!1;continue}let c=a(r,n),l=o(s[t],n);u?e.lineTo(c,l):(e.moveTo(c,l),u=!0)}e.stroke(),e.setLineDash([])};l(`long`,r.colors[0]??`#26A69A`),l(`short`,r.colors[1]??`#EF5350`)}},et=class extends j{descriptor={id:`alligator`,name:`Alligator`,placement:`overlay`,defaultConfig:{jaw:13,teeth:8,lips:5,jawShift:8,teethShift:5,lipsShift:3}};calculate(e,t){let n=P(t,`jaw`,13,1),r=P(t,`teeth`,8,1),i=P(t,`lips`,5,1),a=P(t,`jawShift`,8,0),o=P(t,`teethShift`,5,0),s=P(t,`lipsShift`,3,0),c=new M,l=e.length,u=Array(l).fill(null);if(l===0)return{values:c,series:u};let d=e.map(e=>(e.high+e.low)/2),f=tt(d,n),p=tt(d,r),m=tt(d,i),h=Array(l).fill(void 0),g=Array(l).fill(void 0),_=Array(l).fill(void 0);for(let e=0;e<l;e++)f[e]!==void 0&&e+a<l&&(h[e+a]=f[e]),p[e]!==void 0&&e+o<l&&(g[e+o]=p[e]),m[e]!==void 0&&e+s<l&&(_[e+s]=m[e]);for(let t=0;t<l;t++){if(h[t]===void 0&&g[t]===void 0&&_[t]===void 0)continue;let n={};h[t]!==void 0&&(n.jaw=h[t]),g[t]!==void 0&&(n.teeth=g[t]),_[t]!==void 0&&(n.lips=_[t]),c.set(e[t].time,n),u[t]=n}return{values:c,series:u}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange,l=(t,l)=>{e.beginPath(),e.strokeStyle=l,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let r=s;r<=c&&r<i.length;r++){let s=i[r];if(!s||s[t]===void 0){u=!1;continue}let c=a(r,n),l=o(s[t],n);u?e.lineTo(c,l):(e.moveTo(c,l),u=!0)}e.stroke()};l(`jaw`,r.colors[0]??`#2962FF`),l(`teeth`,r.colors[1]??`#EF5350`),l(`lips`,r.colors[2]??`#26A69A`)}};function tt(e,t){let n=e.length,r=Array(n).fill(void 0);if(n<t)return r;let i=0;for(let n=0;n<t;n++)i+=e[n];let a=i/t;r[t-1]=a;for(let i=t;i<n;i++)a=(a*(t-1)+e[i])/t,r[i]=a;return r}var nt=class extends j{descriptor={id:`vwma`,name:`Volume Weighted Moving Average`,placement:`overlay`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new M,i=Array(e.length).fill(null),a=0,o=0;for(let t=0;t<e.length;t++){let s=e[t].close*e[t].volume;if(a+=s,o+=e[t].volume,t>=n){let r=e[t-n];a-=r.close*r.volume,o-=r.volume}if(t>=n-1&&o>0){let n={value:a/o};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=P(t,`period`,20,1);for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0,a=0;for(let n=t-i+1;n<=t;n++)r+=e[n].close*e[n].volume,a+=e[n].volume;this.writePoint(n,e,t,a>0?{value:r/a}:null)}return n}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},rt=class extends j{descriptor={id:`wma`,name:`Weighted Moving Average`,placement:`overlay`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new M,i=Array(e.length).fill(null),a=n*(n+1)/2,o=0,s=0;for(let t=0;t<e.length;t++){let c=e[t].close;if(s+=c*n-o,o+=c,t>=n&&(o-=e[t-n].close),t>=n-1){let n={value:s/a};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=P(t,`period`,20,1),a=i*(i+1)/2;for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0,o=t-i+1;for(let t=0;t<i;t++)r+=e[o+t].close*(t+1);this.writePoint(n,e,t,{value:r/a})}return n}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},it=class extends j{descriptor={id:`envelope`,name:`Moving Average Envelope`,placement:`overlay`,defaultConfig:{period:20,percent:2.5}};calculate(e,t){let n=P(t,`period`,20,1),r=N(t,`percent`,2.5)/100,i=new M,a=Array(e.length).fill(null),o=0;for(let t=0;t<e.length;t++)if(o+=e[t].close,t>=n&&(o-=e[t-n].close),t>=n-1){let s=o/n,c={basis:s,upper:s*(1+r),lower:s*(1-r)};i.set(e[t].time,c),a[t]=c}return{values:i,series:a}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=P(t,`period`,20,1),a=N(t,`percent`,2.5)/100;for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0;for(let n=t-i+1;n<=t;n++)r+=e[n].close;let o=r/i;this.writePoint(n,e,t,{basis:o,upper:o*(1+a),lower:o*(1-a)})}return n}render(t,n,r,i){let s=n.series;if(!s)return;let{from:c,to:l}=r.visibleRange,u=[],d=[],f=[];for(let e=c;e<=l&&e<s.length;e++){let t=s[e];if(!t||t.upper===void 0)continue;let n=a(e,r);u.push({x:n,y:o(t.upper,r)}),d.push({x:n,y:o(t.lower,r)}),f.push({x:n,y:o(t.basis,r)})}this.drawBand(t,u,d,(0,e.withAlpha)(i.colors[0],.08)),this.drawLine(t,u,i.colors[0],i.lineWidths[0]),this.drawLine(t,d,i.colors[0],i.lineWidths[0]),this.drawLine(t,f,i.colors[1]??i.colors[0],i.lineWidths[0])}};function at(e,t){let n=2/(t+1),r=Array(e.length).fill(null),i=0,a=0;for(let o=0;o<e.length;o++){if(o<t-1){a+=e[o];continue}i=o===t-1?(a+e[o])/t:(e[o]-i)*n+i,r[o]=i}return r}function ot(e,t,n){let r=Array(n).fill(null);for(let n=0;n<e.length;n++)e[n]!==null&&(r[t[n]]=e[n]);return r}function st(e){let t=[],n=[];for(let r=0;r<e.length;r++)e[r]!==null&&(t.push(e[r]),n.push(r));return{values:t,indices:n}}var ct=class extends j{descriptor={id:`tema`,name:`Triple EMA`,placement:`overlay`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new M,i=Array(e.length).fill(null),a=at(e.map(e=>e.close),n),o=st(a),s=ot(at(o.values,n),o.indices,e.length),c=st(s),l=ot(at(c.values,n),c.indices,e.length);for(let t=0;t<e.length;t++){let n=a[t],o=s[t],c=l[t];if(n===null||o===null||c===null)continue;let u={value:3*n-3*o+c};r.set(e[t].time,u),i[t]=u}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},lt=class extends j{descriptor={id:`ao`,name:`Awesome Oscillator`,placement:`panel`,defaultConfig:{fast:5,slow:34}};calculate(e,t){let n=P(t,`fast`,5,1),r=P(t,`slow`,34,1),i=new M,a=Array(e.length).fill(null);if(e.length<r)return{values:i,series:a};let o=Array(e.length);for(let t=0;t<e.length;t++)o[t]=(e[t].high+e[t].low)/2;let s=0,c=0,l;for(let t=0;t<e.length;t++)if(c+=o[t],t>=r&&(c-=o[t-r]),s+=o[t],t>=n&&(s-=o[t-n]),t>=r-1){let o=s/n-c/r,u={value:o,up:+(l===void 0||o>=l)};i.set(e[t].time,u),a[t]=u,l=o}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&(t<l&&(l=t),t>u&&(u=t))}if(l===1/0)return;let d=Math.max(Math.abs(l),Math.abs(u))||1,f=e=>o.y+o.height*(1-(e+d)/(2*d)),p=f(0),m=n.barWidth/2,h=r.colors[0]??`#26A69A`,g=r.colors[1]??`#EF5350`;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=f(r.value),c=Math.min(s,p),l=Math.max(Math.abs(s-p),1);e.fillStyle=r.up?h:g,e.fillRect(o-m,c,n.barWidth,l)}}},ut=class extends j{descriptor={id:`chaikinOsc`,name:`Chaikin Oscillator`,placement:`panel`,defaultConfig:{fast:3,slow:10}};calculate(e,t){let n=P(t,`fast`,3,1),r=P(t,`slow`,10,1),i=new M,a=Array(e.length).fill(null);if(e.length<r)return{values:i,series:a};let o=2/(n+1),s=2/(r+1),c=0,l=0,u=0;for(let t=0;t<e.length;t++){let{high:n,low:d,close:f,volume:p}=e[t],m=n-d,h=m===0?0:(f-d-(n-f))/m;if(c+=h*p,t===0?(l=c,u=c):(l=(c-l)*o+l,u=(c-u)*s+u),t>=r-1){let n={value:l-u,adl:c};i.set(e[t].time,n),a[t]=n}}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&(t<l&&(l=t),t>u&&(u=t))}if(l===1/0)return;let d=Math.max(Math.abs(l),Math.abs(u))||1,f=e=>o.y+o.height*(1-(e+d)/(2*d)),p=f(0),m=n.barWidth/2,h=r.colors[0]??`#26A69A`,g=r.colors[1]??`#EF5350`;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=f(r.value),c=Math.min(s,p),l=Math.max(Math.abs(s-p),1);e.fillStyle=r.value>=0?h:g,e.fillRect(o-m,c,n.barWidth,l)}}},dt=class extends j{descriptor={id:`rsi`,name:`Relative Strength Index`,placement:`panel`,defaultConfig:{period:14}};smoothing=new WeakMap;calculate(e,t){let n=P(t,`period`,14,1),r=new M,i=Array(e.length).fill(null),a={values:r,series:i};if(e.length<n+1)return a;let o=[],s=[],c=0,l=0;for(let t=1;t<=n;t++){let n=e[t].close-e[t-1].close;n>0?c+=n:l-=n}c/=n,l/=n,o[n]=c,s[n]=l;let u={value:l===0?100:100-100/(1+c/l)};r.set(e[n].time,u),i[n]=u;for(let t=n+1;t<e.length;t++){let a=e[t].close-e[t-1].close,u=a>0?a:0,d=a<0?-a:0;c=(c*(n-1)+u)/n,l=(l*(n-1)+d)/n,o[t]=c,s[t]=l;let f={value:l===0?100:100-100/(1+c/l)};r.set(e[t].time,f),i[t]=f}return this.smoothing.set(a,{gain:o,loss:s}),a}update(e,t,n,r){let i=P(t,`period`,14,1),a=this.smoothing.get(n);if(!a||r<=i||!this.canResume(e,n,r))return null;let o=a.gain[r-1],s=a.loss[r-1];if(o===void 0||s===void 0)return null;for(let t=r;t<e.length;t++){let r=e[t].close-e[t-1].close,c=r>0?r:0,l=r<0?-r:0;o=(o*(i-1)+c)/i,s=(s*(i-1)+l)/i,a.gain[t]=o,a.loss[t]=s;let u=s===0?100:100-100/(1+o/s);this.writePoint(n,e,t,{value:u})}return n}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath();for(let t of[30,70]){let n=l(t);e.moveTo(o.x,n),e.lineTo(o.x+o.width,n)}e.stroke(),e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}},ft=class extends j{descriptor={id:`macd`,name:`MACD`,placement:`panel`,defaultConfig:{fast:12,slow:26,signal:9}};emas=new WeakMap;calculate(e,t){let n=P(t,`fast`,12,1),r=P(t,`slow`,26,1),i=P(t,`signal`,9,1),a=new M,o=Array(e.length).fill(null),s={values:a,series:o};if(e.length<r)return s;let c=2/(n+1),l=2/(r+1),u=2/(i+1),d=Array(e.length),f=Array(e.length),p=e[0].close,m=e[0].close,h=0,g=!1;for(let t=0;t<e.length;t++){let n=e[t].close;if(t===0?(p=n,m=n):(p=(n-p)*c+p,m=(n-m)*l+m),d[t]=p,f[t]=m,t>=r-1){let n=p-m;g?h=(n-h)*u+h:(h=n,g=!0);let r=n-h,i={macd:n,signal:h,histogram:r};a.set(e[t].time,i),o[t]=i}}return this.emas.set(s,{fast:d,slow:f}),s}update(e,t,n,r){let i=P(t,`fast`,12,1),a=P(t,`slow`,26,1),o=P(t,`signal`,9,1),s=this.emas.get(n);if(!s||r<a||!this.canResume(e,n,r))return null;let c=s.fast[r-1],l=s.slow[r-1],u=n.series[r-1]?.signal;if(c===void 0||l===void 0||u===void 0)return null;let d=2/(i+1),f=2/(a+1),p=2/(o+1);for(let t=r;t<e.length;t++){let r=e[t].close;c=(r-c)*d+c,l=(r-l)*f+l,s.fast[t]=c,s.slow[t]=l;let i=c-l;u=(i-u)*p+u,this.writePoint(n,e,t,{macd:i,signal:u,histogram:i-u})}return n}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&(t.macd!==void 0&&(t.macd<l&&(l=t.macd),t.macd>u&&(u=t.macd)),t.signal!==void 0&&(t.signal<l&&(l=t.signal),t.signal>u&&(u=t.signal)),t.histogram!==void 0&&(t.histogram<l&&(l=t.histogram),t.histogram>u&&(u=t.histogram)))}if(l===1/0)return;let d=u-l||1,f=e=>o.y+o.height*(1-(e-l)/d),p=f(0),m=n.barWidth/2,h=r.colors[2]??`#26A69A`,g=r.colors[3]??`#EF5350`,_=r.colors[0],v=r.colors[1]??`#FF9800`;e.beginPath();let y=new Path2D,b=new Path2D,x=!1,S=!1,C=new Path2D,w=new Path2D;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(!t)continue;let r=a(e,n);if(t.histogram!==void 0){let e=f(t.histogram),i=Math.min(e,p),a=Math.max(Math.abs(e-p),1);t.histogram>=0?y.rect(r-m,i,n.barWidth,a):b.rect(r-m,i,n.barWidth,a)}if(t.macd!==void 0){let e=f(t.macd);x?C.lineTo(r,e):(C.moveTo(r,e),x=!0)}if(t.signal!==void 0){let e=f(t.signal);S?w.lineTo(r,e):(w.moveTo(r,e),S=!0)}}e.fillStyle=h,e.fill(y),e.fillStyle=g,e.fill(b),e.strokeStyle=_,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`,e.stroke(C),e.strokeStyle=v,e.stroke(w)}},pt=class extends j{descriptor={id:`stochastic`,name:`Stochastic Oscillator`,placement:`panel`,defaultConfig:{kPeriod:14,dPeriod:3,smooth:3}};calculate(e,t){let n=P(t,`kPeriod`,14,1),r=P(t,`dPeriod`,3,1),i=P(t,`smooth`,3,1),a=new M,o=Array(e.length).fill(null);if(e.length<n)return{values:a,series:o};let s=[];for(let t=0;t<e.length;t++){if(t<n-1){s.push(0);continue}let r=-1/0,i=1/0;for(let a=t-n+1;a<=t;a++)e[a].high>r&&(r=e[a].high),e[a].low<i&&(i=e[a].low);s.push(r===i?50:(e[t].close-i)/(r-i)*100)}let c=[];for(let e=0;e<s.length;e++){if(e<n-1+i-1){c.push(0);continue}let t=0;for(let n=e-i+1;n<=e;n++)t+=s[n];c.push(t/i)}let l=n-1+i-1;for(let t=l;t<c.length;t++){let n={k:c[t]};if(t>=l+r-1){let e=0;for(let n=t-r+1;n<=t;n++)e+=c[n];n.d=e/r}a.set(e[t].time,n),o[t]=n}return{values:a,series:o}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=P(t,`kPeriod`,14,1),a=P(t,`dPeriod`,3,1),o=P(t,`smooth`,3,1),s=i-1+o-1,c=t=>{let n=-1/0,r=1/0;for(let a=t-i+1;a<=t;a++)e[a].high>n&&(n=e[a].high),e[a].low<r&&(r=e[a].low);return n===r?50:(e[t].close-r)/(n-r)*100},l=e=>{let t=0;for(let n=e-o+1;n<=e;n++)t+=c(n);return t/o};for(let t=r;t<e.length;t++){if(t<s||e.length<i){this.writePoint(n,e,t,null);continue}let r={k:l(t)};if(t>=s+a-1){let e=0;for(let n=t-a+1;n<=t;n++)e+=l(n);r.d=e/a}this.writePoint(n,e,t,r)}return n}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[20,80]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]);let u=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0)continue;let s=a(r,n),c=l(o[t]);u?e.lineTo(s,c):(e.moveTo(s,c),u=!0)}e.stroke()};u(`k`,r.colors[0]),u(`d`,r.colors[1]??`#FF9800`)}},mt=class extends j{descriptor={id:`atr`,name:`Average True Range`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new M,i=Array(e.length).fill(null);if(e.length<Math.max(2,n))return{values:r,series:i};let a=[e[0].high-e[0].low];for(let t=1;t<e.length;t++){let n=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close));a.push(n)}let o=0;for(let e=0;e<n;e++)o+=a[e];o/=n;let s={value:o};r.set(e[n-1].time,s),i[n-1]=s;for(let t=n;t<e.length;t++){o=(o*(n-1)+a[t])/n;let s={value:o};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}update(e,t,n,r){let i=P(t,`period`,14,1);if(r<i||!this.canResume(e,n,r))return null;let a=n.series[r-1]?.value;if(a===void 0)return null;for(let t=r;t<e.length;t++){let r=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close));a=(a*(i-1)+r)/i,this.writePoint(n,e,t,{value:a})}return n}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d-f,m=e=>o.y+o.height*(1-(e-f)/p);e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let h=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=m(r.value);h?e.lineTo(i,o):(e.moveTo(i,o),h=!0)}}e.stroke()}},ht=class extends j{descriptor={id:`adx`,name:`Average Directional Index`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new M,i=Array(e.length).fill(null);if(e.length<n*2)return{values:r,series:i};let a=[],o=[],s=[];for(let t=1;t<e.length;t++){let n=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close));a.push(n);let r=e[t].high-e[t-1].high,i=e[t-1].low-e[t].low;o.push(r>i&&r>0?r:0),s.push(i>r&&i>0?i:0)}let c=0,l=0,u=0;for(let e=0;e<n;e++)c+=a[e],l+=o[e],u+=s[e];let d=[];for(let t=n;t<a.length;t++){t>n&&(c=c-c/n+a[t],l=l-l/n+o[t],u=u-u/n+s[t]);let f=c===0?0:l/c*100,p=c===0?0:u/c*100,m=f+p,h=m===0?0:Math.abs(f-p)/m*100;d.push(h);let g=t+1,_={plusDI:f,minusDI:p,dx:h};r.set(e[g].time,_),i[g]=_}if(d.length>=n){let t=0;for(let e=0;e<n;e++)t+=d[e];t/=n;let a=n*2;if(a<e.length){let n=r.get(e[a].time);n&&(n.adx=t),i[a]&&(i[a].adx=t)}for(let a=n;a<d.length;a++){t=(t*(n-1)+d[a])/n;let o=a+n+1;if(o<e.length){let n=r.get(e[o].time);n&&(n.adx=t),i[o]&&(i[o].adx=t)}}}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100),u=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0)continue;let s=a(r,n),c=l(o[t]);u?e.lineTo(s,c):(e.moveTo(s,c),u=!0)}e.stroke()};u(`adx`,r.colors[0]),u(`plusDI`,r.colors[1]??`#26A69A`),u(`minusDI`,r.colors[2]??`#EF5350`)}},gt=class extends j{descriptor={id:`obv`,name:`On Balance Volume`,placement:`panel`,defaultConfig:{}};calculate(e,t){let n=new M,r=Array(e.length).fill(null);if(e.length===0)return{values:n,series:r};let i=0,a={value:i};n.set(e[0].time,a),r[0]=a;for(let t=1;t<e.length;t++){e[t].close>e[t-1].close?i+=e[t].volume:e[t].close<e[t-1].close&&(i-=e[t].volume);let a={value:i};n.set(e[t].time,a),r[t]=a}return{values:n,series:r}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=n.series[r-1]?.value;if(i===void 0)return null;for(let t=r;t<e.length;t++)e[t].close>e[t-1].close?i+=e[t].volume:e[t].close<e[t-1].close&&(i-=e[t].volume),this.writePoint(n,e,t,{value:i});return n}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d-f,m=e=>o.y+o.height*(1-(e-f)/p);e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let h=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=m(r.value);h?e.lineTo(i,o):(e.moveTo(i,o),h=!0)}}e.stroke()}},_t=class extends j{descriptor={id:`williamsR`,name:`Williams %R`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new M,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=-1/0,o=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>a&&(a=e[r].high),e[r].low<o&&(o=e[r].low);let s={value:a===o?-50:(a-e[t].close)/(a-o)*-100};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-(e+100)/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[-20,-80]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=l(r.value);u?e.lineTo(i,o):(e.moveTo(i,o),u=!0)}}e.stroke()}},vt=class extends j{descriptor={id:`cci`,name:`Commodity Channel Index`,placement:`panel`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new M,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=0;for(let r=t-n+1;r<=t;r++)a+=(e[r].high+e[r].low+e[r].close)/3;let o=a/n,s=0;for(let r=t-n+1;r<=t;r++){let t=(e[r].high+e[r].low+e[r].close)/3;s+=Math.abs(t-o)}let c=s/n,l=(e[t].high+e[t].low+e[t].close)/3,u={value:c===0?0:(l-o)/(.015*c)};r.set(e[t].time,u),i[t]=u}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d,m=p-f,h=e=>o.y+o.height*(1-(e-f)/m);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[-100,0,100])if(t>=f&&t<=p){let n=h(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let g=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=h(r.value);g?e.lineTo(i,o):(e.moveTo(i,o),g=!0)}}e.stroke()}},yt=class extends j{descriptor={id:`mfi`,name:`Money Flow Index`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new M,i=Array(e.length).fill(null);if(e.length<n+1)return{values:r,series:i};let a=e.map(e=>(e.high+e.low+e.close)/3),o=a.map((t,n)=>t*e[n].volume);for(let t=n;t<e.length;t++){let s=0,c=0;for(let e=t-n+1;e<=t;e++)a[e]>a[e-1]?s+=o[e]:a[e]<a[e-1]&&(c+=o[e]);let l={value:c===0?100:100-100/(1+s/c)};r.set(e[t].time,l),i[t]=l}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[20,80]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=l(r.value);u?e.lineTo(i,o):(e.moveTo(i,o),u=!0)}}e.stroke()}},bt=class extends j{descriptor={id:`aroon`,name:`Aroon`,placement:`panel`,defaultConfig:{period:25}};calculate(e,t){let n=P(t,`period`,25,1),r=new M,i=Array(e.length).fill(null);for(let t=n;t<e.length;t++){let a=0,o=0,s=-1/0,c=1/0;for(let r=0;r<=n;r++){let i=t-n+r;e[i].high>s&&(s=e[i].high,a=r),e[i].low<c&&(c=e[i].low,o=r)}let l={up:a/n*100,down:o/n*100};r.set(e[t].time,l),i[t]=l}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100),u=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0)continue;let s=a(r,n),c=l(o[t]);u?e.lineTo(s,c):(e.moveTo(s,c),u=!0)}e.stroke()};u(`up`,r.colors[0]),u(`down`,r.colors[1]??`#EF5350`)}},xt=class extends j{descriptor={id:`roc`,name:`Rate of Change`,placement:`panel`,defaultConfig:{period:12}};calculate(e,t){let n=P(t,`period`,12,1),r=new M,i=Array(e.length).fill(null);for(let t=n;t<e.length;t++){let a=e[t-n].close,o={value:a===0?0:(e[t].close-a)/a*100};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d,m=p-f,h=e=>o.y+o.height*(1-(e-f)/m);if(0>=f&&0<=p){e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);let t=h(0);e.beginPath(),e.moveTo(o.x,t),e.lineTo(o.x+o.width,t),e.stroke(),e.setLineDash([])}e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let g=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=h(r.value);g?e.lineTo(i,o):(e.moveTo(i,o),g=!0)}}e.stroke()}},St=class extends j{descriptor={id:`tsi`,name:`True Strength Index`,placement:`panel`,defaultConfig:{longPeriod:25,shortPeriod:13,signalPeriod:7}};emaSmooth(e,t){let n=2/(t+1),r=[e[0]];for(let t=1;t<e.length;t++)r.push((e[t]-r[t-1])*n+r[t-1]);return r}calculate(e,t){let n=P(t,`longPeriod`,25,1),r=P(t,`shortPeriod`,13,1),i=P(t,`signalPeriod`,7,1),a=new M,o=Array(e.length).fill(null);if(e.length<2)return{values:a,series:o};let s=[],c=[];for(let t=1;t<e.length;t++){let n=e[t].close-e[t-1].close;s.push(n),c.push(Math.abs(n))}let l=this.emaSmooth(this.emaSmooth(s,n),r),u=this.emaSmooth(this.emaSmooth(c,n),r),d=[];for(let e=0;e<l.length;e++)d.push(u[e]===0?0:l[e]/u[e]*100);let f=this.emaSmooth(d,i);for(let t=0;t<d.length;t++){let n=t+1;if(n<e.length){let r={tsi:d[t],signal:f[t]};a.set(e[n].time,r),o[n]=r}}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&(t.tsi!==void 0&&(l=Math.min(l,t.tsi),u=Math.max(u,t.tsi)),t.signal!==void 0&&(l=Math.min(l,t.signal),u=Math.max(u,t.signal)))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d,m=p-f,h=e=>o.y+o.height*(1-(e-f)/m);0>=f&&0<=p&&(e.strokeStyle=`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,h(0)),e.lineTo(o.x+o.width,h(0)),e.stroke(),e.setLineDash([]));let g=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0)continue;let s=a(r,n),c=h(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};g(`tsi`,r.colors[0]),g(`signal`,r.colors[1]??`#FF9800`)}},Ct=class extends j{descriptor={id:`cmf`,name:`Chaikin Money Flow`,placement:`panel`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new M,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=0,o=0;for(let r=t-n+1;r<=t;r++){let t=e[r].high-e[r].low,n=t===0?0:(e[r].close-e[r].low-(e[r].high-e[r].close))/t;a+=n*e[r].volume,o+=e[r].volume}let s={value:o===0?0:a/o};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d,m=p-f,h=e=>o.y+o.height*(1-(e-f)/m);0>=f&&0<=p&&(e.strokeStyle=`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,h(0)),e.lineTo(o.x+o.width,h(0)),e.stroke(),e.setLineDash([]));let g=n.barWidth/2;for(let t=s;t<=c&&t<i.length;t++){let o=i[t];if(o&&o.value!==void 0){let i=a(t,n),s=h(o.value),c=h(0);e.fillStyle=o.value>=0?r.colors[0]:r.colors[1]??`#EF5350`;let l=Math.min(s,c);e.fillRect(i-g,l,n.barWidth,Math.max(Math.abs(s-c),1))}}}},wt=class extends j{descriptor={id:`voldelta`,name:`Volume Delta`,placement:`panel`,defaultConfig:{mode:0}};calculate(e,t){let n=N(t,`mode`,0)>=1,r=new M,i=Array(e.length).fill(null),a=0;for(let t=0;t<e.length;t++){let o=e[t],s=o.close>=o.open,c=s?o.volume:-o.volume;a+=c;let l={value:n?a:c,up:+!!s};r.set(o.time,l),i[t]=l}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0),f=n.barWidth/2,p=r.colors[0]??`#26A69A`,m=r.colors[1]??`#EF5350`;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=u(r.value),c=Math.min(s,d),l=Math.max(Math.abs(s-d),1);e.fillStyle=r.up?p:m,e.fillRect(o-f,c,n.barWidth,l)}}},Tt=class extends j{descriptor={id:`vortex`,name:`Vortex Indicator`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new M,i=Array(e.length).fill(null);if(e.length<=n)return{values:r,series:i};let a=Array(e.length).fill(0),o=Array(e.length).fill(0),s=Array(e.length).fill(0);for(let t=1;t<e.length;t++){a[t]=Math.abs(e[t].high-e[t-1].low),o[t]=Math.abs(e[t].low-e[t-1].high);let n=e[t].high,r=e[t].low,i=e[t-1].close;s[t]=Math.max(n-r,Math.abs(n-i),Math.abs(r-i))}let c=0,l=0,u=0;for(let t=1;t<e.length;t++)if(c+=a[t],l+=o[t],u+=s[t],t>n&&(c-=a[t-n],l-=o[t-n],u-=s[t-n]),t>=n&&u>0){let n={viPlus:c/u,viMinus:l/u};r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`viPlus`,`viMinus`]){let n=t[e];n!==void 0&&(n<l&&(l=n),n>u&&(u=n))}}if(l===1/0)return;let d=(u-l)*.1||.1;l-=d,u+=d;let f=u-l||1,p=e=>o.y+o.height*(1-(e-l)/f);if(1>=l&&1<=u){e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);let t=p(1);e.beginPath(),e.moveTo(o.x,t),e.lineTo(o.x+o.width,t),e.stroke(),e.setLineDash([])}let m=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0)continue;let s=a(r,n),c=p(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};m(`viPlus`,r.colors[0]??`#26A69A`),m(`viMinus`,r.colors[1]??`#EF5350`)}},Et=class extends j{descriptor={id:`chop`,name:`Choppiness Index`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,2),r=new M,i=Array(e.length).fill(null);if(e.length<=n)return{values:r,series:i};let a=Array(e.length).fill(0);for(let t=1;t<e.length;t++){let n=e[t].high,r=e[t].low,i=e[t-1].close;a[t]=Math.max(n-r,Math.abs(n-i),Math.abs(r-i))}let o=Math.log10(n),s=0;for(let t=1;t<e.length;t++)if(s+=a[t],t>n&&(s-=a[t-n]),t>=n){let a=-1/0,c=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>a&&(a=e[r].high),e[r].low<c&&(c=e[r].low);let l=a-c;if(l>0&&s>0){let n={value:Math.max(0,Math.min(100,100*Math.log10(s/l)/o))};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[38.2,61.8]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}},Dt=class extends j{descriptor={id:`uo`,name:`Ultimate Oscillator`,placement:`panel`,defaultConfig:{fast:7,mid:14,slow:28}};calculate(e,t){let n=P(t,`fast`,7,1),r=P(t,`mid`,14,1),i=P(t,`slow`,28,1),a=new M,o=Array(e.length).fill(null);if(e.length<=i)return{values:a,series:o};let s=Array(e.length).fill(0),c=Array(e.length).fill(0);for(let t=1;t<e.length;t++){let n=e[t-1].close,r=Math.min(e[t].low,n),i=Math.max(e[t].high,n);s[t]=e[t].close-r,c[t]=i-r}let l=(e,t,n)=>{let r=0;for(let i=t-n+1;i<=t;i++)r+=e[i];return r};for(let t=i;t<e.length;t++){let u=Ot(l(s,t,n),l(c,t,n)),d=Ot(l(s,t,r),l(c,t,r)),f=Ot(l(s,t,i),l(c,t,i)),p={value:100*(4*u+2*d+f)/7};a.set(e[t].time,p),o[t]=p}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[30,70]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}};function Ot(e,t){return t===0?0:e/t}var kt=class extends j{descriptor={id:`fi`,name:`Force Index`,placement:`panel`,defaultConfig:{period:13}};calculate(e,t){let n=P(t,`period`,13,1),r=new M,i=Array(e.length).fill(null);if(e.length<2)return{values:r,series:i};let a=2/(n+1),o;for(let t=1;t<e.length;t++){let s=(e[t].close-e[t-1].close)*e[t].volume;if(o=o===void 0?s:s*a+o*(1-a),t>=n){let n={value:o};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let f=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=u(r.value);f?e.lineTo(o,s):(e.moveTo(o,s),f=!0)}e.stroke()}},At=class extends j{descriptor={id:`crsi`,name:`Connors RSI`,placement:`panel`,defaultConfig:{rsiPeriod:3,streakPeriod:2,rankPeriod:100}};calculate(e,t){let n=P(t,`rsiPeriod`,3,1),r=P(t,`streakPeriod`,2,1),i=P(t,`rankPeriod`,100,1),a=new M,o=Array(e.length).fill(null),s=e.length;if(s<2)return{values:a,series:o};let c=e.map(e=>e.close),l=jt(c,n),u=Array(s).fill(0);for(let e=1;e<s;e++)c[e]>c[e-1]?u[e]=u[e-1]>0?u[e-1]+1:1:c[e]<c[e-1]?u[e]=u[e-1]<0?u[e-1]-1:-1:u[e]=0;let d=jt(u,r),f=Array(s).fill(0);for(let e=1;e<s;e++)f[e]=c[e-1]===0?0:(c[e]-c[e-1])/c[e-1]*100;for(let t=0;t<s;t++){if(t<i+1)continue;let n=l[t],r=d[t];if(n===void 0||r===void 0)continue;let s=0;for(let e=t-i;e<t;e++)f[e]<f[t]&&s++;let c=s/i*100,u={value:(n+r+c)/3};a.set(e[t].time,u),o[t]=u}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[10,90]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}};function jt(e,t){let n=e.length,r=Array(n).fill(void 0);if(n<=t)return r;let i=0,a=0;for(let n=1;n<=t;n++){let t=e[n]-e[n-1];t>=0?i+=t:a-=t}i/=t,a/=t,r[t]=a===0?100:100-100/(1+i/a);for(let o=t+1;o<n;o++){let n=e[o]-e[o-1],s=n>0?n:0,c=n<0?-n:0;i=(i*(t-1)+s)/t,a=(a*(t-1)+c)/t,r[o]=a===0?100:100-100/(1+i/a)}return r}var Mt=class extends j{descriptor={id:`coppock`,name:`Coppock Curve`,placement:`panel`,defaultConfig:{longRoc:14,shortRoc:11,wma:10}};calculate(e,t){let n=P(t,`longRoc`,14,1),r=P(t,`shortRoc`,11,1),i=P(t,`wma`,10,1),a=new M,o=Array(e.length).fill(null),s=e.length,c=Math.max(n,r);if(s<=c+i)return{values:a,series:o};let l=e.map(e=>e.close),u=(e,t)=>l[e-t]===0?0:(l[e]-l[e-t])/l[e-t]*100,d=Array(s).fill(void 0);for(let e=c;e<s;e++)d[e]=u(e,n)+u(e,r);let f=i*(i+1)/2;for(let t=c+i-1;t<s;t++){let n=0,r=!0;for(let e=0;e<i;e++){let a=d[t-e];if(a===void 0){r=!1;break}n+=a*(i-e)}if(!r)continue;let s={value:n/f};a.set(e[t].time,s),o[t]=s}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let f=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=u(r.value);f?e.lineTo(o,s):(e.moveTo(o,s),f=!0)}e.stroke()}},Nt=class extends j{descriptor={id:`kst`,name:`Know Sure Thing`,placement:`panel`,defaultConfig:{roc1:10,roc2:15,roc3:20,roc4:30,sma1:10,sma2:10,sma3:10,sma4:15,signal:9}};calculate(e,t){let n=P(t,`roc1`,10,1),r=P(t,`roc2`,15,1),i=P(t,`roc3`,20,1),a=P(t,`roc4`,30,1),o=P(t,`sma1`,10,1),s=P(t,`sma2`,10,1),c=P(t,`sma3`,10,1),l=P(t,`sma4`,15,1),u=P(t,`signal`,9,1),d=new M,f=Array(e.length).fill(null),p=e.length;if(p<2)return{values:d,series:f};let m=e.map(e=>e.close),h=I(F(m,n),o),g=I(F(m,r),s),_=I(F(m,i),c),v=I(F(m,a),l),y=Array(p).fill(void 0);for(let e=0;e<p;e++)h[e]===void 0||g[e]===void 0||_[e]===void 0||v[e]===void 0||(y[e]=h[e]*1+g[e]*2+_[e]*3+v[e]*4);let b=I(y,u);for(let t=0;t<p;t++){if(y[t]===void 0)continue;let n={value:y[t]};b[t]!==void 0&&(n.signal=b[t]),d.set(e[t].time,n),f[t]=n}return{values:d,series:f}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`signal`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};f(`value`,r.colors[0]??`#2962FF`),f(`signal`,r.colors[1]??`#FF9800`)}};function F(e,t){let n=Array(e.length).fill(void 0);for(let r=t;r<e.length;r++)n[r]=e[r-t]===0?0:(e[r]-e[r-t])/e[r-t]*100;return n}function I(e,t){let n=Array(e.length).fill(void 0);for(let r=t-1;r<e.length;r++){let i=0,a=!0;for(let n=r-t+1;n<=r;n++){let t=e[n];if(t===void 0){a=!1;break}i+=t}a&&(n[r]=i/t)}return n}var Pt=class extends j{descriptor={id:`elderray`,name:`Elder Ray`,placement:`panel`,defaultConfig:{period:13}};calculate(e,t){let n=P(t,`period`,13,1),r=new M,i=Array(e.length).fill(null),a=e.length;if(a===0)return{values:r,series:i};let o=2/(n+1),s;for(let t=0;t<a;t++)if(s=s===void 0?e[t].close:e[t].close*o+s*(1-o),t>=n-1){let n={bull:e[t].high-s,bear:e[t].low-s};r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`bull`,`bear`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0),f=n.barWidth/2;e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let p=r.colors[0]??`#26A69A`,m=r.colors[1]??`#EF5350`;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r)continue;let o=a(t,n);if(r.bull!==void 0){let t=u(r.bull);e.fillStyle=p,e.globalAlpha=.8,e.fillRect(o-f,Math.min(t,d),Math.max(1,f),Math.abs(t-d))}if(r.bear!==void 0){let t=u(r.bear);e.fillStyle=m,e.globalAlpha=.8,e.fillRect(o,Math.min(t,d),Math.max(1,f),Math.abs(t-d))}}e.globalAlpha=1}},Ft=class extends j{descriptor={id:`stc`,name:`Schaff Trend Cycle`,placement:`panel`,defaultConfig:{fast:23,slow:50,cycle:10}};calculate(e,t){let n=P(t,`fast`,23,1),r=P(t,`slow`,50,1),i=P(t,`cycle`,10,1),a=new M,o=Array(e.length).fill(null),s=e.length;if(s===0)return{values:a,series:o};let c=e.map(e=>e.close),l=2/(n+1),u=2/(r+1),d=c[0],f=c[0],p=Array(s);for(let e=0;e<s;e++)d=e===0?c[0]:c[e]*l+d*(1-l),f=e===0?c[0]:c[e]*u+f*(1-u),p[e]=d-f;let m=It(It(p,i),i);for(let t=0;t<s;t++){let n=m[t];if(n===void 0)continue;let r={value:Math.max(0,Math.min(100,n))};a.set(e[t].time,r),o[t]=r}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[25,75]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}};function It(e,t){let n=e.length,r=Array(n).fill(void 0),i;for(let a=0;a<n;a++){if(a<t-1)continue;let n=1/0,o=-1/0,s=!0;for(let r=a-t+1;r<=a;r++){let t=e[r];if(t===void 0){s=!1;break}t<n&&(n=t),t>o&&(o=t)}if(!s||e[a]===void 0)continue;let c=o-n>0?(e[a]-n)/(o-n)*100:50;i=i===void 0?c:i+.5*(c-i),r[a]=i}return r}var Lt=class extends j{descriptor={id:`kvo`,name:`Klinger Oscillator`,placement:`panel`,defaultConfig:{fast:34,slow:55,signal:13}};calculate(e,t){let n=P(t,`fast`,34,1),r=P(t,`slow`,55,1),i=P(t,`signal`,13,1),a=new M,o=Array(e.length).fill(null),s=e.length;if(s<2)return{values:a,series:o};let c=2/(n+1),l=2/(r+1),u=2/(i+1),d,f=1,p=0,m=0,h,g,_;for(let t=0;t<s;t++){let n=e[t],i=n.high+n.low+n.close,s=d===void 0||i>d?1:-1,v=n.high-n.low;m=d===void 0?v:s===f?m+v:p+v;let y=m===0?0:n.volume*Math.abs(2*(v/m-1))*s*100;h=h===void 0?y:y*c+h*(1-c),g=g===void 0?y:y*l+g*(1-l);let b=h-g;if(_=_===void 0?b:b*u+_*(1-u),d=i,f=s,p=v,t>=r){let e={value:b,signal:_};a.set(n.time,e),o[t]=e}}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`signal`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};f(`value`,r.colors[0]??`#2962FF`),f(`signal`,r.colors[1]??`#FF9800`)}},Rt=class extends j{descriptor={id:`fisher`,name:`Fisher Transform`,placement:`panel`,defaultConfig:{period:9}};calculate(e,t){let n=P(t,`period`,9,1),r=new M,i=Array(e.length).fill(null),a=e.length;if(a<n)return{values:r,series:i};let o=e.map(e=>(e.high+e.low)/2),s=0,c=0;for(let t=n-1;t<a;t++){let a=-1/0,l=1/0;for(let e=t-n+1;e<=t;e++)o[e]>a&&(a=o[e]),o[e]<l&&(l=o[e]);s=.33*(a-l>0?2*(o[t]-l)/(a-l)-1:0)+.67*s,s=Math.max(-.999,Math.min(.999,s));let u=c;c=.5*Math.log((1+s)/(1-s))+.5*c;let d={value:c,trigger:u};r.set(e[t].time,d),i[t]=d}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`trigger`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};f(`value`,r.colors[0]??`#2962FF`),f(`trigger`,r.colors[1]??`#FF9800`)}},zt=class extends j{descriptor={id:`dpo`,name:`Detrended Price Oscillator`,placement:`panel`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,2),r=Math.floor(n/2)+1,i=new M,a=Array(e.length).fill(null),o=e.length;if(o<n)return{values:i,series:a};let s=0;for(let t=0;t<o;t++)if(s+=e[t].close,t>=n&&(s-=e[t-n].close),t>=n-1&&t-r>=0){let o=s/n,c={value:e[t-r].close-o};i.set(e[t].time,c),a[t]=c}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0),f=n.barWidth/2;e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let p=r.colors[0]??`#26A69A`,m=r.colors[1]??`#EF5350`;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=u(r.value);e.fillStyle=r.value>=0?p:m,e.fillRect(o-f,Math.min(s,d),n.barWidth,Math.max(1,Math.abs(s-d)))}}},Bt=class extends j{descriptor={id:`bop`,name:`Balance of Power`,placement:`panel`,defaultConfig:{smooth:14}};calculate(e,t){let n=P(t,`smooth`,14,1),r=new M,i=Array(e.length).fill(null),a=e.length;if(a===0)return{values:r,series:i};let o=Array(a);for(let t=0;t<a;t++){let n=e[t].high-e[t].low;o[t]=n>0?(e[t].close-e[t].open)/n:0}let s=0;for(let t=0;t<a;t++)if(s+=o[t],t>=n&&(s-=o[t-n]),t>=n-1){let a={value:s/n};r.set(e[t].time,a),i[t]=a}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-(e+1)/2),u=l(0);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,u),e.lineTo(o.x+o.width,u),e.stroke(),e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let d=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(Math.max(-1,Math.min(1,r.value)));d?e.lineTo(o,s):(e.moveTo(o,s),d=!0)}e.stroke()}},Vt=class extends j{descriptor={id:`massindex`,name:`Mass Index`,placement:`panel`,defaultConfig:{ema:9,sum:25}};calculate(e,t){let n=P(t,`ema`,9,1),r=P(t,`sum`,25,1),i=new M,a=Array(e.length).fill(null),o=e.length;if(o<r)return{values:i,series:a};let s=2/(n+1),c,l,u=Array(o).fill(0);for(let t=0;t<o;t++){let n=e[t].high-e[t].low;c=c===void 0?n:n*s+c*(1-s),l=l===void 0?c:c*s+l*(1-s),u[t]=l===0?1:c/l}let d=0;for(let t=0;t<o;t++)if(d+=u[t],t>=r&&(d-=u[t-r]),t>=n+r){let n={value:d};i.set(e[t].time,n),a[t]=n}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&(t<l&&(l=t),t>u&&(u=t))}if(l===1/0)return;l=Math.min(l,26),u=Math.max(u,27.5);let d=u-l||1,f=e=>o.y+o.height*(1-(e-l)/d);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[26.5,27]){let n=f(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let p=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=f(r.value);p?e.lineTo(o,s):(e.moveTo(o,s),p=!0)}e.stroke()}},Ht=class extends j{descriptor={id:`cmo`,name:`Chande Momentum`,placement:`panel`,defaultConfig:{period:9}};calculate(e,t){let n=P(t,`period`,9,1),r=new M,i=Array(e.length).fill(null),a=e.length;if(a<=n)return{values:r,series:i};let o=Array(a).fill(0),s=Array(a).fill(0);for(let t=1;t<a;t++){let n=e[t].close-e[t-1].close;o[t]=n>0?n:0,s[t]=n<0?-n:0}let c=0,l=0;for(let t=1;t<a;t++)if(c+=o[t],l+=s[t],t>n&&(c-=o[t-n],l-=s[t-n]),t>=n){let n=c+l,a={value:n>0?100*(c-l)/n:0};r.set(e[t].time,a),i[t]=a}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-(e+100)/200);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[-50,0,50]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}},Ut=class extends j{descriptor={id:`trix`,name:`TRIX`,placement:`panel`,defaultConfig:{period:15,signal:9}};calculate(e,t){let n=P(t,`period`,15,1),r=P(t,`signal`,9,1),i=new M,a=Array(e.length).fill(null),o=e.length;if(o<2)return{values:i,series:a};let s=L(L(L(e.map(e=>e.close),n),n),n),c=Array(o).fill(0);for(let e=1;e<o;e++)c[e]=s[e-1]===0?0:(s[e]-s[e-1])/s[e-1]*100;let l=L(c,r),u=3*n;for(let t=u;t<o;t++){let n={value:c[t],signal:l[t]};i.set(e[t].time,n),a[t]=n}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`signal`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};f(`value`,r.colors[0]??`#2962FF`),f(`signal`,r.colors[1]??`#FF9800`)}};function L(e,t){let n=2/(t+1),r=Array(e.length).fill(0),i=e[0]??0;r[0]=i;for(let t=1;t<e.length;t++)i=e[t]*n+i*(1-n),r[t]=i;return r}var Wt=class extends j{descriptor={id:`emv`,name:`Ease of Movement`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new M,i=Array(e.length).fill(null),a=e.length;if(a<2)return{values:r,series:i};let o=Array(a).fill(0);for(let t=1;t<a;t++){let n=(e[t].high+e[t].low)/2,r=(e[t-1].high+e[t-1].low)/2,i=e[t].high-e[t].low,a=e[t].volume;o[t]=a>0?(n-r)*i/a:0}let s=0;for(let t=1;t<a;t++)if(s+=o[t],t>n&&(s-=o[t-n]),t>=n){let a={value:s/n};r.set(e[t].time,a),i[t]=a}return{values:r,series:i}}render(e,t,n,r){R(e,t,n,r)}};function R(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let f=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=u(r.value);f?e.lineTo(o,s):(e.moveTo(o,s),f=!0)}e.stroke()}var Gt=class extends j{descriptor={id:`wad`,name:`Williams A/D`,placement:`panel`,defaultConfig:{}};calculate(e,t){let n=new M,r=Array(e.length).fill(null),i=e.length;if(i===0)return{values:n,series:r};let a=0;n.set(e[0].time,{value:0}),r[0]={value:0};for(let t=1;t<i;t++){let i=e[t-1].close,o=e[t].close;o>i?a+=o-Math.min(e[t].low,i):o<i&&(a+=o-Math.max(e[t].high,i));let s={value:a};n.set(e[t].time,s),r[t]=s}return{values:n,series:r}}render(e,t,n,r){Kt(e,t,n,r,a)}};function Kt(e,t,n,r,i){let a=t.series;if(!a)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<a.length;e++){let t=a[e]?.value;t!==void 0&&(t<l&&(l=t),t>u&&(u=t))}if(l===1/0)return;let d=u-l||1,f=e=>o.y+o.height*(1-(e-l)/d);e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let p=!1;for(let t=s;t<=c&&t<a.length;t++){let r=a[t];if(!r||r.value===void 0)continue;let o=i(t,n),s=f(r.value);p?e.lineTo(o,s):(e.moveTo(o,s),p=!0)}e.stroke()}var qt=class extends j{descriptor={id:`pvt`,name:`Price Volume Trend`,placement:`panel`,defaultConfig:{}};calculate(e,t){let n=new M,r=Array(e.length).fill(null),i=e.length;if(i===0)return{values:n,series:r};let a=0;n.set(e[0].time,{value:0}),r[0]={value:0};for(let t=1;t<i;t++){let i=e[t-1].close;i!==0&&(a+=e[t].volume*(e[t].close-i)/i);let o={value:a};n.set(e[t].time,o),r[t]=o}return{values:n,series:r}}render(e,t,n,r){Kt(e,t,n,r,a)}},Jt=class extends j{descriptor={id:`chaikinvol`,name:`Chaikin Volatility`,placement:`panel`,defaultConfig:{ema:10,roc:10}};calculate(e,t){let n=P(t,`ema`,10,1),r=P(t,`roc`,10,1),i=new M,a=Array(e.length).fill(null),o=e.length;if(o<=r)return{values:i,series:a};let s=2/(n+1),c=Array(o),l=e[0].high-e[0].low;c[0]=l;for(let t=1;t<o;t++)l=(e[t].high-e[t].low)*s+l*(1-s),c[t]=l;for(let t=n+r;t<o;t++){let n=c[t-r],o={value:n===0?0:(c[t]-n)/n*100};i.set(e[t].time,o),a[t]=o}return{values:i,series:a}}render(e,t,n,r){R(e,t,n,r)}},Yt=class extends j{descriptor={id:`rvi`,name:`Relative Vigor Index`,placement:`panel`,defaultConfig:{period:10}};calculate(e,t){let n=P(t,`period`,10,1),r=new M,i=Array(e.length).fill(null),a=e.length;if(a<n+3)return{values:r,series:i};let o=Array(a).fill(0),s=Array(a).fill(0);for(let t=0;t<a;t++)o[t]=e[t].close-e[t].open,s[t]=e[t].high-e[t].low;let c=(e,t)=>(e[t]+2*e[t-1]+2*e[t-2]+e[t-3])/6,l=Array(a).fill(void 0),u=Array(a).fill(void 0);for(let e=3;e<a;e++)l[e]=c(o,e),u[e]=c(s,e);let d=Array(a).fill(void 0);for(let e=3+n-1;e<a;e++){let t=0,r=0;for(let i=e-n+1;i<=e;i++)t+=l[i],r+=u[i];d[e]=r===0?0:t/r}for(let t=0;t<a;t++){if(d[t]===void 0)continue;let n={value:d[t]};t>=3&&d[t-3]!==void 0&&(n.signal=(d[t]+2*d[t-1]+2*d[t-2]+d[t-3])/6),r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`signal`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};f(`value`,r.colors[0]??`#2962FF`),f(`signal`,r.colors[1]??`#FF9800`)}},Xt=class extends j{descriptor={id:`stochrsi`,name:`Stochastic RSI`,placement:`panel`,defaultConfig:{rsiPeriod:14,stochPeriod:14,k:3,d:3}};calculate(e,t){let n=P(t,`rsiPeriod`,14,1),r=P(t,`stochPeriod`,14,1),i=P(t,`k`,3,1),a=P(t,`d`,3,1),o=new M,s=Array(e.length).fill(null),c=e.length;if(c<=n+r)return{values:o,series:s};let l=Zt(e.map(e=>e.close),n),u=Array(c).fill(void 0);for(let e=0;e<c;e++){if(l[e]===void 0)continue;let t=1/0,n=-1/0,i=!0;for(let a=e-r+1;a<=e;a++){if(a<0||l[a]===void 0){i=!1;break}l[a]<t&&(t=l[a]),l[a]>n&&(n=l[a])}i&&(u[e]=n-t>0?(l[e]-t)/(n-t)*100:0)}let d=Qt(u,i),f=Qt(d,a);for(let t=0;t<c;t++){if(d[t]===void 0)continue;let n={k:d[t]};f[t]!==void 0&&(n.d=f[t]),o.set(e[t].time,n),s[t]=n}return{values:o,series:s}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[20,80]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]);let u=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){u=!1;continue}let s=a(r,n),c=l(o[t]);u?e.lineTo(s,c):(e.moveTo(s,c),u=!0)}e.stroke()};u(`k`,r.colors[0]??`#2962FF`),u(`d`,r.colors[1]??`#FF9800`)}};function Zt(e,t){let n=e.length,r=Array(n).fill(void 0);if(n<=t)return r;let i=0,a=0;for(let n=1;n<=t;n++){let t=e[n]-e[n-1];t>=0?i+=t:a-=t}i/=t,a/=t,r[t]=a===0?100:100-100/(1+i/a);for(let o=t+1;o<n;o++){let n=e[o]-e[o-1];i=(i*(t-1)+(n>0?n:0))/t,a=(a*(t-1)+(n<0?-n:0))/t,r[o]=a===0?100:100-100/(1+i/a)}return r}function Qt(e,t){let n=Array(e.length).fill(void 0);for(let r=t-1;r<e.length;r++){let i=0,a=!0;for(let n=r-t+1;n<=r;n++){if(e[n]===void 0){a=!1;break}i+=e[n]}a&&(n[r]=i/t)}return n}var $t=class extends j{descriptor={id:`ppo`,name:`Percentage Price Oscillator`,placement:`panel`,defaultConfig:{fast:12,slow:26,signal:9}};calculate(e,t){let n=P(t,`fast`,12,1),r=P(t,`slow`,26,1),i=P(t,`signal`,9,1),a=new M,o=Array(e.length).fill(null),s=e.length;if(s<=r)return{values:a,series:o};let c=e.map(e=>e.close),l=en(c,n),u=en(c,r),d=Array(s).fill(void 0);for(let e=0;e<s;e++)l[e]===void 0||u[e]===void 0||u[e]===0||(d[e]=(l[e]-u[e])/u[e]*100);let f=en(d,i);for(let t=0;t<s;t++){if(d[t]===void 0)continue;let n={value:d[t]};f[t]!==void 0&&(n.signal=f[t],n.hist=d[t]-f[t]),a.set(e[t].time,n),o[t]=n}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`signal`,`hist`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0),f=Math.max(1,o.width/(c-s+1)*.6);for(let t=s;t<=c&&t<i.length;t++){let r=i[t]?.hist;if(r===void 0)continue;let o=a(t,n),s=u(r);e.fillStyle=r>=0?`rgba(38,166,154,0.5)`:`rgba(239,83,80,0.5)`;let c=Math.min(s,d);e.fillRect(o-f/2,c,f,Math.max(1,Math.abs(s-d)))}e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let p=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};p(`value`,r.colors[0]??`#2962FF`),p(`signal`,r.colors[1]??`#FF9800`)}};function en(e,t){let n=e.length,r=Array(n).fill(void 0),i=2/(t+1),a,o=0,s=0;for(let c=0;c<n;c++){let n=e[c];n!==void 0&&(a===void 0?(o+=n,s++,s===t&&(a=o/t,r[c]=a)):(a=n*i+a*(1-i),r[c]=a))}return r}var tn=class extends j{descriptor={id:`ac`,name:`Accelerator Oscillator`,placement:`panel`,defaultConfig:{}};calculate(e){let t=new M,n=Array(e.length).fill(null),r=e.length;if(r<38)return{values:t,series:n};let i=e.map(e=>(e.high+e.low)/2),a=Array(r).fill(void 0);for(let e=33;e<r;e++)a[e]=nn(i,e,5)-nn(i,e,34);for(let i=37;i<r;i++){let r=0;for(let e=i-4;e<=i;e++)r+=a[e];let o={value:a[i]-r/5};t.set(e[i].time,o),n[i]=o}return{values:t,series:n}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=Math.max(1,o.width/(c-s+1)*.6),p;for(let t=s;t<=c&&t<i.length;t++){let r=i[t]?.value;if(r===void 0){p=void 0;continue}let o=a(t,n),s=u(r);e.fillStyle=(p===void 0?r>=0:r>=p)?`rgba(38,166,154,0.85)`:`rgba(239,83,80,0.85)`;let c=Math.min(s,d);e.fillRect(o-f/2,c,f,Math.max(1,Math.abs(s-d))),p=r}}};function nn(e,t,n){let r=0;for(let i=t-n+1;i<=t;i++)r+=e[i];return r/n}var rn=class extends j{descriptor={id:`rmi`,name:`Relative Momentum Index`,placement:`panel`,defaultConfig:{period:20,momentum:5}};calculate(e,t){let n=P(t,`period`,20,1),r=P(t,`momentum`,5,1),i=new M,a=Array(e.length).fill(null),o=e.length;if(o<=n+r)return{values:i,series:a};let s=e.map(e=>e.close),c=Array(o).fill(0),l=Array(o).fill(0);for(let e=r;e<o;e++){let t=s[e]-s[e-r];c[e]=t>0?t:0,l[e]=t<0?-t:0}let u=0,d=0,f=r+n;for(let e=r+1;e<=f;e++)u+=c[e],d+=l[e];u/=n,d/=n;let p=t=>{let n={value:d===0?100:100-100/(1+u/d)};i.set(e[t].time,n),a[t]=n};p(f);for(let e=f+1;e<o;e++)u=(u*(n-1)+c[e])/n,d=(d*(n-1)+l[e])/n,p(e);return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[30,70]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0]??`#2962FF`,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0){u=!1;continue}let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}},an=class extends j{descriptor={id:`disparity`,name:`Disparity Index`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new M,i=Array(e.length).fill(null),a=e.length;if(a<n)return{values:r,series:i};let o=0;for(let t=0;t<a;t++)if(o+=e[t].close,t>=n&&(o-=e[t-n].close),t>=n-1){let a=o/n,s={value:a===0?0:(e[t].close-a)/a*100};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}render(e,t,n,r){R(e,t,n,r)}},on=class extends j{descriptor={id:`qstick`,name:`Qstick`,placement:`panel`,defaultConfig:{period:8}};calculate(e,t){let n=P(t,`period`,8,1),r=new M,i=Array(e.length).fill(null),a=e.length;if(a<n)return{values:r,series:i};let o=0;for(let t=0;t<a;t++){let a=e[t].close-e[t].open;if(o+=a,t>=n&&(o-=e[t-n].close-e[t-n].open),t>=n-1){let a={value:o/n};r.set(e[t].time,a),i[t]=a}}return{values:r,series:i}}render(e,t,n,r){R(e,t,n,r)}},sn=class extends j{descriptor={id:`pgo`,name:`Pretty Good Oscillator`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new M,i=Array(e.length).fill(null),a=e.length;if(a<=n)return{values:r,series:i};let o=Array(a).fill(0);for(let t=0;t<a;t++){if(t===0){o[t]=e[t].high-e[t].low;continue}let n=e[t-1].close;o[t]=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-n),Math.abs(e[t].low-n))}let s=Array(a).fill(void 0),c=0;for(let e=1;e<=n;e++)c+=o[e];s[n]=c/n;for(let e=n+1;e<a;e++)s[e]=(s[e-1]*(n-1)+o[e])/n;let l=0;for(let t=0;t<a;t++)if(l+=e[t].close,t>=n&&(l-=e[t-n].close),t>=n&&s[t]!==void 0&&s[t]>0){let a=l/n,o={value:(e[t].close-a)/s[t]};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=3;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}let u=e=>o.y+o.height*(1-(e+l)/(2*l));e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[-3,0,3]){let n=u(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0]??`#2962FF`,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let d=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0){d=!1;continue}let o=a(t,n),s=u(r.value);d?e.lineTo(o,s):(e.moveTo(o,s),d=!0)}e.stroke()}},cn=class extends j{descriptor={id:`stddev`,name:`Standard Deviation`,placement:`panel`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new M,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=0;for(let r=t-n+1;r<=t;r++)a+=e[r].close;let o=a/n,s=0;for(let r=t-n+1;r<=t;r++){let t=e[r].close-o;s+=t*t}let c={value:Math.sqrt(s/n)};r.set(e[t].time,c),i[t]=c}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d-f,m=e=>o.y+o.height*(1-(e-f)/p);e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let h=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=m(r.value);h?e.lineTo(i,o):(e.moveTo(i,o),h=!0)}}e.stroke()}},ln=class extends j{descriptor={id:`volumeProfile`,name:`Volume Profile`,placement:`panel`,defaultConfig:{rows:24}};calculate(e,t){let n=P(t,`rows`,24,1),r=new M,i=Array(e.length).fill(null);if(e.length===0)return{values:r,series:i};let a=1/0,o=-1/0;for(let t of e)t.low<a&&(a=t.low),t.high>o&&(o=t.high);let s=(o-a||1)/n,c=Array(n).fill(0);for(let t of e){let e=(t.high+t.low+t.close)/3,r=Math.min(n-1,Math.floor((e-a)/s));c[r]+=t.volume}for(let e=0;e<n;e++){let t=a+(e+.5)*s;r.set(e,{price:t,volume:c[e],rowIndex:e})}return{values:r,series:i,meta:{minPrice:a,maxPrice:o,rows:n,rowHeight:s,bins:c,maxVolume:Math.max(...c)}}}render(e,t,n,r){let{chartRect:i}=n,a=t.meta;if(!a||a.maxVolume===0)return;let{minPrice:o,rows:s,rowHeight:c,bins:l,maxVolume:u}=a,d=i.height/s,f=i.width*.3;for(let t=0;t<s;t++){let a=(o+(t+.5)*c-n.priceRange.min)/(n.priceRange.max-n.priceRange.min),s=i.y+i.height*(1-a),p=l[t]/u*f;e.fillStyle=l[t]>u*.7?r.colors[1]??`rgba(255, 152, 0, 0.5)`:r.colors[0]??`rgba(33, 150, 243, 0.3)`,e.fillRect(i.x,s-d/2,p,Math.max(d-1,1))}}},un=class extends j{descriptor={id:`ad`,name:`Accumulation/Distribution`,placement:`panel`,defaultConfig:{}};calculate(e,t){let n=new M,r=Array(e.length).fill(null);if(e.length===0)return{values:n,series:r};let i=0;for(let t=0;t<e.length;t++){let a=e[t].high-e[t].low,o=a===0?0:(e[t].close-e[t].low-(e[t].high-e[t].close))/a;i+=o*e[t].volume;let s={value:i};n.set(e[t].time,s),r[t]=s}return{values:n,series:r}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d-f,m=e=>o.y+o.height*(1-(e-f)/p);e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let h=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=m(r.value);h?e.lineTo(i,o):(e.moveTo(i,o),h=!0)}}e.stroke()}},dn=class extends j{descriptor={id:`vroc`,name:`Volume Rate of Change`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new M,i=Array(e.length).fill(null);for(let t=n;t<e.length;t++){let a=e[t-n].volume,o={value:a===0?0:(e[t].volume-a)/a*100};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d,m=p-f,h=e=>o.y+o.height*(1-(e-f)/m);0>=f&&0<=p&&(e.strokeStyle=`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,h(0)),e.lineTo(o.x+o.width,h(0)),e.stroke(),e.setLineDash([])),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let g=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=h(r.value);g?e.lineTo(i,o):(e.moveTo(i,o),g=!0)}}e.stroke()}};function fn(e){e.register(new Pe),e.register(new Fe),e.register(new Ie),e.register(new Le),e.register(new Re),e.register(new ze),e.register(new Be),e.register(new Ve),e.register(new He),e.register(new We),e.register(new Ge),e.register(new Ke),e.register(new qe),e.register(new Je),e.register(new Ze),e.register(new Qe),e.register(new $e),e.register(new et),e.register(new nt),e.register(new rt),e.register(new it),e.register(new ct),e.register(new dt),e.register(new ft),e.register(new pt),e.register(new mt),e.register(new ht),e.register(new gt),e.register(new _t),e.register(new vt),e.register(new yt),e.register(new bt),e.register(new xt),e.register(new St),e.register(new Ct),e.register(new cn),e.register(new ln),e.register(new un),e.register(new dn),e.register(new lt),e.register(new ut),e.register(new wt),e.register(new Tt),e.register(new Et),e.register(new Dt),e.register(new kt),e.register(new At),e.register(new Mt),e.register(new Nt),e.register(new Pt),e.register(new Ft),e.register(new Lt),e.register(new Rt),e.register(new zt),e.register(new Bt),e.register(new Vt),e.register(new Ht),e.register(new Ut),e.register(new Wt),e.register(new qt),e.register(new Gt),e.register(new Jt),e.register(new Yt),e.register(new Xt),e.register(new $t),e.register(new tn),e.register(new rn),e.register(new an),e.register(new on),e.register(new sn)}function pn(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.requestId==`number`?t.type===`result`||t.type===`pong`||t.type===`error`:!1}var mn=class{worker;fallbackPlugins;timeoutMs;nextRequestId=1;pending=new Map;messageHandler;constructor(e,t={}){this.worker=e,this.fallbackPlugins=t.fallbackPlugins??new Map,this.timeoutMs=t.timeoutMs??3e4,this.messageHandler=e=>this.handleMessage(e),this.worker&&(this.worker.addEventListener(`message`,this.messageHandler),this.worker.addEventListener(`error`,this.messageHandler))}hasWorker(){return this.worker!==null}registerFallbackPlugin(e){this.fallbackPlugins.set(e.descriptor.id,e)}async calculate(e,t,n){if(!this.worker){let r=this.fallbackPlugins.get(e);if(!r)throw Error(`Unknown indicator: ${e}`);return r.calculate(n,t)}let r=this.nextRequestId++,i={type:`calculate`,requestId:r,indicatorId:e,config:t,data:n};return new Promise((t,n)=>{let a={resolve:t,reject:n,timer:null};this.timeoutMs>0&&(a.timer=setTimeout(()=>{this.pending.delete(r),n(Error(`Indicator worker timeout (${this.timeoutMs}ms): ${e}`))},this.timeoutMs)),this.pending.set(r,a),this.worker.postMessage(i)})}ping(){if(!this.worker)return Promise.resolve();let e=this.nextRequestId++;return new Promise((t,n)=>{let r={resolve:()=>t(),reject:n,timer:this.timeoutMs>0?setTimeout(()=>{this.pending.delete(e),n(Error(`Indicator worker ping timeout`))},this.timeoutMs):null};this.pending.set(e,r),this.worker.postMessage({type:`ping`,requestId:e})})}terminate(){this.worker&&=(this.worker.removeEventListener(`message`,this.messageHandler),this.worker.removeEventListener(`error`,this.messageHandler),this.worker.terminate(),null);for(let e of this.pending.values())e.timer&&clearTimeout(e.timer),e.reject(Error(`Indicator worker terminated`));this.pending.clear()}handleMessage(e){let t=e.data;if(t!==void 0){if(!pn(t))return;this.dispatchResponse(t);return}let n=e.message??`Indicator worker error`;for(let[e,t]of this.pending)t.timer&&clearTimeout(t.timer),t.reject(Error(n)),this.pending.delete(e)}dispatchResponse(e){let t=this.pending.get(e.requestId);if(t){if(this.pending.delete(e.requestId),t.timer&&clearTimeout(t.timer),e.type===`error`){t.reject(Error(e.message));return}if(e.type===`pong`){t.resolve(void 0);return}t.resolve(e.output)}}},hn=class{visible=!0;setVisible(e){this.visible=e}isVisible(){return this.visible}render(t,n,r){if(!this.visible)return;let{chartRect:i,priceRange:a}=n;t.strokeStyle=r.grid,t.lineWidth=1;let o=a.max-a.min;if(o<=0)return;let s=1/o;t.beginPath();let c=(0,e.computeTickStep)(a.min,a.max,8),l=Math.ceil(a.min/c)*c;for(let e=l;e<=a.max;e+=c){let n=Math.round(i.y+i.height*(1-(e-a.min)*s))+.5;t.moveTo(i.x,n),t.lineTo(i.x+i.width,n)}let u=n.barWidth+n.barSpacing,d=Math.max(1,Math.ceil(80/u)),{from:f,to:p}=n.visibleRange,m=-n.offset+i.x+n.barWidth/2;for(let e=f;e<=p;e++){if(e%d!==0)continue;let n=Math.round(e*u+m)+.5;t.moveTo(n,i.y),t.lineTo(n,i.y+i.height)}t.stroke()}},gn=class{locale=`en-US`;setLocale(e){this.locale=e}render(t,n,r){let{chartRect:i,priceRange:a}=n,o=i.x+i.width,s=a.max-a.min;if(s<=0)return;let c=1/s;t.strokeStyle=r.axisLine,t.lineWidth=1,t.globalAlpha=.65,t.beginPath(),t.moveTo(o+.5,i.y),t.lineTo(o+.5,i.y+i.height),t.stroke(),t.globalAlpha=1;let l=(0,e.computeTickStep)(a.min,a.max,8),u=Math.ceil(a.min/l)*l,d=(0,e.autoPricePrecision)(a.min,a.max),f=`500 ${r.font.sizeSmall}px ${r.font.family}`,p=n.scaleMode??(n.logScale?`logarithmic`:`regular`),m=n.scaleBaseline,h=[];for(let t=u;t<=a.max;t+=l){let n=i.y+i.height*(1-(t-a.min)*c);h.push({y:n,text:(0,e.formatPriceScaleLabel)(t,p,m,d,this.locale)})}t.font=f,t.textBaseline=`middle`,t.textAlign=`left`,t.strokeStyle=r.axisLine,t.globalAlpha=.45,t.beginPath();for(let{y:e}of h)t.moveTo(o+1,e+.5),t.lineTo(o+4,e+.5);t.stroke(),t.globalAlpha=1,t.fillStyle=r.axisLabel;for(let{y:e,text:n}of h)t.fillText(n,o+8,e)}},_n=e=>e<10?`0`+e:``+e,vn=class{tzOffsetMinutes=null;setTimezoneOffset(e){this.tzOffsetMinutes=e}render(t,n,r,i,a){let{chartRect:o}=n,s=a??o.y+o.height;t.strokeStyle=r.axisLine,t.lineWidth=1,t.globalAlpha=.65,t.beginPath(),t.moveTo(o.x,s+.5),t.lineTo(o.x+o.width,s+.5),t.stroke(),t.globalAlpha=1;let c=n.barWidth+n.barSpacing,l=Math.max(1,Math.ceil(80/c)),{from:u,to:d}=n.visibleRange,f=-n.offset+o.x+n.barWidth/2;t.font=`500 ${r.font.sizeSmall}px ${r.font.family}`,t.textBaseline=`top`,t.textAlign=`center`,t.fillStyle=r.axisLabel;let p=-1;for(let n=u;n<=d&&n<i.length;n++){if(n%l!==0)continue;let r=n*c+f,a=i[n].time,o=(0,e.timeParts)(a>0xe8d4a51000?a:a*1e3,this.tzOffsetMinutes),{year:u,day:d,month:m,hours:h,minutes:g}=o,_;(0,e.isDateOnly)(o)?_=`${m}/${d}/${u}`:d===p?_=`${_n(h)}:${_n(g)}`:(_=`${m}/${d}`,p=d),t.fillText(_,r,s+7)}let m=o.x+o.width-4,h=s+7;t.font=`500 ${r.font.sizeSmall-1}px ${r.font.family}`,t.textAlign=`right`,t.textBaseline=`top`,t.globalAlpha=.75,t.fillStyle=r.textSecondary,t.fillText((0,e.tzLabel)(this.tzOffsetMinutes),m,h),t.globalAlpha=1}},yn=class{panHandler=null;zoomHandler=null;crosshairHandler=null;axisDragHandler=null;alertDragHandler=null;axisViewportGetter=null;onAxisDoubleClick=null;measureHandlers=null;measuring=!1;onAltClick=null;onEscape=null;onConfirm=null;onClick=null;downPos=null;downMoved=!1;pressForClick=!1;drawingManager=null;tradingManager=null;paneResizeHandler=null;viewportGetter=null;onOverlayDirty=null;boundHandlers=[];lastTouchDist=0;lastTouchMid={x:0,y:0};touchActive=!1;touchStartPos={x:0,y:0};longPressTimer=null;longPressMs=500;longPressMaxMove=8;cachedRect=null;constructor(e){this.element=e}setOverlayDirtyCallback(e){this.onOverlayDirty=e}setPanHandler(e){this.panHandler=e}setZoomHandler(e){this.zoomHandler=e}setCrosshairHandler(e){this.crosshairHandler=e}setAltClickHandler(e){this.onAltClick=e}setEscapeHandler(e){this.onEscape=e}setConfirmHandler(e){this.onConfirm=e}setClickHandler(e){this.onClick=e}setMeasureHandlers(e){this.measureHandlers=e}setAxisDragHandler(e,t,n){this.axisDragHandler=e,this.axisViewportGetter=t,this.onAxisDoubleClick=n??null}setDrawingManager(e,t){this.drawingManager=e,this.viewportGetter=t}setAlertDragHandler(e){this.alertDragHandler=e}setTradingManager(e,t){this.tradingManager=e,this.viewportGetter=t}setPaneResizeHandler(e){this.paneResizeHandler=e}attach(){let e=()=>this.viewportGetter?.()??null,t=e=>{let t=this.axisViewportGetter?.();if(!t)return null;let n=t.chartRect;return e.y>n.y+n.height?`time`:e.x>n.x+n.width?`price`:null},n=n=>{this.invalidateRect();let r=this.getMousePos(n),i=e();this.downPos=r,this.downMoved=!1,this.pressForClick=!1;let a=t(r);if(a&&this.axisDragHandler){this.axisDragHandler.begin(a,r);return}if(!this.paneResizeHandler?.tryBegin(r)){if(n.shiftKey&&this.measureHandlers){this.measuring=!0,this.measureHandlers.begin(r),this.onOverlayDirty?.();return}if(n.altKey&&this.onAltClick){this.onAltClick(r);return}if(!(this.tradingManager&&i&&this.tradingManager.onPointerDown(r,i))&&!(this.drawingManager&&i&&this.drawingManager.onPointerDown(r,i))){if(this.alertDragHandler?.tryBegin(r)){this.onOverlayDirty?.();return}this.pressForClick=!0,this.panHandler?.onPointerDown(r)}}},r=n=>{let r=this.getMousePos(n),i=e();if(this.downPos&&!this.downMoved){let e=r.x-this.downPos.x,t=r.y-this.downPos.y;e*e+t*t>16&&(this.downMoved=!0)}if(this.axisDragHandler?.isActive()){this.axisDragHandler.move(r);return}if(this.paneResizeHandler?.isActive()){this.paneResizeHandler.move(r);return}if(this.alertDragHandler?.isActive()){this.alertDragHandler.move(r),this.onOverlayDirty?.();return}if(this.measuring&&this.measureHandlers){this.measureHandlers.move(r),this.onOverlayDirty?.();return}let a=t(r),o=this.paneResizeHandler?.cursorAt(r)??null;if(a===`price`?this.element.style.cursor=`ns-resize`:a===`time`?this.element.style.cursor=`ew-resize`:this.alertDragHandler?.isOverAlert(r)?this.element.style.cursor=`ns-resize`:o?this.element.style.cursor=o:(this.element.style.cursor===`ns-resize`||this.element.style.cursor===`ew-resize`)&&(this.element.style.cursor=``),this.tradingManager&&i&&this.tradingManager.onPointerMove(r,i)){this.crosshairHandler?.onPointerMove(r),this.onOverlayDirty?.();return}if(this.drawingManager&&i&&this.drawingManager.onPointerMove(r,i)){this.crosshairHandler?.onPointerMove(r),this.onOverlayDirty?.();return}this.panHandler?.onPointerMove(r),this.crosshairHandler?.onPointerMove(r),this.onOverlayDirty?.()},i=()=>{if(this.axisDragHandler?.isActive()){this.axisDragHandler.end();return}if(this.paneResizeHandler?.isActive()){this.paneResizeHandler.end();return}if(this.alertDragHandler?.isActive()){this.alertDragHandler.end(),this.onOverlayDirty?.();return}if(this.measuring&&this.measureHandlers){this.measuring=!1,this.measureHandlers.end(),this.onOverlayDirty?.();return}this.tradingManager?.onPointerUp()||this.drawingManager?.onPointerUp()||(this.panHandler?.onPointerUp(),this.pressForClick&&!this.downMoved&&this.downPos&&this.onClick&&this.onClick(this.downPos),this.pressForClick=!1,this.downPos=null)},a=e=>{let n=t(this.getMousePos(e));n&&this.onAxisDoubleClick&&this.onAxisDoubleClick(n)},o=()=>{this.panHandler?.onPointerUp(),this.drawingManager?.onPointerUp(),this.tradingManager?.onPointerUp(),this.alertDragHandler?.end(),this.paneResizeHandler?.end(),this.crosshairHandler?.onPointerLeave(),this.pressForClick=!1,this.downPos=null,this.onOverlayDirty?.()},s=e=>{e.preventDefault();let t=this.getMousePos(e);this.zoomHandler?.onWheel(e.deltaY,t)},c=e=>{if(e.key===`Escape`&&this.onEscape&&this.onEscape(),e.key===`Enter`&&this.onConfirm&&this.onConfirm()){e.preventDefault();return}this.drawingManager?.onKeyDown(e.key,e.ctrlKey||e.metaKey)&&e.preventDefault()},l=t=>{let n=e();!this.tradingManager||!n||this.tradingManager.onContextMenu(this.getMousePos(t),n)&&t.preventDefault()},u=n=>{if(n.preventDefault(),this.invalidateRect(),n.touches.length===1){let r=this.getTouchPos(n.touches[0]);this.touchStartPos=r;let i=t(r);if(i&&this.axisDragHandler){this.axisDragHandler.begin(i,r),this.touchActive=!0;return}if(this.paneResizeHandler?.tryBegin(r)){this.touchActive=!0;return}let a=e();if(this.tradingManager&&a&&this.tradingManager.onPointerDown(r,a)){this.touchActive=!0,this.onOverlayDirty?.();return}this.onAltClick&&(this.clearLongPress(),this.longPressTimer=setTimeout(()=>{this.longPressTimer=null,this.onAltClick?.(r),this.panHandler?.onPointerUp(),this.onOverlayDirty?.()},this.longPressMs)),this.panHandler?.onPointerDown(r),this.crosshairHandler?.onPointerMove(r),this.touchActive=!0}else n.touches.length===2&&(this.clearLongPress(),this.panHandler?.onPointerUp(),this.lastTouchDist=this.getTouchDistance(n.touches[0],n.touches[1]),this.lastTouchMid=this.getTouchMidpoint(n.touches[0],n.touches[1]),this.touchActive=!0)},d=t=>{if(t.preventDefault(),t.touches.length===1&&this.touchActive){let n=this.getTouchPos(t.touches[0]);if(this.longPressTimer){let e=n.x-this.touchStartPos.x,t=n.y-this.touchStartPos.y;Math.hypot(e,t)>this.longPressMaxMove&&this.clearLongPress()}if(this.axisDragHandler?.isActive()){this.axisDragHandler.move(n),this.onOverlayDirty?.();return}if(this.paneResizeHandler?.isActive()){this.paneResizeHandler.move(n),this.onOverlayDirty?.();return}let r=e();if(this.tradingManager&&r&&this.tradingManager.onPointerMove(n,r)){this.onOverlayDirty?.();return}this.panHandler?.onPointerMove(n),this.crosshairHandler?.onPointerMove(n)}else if(t.touches.length===2){let e=this.getTouchDistance(t.touches[0],t.touches[1]),n=this.getTouchMidpoint(t.touches[0],t.touches[1]);if(this.lastTouchDist>0){let t=(e/this.lastTouchDist-1)*.5;this.zoomHandler?.onWheel(-t*100,n)}let r=this.lastTouchMid.x-n.x;Math.abs(r)>1&&(this.panHandler?.onPointerDown(this.lastTouchMid),this.panHandler?.onPointerMove({x:n.x,y:this.lastTouchMid.y})),this.lastTouchDist=e,this.lastTouchMid=n}this.onOverlayDirty?.()},f=e=>{if(this.clearLongPress(),e.touches.length===0)this.axisDragHandler?.isActive()&&this.axisDragHandler.end(),this.paneResizeHandler?.end(),this.tradingManager?.onPointerUp(),this.panHandler?.onPointerUp(),this.crosshairHandler?.onPointerLeave(),this.touchActive=!1,this.lastTouchDist=0;else if(e.touches.length===1){let t=this.getTouchPos(e.touches[0]);this.panHandler?.onPointerDown(t)}},p=()=>this.invalidateRect(),m=()=>this.invalidateRect();this.element.addEventListener(`mousedown`,n),this.element.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i),this.element.addEventListener(`mouseleave`,o),this.element.addEventListener(`dblclick`,a),this.element.addEventListener(`wheel`,s,{passive:!1}),this.element.addEventListener(`contextmenu`,l),this.element.addEventListener(`touchstart`,u,{passive:!1}),this.element.addEventListener(`touchmove`,d,{passive:!1}),this.element.addEventListener(`touchend`,f),document.addEventListener(`keydown`,c),window.addEventListener(`resize`,p),this.element.addEventListener(`scroll`,m,{passive:!0}),this.boundHandlers.push(()=>this.element.removeEventListener(`mousedown`,n),()=>this.element.removeEventListener(`mousemove`,r),()=>document.removeEventListener(`mouseup`,i),()=>this.element.removeEventListener(`mouseleave`,o),()=>this.element.removeEventListener(`dblclick`,a),()=>this.element.removeEventListener(`wheel`,s),()=>this.element.removeEventListener(`contextmenu`,l),()=>this.element.removeEventListener(`touchstart`,u),()=>this.element.removeEventListener(`touchmove`,d),()=>this.element.removeEventListener(`touchend`,f),()=>document.removeEventListener(`keydown`,c),()=>window.removeEventListener(`resize`,p),()=>this.element.removeEventListener(`scroll`,m))}detach(){for(let e of this.boundHandlers)e();this.boundHandlers=[],this.cachedRect=null,this.clearLongPress()}clearLongPress(){this.longPressTimer&&=(clearTimeout(this.longPressTimer),null)}invalidateRect(){this.cachedRect=null}getRect(){return this.cachedRect||=this.element.getBoundingClientRect(),this.cachedRect}getMousePos(e){let t=this.getRect();return{x:e.clientX-t.left,y:e.clientY-t.top}}getTouchPos(e){let t=this.getRect();return{x:e.clientX-t.left,y:e.clientY-t.top}}getTouchDistance(e,t){return Math.hypot(t.clientX-e.clientX,t.clientY-e.clientY)}getTouchMidpoint(e,t){let n=this.getRect();return{x:(e.clientX+t.clientX)/2-n.left,y:(e.clientY+t.clientY)/2-n.top}}},bn=class{dragging=!1;lastX=0;lastY=0;lastTime=0;velocityX=0;velocityY=0;momentumId=0;callback;onStart;friction=.92;constructor(e,t){this.callback=e,this.onStart=t}onPointerDown(e){this.dragging=!0,this.lastX=e.x,this.lastY=e.y,this.lastTime=Date.now(),this.velocityX=0,this.velocityY=0,this.stopMomentum(),this.onStart?.()}onPointerMove(e){if(!this.dragging)return;let t=Date.now(),n=this.lastX-e.x,r=this.lastY-e.y,i=t-this.lastTime;i>0&&(this.velocityX=n/i,this.velocityY=r/i),this.lastX=e.x,this.lastY=e.y,this.lastTime=t,this.callback(n,r)}onPointerUp(){this.dragging&&(this.dragging=!1,Math.hypot(this.velocityX,this.velocityY)>.1&&this.startMomentum())}startMomentum(){this.stopMomentum();let e=this.velocityX*16,t=this.velocityY*16,n=()=>{if(e*=this.friction,t*=this.friction,Math.hypot(e,t)<.5){this.momentumId=0;return}this.callback(e,t),this.momentumId=requestAnimationFrame(n)};this.momentumId=requestAnimationFrame(n)}stopMomentum(){this.momentumId&&=(cancelAnimationFrame(this.momentumId),0)}},xn=class{callback;sensitivity;pendingDelta=0;pendingCenterX=0;rafId=0;constructor(e,t=.001){this.callback=e,this.sensitivity=t}onWheel(e,t){this.pendingDelta+=-e*this.sensitivity,this.pendingCenterX=t.x,this.rafId||=requestAnimationFrame(()=>{this.rafId=0;let e=this.pendingDelta,t=this.pendingCenterX;this.pendingDelta=0,this.callback(e,t)})}dispose(){this.rafId&&=(cancelAnimationFrame(this.rafId),0)}},Sn=class{dragging=!1;axis=null;startPos={x:0,y:0};lastPos={x:0,y:0};moved=!1;threshold=3;sensitivity=.005;constructor(e,t){this.onPriceScale=e,this.onTimeScale=t}begin(e,t){this.dragging=!0,this.axis=e,this.startPos=t,this.lastPos=t,this.moved=!1}move(e){if(!this.dragging||!this.axis)return!1;let t=e.x-this.startPos.x,n=e.y-this.startPos.y;if(!this.moved&&Math.hypot(t,n)<this.threshold)return!1;if(this.moved=!0,this.axis===`price`){let t=e.y-this.lastPos.y,n=Math.exp(t*this.sensitivity);this.onPriceScale(n)}else{let t=e.x-this.lastPos.x,n=Math.exp(t*this.sensitivity);this.onTimeScale(n)}return this.lastPos=e,!0}end(){let e=this.dragging&&this.moved;return this.dragging=!1,this.axis=null,this.moved=!1,e}isActive(){return this.dragging}},Cn=class{draggingId=null;constructor(e,t){this.alerts=e,this.viewportGetter=t}isOverAlert(e){let t=this.viewportGetter();return t?this.alerts.getAlertAtPoint(e,t)!==null:!1}tryBegin(e){let t=this.viewportGetter();if(!t)return!1;let n=this.alerts.getAlertAtPoint(e,t);return n?(this.draggingId=n.id,!0):!1}move(e){if(this.draggingId===null)return;let t=this.viewportGetter();t&&this.alerts.updateAlertPrice(this.draggingId,c(e.y,t))}end(){this.draggingId=null}isActive(){return this.draggingId!==null}},wn=class{state=null;layoutGetter=null;onResize=null;constructor(e=4){this.tolerance=e}configure(e,t){this.layoutGetter=e,this.onResize=t}hitTest(e,t){for(let n of t.dividers)if(Tn(e,n.rect,this.tolerance)){let e=t.panels.find(e=>e.config.id===n.panelId);if(e)return{panelId:n.panelId,orientation:n.orientation,position:e.config.position,size:e.config.size}}return null}cursorAt(e){let t=this.layoutGetter?.();if(!t)return null;let n=this.hitTest(e,t);return n?n.orientation===`horizontal`?`ns-resize`:`ew-resize`:null}tryBegin(e){let t=this.layoutGetter?.();if(!t)return!1;let n=this.hitTest(e,t);return n?(this.state={panelId:n.panelId,position:n.position,startSize:n.size,startPos:e},!0):!1}move(e){let t=this.computeSize(e);t&&this.onResize?.(t.panelId,t.size)}computeSize(e){let t=this.state;if(!t)return null;let n=0;switch(t.position){case`bottom`:n=t.startPos.y-e.y;break;case`top`:n=e.y-t.startPos.y;break;case`left`:n=e.x-t.startPos.x;break;case`right`:n=t.startPos.x-e.x;break}return{panelId:t.panelId,size:t.startSize+n}}end(){this.state=null}isActive(){return this.state!==null}};function Tn(e,t,n){return e.x>=t.x-n&&e.x<=t.x+t.width+n&&e.y>=t.y-n&&e.y<=t.y+t.height+n}var En=class{position=null;callback=null;data=[];tzOffsetMinutes=null;setTimezoneOffset(e){this.tzOffsetMinutes=e}magnetMode=!0;mode=`magnet`;pricePrecision=null;locale=`en-US`;pendingBarIndex=null;pendingPoint=null;callbackScheduled=!1;lastCallbackBarIndex=-1;setCallback(e){this.callback=e}setData(e){this.data=e}setMagnetMode(e){this.magnetMode=e,this.mode=e?`magnet`:`normal`}setMode(e){this.mode=e,this.magnetMode=e===`magnet`}getMode(){return this.mode}setPricePrecision(e){this.pricePrecision=e}setLocale(e){this.locale=e}getPosition(){return this.position}onPointerMove(e){this.position=e}onPointerLeave(){this.position=null,this.pendingBarIndex=null,this.pendingPoint=null,this.lastCallbackBarIndex=-1,this.flushCallback(null,null)}render(e,t,n){if(!this.position||this.mode===`hidden`)return;let{chartRect:r}=t,{x:i,y:o}=this.position;if(i<r.x||i>r.x+r.width||o<r.y||o>r.y+r.height)return;let c=s(i,t);if(c=Math.max(0,Math.min(this.data.length-1,c)),this.magnetMode&&c>=0&&c<this.data.length&&(i=a(c,t)),c!==this.lastCallbackBarIndex&&(this.pendingBarIndex=c,this.pendingPoint={x:i,y:o},this.lastCallbackBarIndex=c,this.scheduleCallback()),this.magnetMode&&c>=0&&c<this.data.length){let a=t.barWidth+t.barSpacing,o=a/2;e.fillStyle=n.crosshair,e.globalAlpha=.08,e.fillRect(i-o,r.y,a,r.height),e.globalAlpha=1}e.setLineDash([4,4]),e.strokeStyle=n.crosshair,e.lineWidth=1,e.beginPath(),e.moveTo(Math.round(i)+.5,r.y),e.lineTo(Math.round(i)+.5,r.y+r.height),e.stroke(),e.beginPath(),e.moveTo(r.x,Math.round(o)+.5),e.lineTo(r.x+r.width,Math.round(o)+.5),e.stroke(),e.setLineDash([])}renderAxisLabels(t,n,r,i,o){if(!this.position||this.mode===`hidden`)return;let{chartRect:l}=n,{x:u,y:d}=this.position;if(u<l.x||u>l.x+l.width||d<l.y||d>l.y+l.height)return;let f=s(u,n);f=Math.max(0,Math.min(i.length-1,f)),this.magnetMode&&f>=0&&f<i.length&&(u=a(f,n));let p=`600 ${r.font.sizeSmall}px ${r.font.family}`;if(Dn(t,{text:(0,e.formatPrice)(c(d,n),this.pricePrecision??(0,e.autoPricePrecision)(n.priceRange.min,n.priceRange.max),this.locale),anchorX:l.x+l.width,anchorY:d,orientation:`right`,bg:r.text,fg:r.background,font:p}),f>=0&&f<i.length){let e=On(i[f].time,this.tzOffsetMinutes),n=o??l.y+l.height;Dn(t,{text:e,anchorX:u,anchorY:n,orientation:`bottom`,bg:r.text,fg:r.background,font:p})}}scheduleCallback(){this.callbackScheduled||(this.callbackScheduled=!0,queueMicrotask(()=>{this.callbackScheduled=!1,this.flushCallback(this.pendingBarIndex,this.pendingPoint)}))}flushCallback(e,t){this.callback?.(e,t)}};function Dn(e,t){e.save(),e.font=t.font;let n=Math.ceil(e.measureText(t.text).width)+16;if(t.orientation===`right`){let r=t.anchorX+5,i=t.anchorY-20/2;e.beginPath(),e.moveTo(t.anchorX,t.anchorY),e.lineTo(r,t.anchorY-5),e.lineTo(r,i),e.lineTo(r+n,i),e.lineTo(r+n,i+20),e.lineTo(r,i+20),e.lineTo(r,t.anchorY+5),e.closePath(),e.fillStyle=t.bg,e.fill(),e.fillStyle=t.fg,e.textBaseline=`middle`,e.textAlign=`left`,e.fillText(t.text,r+8,t.anchorY)}else{let r=t.anchorX-n/2,i=t.anchorY+5;e.beginPath(),e.moveTo(t.anchorX,t.anchorY),e.lineTo(t.anchorX+5,i),e.lineTo(r+n,i),e.lineTo(r+n,i+20),e.lineTo(r,i+20),e.lineTo(r,i),e.lineTo(t.anchorX-5,i),e.closePath(),e.fillStyle=t.bg,e.fill(),e.fillStyle=t.fg,e.textBaseline=`middle`,e.textAlign=`center`,e.fillText(t.text,t.anchorX,i+20/2)}e.restore()}function On(t,n){let r=(0,e.timeParts)(t>0xe8d4a51000?t:t*1e3,n),{year:i,month:a,day:o,hours:s,minutes:c}=r;return(0,e.isDateOnly)(r)?`${a}/${o}/${i}`:`${a}/${o} ${s<10?`0`+s:s}:${c<10?`0`+c:c}`}var kn=class{callbacks;enabled=!0;constructor(e){this.callbacks=e}setEnabled(e){this.enabled=e}handleKey(e){if(!this.enabled)return!1;let t=e.shiftKey?10:1;switch(e.key){case`ArrowLeft`:return this.callbacks.scrollBars(-t),!0;case`ArrowRight`:return this.callbacks.scrollBars(t),!0;case`ArrowUp`:case`+`:case`=`:return this.callbacks.zoom(.1),!0;case`ArrowDown`:case`-`:return this.callbacks.zoom(-.1),!0;case`Home`:return this.callbacks.goToStart(),!0;case`End`:return this.callbacks.goToEnd(),!0;case` `:return this.callbacks.fitContent(),!0;default:return!1}}},An=class{el=null;visible=!1;timeEl;openEl;highEl;lowEl;closeEl;changeEl;volEl;measuredWidth=155;measuredHeight=95;measured=!1;create(e){if(this.el)return;this.el=document.createElement(`div`),Object.assign(this.el.style,{position:`absolute`,display:`none`,padding:`6px 10px`,borderRadius:`4px`,fontSize:`11px`,fontFamily:`-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif`,lineHeight:`1.5`,pointerEvents:`none`,zIndex:`100`,whiteSpace:`nowrap`,willChange:`transform`}),this.timeEl=this.addLine(this.el);let t=this.addLine(this.el),n=this.addLine(this.el);this.changeEl=this.addLine(this.el),this.volEl=this.addLine(this.el),t.append(this.label(`O `),this.openEl=this.val(),this.label(` H `),this.highEl=this.val()),n.append(this.label(`L `),this.lowEl=this.val(),this.label(` C `),this.closeEl=this.val()),e.appendChild(this.el)}show(e,t,n,r){if(!this.el)return;let i=t.close>=t.open?n.candleUp:n.candleDown,a=e=>e.toFixed(2),o=new Date(t.time);this.timeEl.textContent=`${o.getMonth()+1}/${o.getDate()} ${String(o.getHours()).padStart(2,`0`)}:${String(o.getMinutes()).padStart(2,`0`)}`,this.timeEl.style.color=n.textSecondary,this.openEl.textContent=a(t.open),this.highEl.textContent=a(t.high),this.lowEl.textContent=a(t.low),this.closeEl.textContent=a(t.close),this.openEl.style.color=i,this.highEl.style.color=i,this.lowEl.style.color=i,this.closeEl.style.color=i;let s=t.close-t.open,c=t.open===0?0:s/t.open*100,l=s>=0?`+`:``;this.changeEl.textContent=`${l}${a(s)} (${l}${c.toFixed(2)}%)`,this.changeEl.style.color=i;let u=t.volume;this.volEl.textContent=`Vol ${u>=1e6?(u/1e6).toFixed(1)+`M`:u>=1e3?(u/1e3).toFixed(1)+`K`:u.toFixed(0)}`,this.volEl.style.color=n.textSecondary;let d=jn(n.background);this.el.style.background=d?Mn(n.background,.95):Mn(n.background,.97),this.el.style.border=`1px solid ${n.axisLine}`,this.el.style.boxShadow=d?`0 4px 12px rgba(0,0,0,0.5)`:`0 4px 12px rgba(0,0,0,0.15)`,this.el.style.color=n.text,this.el.style.backdropFilter=`blur(8px)`,!this.measured&&this.visible&&(this.measuredWidth=this.el.offsetWidth,this.measuredHeight=this.el.offsetHeight,this.measured=!0);let f=e.x+16,p=e.y-40;f+this.measuredWidth>r.width-80&&(f=e.x-this.measuredWidth-16),p<4&&(p=4),p+this.measuredHeight>r.height&&(p=r.height-this.measuredHeight-4),this.el.style.transform=`translate(${Math.round(f)}px, ${Math.round(p)}px)`,this.el.style.left=`0`,this.el.style.top=`0`,this.visible||=(this.el.style.display=`block`,!0)}hide(){this.el&&this.visible&&(this.el.style.display=`none`,this.visible=!1)}isVisible(){return this.visible}destroy(){this.el?.remove(),this.el=null,this.visible=!1,this.measured=!1}addLine(e){let t=document.createElement(`div`);return e.appendChild(t),t}label(e){let t=document.createElement(`span`);return t.textContent=e,t.style.opacity=`0.6`,t}val(){return document.createElement(`span`)}};function jn(e){if(e.startsWith(`#`)){let t=e.slice(1),n=t.length===3?t.split(``).map(e=>e+e).join(``):t.slice(0,6),r=parseInt(n.slice(0,2),16),i=parseInt(n.slice(2,4),16),a=parseInt(n.slice(4,6),16);return(.299*r+.587*i+.114*a)/255<.5}let t=e.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);if(t){let e=parseInt(t[1]),n=parseInt(t[2]),r=parseInt(t[3]);return(.299*e+.587*n+.114*r)/255<.5}return!0}function Mn(e,t){if(e.startsWith(`#`)){let n=e.slice(1),r=n.length===3?n.split(``).map(e=>e+e).join(``):n.slice(0,6);return`rgba(${parseInt(r.slice(0,2),16)}, ${parseInt(r.slice(2,4),16)}, ${parseInt(r.slice(4,6),16)}, ${t})`}return e}var Nn=class{el=null;deltaEl=null;timeEl=null;ohlcEl=null;pinnedBar=null;pinnedIndex=-1;create(e){if(this.el)return;this.el=document.createElement(`div`),Object.assign(this.el.style,{position:`absolute`,display:`none`,padding:`6px 10px`,borderRadius:`4px`,fontSize:`11px`,fontFamily:`-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif`,lineHeight:`1.5`,pointerEvents:`auto`,cursor:`pointer`,zIndex:`99`,whiteSpace:`nowrap`,willChange:`transform`}),this.timeEl=document.createElement(`div`),this.ohlcEl=document.createElement(`div`),this.deltaEl=document.createElement(`div`),this.deltaEl.style.marginTop=`4px`,this.deltaEl.style.paddingTop=`4px`,this.deltaEl.style.borderTop=`1px solid currentColor`,this.deltaEl.style.opacity=`0.85`,this.deltaEl.style.fontVariantNumeric=`tabular-nums`,this.el.appendChild(this.timeEl),this.el.appendChild(this.ohlcEl),this.el.appendChild(this.deltaEl);let t=document.createElement(`div`);t.textContent=`๐Ÿ“Œ pinned`,t.style.fontSize=`9px`,t.style.opacity=`0.6`,t.style.marginBottom=`2px`,t.style.letterSpacing=`0.04em`,t.style.textTransform=`uppercase`,this.el.insertBefore(t,this.timeEl),e.appendChild(this.el)}pin(e,t,n){if(!this.el||!this.timeEl||!this.ohlcEl)return;this.pinnedBar=e,this.pinnedIndex=t;let r=e.close>=e.open?n.candleUp:n.candleDown,i=new Date(e.time>0xe8d4a51000?e.time:e.time*1e3);this.timeEl.textContent=`${i.getMonth()+1}/${i.getDate()} ${Pn(i.getHours())}:${Pn(i.getMinutes())}`,this.timeEl.style.color=n.textSecondary,this.ohlcEl.innerHTML=`
2
- <span style="opacity:.6">O </span><span style="color:${r}">${z(e.open)}</span>
3
- <span style="opacity:.6"> H </span><span style="color:${r}">${z(e.high)}</span>
4
- <span style="opacity:.6"> L </span><span style="color:${r}">${z(e.low)}</span>
5
- <span style="opacity:.6"> C </span><span style="color:${r}">${z(e.close)}</span>
6
- `;let a=Fn(n.background);this.el.style.background=In(n.background,a?.96:.97),this.el.style.border=`1px solid ${r}`,this.el.style.boxShadow=a?`0 4px 12px rgba(0,0,0,0.55)`:`0 4px 12px rgba(0,0,0,0.18)`,this.el.style.color=n.text,this.el.style.backdropFilter=`blur(8px)`,this.el.style.display=`block`}unpin(){this.pinnedBar=null,this.pinnedIndex=-1,this.el&&(this.el.style.display=`none`)}isPinned(){return this.pinnedBar!==null}getPinnedIndex(){return this.pinnedIndex}reposition(e,t,n,r){if(!this.el||!this.pinnedBar)return;let i=a(this.pinnedIndex,e),s=o(this.pinnedBar.close,e),c=e.chartRect,l=i>=c.x-4&&i<=c.x+c.width+4;this.el.style.opacity=l?`1`:`0.35`;let u=Math.max(c.x,Math.min(c.x+c.width-180,i+8)),d=Math.max(c.y,Math.min(c.y+c.height-90,s-64));if(this.el.style.transform=`translate(${Math.round(u)}px, ${Math.round(d)}px)`,this.el.style.left=`0`,this.el.style.top=`0`,this.deltaEl)if(t&&n!==null&&n!==this.pinnedIndex){let e=t.close-this.pinnedBar.close,i=this.pinnedBar.close===0?0:e/this.pinnedBar.close*100,a=e>0?`+`:e<0?`โˆ’`:``,o=n-this.pinnedIndex,s=e>=0?r.candleUp:r.candleDown;this.deltaEl.style.color=s,this.deltaEl.innerHTML=`ฮ” ${a}${z(Math.abs(e))} <span style="opacity:.7">(${a}${Math.abs(i).toFixed(2)}%)</span> ยท ${o>0?`+`:``}${o} bars`,this.deltaEl.style.display=`block`}else this.deltaEl.style.display=`none`}destroy(){this.el?.remove(),this.el=null,this.deltaEl=null,this.timeEl=null,this.ohlcEl=null,this.pinnedBar=null,this.pinnedIndex=-1}};function z(e){return e.toFixed(2)}function Pn(e){return e<10?`0`+e:``+e}function Fn(e){if(e.startsWith(`#`)){let t=e.slice(1),n=t.length===3?t.split(``).map(e=>e+e).join(``):t.slice(0,6),r=parseInt(n.slice(0,2),16),i=parseInt(n.slice(2,4),16),a=parseInt(n.slice(4,6),16);return(.299*r+.587*i+.114*a)/255<.5}return!0}function In(e,t){if(e.startsWith(`#`)){let n=e.slice(1),r=n.length===3?n.split(``).map(e=>e+e).join(``):n.slice(0,6);return`rgba(${parseInt(r.slice(0,2),16)}, ${parseInt(r.slice(2,4),16)}, ${parseInt(r.slice(4,6),16)}, ${t})`}return e}var Ln=class{listeners=new Map;tauriBridge=null;on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}emit(e,t){let n={type:e,timestamp:Date.now(),payload:t},r=this.listeners.get(e);if(r)for(let e of r)e(n);if(this.tauriBridge?.enabled&&window.__TAURI__){let t=this.tauriBridge.eventPrefix??`tc-chart`;window.__TAURI__.event.emit(`${t}:${e}`,n).catch(()=>{})}}enableTauriBridge(e){this.tauriBridge=e}disableTauriBridge(){this.tauriBridge=null}destroy(){this.listeners.clear(),this.tauriBridge=null}},B=class{hitTestAnchor(e,t,n,r){for(let i=0;i<t.anchors.length;i++){let a=this.anchorToPixel(t.anchors[i],n);if(Math.hypot(e.x-a.x,e.y-a.y)<=r)return i}return-1}anchorToPixel(e,t){return{x:d(e.time,t),y:o(e.price,t)}}pixelToAnchor(e,t){return{time:f(e.x,t),price:c(e.y,t)}}applyLineStyle(e,t){switch(e.strokeStyle=t.color,e.lineWidth=t.lineWidth,t.lineStyle){case`dashed`:e.setLineDash([6,4]);break;case`dotted`:e.setLineDash([2,2]);break;default:e.setLineDash([]);break}}resetLineStyle(e){e.setLineDash([])}renderAnchorHandles(e,t,n){e.fillStyle=`#FFFFFF`,e.strokeStyle=t.style.color,e.lineWidth=1;for(let r of t.anchors){let t=this.anchorToPixel(r,n);e.fillRect(t.x-4,t.y-4,8,8),e.strokeRect(t.x-4,t.y-4,8,8)}}distanceToLine(e,t,n){let r=n.x-t.x,i=n.y-t.y,a=r*r+i*i;if(a===0)return Math.hypot(e.x-t.x,e.y-t.y);let o=((e.x-t.x)*r+(e.y-t.y)*i)/a;o=Math.max(0,Math.min(1,o));let s=t.x+o*r,c=t.y+o*i;return Math.hypot(e.x-s,e.y-c)}distanceToInfiniteLine(e,t,n){let r=n.x-t.x,i=n.y-t.y,a=Math.hypot(r,i);return a===0?Math.hypot(e.x-t.x,e.y-t.y):Math.abs(r*(t.y-e.y)-i*(t.x-e.x))/a}},Rn=1;function V(e){return{...e,anchors:e.anchors.map(e=>({...e})),style:{...e.style},meta:e.meta?{...e.meta}:void 0}}var zn=class{registry=new Map;drawings=[];state=`idle`;activeTool=null;activeStyle={color:`#2196F3`,lineWidth:1,lineStyle:`solid`,fillColor:`rgba(33, 150, 243, 0.1)`,fillOpacity:.1,fontSize:12};creatingDrawing=null;committedAnchors=0;previewAnchor=null;selectedDrawingId=null;dragAnchorIndex=-1;dragStartPoint=null;dragStartAnchors=[];dragBeforeState=null;eventCallback=null;requestRender=null;undoRedo=null;magnetMode=`none`;dataGetter=null;displayDataGetter=null;register(e){this.registry.set(e.descriptor.type,e)}setEventCallback(e){this.eventCallback=e}setRequestRender(e){this.requestRender=e}setUndoRedoManager(e){this.undoRedo=e}setMagnetMode(e){this.magnetMode=e}getMagnetMode(){return this.magnetMode}setDataGetter(e){this.dataGetter=e}setDisplayDataGetter(e){this.displayDataGetter=e}snapToOHLC(e,t,n){if(this.magnetMode===`none`||!this.dataGetter)return{time:e,price:t};let r=this.displayDataGetter?.()??this.dataGetter();if(r.length===0)return{time:e,price:t};let i=!!(n?.data&&n.data.length>0),a=Math.max(0,Math.min(r.length-1,Math.round(i?l(e,r):e))),o=r[a],s=[o.open,o.high,o.low,o.close],c=s[0],u=Math.abs(t-c);for(let e=1;e<s.length;e++){let n=Math.abs(t-s[e]);n<u&&(u=n,c=s[e])}if(n){let e=n.chartRect.height/(n.priceRange.max-n.priceRange.min||1);if(u*e>30)return{time:i?o.time:a,price:t}}return{time:i?o.time:a,price:c}}undo(){if(!this.undoRedo)return!1;let e=this.undoRedo.undo();return e?(this.applyUndoAction(e),!0):!1}redo(){if(!this.undoRedo)return!1;let e=this.undoRedo.redo();return e?(this.applyRedoAction(e),!0):!1}applyUndoAction(e){switch(e.type){case`drawingCreate`:e.after&&(this.drawings=this.drawings.filter(t=>t.id!==e.after.id));break;case`drawingRemove`:e.before&&this.drawings.push(e.before);break;case`drawingModify`:if(e.before){let t=this.drawings.findIndex(t=>t.id===e.before.id);t>=0&&(this.drawings[t]=structuredClone(e.before))}break}this.selectedDrawingId=null,this.state=`idle`,this.requestRender?.()}applyRedoAction(e){switch(e.type){case`drawingCreate`:e.after&&this.drawings.push(structuredClone(e.after));break;case`drawingRemove`:e.before&&(this.drawings=this.drawings.filter(t=>t.id!==e.before.id));break;case`drawingModify`:if(e.after){let t=this.drawings.findIndex(t=>t.id===e.after.id);t>=0&&(this.drawings[t]=structuredClone(e.after))}break}this.selectedDrawingId=null,this.state=`idle`,this.requestRender?.()}lockAllDrawings(){for(let e of this.drawings)e.locked=!0;this.requestRender?.()}unlockAllDrawings(){for(let e of this.drawings)e.locked=!1;this.requestRender?.()}hideAllDrawings(){for(let e of this.drawings)e.visible=!1;this.selectedDrawingId=null,this.state=`idle`,this.requestRender?.()}showAllDrawings(){for(let e of this.drawings)e.visible=!0;this.requestRender?.()}setDrawingVisible(e,t){let n=this.drawings.find(t=>t.id===e);return n?(n.visible=t,!t&&this.selectedDrawingId===e&&(this.selectedDrawingId=null),this.requestRender?.(),t):null}setDrawingLocked(e,t){let n=this.drawings.find(t=>t.id===e);return n?(n.locked=t,this.requestRender?.(),t):null}setActiveTool(e){this.activeTool=e,this.state=e?`creating`:`idle`,this.creatingDrawing=null,this.committedAnchors=0,this.previewAnchor=null}getActiveTool(){return this.activeTool}setStyle(e){Object.assign(this.activeStyle,e)}getActiveStyle(){return{...this.activeStyle}}setSelectedDrawingStyle(e,t){let n=t??this.selectedDrawingId;if(!n)return!1;let r=this.drawings.find(e=>e.id===n);if(!r||r.locked)return!1;let i=V(r);return r.style={...r.style,...e},this.undoRedo?.push({type:`drawingModify`,before:i,after:V(r)}),this.requestRender?.(),!0}onPointerDown(e,t){return this.state===`creating`&&this.activeTool?this.handleCreationClick(e,t):this.state===`idle`||this.state===`selected`?this.handleSelectionClick(e,t):!1}onPointerMove(e,t){if(this.state===`creating`&&this.creatingDrawing){let n=this.registry.get(this.creatingDrawing.type);if(n&&this.committedAnchors<n.descriptor.requiredAnchors){let n=f(e.x,t),r=c(e.y,t);return this.previewAnchor=this.snapToOHLC(n,r,t),this.requestRender?.(),!0}}return this.state===`moving`&&this.selectedDrawingId&&this.dragStartPoint?this.handleMove(e,t):this.state===`resizing`&&this.selectedDrawingId&&this.dragAnchorIndex>=0?this.handleResize(e,t):!1}onPointerUp(){if(this.state===`moving`||this.state===`resizing`){if(this.dragBeforeState&&this.selectedDrawingId){let e=this.drawings.find(e=>e.id===this.selectedDrawingId);e&&this.undoRedo?.push({type:`drawingModify`,before:this.dragBeforeState,after:V(e)})}return this.state=`selected`,this.dragStartPoint=null,this.dragStartAnchors=[],this.dragAnchorIndex=-1,this.dragBeforeState=null,!0}return!1}onKeyDown(e,t=!1){if(t&&(e===`d`||e===`D`)&&this.state===`selected`&&this.selectedDrawingId&&this.duplicateDrawing(this.selectedDrawingId)||t&&(e===`z`||e===`Z`)&&this.undo()||t&&(e===`y`||e===`Y`)&&this.redo())return!0;if(e===`Escape`){if(this.state===`creating`)return this.setActiveTool(null),this.requestRender?.(),!0;if(this.state===`selected`)return this.selectedDrawingId=null,this.state=`idle`,this.requestRender?.(),!0}return(e===`Delete`||e===`Backspace`)&&this.state===`selected`&&this.selectedDrawingId?this.drawings.find(e=>e.id===this.selectedDrawingId)?.locked?!1:(this.removeDrawing(this.selectedDrawingId),this.selectedDrawingId=null,this.state=`idle`,this.requestRender?.(),!0):!1}getDrawings(){return this.drawings}setDrawings(e){this.drawings=this.upgradeLegacyAnchors(e),this.requestRender?.()}addDrawing(e){let t=e.id??`tc_drawing_${Rn++}`,n={id:t,type:e.type,anchors:e.anchors.map(e=>({...e})),style:{...this.activeStyle,...e.style},visible:e.visible??!0,locked:e.locked??!1,meta:e.meta};return this.drawings=[...this.drawings,n],this.undoRedo?.push({type:`drawingCreate`,before:null,after:V(n)}),this.eventCallback?.(`drawingCreate`,{id:t,type:n.type}),this.requestRender?.(),t}upgradeLegacyAnchors(e){let t=this.dataGetter?.();return!t||t.length===0?e:e.map(e=>({...e,anchors:e.anchors.map(e=>{if(e.time>=1e9)return e;let n=Math.max(0,Math.min(t.length-1,Math.round(e.time)));return{...e,time:t[n].time}})}))}removeDrawing(e){let t=this.drawings.find(t=>t.id===e);this.drawings=this.drawings.filter(t=>t.id!==e),t&&this.undoRedo?.push({type:`drawingRemove`,before:structuredClone(t),after:null}),this.eventCallback?.(`drawingRemove`,{id:e}),this.requestRender?.()}duplicateDrawing(e){let t=this.drawings.find(t=>t.id===e);if(!t)return null;let n=structuredClone(t);n.id=`tc_drawing_${Rn++}`;let r=this.computeBarOffsetTime(3);return n.anchors=n.anchors.map(e=>({...e,time:e.time+r})),n.locked=!1,this.drawings.push(n),this.undoRedo?.push({type:`drawingCreate`,before:null,after:structuredClone(n)}),this.selectedDrawingId=n.id,this.state=`selected`,this.eventCallback?.(`drawingCreate`,{drawing:n}),this.requestRender?.(),n.id}clearDrawings(){this.drawings=[],this.selectedDrawingId=null,this.state=`idle`,this.requestRender?.()}getSelectedDrawingId(){return this.selectedDrawingId}render(e,t){e.save(),e.beginPath(),e.rect(t.chartRect.x,t.chartRect.y,t.chartRect.width,t.chartRect.height),e.clip();for(let n of this.drawings){if(!n.visible)continue;let r=this.registry.get(n.type);if(!r)continue;let i=n.id===this.selectedDrawingId;r.render(e,n,t,i)}if(this.creatingDrawing&&this.committedAnchors>0){let n=this.registry.get(this.creatingDrawing.type);if(n){let r={...this.creatingDrawing,anchors:this.previewAnchor?[...this.creatingDrawing.anchors,this.previewAnchor]:[...this.creatingDrawing.anchors]};n.render(e,r,t,!1)}}e.restore()}computeBarOffsetTime(e){let t=this.dataGetter?.();if(!t||t.length<2)return e;let n=Math.max(0,t.length-20),r=[];for(let e=n+1;e<t.length;e++)r.push(t[e].time-t[e-1].time);return r.length===0?e:(r.sort((e,t)=>e-t),e*r[Math.floor(r.length/2)])}handleCreationClick(e,t){if(!this.activeTool)return!1;let n=this.registry.get(this.activeTool);if(!n)return!1;let r=f(e.x,t),i=c(e.y,t),a=this.snapToOHLC(r,i,t);return this.creatingDrawing?(this.creatingDrawing.anchors.push(a),this.committedAnchors++,this.previewAnchor=null,this.committedAnchors>=n.descriptor.requiredAnchors&&this.finalizeCreation(),this.requestRender?.(),!0):(this.creatingDrawing={id:`tc_drawing_${Rn++}`,type:this.activeTool,anchors:[a],style:{...this.activeStyle},visible:!0,locked:!1},this.committedAnchors=1,this.previewAnchor=null,n.descriptor.requiredAnchors===1&&this.finalizeCreation(),this.requestRender?.(),!0)}finalizeCreation(){this.creatingDrawing&&(this.drawings.push(this.creatingDrawing),this.selectedDrawingId=this.creatingDrawing.id,this.undoRedo?.push({type:`drawingCreate`,before:null,after:structuredClone(this.creatingDrawing)}),this.eventCallback?.(`drawingCreate`,{drawing:this.creatingDrawing}),this.creatingDrawing=null,this.committedAnchors=0,this.previewAnchor=null,this.activeTool=null,this.state=`selected`)}handleSelectionClick(e,t){if(this.selectedDrawingId){let n=this.drawings.find(e=>e.id===this.selectedDrawingId);if(n&&!n.locked){let r=this.registry.get(n.type);if(r){let i=r.hitTestAnchor(e,n,t,8);if(i>=0)return this.state=`resizing`,this.dragAnchorIndex=i,this.dragStartPoint=e,this.dragBeforeState=V(n),!0;if(r.hitTest(e,n,t,8))return this.state=`moving`,this.dragStartPoint=e,this.dragStartAnchors=n.anchors.map(e=>({...e})),this.dragBeforeState=V(n),!0}}}for(let n=this.drawings.length-1;n>=0;n--){let r=this.drawings[n];if(!r.visible)continue;let i=this.registry.get(r.type);if(i&&i.hitTest(e,r,t,8))return this.selectedDrawingId=r.id,this.state=`selected`,this.requestRender?.(),!0}return this.selectedDrawingId&&(this.selectedDrawingId=null,this.state=`idle`,this.requestRender?.()),!1}handleMove(e,t){let n=this.drawings.find(e=>e.id===this.selectedDrawingId);if(!n||!this.dragStartPoint)return!1;let r=f(e.x,t)-f(this.dragStartPoint.x,t),i=c(e.y,t)-c(this.dragStartPoint.y,t);return n.anchors=this.dragStartAnchors.map(e=>({time:e.time+r,price:e.price+i})),this.requestRender?.(),!0}handleResize(e,t){let n=this.drawings.find(e=>e.id===this.selectedDrawingId);return!n||this.dragAnchorIndex<0?!1:(n.anchors[this.dragAnchorIndex]={time:f(e.x,t),price:c(e.y,t)},this.requestRender?.(),!0)}},Bn=class{constructor(e){this.manager=e}render(e,t){this.manager.render(e,t)}};function Vn(e,t,n){let r=Math.max(0,t),i=Math.min(e.length-1,n);if(i<=r)return null;let a=r,o=r;for(let t=r;t<=i;t++)e[t].high>e[a].high&&(a=t),e[t].low<e[o].low&&(o=t);if(a===o)return null;let s={time:e[a].time,price:e[a].high},c={time:e[o].time,price:e[o].low};return a<o?[s,c]:[c,s]}var Hn=class extends B{descriptor={type:`trendLine`,name:`Trend Line`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return this.distanceToLine(e,i,a)<=r}},Un=class extends B{descriptor={type:`horizontalLine`,name:`Horizontal Line`,requiredAnchors:1};render(e,t,n,r){if(t.anchors.length<1)return;let i=o(t.anchors[0].price,n),{chartRect:a}=n;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(a.x,i),e.lineTo(a.x+a.width,i),e.stroke(),this.resetLineStyle(e),e.fillStyle=t.style.color,e.font=`11px sans-serif`,e.textBaseline=`bottom`,e.fillText(t.anchors[0].price.toFixed(2),a.x+4,i-3),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=o(t.anchors[0].price,n);return Math.abs(e.y-i)<=r&&e.x>=n.chartRect.x&&e.x<=n.chartRect.x+n.chartRect.width}},Wn=class extends B{descriptor={type:`horizontalRay`,name:`Horizontal Ray`,requiredAnchors:1};render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n),a=i.y,{chartRect:o}=n;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,a),e.lineTo(o.x+o.width,a),e.stroke(),this.resetLineStyle(e),e.fillStyle=t.style.color,e.font=`11px sans-serif`,e.textBaseline=`bottom`,e.fillText(t.anchors[0].price.toFixed(2),i.x+4,a-3),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n);return Math.abs(e.y-i.y)<=r&&e.x>=i.x-r&&e.x<=n.chartRect.x+n.chartRect.width}},Gn=class extends B{descriptor={type:`verticalLine`,name:`Vertical Line`,requiredAnchors:1};render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n),{chartRect:a}=n;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,a.y),e.lineTo(i.x,a.y+a.height),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n),{chartRect:a}=n;return Math.abs(e.x-i.x)<=r&&e.y>=a.y&&e.y<=a.y+a.height}},Kn=class extends B{descriptor={type:`ray`,name:`Ray`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),{chartRect:o}=n,s=a.x-i.x,c=a.y-i.y,l=Math.hypot(s,c);if(l===0)return;let u=Math.hypot(o.width,o.height)*2,d=i.x+s/l*u,f=i.y+c/l*u;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(d,f),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=a.x-i.x,s=a.y-i.y;return((e.x-i.x)*o+(e.y-i.y)*s)/(o*o+s*s)<0?!1:this.distanceToInfiniteLine(e,i,a)<=r}},qn=class extends B{descriptor={type:`extendedLine`,name:`Extended Line`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),{chartRect:o}=n,s=a.x-i.x,c=a.y-i.y,l=Math.hypot(s,c);if(l===0)return;let u=Math.hypot(o.width,o.height)*2,d=i.x-s/l*u,f=i.y-c/l*u,p=i.x+s/l*u,m=i.y+c/l*u;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(d,f),e.lineTo(p,m),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return this.distanceToInfiniteLine(e,i,a)<=r}},Jn=class extends B{descriptor={type:`parallelChannel`,name:`Parallel Channel`,requiredAnchors:3};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);if(this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),t.anchors.length>=3){let r=this.anchorToPixel(t.anchors[2],n),o=a.x-i.x,s=a.y-i.y,c=Math.hypot(o,s)||1,l=-s/c,u=o/c,d=(r.x-i.x)*l+(r.y-i.y)*u,f={x:i.x+l*d,y:i.y+u*d},p={x:a.x+l*d,y:a.y+u*d};e.beginPath(),e.moveTo(f.x,f.y),e.lineTo(p.x,p.y),e.stroke(),t.style.fillColor&&(e.fillStyle=t.style.fillColor,e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.lineTo(p.x,p.y),e.lineTo(f.x,f.y),e.closePath(),e.fill())}this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);if(this.distanceToLine(e,i,a)<=r)return!0;if(t.anchors.length>=3){let o=this.anchorToPixel(t.anchors[2],n),s=a.x-i.x,c=a.y-i.y,l=Math.hypot(s,c)||1,u=-c/l,d=s/l,f=(o.x-i.x)*u+(o.y-i.y)*d,p={x:i.x+u*f,y:i.y+d*f},m={x:a.x+u*f,y:a.y+d*f};if(this.distanceToLine(e,p,m)<=r)return!0}return!1}},Yn=class extends B{descriptor={type:`regressionChannel`,name:`Regression Channel`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke();let o=a.x-i.x,s=a.y-i.y,c=Math.hypot(o,s);if(c===0){this.resetLineStyle(e);return}let l=Math.max(10,Math.min(c*.2,100)),u=-s/c*l,d=o/c*l;e.setLineDash([4,4]),e.beginPath(),e.moveTo(i.x+u,i.y+d),e.lineTo(a.x+u,a.y+d),e.stroke(),e.beginPath(),e.moveTo(i.x-u,i.y-d),e.lineTo(a.x-u,a.y-d),e.stroke(),t.style.fillColor&&(e.fillStyle=t.style.fillColor,e.beginPath(),e.moveTo(i.x+u,i.y+d),e.lineTo(a.x+u,a.y+d),e.lineTo(a.x-u,a.y-d),e.lineTo(i.x-u,i.y-d),e.closePath(),e.fill()),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.hypot(a.x-i.x,a.y-i.y),s=Math.max(10,Math.min(o*.2,100));return this.distanceToLine(e,i,a)<=r+s}},H=[0,.236,.382,.5,.618,.786,1],Xn=class extends B{descriptor={type:`fibRetracement`,name:`Fibonacci Retracement`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let{chartRect:i}=n,a=t.anchors[0].price,s=t.anchors[1].price,c=a-s;e.font=`11px sans-serif`,e.textBaseline=`middle`;for(let r of H){let a=s+c*(1-r),l=o(a,n);this.applyLineStyle(e,t.style),e.globalAlpha=r===0||r===1?1:.7,e.beginPath(),e.moveTo(i.x,l),e.lineTo(i.x+i.width,l),e.stroke(),e.fillStyle=t.style.color,e.textAlign=`left`,e.fillText(`${(r*100).toFixed(1)}% (${a.toFixed(2)})`,i.x+4,l-2)}if(e.globalAlpha=1,t.style.fillColor){for(let r=0;r<H.length-1;r++){let a=s+c*(1-H[r]),l=s+c*(1-H[r+1]),u=o(a,n),d=o(l,n);e.fillStyle=t.style.fillColor,e.globalAlpha=.05+r*.02,e.fillRect(i.x,Math.min(u,d),i.width,Math.abs(d-u))}e.globalAlpha=1}this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let{chartRect:i}=n;if(e.x<i.x-r||e.x>i.x+i.width+r)return!1;let a=t.anchors[0].price,s=t.anchors[1].price,c=a-s;for(let t of H){let i=o(s+c*(1-t),n);if(Math.abs(e.y-i)<=r)return!0}return!1}},Zn=[0,.618,1,1.618,2,2.618,3.618,4.236],Qn=class extends B{descriptor={type:`fibExtension`,name:`Fibonacci Extension`,requiredAnchors:3};render(e,t,n,r){if(t.anchors.length<3){if(t.anchors.length===2){let r=this.anchorToPixel(t.anchors[0],n),i=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(r.x,r.y),e.lineTo(i.x,i.y),e.stroke(),this.resetLineStyle(e)}return}let{chartRect:i}=n,a=t.anchors[0].price,s=t.anchors[1].price,c=t.anchors[2].price,l=a-s;e.font=`11px sans-serif`,e.textBaseline=`middle`,e.textAlign=`left`;for(let r of Zn){let a=o(c+l*r,n);this.applyLineStyle(e,t.style),e.globalAlpha=r===0||r===1?1:.6,e.beginPath(),e.moveTo(i.x,a),e.lineTo(i.x+i.width,a),e.stroke(),e.fillStyle=t.style.color,e.fillText(`${(r*100).toFixed(1)}%`,i.x+4,a-2)}e.globalAlpha=1,this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<3)return!1;let{chartRect:i}=n;if(e.x<i.x-r||e.x>i.x+i.width+r)return!1;let a=t.anchors[0].price-t.anchors[1].price;for(let i of Zn){let s=o(t.anchors[2].price+a*i,n);if(Math.abs(e.y-s)<=r)return!0}return!1}},$n=class extends B{descriptor={type:`rectangle`,name:`Rectangle`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.min(i.y,a.y),c=Math.abs(a.x-i.x),l=Math.abs(a.y-i.y);t.style.fillColor&&(e.fillStyle=t.style.fillColor,e.fillRect(o,s,c,l)),this.applyLineStyle(e,t.style),e.strokeRect(o,s,c,l),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x)-r,s=Math.min(i.y,a.y)-r,c=Math.max(i.x,a.x)+r,l=Math.max(i.y,a.y)+r;if(e.x<o||e.x>c||e.y<s||e.y>l)return!1;let u=Math.min(i.x,a.x)+r,d=Math.min(i.y,a.y)+r,f=Math.max(i.x,a.x)-r,p=Math.max(i.y,a.y)-r;return!(e.x>u&&e.x<f&&e.y>d&&e.y<p)||!!t.style.fillColor}},er=class extends B{descriptor={type:`ellipse`,name:`Ellipse`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=(i.x+a.x)/2,s=(i.y+a.y)/2,c=Math.abs(a.x-i.x)/2,l=Math.abs(a.y-i.y)/2;e.beginPath(),e.ellipse(o,s,Math.max(c,1),Math.max(l,1),0,0,Math.PI*2),t.style.fillColor&&(e.fillStyle=t.style.fillColor,e.fill()),this.applyLineStyle(e,t.style),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=(i.x+a.x)/2,s=(i.y+a.y)/2,c=Math.max(Math.abs(a.x-i.x)/2,1),l=Math.max(Math.abs(a.y-i.y)/2,1),u=(e.x-o)/c,d=(e.y-s)/l,f=Math.sqrt(u*u+d*d),p=r/Math.max(Math.min(c,l),4);return t.style.fillColor?f<=1+p:Math.abs(f-1)<=p}},tr=class extends B{descriptor={type:`triangle`,name:`Triangle`,requiredAnchors:3};render(e,t,n,r){if(t.anchors.length<3){if(t.anchors.length===2){let r=this.anchorToPixel(t.anchors[0],n),i=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(r.x,r.y),e.lineTo(i.x,i.y),e.stroke(),this.resetLineStyle(e)}return}let i=t.anchors.map(e=>this.anchorToPixel(e,n));e.beginPath(),e.moveTo(i[0].x,i[0].y),e.lineTo(i[1].x,i[1].y),e.lineTo(i[2].x,i[2].y),e.closePath(),t.style.fillColor&&(e.fillStyle=t.style.fillColor,e.fill()),this.applyLineStyle(e,t.style),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<3)return!1;let i=t.anchors.map(e=>this.anchorToPixel(e,n));for(let t=0;t<3;t++){let n=(t+1)%3;if(this.distanceToLine(e,i[t],i[n])<=r)return!0}return!1}},U=class extends B{descriptor={type:`pitchfork`,name:`Andrews' Pitchfork`,requiredAnchors:3};origin(e,t){return e}render(e,t,n,r){if(t.anchors.length<3){if(t.anchors.length===2){let r=this.anchorToPixel(t.anchors[0],n),i=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(r.x,r.y),e.lineTo(i.x,i.y),e.stroke(),this.resetLineStyle(e)}return}let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=this.anchorToPixel(t.anchors[2],n),s=this.origin(i,a),c={x:(a.x+o.x)/2,y:(a.y+o.y)/2};(s.x!==i.x||s.y!==i.y)&&(e.strokeStyle=t.style.color,e.lineWidth=1,e.setLineDash([3,3]),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(s.x,s.y),e.stroke(),e.setLineDash([]));let l=c.x-s.x,u=c.y-s.y,d=Math.hypot(l,u)||1,f=Math.hypot(n.chartRect.width,n.chartRect.height),p=s.x+l/d*f,m=s.y+u/d*f;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(s.x,s.y),e.lineTo(p,m),e.stroke(),e.beginPath(),e.moveTo(a.x,a.y),e.lineTo(a.x+l/d*f,a.y+u/d*f),e.stroke(),e.beginPath(),e.moveTo(o.x,o.y),e.lineTo(o.x+l/d*f,o.y+u/d*f),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<3)return!1;let i=this.anchorToPixel(t.anchors[1],n),a=this.anchorToPixel(t.anchors[2],n),o=this.origin(this.anchorToPixel(t.anchors[0],n),i),s={x:(i.x+a.x)/2,y:(i.y+a.y)/2};if(this.distanceToInfiniteLine(e,o,s)<=r)return!0;let c=s.x-o.x,l=s.y-o.y,u={x:i.x+c,y:i.y+l},d={x:a.x+c,y:a.y+l};return this.distanceToInfiniteLine(e,i,u)<=r||this.distanceToInfiniteLine(e,a,d)<=r}},nr=class extends U{descriptor={type:`schiffPitchfork`,name:`Schiff Pitchfork`,requiredAnchors:3};origin(e,t){return{x:e.x,y:(e.y+t.y)/2}}},rr=class extends U{descriptor={type:`modifiedSchiffPitchfork`,name:`Modified Schiff Pitchfork`,requiredAnchors:3};origin(e,t){return{x:(e.x+t.x)/2,y:(e.y+t.y)/2}}},ir=[`1`,`2`,`3`,`4`,`5`,`A`,`B`,`C`],ar=class extends B{descriptor={type:`elliottWave`,name:`Elliott Wave`,requiredAnchors:8};render(e,t,n,r){if(t.anchors.length<2)return;let i=t.anchors.map(e=>this.anchorToPixel(e,n));this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i[0].x,i[0].y);for(let t=1;t<i.length;t++)e.lineTo(i[t].x,i[t].y);e.stroke(),this.resetLineStyle(e),e.font=`bold 12px sans-serif`,e.fillStyle=t.style.color,e.textAlign=`center`;for(let t=0;t<i.length&&t<ir.length;t++){let n=t%2==0?-12:12;e.textBaseline=n<0?`bottom`:`top`,e.fillText(ir[t],i[t].x,i[t].y+n)}r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=t.anchors.map(e=>this.anchorToPixel(e,n));for(let t=0;t<i.length-1;t++)if(this.distanceToLine(e,i[t],i[t+1])<=r)return!0;return!1}},or=class extends B{descriptor={type:`priceRange`,name:`Price Range`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.abs(a.x-i.x),c=Math.min(i.y,a.y),l=Math.abs(a.y-i.y),u=t.anchors[1].price>t.anchors[0].price;e.fillStyle=u?`rgba(38, 166, 154, 0.15)`:`rgba(239, 83, 80, 0.15)`,e.fillRect(o,c,s,l),this.applyLineStyle(e,t.style),e.strokeRect(o,c,s,l),this.resetLineStyle(e);let d=t.anchors[1].price-t.anchors[0].price,f=t.anchors[0].price===0?0:d/t.anchors[0].price*100,p=`${d>=0?`+`:``}${d.toFixed(2)} (${f>=0?`+`:``}${f.toFixed(2)}%)`;e.font=`12px sans-serif`,e.fillStyle=u?`#26A69A`:`#EF5350`,e.textAlign=`center`,e.textBaseline=`middle`,e.fillText(p,o+s/2,c+l/2),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.max(i.x,a.x),c=Math.min(i.y,a.y),l=Math.max(i.y,a.y);return e.x>=o-r&&e.x<=s+r&&e.y>=c-r&&e.y<=l+r}},sr=class extends B{descriptor={type:`dateRange`,name:`Date Range`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),{chartRect:o}=n,s=Math.min(i.x,a.x),c=Math.max(i.x,a.x);e.fillStyle=`rgba(33, 150, 243, 0.08)`,e.fillRect(s,o.y,c-s,o.height),this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(s,o.y),e.lineTo(s,o.y+o.height),e.stroke(),e.beginPath(),e.moveTo(c,o.y),e.lineTo(c,o.y+o.height),e.stroke(),this.resetLineStyle(e);let l=u(t.anchors[0].time,n),d=u(t.anchors[1].time,n),f=Math.max(0,Math.round(Math.abs(d-l)));e.font=`12px sans-serif`,e.fillStyle=t.style.color,e.textAlign=`center`,e.textBaseline=`top`,e.fillText(`${f} bars`,(s+c)/2,o.y+4),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),{chartRect:o}=n,s=Math.min(i.x,a.x),c=Math.max(i.x,a.x);return e.x>=s-r&&e.x<=c+r&&e.y>=o.y&&e.y<=o.y+o.height}},cr=class extends B{descriptor={type:`measure`,name:`Measure`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.setLineDash([4,4]),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),this.resetLineStyle(e);let o=t.anchors[1].price-t.anchors[0].price,s=u(t.anchors[0].time,n),c=u(t.anchors[1].time,n),l=Math.max(0,Math.round(Math.abs(c-s))),d=t.anchors[0].price===0?0:o/t.anchors[0].price*100,f=[`Price: ${o>=0?`+`:``}${o.toFixed(2)} (${d>=0?`+`:``}${d.toFixed(2)}%)`,`Bars: ${l}`],p=(i.x+a.x)/2,m=(i.y+a.y)/2;e.font=`11px sans-serif`,e.textAlign=`center`,e.textBaseline=`bottom`;let h=Math.max(...f.map(t=>e.measureText(t).width));e.fillStyle=`rgba(0, 0, 0, 0.7)`,e.fillRect(p-h/2-6,m-f.length*14-4,h+12,f.length*14+8),e.fillStyle=`#FFFFFF`;for(let t=0;t<f.length;t++)e.fillText(f[t],p,m-(f.length-1-t)*14);r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return this.distanceToLine(e,i,a)<=r}};function lr(e,t=`Text`){if(typeof e.style.text==`string`&&e.style.text.length>0)return e.style.text;let n=e.meta?.text;return typeof n==`string`&&n.length>0?n:t}var ur=class extends B{descriptor={type:`text`,name:`Text`,requiredAnchors:1};render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n),a=lr(t),o=t.style.fontSize||14;if(e.font=`${o}px sans-serif`,e.fillStyle=t.style.color,e.textAlign=`left`,e.textBaseline=`top`,r){let n=e.measureText(a);e.strokeStyle=t.style.color,e.lineWidth=1,e.setLineDash([3,3]),e.strokeRect(i.x-2,i.y-2,n.width+4,o+4),e.setLineDash([])}e.fillText(a,i.x,i.y),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=t.style.fontSize||14;return e.x>=i.x-r&&e.x<=i.x+80+r&&e.y>=i.y-r&&e.y<=i.y+a+r}},dr=class extends B{descriptor={type:`arrow`,name:`Arrow`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke();let o=Math.atan2(a.y-i.y,a.x-i.x);e.beginPath(),e.moveTo(a.x,a.y),e.lineTo(a.x-12*Math.cos(o-Math.PI/6),a.y-12*Math.sin(o-Math.PI/6)),e.lineTo(a.x-12*Math.cos(o+Math.PI/6),a.y-12*Math.sin(o+Math.PI/6)),e.closePath(),e.fillStyle=t.style.color,e.fill(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return this.distanceToLine(e,i,a)<=r}},fr=[{label:`8x1`,ratio:8},{label:`4x1`,ratio:4},{label:`3x1`,ratio:3},{label:`2x1`,ratio:2},{label:`1x1`,ratio:1},{label:`1x2`,ratio:.5},{label:`1x3`,ratio:1/3},{label:`1x4`,ratio:.25},{label:`1x8`,ratio:.125}],pr=class extends B{descriptor={type:`gannFan`,name:`Gann Fan`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=a.x-i.x,s=a.y-i.y;if(Math.abs(o)<1)return;let c=s/o,l=o>0?1:-1,{chartRect:u}=n,d=l>0?u.x+u.width:u.x;this.applyLineStyle(e,t.style);for(let{label:n,ratio:r}of fr){let a=c*r,o=d,s=i.y+a*(o-i.x);e.globalAlpha=r===1?1:.5,e.lineWidth=r===1?t.style.lineWidth:Math.max(.5,t.style.lineWidth*.7),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(o,s),e.stroke();let f=o-l*4,p=s;p>u.y&&p<u.y+u.height&&(e.globalAlpha=.7,e.fillStyle=t.style.color,e.font=`9px sans-serif`,e.textAlign=l>0?`right`:`left`,e.textBaseline=`bottom`,e.fillText(n,f,p-2))}e.globalAlpha=1,this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=a.x-i.x,s=a.y-i.y;if(Math.abs(o)<1)return!1;let c=s/o,l=o>0?1:-1,{chartRect:u}=n,d=l>0?u.x+u.width:u.x;for(let{ratio:t}of fr){let n=c*t,a=d,o=i.y+n*(a-i.x);if(this.distanceToLine(e,i,{x:a,y:o})<=r)return!0}return!1}},mr=[0,.25,.333,.5,.667,.75,1],hr=class extends B{descriptor={type:`gannBox`,name:`Gann Box`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.max(i.x,a.x),c=Math.min(i.y,a.y),l=Math.max(i.y,a.y),u=s-o,d=l-c;if(!(u<2||d<2)){this.applyLineStyle(e,t.style),e.strokeRect(o,c,u,d),e.save(),e.globalAlpha=.35;for(let t of mr){if(t===0||t===1)continue;let n=c+d*t;e.beginPath(),e.moveTo(o,n),e.lineTo(s,n),e.stroke()}for(let t of mr){if(t===0||t===1)continue;let n=o+u*t;e.beginPath(),e.moveTo(n,c),e.lineTo(n,l),e.stroke()}e.globalAlpha=.5,e.setLineDash([4,3]),e.beginPath(),e.moveTo(o,c),e.lineTo(s,l),e.stroke(),e.beginPath(),e.moveTo(s,c),e.lineTo(o,l),e.stroke(),e.restore(),this.resetLineStyle(e),e.fillStyle=t.style.color,e.font=`8px sans-serif`,e.globalAlpha=.6,e.textBaseline=`bottom`,e.textAlign=`right`;for(let t of mr){if(t===0||t===1)continue;let n=c+d*t;e.fillText(`${(t*100).toFixed(0)}%`,o-3,n)}e.globalAlpha=1,r&&this.renderAnchorHandles(e,t,n)}}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.max(i.x,a.x),c=Math.min(i.y,a.y),l=Math.max(i.y,a.y);return Math.abs(e.x-o)<=r&&e.y>=c-r&&e.y<=l+r||Math.abs(e.x-s)<=r&&e.y>=c-r&&e.y<=l+r||Math.abs(e.y-c)<=r&&e.x>=o-r&&e.x<=s+r||Math.abs(e.y-l)<=r&&e.x>=o-r&&e.x<=s+r||this.distanceToLine(e,{x:o,y:c},{x:s,y:l})<=r||this.distanceToLine(e,{x:s,y:c},{x:o,y:l})<=r}},gr=class extends B{descriptor={type:`anchoredVWAP`,name:`Anchored VWAP`,requiredAnchors:1};dataGetter=null;showBands=!0;setDataGetter(e){this.dataGetter=e}setShowBands(e){this.showBands=e}render(e,t,n,r){if(t.anchors.length<1||!this.dataGetter)return;let i=this.dataGetter(),s=Math.max(0,Math.round(u(t.anchors[0].time,n)));if(s>=i.length)return;let{vwap:c,upper1:l,lower1:d,upper2:f,lower2:p}=this.computeVWAP(i,s),{chartRect:m}=n,h=n.barWidth+n.barSpacing;if(this.applyLineStyle(e,t.style),e.lineWidth=t.style.lineWidth+.5,this.drawLine(e,c,s,n,m,h),this.showBands&&c.length>1&&(e.globalAlpha=.4,e.lineWidth=Math.max(.5,t.style.lineWidth*.6),e.setLineDash([4,3]),this.drawLine(e,l,s,n,m,h),this.drawLine(e,d,s,n,m,h),e.globalAlpha=.25,this.drawLine(e,f,s,n,m,h),this.drawLine(e,p,s,n,m,h),e.globalAlpha=1),this.resetLineStyle(e),c.length>0){let r=c[c.length-1],i=a(s+c.length-1,n),l=o(r,n);i>=m.x&&i<=m.x+m.width&&(e.fillStyle=t.style.color,e.font=`bold 9px sans-serif`,e.textAlign=`left`,e.textBaseline=`middle`,e.fillText(`AVWAP ${r.toFixed(2)}`,i+6,l))}r&&this.renderAnchorHandles(e,t,n)}drawLine(e,t,n,r,i,s){e.beginPath();let c=!1;for(let l=0;l<t.length;l++){let u=a(n+l,r);if(u<i.x-s)continue;if(u>i.x+i.width+s)break;let d=o(t[l],r);c?e.lineTo(u,d):(e.moveTo(u,d),c=!0)}e.stroke()}computeVWAP(e,t){let n=e.length-t,r=Array(n),i=Array(n),a=Array(n),o=Array(n),s=Array(n),c=0,l=0,u=0;for(let d=0;d<n;d++){let n=e[t+d],f=(n.high+n.low+n.close)/3,p=n.volume??1;c+=f*p,l+=p,u+=f*f*p;let m=l>0?c/l:f;r[d]=m;let h=l>0?u/l-m*m:0,g=Math.sqrt(Math.max(0,h));i[d]=m+g,a[d]=m-g,o[d]=m+2*g,s[d]=m-2*g}return{vwap:r,upper1:i,lower1:a,upper2:o,lower2:s}}hitTest(e,t,n,r){if(t.anchors.length<1||!this.dataGetter)return!1;let i=this.dataGetter(),s=Math.max(0,Math.round(u(t.anchors[0].time,n)));if(s>=i.length)return!1;let{vwap:c}=this.computeVWAP(i,s);for(let t=1;t<c.length;t++){let i=a(s+t-1,n),l=o(c[t-1],n),u=a(s+t,n),d=o(c[t],n);if(this.distanceToLine(e,{x:i,y:l},{x:u,y:d})<=r)return!0}return!1}},_r=class extends B{descriptor={type:`volumeProfileRange`,name:`Volume Profile (Range)`,requiredAnchors:2};dataGetter=null;numBins=40;setDataGetter(e){this.dataGetter=e}render(e,t,n,r){if(t.anchors.length<2||!this.dataGetter)return;let i=this.dataGetter(),s=Math.round(u(t.anchors[0].time,n)),c=Math.round(u(t.anchors[1].time,n)),l=Math.max(0,Math.min(s,c)),d=Math.min(i.length-1,Math.max(s,c));if(l>=i.length||d<0||l>d)return;let f=1/0,p=-1/0;for(let e=l;e<=d;e++)i[e].low<f&&(f=i[e].low),i[e].high>p&&(p=i[e].high);if(f>=p)return;let m=(p-f)/this.numBins,h=new Float64Array(this.numBins),g=0;for(let e=l;e<=d;e++){let t=i[e],n=t.volume??1,r=Math.max(0,Math.floor((t.low-f)/m)),a=Math.min(this.numBins-1,Math.floor((t.high-f)/m)),o=n/(a-r+1);for(let e=r;e<=a;e++)h[e]+=o,h[e]>g&&(g=h[e])}if(g===0)return;let _=0;for(let e=1;e<this.numBins;e++)h[e]>h[_]&&(_=e);let v=a(d,n)+n.barWidth,y=t.style.color,b=t.style.fillColor??`#FF9800`;e.save();for(let t=0;t<this.numBins;t++){let r=h[t]/g*100,i=f+(t+1)*m,a=f+t*m,s=o(i,n),c=o(a,n),l=Math.abs(c-s);e.globalAlpha=.35,e.fillStyle=t===_?b:y,e.fillRect(v,Math.min(s,c),r,Math.max(1,l-.5))}let x=f+(_+.5)*m,S=o(x,n);e.globalAlpha=.7,e.strokeStyle=b,e.lineWidth=1,e.setLineDash([4,3]),e.beginPath();let C=a(l,n)-n.barWidth/2;e.moveTo(C,S),e.lineTo(v+100,S),e.stroke(),e.fillStyle=b,e.font=`9px sans-serif`,e.textAlign=`left`,e.textBaseline=`bottom`,e.globalAlpha=.8,e.fillText(`POC ${x.toFixed(2)}`,v+100+4,S-2),e.restore(),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x)-r,s=Math.max(i.x,a.x)+100+r,c=Math.min(i.y,a.y)-r,l=Math.max(i.y,a.y)+r;return e.x>=o&&e.x<=s&&e.y>=c&&e.y<=l}},vr=[1,2,3,5,8,13,21,34,55],yr=class extends B{descriptor={type:`fibTimeZones`,name:`Fibonacci Time Zones`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=t.anchors[0],a=t.anchors[1].time-i.time;if(a===0)return;let{chartRect:o}=n;e.font=`11px sans-serif`,e.textBaseline=`top`,e.textAlign=`center`,this.applyLineStyle(e,t.style);for(let r of vr){let s=d(i.time+a*r,n);s<o.x||s>o.x+o.width||(e.globalAlpha=r===1?1:.55,e.beginPath(),e.moveTo(s,o.y),e.lineTo(s,o.y+o.height),e.stroke(),e.fillStyle=t.style.color,e.fillText(String(r),s,o.y+2))}e.globalAlpha=1,this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=t.anchors[0],a=t.anchors[1].time-i.time;if(a===0)return!1;let{chartRect:o}=n;if(e.y<o.y||e.y>o.y+o.height)return!1;for(let t of vr){let o=d(i.time+a*t,n);if(Math.abs(e.x-o)<=r)return!0}return!1}},br=2,xr=class extends B{descriptor={type:`riskReward`,name:`Long/Short Position`,requiredAnchors:2};geometry(e){let t=e.anchors[0].price,n=e.anchors[1].price,r=Math.abs(t-n),i=n<t;return{entryPrice:t,stopPrice:n,targetPrice:i?t+r*br:t-r*br,risk:r,isLong:i}}render(e,t,n,r){if(t.anchors.length<2)return;let{entryPrice:i,stopPrice:a,targetPrice:o,risk:s,isLong:c}=this.geometry(t),l=this.anchorToPixel(t.anchors[0],n),u=this.anchorToPixel(t.anchors[1],n),d=Math.min(l.x,u.x),f=Math.max(Math.abs(u.x-l.x),40),p=l.y,m=u.y,h=this.anchorToPixel({time:t.anchors[1].time,price:o},n).y,g=Math.min(p,m),_=Math.abs(m-p),v=Math.min(p,h),y=Math.abs(h-p);e.fillStyle=`rgba(239, 83, 80, 0.18)`,e.fillRect(d,g,f,_),e.fillStyle=`rgba(38, 166, 154, 0.18)`,e.fillRect(d,v,f,y),e.strokeStyle=t.style.color,e.lineWidth=1,e.setLineDash([]),e.beginPath(),e.moveTo(d,p),e.lineTo(d+f,p),e.stroke();let b=e=>i===0?0:(e-i)/i*100;e.font=`11px sans-serif`,e.textAlign=`left`,e.textBaseline=`middle`,e.fillStyle=`#EF5350`,e.fillText(`Risk ${s.toFixed(2)} (${b(a).toFixed(2)}%)`,d+4,(p+m)/2),e.fillStyle=`#26A69A`;let x=`R:R 1:${br}`;e.fillText(`Reward ${(s*br).toFixed(2)} (${b(o).toFixed(2)}%) ยท ${x}`,d+4,(p+h)/2),e.fillStyle=t.style.color,e.fillText(c?`Long`:`Short`,d+4,p-8),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let{targetPrice:i}=this.geometry(t),a=this.anchorToPixel(t.anchors[0],n),o=this.anchorToPixel(t.anchors[1],n),s=this.anchorToPixel({time:t.anchors[1].time,price:i},n).y,c=Math.min(a.x,o.x)-r,l=Math.max(a.x,o.x)+r,u=Math.min(a.y,o.y,s)-r,d=Math.max(a.y,o.y,s)+r;return e.x>=c&&e.x<=l&&e.y>=u&&e.y<=d}},Sr=class extends B{descriptor={type:`crossLine`,name:`Cross Line`,requiredAnchors:1};render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n),{chartRect:a}=n;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(a.x,i.y),e.lineTo(a.x+a.width,i.y),e.moveTo(i.x,a.y),e.lineTo(i.x,a.y+a.height),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n);return Math.abs(e.y-i.y)<=r||Math.abs(e.x-i.x)<=r}},Cr=28,wr=48;function Tr(e,t){return Math.atan2(e.y-t.y,t.x-e.x)*180/Math.PI}var Er=class extends B{descriptor={type:`trendAngle`,name:`Trend Angle`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Tr(i,a),s=a.x>=i.x?1:-1;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),this.resetLineStyle(e),e.strokeStyle=t.style.color,e.lineWidth=1,e.setLineDash([3,3]),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(i.x+s*wr,i.y),e.stroke(),e.setLineDash([]);let c=Math.atan2(a.y-i.y,a.x-i.x),l=s>0?0:Math.PI;s<0&&c<0&&(c+=2*Math.PI),e.beginPath(),e.arc(i.x,i.y,Cr,Math.min(l,c),Math.max(l,c)),e.stroke(),e.font=`11px sans-serif`,e.fillStyle=t.style.color,e.textAlign=s>0?`left`:`right`,e.textBaseline=`middle`,e.fillText(`${o.toFixed(1)}ยฐ`,i.x+s*(Cr+6),i.y+(o>=0?-8:8)),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return this.distanceToLine(e,i,a)<=r}},Dr=`11px sans-serif`,Or=14,kr=6,Ar=4,jr=`rgba(19, 23, 34, 0.85)`,Mr=`#FFFFFF`,Nr=6e4,W=60*Nr,Pr=24*W;function Fr(e){let t=Math.abs(e);return t>=10||t===0?2:t>=1?4:Math.min(10,Math.ceil(-Math.log10(t))+3)}function Ir(e,t=e){return e.toFixed(Fr(t))}function Lr(e,t){let n=t-e,r=e===0?0:n/e*100,i=n>=0?`+`:``;return`${i}${Ir(n,e)} (${i}${r.toFixed(2)}%)`}function Rr(e){let t=Math.abs(e);if(t<W)return`${Math.round(t/Nr)}m`;if(t<Pr){let e=Math.floor(t/W),n=Math.round((t-e*W)/Nr);return n>0?`${e}h ${n}m`:`${e}h`}let n=Math.floor(t/Pr),r=Math.round((t-n*Pr)/W);if(n>=7){let e=Math.floor(n/7),t=n-e*7;return t>0?`${e}w ${t}d`:`${e}w`}return r>0?`${n}d ${r}h`:`${n}d`}function zr(e){return!!e.data&&e.data.length>0}function Br(e,t,n,r){let i=u(e.anchors[t].time,r),a=u(e.anchors[n].time,r);return Math.round(Math.abs(a-i))}function Vr(e,t,n,r){return zr(r)?Rr(e.anchors[n].time-e.anchors[t].time):null}function Hr(e,t,n,r,i=`center`,a=!0){e.font=Dr;let o=0;for(let n of t)o=Math.max(o,e.measureText(n).width);let s=o+kr*2,c=t.length*Or+Ar*2,l=i===`left`?n:i===`right`?n-s:n-s/2,u=a?r-c:r;e.fillStyle=jr,e.fillRect(l,u,s,c),e.fillStyle=Mr,e.textAlign=`left`,e.textBaseline=`top`;for(let n=0;n<t.length;n++)e.fillText(t[n],l+kr,u+Ar+n*Or);return{x:l,y:u,width:s,height:c}}function Ur(e,t,n){let r=Math.abs(e.anchors[t[1]].price-e.anchors[t[0]].price),i=Math.abs(e.anchors[n[1]].price-e.anchors[n[0]].price);return i===0?`โ€”`:(r/i).toFixed(3)}function Wr(e,t,n){let r=Vr(e,0,1,t),i=Br(e,0,1,t);return[Lr(e.anchors[0].price,e.anchors[1].price),r?`${i} bars, ${r}`:`${i} bars`,`${n.toFixed(1)}ยฐ`]}var Gr=class extends B{descriptor={type:`infoLine`,name:`Info Line`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),this.resetLineStyle(e);let o=Wr(t,n,Tr(i,a)),s=a.y<=i.y;Hr(e,o,a.x+(a.x>=i.x?8:-8),a.y+(s?-6:6),a.x>=i.x?`left`:`right`,s),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return this.distanceToLine(e,i,a)<=r}},Kr=[0,.236,.382,.5,.618,.786,1,1.618];function qr(e,t,n){let r=t.x-e.x,i=t.y-e.y,a=r*r+i*i;if(a===0)return{x:n.x-e.x,y:n.y-e.y};let o=((n.x-e.x)*r+(n.y-e.y)*i)/a;return{x:n.x-(e.x+o*r),y:n.y-(e.y+o*i)}}function Jr(e,t,n,r){let i=qr(e,t,n);return[{x:e.x+i.x*r,y:e.y+i.y*r},{x:t.x+i.x*r,y:t.y+i.y*r}]}var Yr=class extends B{descriptor={type:`fibChannel`,name:`Fibonacci Channel`,requiredAnchors:3};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);if(t.anchors.length<3){this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),this.resetLineStyle(e);return}let o=this.anchorToPixel(t.anchors[2],n);e.font=`11px sans-serif`,e.textAlign=`right`,e.textBaseline=`middle`;for(let n of Kr){let[r,s]=Jr(i,a,o,n);this.applyLineStyle(e,t.style),e.globalAlpha=n===0||n===1?1:.6,e.beginPath(),e.moveTo(r.x,r.y),e.lineTo(s.x,s.y),e.stroke(),e.fillStyle=t.style.color;let c=r.x<=s.x?r:s;e.fillText(String(n),c.x-4,c.y)}e.globalAlpha=1,this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<3)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=this.anchorToPixel(t.anchors[2],n);for(let t of Kr){let[n,s]=Jr(i,a,o,t);if(this.distanceToLine(e,n,s)<=r)return!0}return!1}},Xr=[.25,.382,.5,.618,.75];function Zr(e,t,n){let r=t.x-e.x,i=t.y-e.y,a=Math.hypot(r,i);if(a===0)return null;let o=(n.chartRect.width+n.chartRect.height)*2;return{x:e.x+r/a*o,y:e.y+i/a*o}}function Qr(e,t){let n=[{level:1,kind:`diagonal`,point:t}];for(let r of Xr)n.push({level:r,kind:`price`,point:{x:t.x,y:e.y+(t.y-e.y)*r}}),n.push({level:r,kind:`time`,point:{x:e.x+(t.x-e.x)*r,y:t.y}});return n}var $r=class extends B{descriptor={type:`fibSpeedResistanceFan`,name:`Fib Speed Resistance Fan`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);e.strokeStyle=t.style.color,e.lineWidth=1,e.globalAlpha=.25,e.strokeRect(Math.min(i.x,a.x),Math.min(i.y,a.y),Math.abs(a.x-i.x),Math.abs(a.y-i.y)),e.globalAlpha=1,e.font=`11px sans-serif`,e.textBaseline=`middle`;for(let r of Qr(i,a)){let o=Zr(i,r.point,n);o&&(this.applyLineStyle(e,t.style),e.globalAlpha=r.kind===`diagonal`?1:.65,e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(o.x,o.y),e.stroke(),r.kind===`price`&&(e.fillStyle=t.style.color,e.textAlign=a.x>=i.x?`left`:`right`,e.fillText(String(r.level),r.point.x+(a.x>=i.x?4:-4),r.point.y)))}e.globalAlpha=1,this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);for(let t of Qr(i,a)){let a=Zr(i,t.point,n);if(a&&this.distanceToLine(e,i,a)<=r)return!0}return!1}},ei=class extends B{ratioLinks=[];triangles=[];render(e,t,n,r){if(t.anchors.length<2)return;let i=t.anchors.map(e=>this.anchorToPixel(e,n));t.anchors.length>=this.descriptor.requiredAnchors&&this.renderTriangles(e,t,i),this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i[0].x,i[0].y);for(let t=1;t<i.length;t++)e.lineTo(i[t].x,i[t].y);e.stroke(),this.resetLineStyle(e),this.renderRatioLinks(e,t,i),this.renderPointLabels(e,t,i),this.renderExtras(e,t,i,n),r&&this.renderAnchorHandles(e,t,n)}renderExtras(e,t,n,r){}renderTriangles(e,t,n){e.fillStyle=t.style.fillColor??t.style.color,e.globalAlpha=t.style.fillColor?1:.12;for(let[t,r,i]of this.triangles)e.beginPath(),e.moveTo(n[t].x,n[t].y),e.lineTo(n[r].x,n[r].y),e.lineTo(n[i].x,n[i].y),e.closePath(),e.fill();e.globalAlpha=1}renderRatioLinks(e,t,n){e.font=`11px sans-serif`,e.textAlign=`center`,e.textBaseline=`middle`;for(let r of this.ratioLinks){if(Math.max(r.from,r.to,...r.num,...r.den)>=n.length)continue;let i=n[r.from],a=n[r.to];e.strokeStyle=t.style.color,e.lineWidth=1,e.globalAlpha=.7,e.setLineDash([4,4]),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),e.setLineDash([]),e.globalAlpha=1,e.fillStyle=t.style.color,e.fillText(Ur(t,r.num,r.den),(i.x+a.x)/2,(i.y+a.y)/2)}}renderPointLabels(e,t,n){e.font=`bold 12px sans-serif`,e.fillStyle=t.style.color,e.textAlign=`center`;for(let t=0;t<n.length&&t<this.pointLabels.length;t++){let r=n[t-1]??n[t+1],i=n[t+1]??n[t-1],a=!r||!i?!0:n[t].y<=Math.min(r.y,i.y);e.textBaseline=a?`bottom`:`top`,e.fillText(this.pointLabels[t],n[t].x,n[t].y+(a?-6:6))}}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=t.anchors.map(e=>this.anchorToPixel(e,n));for(let t=0;t<i.length-1;t++)if(this.distanceToLine(e,i[t],i[t+1])<=r)return!0;return!1}},ti=class extends ei{descriptor={type:`xabcdPattern`,name:`XABCD Pattern`,requiredAnchors:5};pointLabels=[`X`,`A`,`B`,`C`,`D`];ratioLinks=[{from:0,to:2,num:[1,2],den:[0,1]},{from:1,to:3,num:[2,3],den:[1,2]},{from:2,to:4,num:[3,4],den:[2,3]},{from:0,to:4,num:[1,4],den:[0,1]}];triangles=[[0,1,2],[2,3,4]]},ni=class extends ei{descriptor={type:`abcdPattern`,name:`ABCD Pattern`,requiredAnchors:4};pointLabels=[`A`,`B`,`C`,`D`];ratioLinks=[{from:0,to:2,num:[1,2],den:[0,1]},{from:1,to:3,num:[2,3],den:[1,2]}]},ri=class extends ei{descriptor={type:`headAndShoulders`,name:`Head and Shoulders`,requiredAnchors:7};pointLabels=[``,`Left Shoulder`,``,`Head`,``,`Right Shoulder`,``];triangles=[[0,1,2],[2,3,4],[4,5,6]];renderExtras(e,t,n){if(n.length<5)return;let r=n[2],i=n[4],a=n[0],o=n[n.length-1],s=i.x===r.x?0:(i.y-r.y)/(i.x-r.x),c=e=>r.y+s*(e-r.x);e.strokeStyle=t.style.color,e.lineWidth=Math.max(1,t.style.lineWidth),e.setLineDash([6,4]),e.beginPath(),e.moveTo(a.x,c(a.x)),e.lineTo(o.x,c(o.x)),e.stroke(),e.setLineDash([])}},ii=class extends B{descriptor={type:`circle`,name:`Circle`,requiredAnchors:2};geometry(e,t){let n=this.anchorToPixel(e.anchors[0],t),r=this.anchorToPixel(e.anchors[1],t);return{c:n,r:Math.hypot(r.x-n.x,r.y-n.y)}}render(e,t,n,r){if(t.anchors.length<2)return;let{c:i,r:a}=this.geometry(t,n);e.beginPath(),e.arc(i.x,i.y,a,0,Math.PI*2),t.style.fillColor&&(e.fillStyle=t.style.fillColor,e.fill()),this.applyLineStyle(e,t.style),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let{c:i,r:a}=this.geometry(t,n),o=Math.hypot(e.x-i.x,e.y-i.y);return t.style.fillColor?o<=a+r:Math.abs(o-a)<=r}},ai=`rgba(33, 150, 243, 0.12)`,oi=`rgba(239, 83, 80, 0.12)`;function si(e,t){let n=t.data;if(!n||n.length===0)return null;let r=Math.round(u(e.anchors[0].time,t)),i=Math.round(u(e.anchors[1].time,t)),a=Math.max(0,Math.min(r,i)),o=Math.min(n.length-1,Math.max(r,i)),s=0;for(let e=a;e<=o;e++)s+=n[e].volume??0;return s}function ci(e){return e>=1e9?`${(e/1e9).toFixed(2)}B`:e>=1e6?`${(e/1e6).toFixed(2)}M`:e>=1e3?`${(e/1e3).toFixed(2)}K`:e.toFixed(0)}function li(e,t){let n=Vr(e,0,1,t),r=Br(e,0,1,t),i=[Lr(e.anchors[0].price,e.anchors[1].price),n?`${r} bars, ${n}`:`${r} bars`],a=si(e,t);return a!==null&&i.push(`Vol ${ci(a)}`),i}var ui=class extends B{descriptor={type:`dateAndPriceRange`,name:`Date and Price Range`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.min(i.y,a.y),c=Math.abs(a.x-i.x),l=Math.abs(a.y-i.y),u=t.anchors[1].price>=t.anchors[0].price;e.fillStyle=u?ai:oi,e.fillRect(o,s,c,l),this.applyLineStyle(e,t.style);let d=o+c/2,f=s+l/2;e.beginPath(),e.moveTo(d,i.y),e.lineTo(d,a.y),e.moveTo(i.x,f),e.lineTo(a.x,f),e.stroke(),this.resetLineStyle(e),Hr(e,li(t,n),d,u?s-6:s+l+6,`center`,u),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return e.x>=Math.min(i.x,a.x)-r&&e.x<=Math.max(i.x,a.x)+r&&e.y>=Math.min(i.y,a.y)-r&&e.y<=Math.max(i.y,a.y)+r}},di=400,fi=2;function pi(e,t,n){let r=Math.abs(t.x-e.x);if(r<fi)return[e.x];let i=n.chartRect.x+n.chartRect.width,a=[],o=Math.min(e.x,t.x);for(let e=o;e<=i&&a.length<di;e+=r)a.push(e);return a}var mi=class extends B{descriptor={type:`cyclicLines`,name:`Cyclic Lines`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),{chartRect:o}=n;this.applyLineStyle(e,t.style),e.beginPath();for(let t of pi(i,a,n))t<o.x||(e.moveTo(t,o.y),e.lineTo(t,o.y+o.height));e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){return t.anchors.length<2?!1:pi(this.anchorToPixel(t.anchors[0],n),this.anchorToPixel(t.anchors[1],n),n).some(t=>Math.abs(e.x-t)<=r)}},hi=14,gi=18,_i=6,vi=20,yi=class extends B{descriptor={type:`priceLabel`,name:`Price Label`,requiredAnchors:1};text(e){return e.style.text||Ir(e.anchors[0].price)}box(e,t,n){let r=t.style.fontSize??12,i=e?e.measureText(this.text(t)).width:this.text(t).length*r*.6;return{x:n.x+hi,y:n.y-gi-vi/2,w:i+_i*2,h:vi}}render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n);e.font=`${t.style.fontSize??12}px sans-serif`;let a=this.box(e,t,i);e.strokeStyle=t.style.color,e.lineWidth=1,e.setLineDash([]),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y+a.h),e.stroke(),e.fillStyle=t.style.color,e.fillRect(a.x,a.y,a.w,a.h),e.fillStyle=`#FFFFFF`,e.textAlign=`left`,e.textBaseline=`middle`,e.fillText(this.text(t),a.x+_i,a.y+a.h/2),e.beginPath(),e.arc(i.x,i.y,3,0,Math.PI*2),e.fillStyle=t.style.color,e.fill(),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n);if(Math.hypot(e.x-i.x,e.y-i.y)<=r)return!0;let a=this.box(null,t,i);return e.x>=a.x-r&&e.x<=a.x+a.w+r&&e.y>=a.y-r&&e.y<=a.y+a.h+r}};function bi(e){e.register(new Hn),e.register(new Un),e.register(new Wn),e.register(new Gn),e.register(new Kn),e.register(new qn),e.register(new Jn),e.register(new Yn),e.register(new Xn),e.register(new Qn),e.register(new $n),e.register(new er),e.register(new tr),e.register(new U),e.register(new ar),e.register(new or),e.register(new sr),e.register(new cr),e.register(new ur),e.register(new dr),e.register(new pr),e.register(new hr),e.register(new gr),e.register(new _r),e.register(new yr),e.register(new xr),e.register(new Sr),e.register(new Er),e.register(new Gr),e.register(new Yr),e.register(new $r),e.register(new nr),e.register(new rr),e.register(new ti),e.register(new ni),e.register(new ri),e.register(new ii),e.register(new ui),e.register(new mi),e.register(new yi)}var xi=class{render(e,t,n,r,i,a){let s=i.orderColors?.buy??`#26A69A`,c=i.orderColors?.sell??`#EF5350`,{chartRect:l}=n;for(let i of t){let t=a?.orderId===i.id&&a.sourceType===`order`,u=o(t?a.currentPrice:i.price,n);if(u<l.y||u>l.y+l.height)continue;let d=i.side===`buy`?s:c;e.setLineDash([6,4]),e.strokeStyle=d,e.lineWidth=1,e.beginPath(),e.moveTo(l.x,Math.round(u)+.5),e.lineTo(l.x+l.width,Math.round(u)+.5),e.stroke(),e.setLineDash([]);let f=i.label??i.type.toUpperCase();e.font=`bold 10px ${r.font.family}`;let p=e.measureText(f).width+8;e.fillStyle=d,e.fillRect(l.x+4,u-8,p,16),e.fillStyle=`#FFFFFF`,e.textBaseline=`middle`,e.textAlign=`left`,e.fillText(f,l.x+8,u);let m=l.x+4+p+6;if(e.fillStyle=d,e.beginPath(),i.side===`buy`?(e.moveTo(m,u+4),e.lineTo(m+5,u-2),e.lineTo(m+10,u+4)):(e.moveTo(m,u-4),e.lineTo(m+5,u+2),e.lineTo(m+10,u-4)),e.fill(),t){let t=o(a.startPrice,n);e.setLineDash([2,4]),e.strokeStyle=d,e.globalAlpha=.3,e.beginPath(),e.moveTo(l.x,Math.round(t)+.5),e.lineTo(l.x+l.width,Math.round(t)+.5),e.stroke(),e.globalAlpha=1,e.setLineDash([])}}}renderAxisBadges(t,n,r,i,a,s){let c=a.orderColors?.buy??`#26A69A`,l=a.orderColors?.sell??`#EF5350`,u=a.pricePrecision??2,{chartRect:d}=r,f=d.x+d.width+1;for(let a of n){let n=s?.orderId===a.id&&s.sourceType===`order`?s.currentPrice:a.price,p=o(n,r);if(p<d.y||p>d.y+d.height)continue;let m=a.side===`buy`?c:l,h=`${n.toFixed(u)} x ${a.quantity}`;t.font=`11px ${i.font.family}`;let g=t.measureText(h).width+10;t.fillStyle=m,t.fillRect(f,p-9,Math.min(g,(r.priceAxisWidth??e.PRICE_AXIS_WIDTH)-2),18),t.fillStyle=`#FFFFFF`,t.textAlign=`left`,t.textBaseline=`middle`,t.fillText(h,f+5,p)}}hitTest(e,t,n,r){for(let i of t){if(i.draggable===!1)continue;let t=o(i.price,n);if(Math.abs(e-t)<=r)return i}return null}};function Si(e,t,n){let r=Math.min(Math.max(e.closedQuantity??0,0),e.quantity),i=e.quantity-r,a=e.side===`buy`?1:-1,o=(t-e.entryPrice)*i*a,s=e.entryPrice===0?0:(t-e.entryPrice)/e.entryPrice*100*a;return{side:e.side,quantity:e.quantity,closedQuantity:r,openQuantity:i,entryPrice:e.entryPrice,currentPrice:t,pnl:o,pnlPct:s,precision:n}}var Ci=/\{(side|qty|closedQty|openQty|entry|price|pnl|pnlPct|pnlSign)\}/g;function wi(e,t){return e.replace(Ci,(e,n)=>{switch(n){case`side`:return t.side.toUpperCase();case`qty`:return String(t.quantity);case`closedQty`:return String(t.closedQuantity);case`openQty`:return String(t.openQuantity);case`entry`:return t.entryPrice.toFixed(t.precision);case`price`:return t.currentPrice.toFixed(t.precision);case`pnl`:return t.pnl.toFixed(t.precision);case`pnlPct`:return`${t.pnlPct.toFixed(2)}%`;case`pnlSign`:return t.pnl>=0?`+`:``;default:return``}})}function Ti(e,t){return typeof e==`function`?e(t):wi(e??`{side} {qty} | P&L: {pnlSign}{pnl}`,t)}function Ei(e,t,n){if(!t||t.length===0)return n;let r=[...t].sort((e,t)=>e.pnl-t.pnl),i;for(let t of r)if(e>=t.pnl)i=t.color;else break;return i??n}var Di=class{render(e,t,n,r,i,a){let{chartRect:s}=r,c=a.positionColors?.profit??`#26A69A`,l=a.positionColors?.loss??`#EF5350`,u=a.positionColors?.entry??`#2196F3`,d=a.pricePrecision??2;for(let f of t){let t=o(f.entryPrice,r);if(e.strokeStyle=u,e.lineWidth=1.5,e.setLineDash([]),e.beginPath(),e.moveTo(s.x,Math.round(t)+.5),e.lineTo(s.x+s.width,Math.round(t)+.5),e.stroke(),n!==null){let p=o(n,r),m=Si(f,n,d),h=m.pnl,g=h>=0?c:l,_=Ei(h,a.pnlThresholds,g);e.fillStyle=_,e.globalAlpha=.08;let v=Math.min(t,p),y=Math.abs(p-t);if(e.fillRect(s.x,v,s.width,y),e.globalAlpha=1,m.closedQuantity>0&&f.quantity>0){let t=m.closedQuantity/f.quantity;e.fillStyle=u,e.globalAlpha=.25,e.fillRect(s.x,v,Math.max(2,s.width*t*.04)+2,y),e.globalAlpha=1}let b=Ti(a.positionLabel,m);e.font=`bold 11px ${i.font.family}`;let x=e.measureText(b).width+12,S=s.x+8;e.fillStyle=_,e.globalAlpha=.9,e.fillRect(S,t-10,x,20),e.globalAlpha=1,e.fillStyle=`#FFFFFF`,e.textBaseline=`middle`,e.textAlign=`left`,e.fillText(b,S+6,t)}if(f.stopLoss!==void 0){let t=o(f.stopLoss,r);e.setLineDash([4,4]),e.strokeStyle=l,e.lineWidth=1,e.beginPath(),e.moveTo(s.x,Math.round(t)+.5),e.lineTo(s.x+s.width,Math.round(t)+.5),e.stroke(),e.font=`bold 10px ${i.font.family}`,e.fillStyle=l,e.fillRect(s.x+4,t-8,24,16),e.fillStyle=`#FFFFFF`,e.textAlign=`left`,e.textBaseline=`middle`,e.fillText(`SL`,s.x+8,t)}if(f.takeProfit!==void 0){let t=o(f.takeProfit,r);e.setLineDash([4,4]),e.strokeStyle=c,e.lineWidth=1,e.beginPath(),e.moveTo(s.x,Math.round(t)+.5),e.lineTo(s.x+s.width,Math.round(t)+.5),e.stroke(),e.font=`bold 10px ${i.font.family}`,e.fillStyle=c,e.fillRect(s.x+4,t-8,24,16),e.fillStyle=`#FFFFFF`,e.textAlign=`left`,e.textBaseline=`middle`,e.fillText(`TP`,s.x+8,t)}e.setLineDash([])}}renderAxisBadges(t,n,r,i,a){let{chartRect:s}=r,c=a.positionColors?.entry??`#2196F3`,l=a.pricePrecision??2,u=s.x+s.width+1;for(let a of n){let n=o(a.entryPrice,r);t.fillStyle=c,t.fillRect(u,n-9,(r.priceAxisWidth??e.PRICE_AXIS_WIDTH)-2,18),t.fillStyle=`#FFFFFF`,t.font=`11px ${i.font.family}`,t.textAlign=`left`,t.textBaseline=`middle`,t.fillText(a.entryPrice.toFixed(l),u+5,n)}}},Oi=class{render(e,t,n,r){if(!r.depthOverlay?.enabled)return;let{chartRect:i}=n,a=r.depthOverlay.bidColor??`rgba(38,166,154,0.15)`,s=r.depthOverlay.askColor??`rgba(239,83,80,0.15)`,c=r.depthOverlay.maxWidth??100,l=0,u=[],d=0;for(let e of t.bids)d+=e.volume,u.push({price:e.price,cumVol:d}),d>l&&(l=d);let f=[];d=0;for(let e of t.asks)d+=e.volume,f.push({price:e.price,cumVol:d}),d>l&&(l=d);if(l===0)return;let p=Math.max(1,t.bids.length>1?Math.abs(o(t.bids[0].price,n)-o(t.bids[1].price,n)):4),m=i.x+i.width;e.fillStyle=a;for(let{price:t,cumVol:r}of u){let a=o(t,n);if(a<i.y||a>i.y+i.height)continue;let s=r/l*c;e.fillRect(m-s,a-p/2,s,p)}e.fillStyle=s;for(let{price:t,cumVol:r}of f){let a=o(t,n);if(a<i.y||a>i.y+i.height)continue;let s=r/l*c;e.fillRect(m-s,a-p/2,s,p)}}},ki=class{dragState=null;startY=0;dragging=!1;constructor(e=3){this.dragThreshold=e}onPointerDown(e,t,n,r,i){for(let n of t){if(n.draggable===!1)continue;let t=o(n.price,r);if(Math.abs(e.y-t)<=i)return this.dragState={orderId:n.id,sourceType:`order`,startPrice:n.price,currentPrice:n.price},this.startY=e.y,this.dragging=!1,!0}for(let t of n){if(t.stopLoss!==void 0){let n=o(t.stopLoss,r);if(Math.abs(e.y-n)<=i)return this.dragState={orderId:t.id,sourceType:`stopLoss`,startPrice:t.stopLoss,currentPrice:t.stopLoss},this.startY=e.y,this.dragging=!1,!0}if(t.takeProfit!==void 0){let n=o(t.takeProfit,r);if(Math.abs(e.y-n)<=i)return this.dragState={orderId:t.id,sourceType:`takeProfit`,startPrice:t.takeProfit,currentPrice:t.takeProfit},this.startY=e.y,this.dragging=!1,!0}}return!1}onPointerMove(e,t){if(!this.dragState)return!1;if(!this.dragging){if(Math.abs(e.y-this.startY)<this.dragThreshold)return!0;this.dragging=!0}return this.dragState.currentPrice=c(e.y,t),!0}onPointerUp(){if(!this.dragState)return null;let e=this.dragState;return this.dragState=null,this.dragging?(this.dragging=!1,{sourceType:e.sourceType,id:e.orderId,newPrice:e.currentPrice,previousPrice:e.startPrice}):null}getDragState(){return this.dragState}isActive(){return this.dragState!==null}},Ai=class{menuElement=null;removeHandler=null;onItemSelect=null;show(e,t,n,r){if(this.hide(),!r.contextMenu?.enabled)return;let i=r.pricePrecision??2,a=t.toFixed(i),o=document.createElement(`div`);o.style.cssText=`
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@tradecanvas/commons`);var t=class{canvas;ctx;dpr=1;constructor(e,t){this.canvas=document.createElement(`canvas`),this.canvas.style.position=`absolute`,this.canvas.style.top=`0`,this.canvas.style.left=`0`,this.canvas.style.zIndex=String(t),this.canvas.style.pointerEvents=`none`,this.ctx=this.canvas.getContext(`2d`),e.appendChild(this.canvas)}resize(e,t){this.dpr=t;let n=Math.round(e.width*t),r=Math.round(e.height*t);(this.canvas.width!==n||this.canvas.height!==r)&&(this.canvas.width=n,this.canvas.height=r),this.canvas.style.width=`${e.width}px`,this.canvas.style.height=`${e.height}px`,this.ctx.setTransform(t,0,0,t,0,0)}clear(){this.ctx.setTransform(1,0,0,1,0,0),this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.setTransform(this.dpr,0,0,this.dpr,0,0)}getSize(){return{width:this.canvas.width/this.dpr,height:this.canvas.height/this.dpr}}destroy(){this.canvas.remove()}},n=class{scene=null;top=null;constructor(e){this.container=e}createLayers(){this.destroy(),this.scene=new t(this.container,0),this.top=new t(this.container,1)}getLayer(t){return(t===e.LayerType.Hover?this.top:this.scene)??void 0}resize(e,t){this.scene?.resize(e,t),this.top?.resize(e,t)}destroy(){this.scene?.destroy(),this.top?.destroy(),this.scene=null,this.top=null}},r=class{animFrameId=0;running=!1;dirtyLayers=new Set;swapLayers=new Set;callback=null;setCallback(e){this.callback=e}markDirty(e){this.dirtyLayers.add(e),this.running&&!this.animFrameId&&this.scheduleFrame()}markAllDirty(){this.dirtyLayers.add(e.LayerType.Background),this.dirtyLayers.add(e.LayerType.Main),this.dirtyLayers.add(e.LayerType.Overlay),this.dirtyLayers.add(e.LayerType.UI),this.dirtyLayers.add(e.LayerType.Hover),this.running&&!this.animFrameId&&this.scheduleFrame()}start(){this.running=!0,this.markAllDirty()}stop(){this.running=!1,this.animFrameId&&=(cancelAnimationFrame(this.animFrameId),0)}scheduleFrame(){this.animFrameId=requestAnimationFrame(()=>{if(this.animFrameId=0,!(!this.running||!this.callback)&&this.dirtyLayers.size>0){let e=this.dirtyLayers;this.dirtyLayers=this.swapLayers,this.callback(e),e.clear(),this.swapLayers=e}})}},i=class{observer=null;callback=null;currentDpr=1;resizeScheduled=!1;cachedSize;constructor(e){this.container=e,this.currentDpr=window.devicePixelRatio||1,this.cachedSize={width:e.clientWidth,height:e.clientHeight}}getDpr(){return this.currentDpr}getContainerSize(){return this.cachedSize}readContainerSize(){let e=this.container.clientWidth,t=this.container.clientHeight;return(e!==this.cachedSize.width||t!==this.cachedSize.height)&&(this.cachedSize={width:e,height:t}),this.cachedSize}onResize(e){this.callback=e,this.observer=new ResizeObserver(()=>{this.resizeScheduled||(this.resizeScheduled=!0,requestAnimationFrame(()=>{this.resizeScheduled=!1,this.currentDpr=window.devicePixelRatio||1;let e=this.container.clientWidth,t=this.container.clientHeight;e===this.cachedSize.width&&t===this.cachedSize.height||(this.cachedSize={width:e,height:t},this.callback?.(this.cachedSize,this.currentDpr))}))}),this.observer.observe(this.container)}destroy(){this.observer?.disconnect(),this.observer=null,this.callback=null}};function a(e,t){return e*(t.barWidth+t.barSpacing)-t.offset+t.chartRect.x+t.barWidth/2}function o(e,t){let{min:n,max:r}=t.priceRange,{y:i,height:a}=t.chartRect,o;if(t.logScale&&n>0&&r>0){let t=Math.log(n),s=Math.log(r)-t;if(s===0)return i+a/2;o=(Math.log(Math.max(e,2**-52))-t)/s}else{let t=r-n;if(t===0)return i+a/2;o=(e-n)/t}return i+a*(t.invertScale?o:1-o)}function s(e){let{min:t,max:n}=e.priceRange,{y:r,height:i}=e.chartRect,a=e.invertScale===!0;if(e.logScale&&t>0&&n>0){let e=Math.log(t),o=Math.log(n)-e;if(o===0)return()=>r+i/2;let s=i/o,c=r+i;return a?t=>r+(Math.log(Math.max(t,2**-52))-e)*s:t=>c-(Math.log(Math.max(t,2**-52))-e)*s}let o=n-t;if(o===0)return()=>r+i/2;let s=i/o;return a?e=>r+(e-t)*s:e=>r+(n-e)*s}function c(e,t,n,r){let{min:i,max:a}=n.priceRange,o=(a-i)/t,s=r(i+e*o),c=r(i+(e+1)*o);return{top:Math.min(s,c),height:Math.abs(s-c),mid:(s+c)/2}}function l(e,t){let n=t.barWidth+t.barSpacing;return Math.round((e-t.chartRect.x-t.barWidth/2+t.offset)/n)}function u(e,t){let{min:n,max:r}=t.priceRange,i=(e-t.chartRect.y)/t.chartRect.height,a=t.invertScale?i:1-i;if(t.logScale&&n>0&&r>0){let e=Math.log(n);return Math.exp(e+(Math.log(r)-e)*a)}return n+(r-n)*a}var d=new WeakMap;function f(e){let t=e.length;if(t<2)return 0;let n=d.get(e);if(n&&n.length===t)return n.step;let r=[];for(let n=Math.max(1,t-20);n<t;n++)r.push(e[n].time-e[n-1].time);r.sort((e,t)=>e-t);let i=Math.max(0,r[r.length>>1]);return d.set(e,{length:t,step:i}),i}function p(e){let t=f(e);return(e.length>0?e[e.length-1].time:0)>0xe8d4a51000?t:t*1e3}function m(e,t){let n=t.length;if(n===0)return e;let r=n-1;if(e>r)return t[r].time+(e-r)*f(t);if(e<0)return t[0].time+e*f(t);let i=Math.floor(e);return i===e||i>=r?t[i].time:t[i].time+(e-i)*(t[i+1].time-t[i].time)}function h(e,t){if(t.length===0)return-1;let n=t[0].time,r=t.length-1,i=t[r].time;if(e<=n||e>=i){if(e===n)return 0;if(e===i)return r;let a=f(t);return a<=0?e<n?0:r:e<n?(e-n)/a:r+(e-i)/a}let a=0,o=t.length-1;for(;a<=o;){let n=a+o>>>1;if(t[n].time===e)return n;t[n].time<e?a=n+1:o=n-1}if(a>=t.length)return t.length-1;if(o<0)return 0;let s=t[o].time,c=t[a].time,l=c===s?0:(e-s)/(c-s);return o+l}function g(e,t){let n=t.data;return n&&n.length>0?h(e,n):e}function _(e,t){return a(g(e,t),t)}function v(e,t){let n=l(e,t),r=t.data;return r&&r.length>0?m(n,r):n}var y=20;function b(e){return e<1?Math.ceil(-Math.log10(e))+1:+(e<10)}var x=class{layerManager;renderLoop;dprManager;renderCtx=null;sceneLayer;topLayer;onContainerResize=null;constructor(e){this.layerManager=new n(e),this.renderLoop=new r,this.dprManager=new i(e),this.layerManager.createLayers(),this.cacheLayerRefs(),this.renderLoop.setCallback(e=>this.render(e)),this.dprManager.onResize((e,t)=>{this.layerManager.resize(e,t),this.renderLoop.markAllDirty(),this.onContainerResize?.(e)});let t=this.dprManager.getContainerSize(),a=this.dprManager.getDpr();this.layerManager.resize(t,a)}cacheLayerRefs(){this.sceneLayer=this.layerManager.getLayer(e.LayerType.Main),this.topLayer=this.layerManager.getLayer(e.LayerType.Hover)}setRenderContext(e){this.renderCtx=e}start(){this.renderLoop.start()}stop(){this.renderLoop.stop()}requestRender(e){e===void 0?this.renderLoop.markAllDirty():this.renderLoop.markDirty(e)}render(t){let n=this.renderCtx;if(!n)return;let{chartRect:r}=n.viewport;if(r.width<=0||r.height<=0)return;let i=!1;for(let n of t)if(n!==e.LayerType.Hover){i=!0;break}i&&this.sceneLayer&&this.renderScene(this.sceneLayer,n),this.topLayer&&this.renderTop(this.topLayer,n)}renderScene(e,t){let{viewport:n,theme:r,data:i}=t;e.clear();let a=e.ctx;t.gridRenderer?.render(a,n,r),t.sessionShading?.render(a,i,n,r),t.sessionBreaks?.render(a,n,r,i),t.watermark?.render(a,n,r),a.save(),a.beginPath(),a.rect(n.chartRect.x,n.chartRect.y,n.chartRect.width,n.chartRect.height),a.clip(),t.depthHeatmap?.render(a,n,r),t.volumeRenderer?.render(a,i,n,r),t.volumeProfile?.render(a,i,n,r),t.marketProfile?.render(a,i,n,r),t.chartRenderer?.render(a,i,n,r),t.compareRenderer?.render(a,i,n,r),t.indicatorEngine?.renderOverlays(a,n),t.periodLevels?.render(a,i,n,r),t.pivotMarkers?.render(a,i,n,r),t.renderOverlayPlugins?.(a,`main`),a.restore(),this.renderPanels(a,t),t.priceLimits&&this.renderPriceLimits(a,n,r,t.priceLimits),t.tradeZoneManager?.render(a,n,r),t.drawingRenderer?.render(a,n),t.tradingRenderer?.render(a,n,r),t.signalMarkerManager?.render(a,n,r),t.alertManager?.render(a,n,r),t.priceAxis?.render(a,n,r),t.tradingRenderer?.renderAxisBadges(a,n,r),t.currentPriceLine?.render(a,n,r),t.timeAxis?.render(a,n,r,i,t.timeAxisY),this.renderPanelAxes(a,t)}renderTop(e,t){let{viewport:n,theme:r,data:i}=t;e.clear();let a=e.ctx;t.measureOverlay?.render(a,n,r),t.selectionBoxOverlay?.render(a,n,r),t.crosshairHandler?.render(a,n,r),t.renderOverlayPlugins?.(a,`overlay`),this.renderPanelCrosshair(a,t),t.crosshairHandler?.renderAxisLabels(a,n,r,i,t.timeAxisY),t.chartLegend?.render(a,n,r,i),t.barCountdown?.render(a,n,r,i),t.renderOverlayPlugins?.(a,`ui`),this.renderPanelHoverValues(a,t)}renderPanels(e,t){let{theme:n}=t,r=t.panels,i=t.indicatorEngine;if(!i||r.length===0)return;let a=`10px ${n.font.family}`,o=this.panelDescriptors(i);for(let s of r){if(s.rect.width<=0||s.rect.height<=0)continue;e.save(),e.beginPath(),e.rect(s.rect.x,s.rect.y,s.rect.width,s.rect.height),e.clip(),e.fillStyle=n.background,e.fillRect(s.rect.x,s.rect.y,s.rect.width,s.rect.height),e.fillStyle=n.axisLine,e.fillRect(s.rect.x,s.rect.y,s.rect.width,3),e.fillStyle=n.textSecondary,e.font=a,e.textBaseline=`top`,e.textAlign=`left`;let r=o.get(s.instanceId);r&&t.paneTitles!==!1&&e.fillText(r.descriptor.name,s.rect.x+6,s.rect.y+6),e.save(),e.beginPath(),e.rect(s.rect.x,s.rect.y+y,s.rect.width,s.rect.height-y),e.clip(),i.renderPanel(e,s.instanceId,s.viewport),e.restore(),e.restore()}}renderPanelAxes(t,n){let{theme:r}=n,i=n.numberLocale??`en-US`,a=`${r.font.sizeSmall}px ${r.font.family}`;for(let s of n.panels){let n=s.viewport,c=s.rect,{min:l,max:u}=n.priceRange;if(u-l<=0||c.height<=0)continue;let d=c.x+c.width,f=n.chartRect;t.strokeStyle=r.axisLine,t.lineWidth=1,t.beginPath(),t.moveTo(d+.5,c.y),t.lineTo(d+.5,c.y+c.height),t.stroke();let p=(0,e.computeTickStep)(l,u,4),m=Math.ceil(l/p)*p,h=b(p);t.font=a,t.textBaseline=`middle`,t.textAlign=`left`;for(let a=m;a<=u;a+=p){let s=o(a,n);s<f.y||s>f.y+f.height||(t.strokeStyle=r.axisLine,t.beginPath(),t.moveTo(d,Math.round(s)+.5),t.lineTo(d+4,Math.round(s)+.5),t.stroke(),t.fillStyle=r.axisLabel,t.fillText((0,e.formatPrice)(a,h,i),d+6,s))}}}renderPanelCrosshair(e,t){let n=t.crosshairHandler?.getPosition();if(!n||t.panels.length===0)return;let{theme:r}=t;for(let i of t.panels){let o=i.rect;if(n.x<o.x||n.x>o.x+o.width||n.y<o.y||n.y>o.y+o.height)continue;let s=i.viewport,c=l(n.x,s),u=a(Math.max(0,Math.min((t.data?.length??1)-1,Math.round(c))),s);e.save(),e.beginPath(),e.rect(o.x,o.y,o.width,o.height),e.clip(),e.setLineDash([4,4]),e.strokeStyle=r.crosshair,e.lineWidth=1,e.beginPath(),e.moveTo(Math.round(u)+.5,o.y),e.lineTo(Math.round(u)+.5,o.y+o.height),e.stroke(),e.beginPath(),e.moveTo(o.x,Math.round(n.y)+.5),e.lineTo(o.x+o.width,Math.round(n.y)+.5),e.stroke(),e.setLineDash([]),e.restore();break}}renderPanelHoverValues(t,n){let r=n.crosshairHandler?.getPosition(),i=n.indicatorEngine;if(!r||n.panels.length===0)return;let{theme:a,viewport:o,data:s}=n,c=n.numberLocale??`en-US`,d=`${a.font.sizeSmall}px ${a.font.family}`,f=i?this.panelDescriptors(i):null;for(let p of n.panels){let m=p.viewport,h=p.rect,{min:g,max:_}=m.priceRange;if(_-g<=0||h.height<=0)continue;let v=h.x+h.width,y=b((0,e.computeTickStep)(g,_,4));if(r.x>=h.x&&r.x<=h.x+h.width&&r.y>=h.y&&r.y<=h.y+h.height){let n=(0,e.formatPrice)(u(r.y,m),y,c);t.font=`bold ${a.font.sizeSmall}px ${a.font.family}`;let i=t.measureText(n).width,s=Math.min(i+10,(o.priceAxisWidth??e.PRICE_AXIS_WIDTH)-2);t.fillStyle=a.crosshair,t.fillRect(v+1,r.y-9,s,18),t.fillStyle=a.background,t.textBaseline=`middle`,t.textAlign=`left`,t.fillText(n,v+5,r.y)}if(!i||n.paneTitles===!1)continue;let x=Math.max(0,Math.min((s?.length??1)-1,Math.round(l(r.x,m)))),S=i.getOutput(p.instanceId),C=S?.series&&x<S.series.length?S.series[x]:null;if(!C)continue;let w=[];for(let e in C){let t=C[e];t!==void 0&&w.push(`${e}: ${t.toFixed(y)}`)}if(w.length===0)continue;let T=f?.get(p.instanceId);t.font=d;let E=T?t.measureText(T.descriptor.name).width+14:10;t.fillStyle=a.textSecondary,t.textBaseline=`top`,t.textAlign=`left`,t.fillText(w.join(` `),h.x+E,h.y+6)}}panelDescriptors(e){let t=new Map;for(let n of e.getPanelIndicators())t.set(n.instanceId,n);return t}renderPriceLimits(t,n,r,i){let{chartRect:a}=n,s=[{price:i.ceiling,color:i.colors?.ceiling??`#FF00FF`,label:`CE`},{price:i.floor,color:i.colors?.floor??`#00FFFF`,label:`FL`},{price:i.reference,color:i.colors?.reference??`#FFD700`,label:`REF`}],c=`bold 9px ${r.font.family}`,l=`10px ${r.font.family}`;for(let{price:r,color:i,label:u}of s){let s=o(r,n);if(s<a.y||s>a.y+a.height)continue;t.setLineDash([8,4]),t.strokeStyle=i,t.lineWidth=1,t.beginPath(),t.moveTo(a.x,Math.round(s)+.5),t.lineTo(a.x+a.width,Math.round(s)+.5),t.stroke(),t.setLineDash([]),t.font=c,t.fillStyle=i,t.textBaseline=`bottom`,t.textAlign=`left`,t.fillText(`${u} ${r.toFixed(2)}`,a.x+4,s-2);let d=a.x+a.width+1;t.fillStyle=i,t.fillRect(d,s-7,(n.priceAxisWidth??e.PRICE_AXIS_WIDTH)-2,14),t.fillStyle=`#000`,t.font=l,t.textBaseline=`middle`,t.textAlign=`left`,t.fillText(r.toFixed(2),d+4,s)}}destroy(){this.renderLoop.stop(),this.dprManager.destroy(),this.layerManager.destroy()}},S=class{state;priceAxisWidth=e.PRICE_AXIS_WIDTH;stateCache=null;dataLength=0;minBarWidth;maxBarWidth;rightMarginBars;freePan=!0;minVisibleBars=3;constructor(t,n,r=2,i=30,a=5){this.minBarWidth=r,this.maxBarWidth=i,this.rightMarginBars=a;let o=this.computeChartRect(t,n);this.state={visibleRange:{from:0,to:0},priceRange:{min:0,max:1},barWidth:e.DEFAULT_BAR_WIDTH,barSpacing:e.DEFAULT_BAR_SPACING,offset:0,chartRect:o}}getState(){return this.stateCache||={visibleRange:{...this.state.visibleRange},priceRange:{...this.state.priceRange},barWidth:this.state.barWidth,barSpacing:this.state.barSpacing,offset:this.state.offset,chartRect:{...this.state.chartRect},logScale:this.state.logScale,scaleMode:this.state.scaleMode,scaleBaseline:this.state.scaleBaseline,invertScale:this.state.invertScale,priceAxisWidth:this.state.priceAxisWidth},this.stateCache}invalidate(){this.stateCache=null}setLogScale(e){this.setScaleMode(e?`logarithmic`:`regular`)}isLogScale(){return(this.state.scaleMode??(this.state.logScale?`logarithmic`:`regular`))===`logarithmic`}setScaleMode(e){this.state.scaleMode=e,this.state.logScale=e===`logarithmic`,this.invalidate()}getScaleMode(){return this.state.scaleMode??(this.state.logScale?`logarithmic`:`regular`)}setInvertScale(e){this.state.invertScale=e,this.invalidate()}isInvertScale(){return this.state.invertScale===!0}setScaleBaseline(e){this.state.scaleBaseline=e,this.invalidate()}setRightMargin(e){this.rightMarginBars=e}getRightMargin(){return this.rightMarginBars}setPanLimits(e){e.freePan!==void 0&&(this.freePan=e.freePan),e.minVisibleBars!==void 0&&(this.minVisibleBars=Math.max(1,Math.floor(e.minVisibleBars))),this.clampOffset(),this.updateVisibleRange()}endOffset(){let e=this.state.barWidth+this.state.barSpacing;return this.dataLength*e-this.state.chartRect.width+this.rightMarginBars*e}setPriceAxisWidth(e){this.priceAxisWidth!==e&&(this.priceAxisWidth=e,this.state.priceAxisWidth=e,this.invalidate())}computeChartRect(t,n){return{x:0,y:0,width:Math.max(0,t-this.priceAxisWidth),height:Math.max(0,n-e.TIME_AXIS_HEIGHT)}}resize(e,t){this.state.chartRect=this.computeChartRect(e,t),this.invalidate(),this.clampOffset()}setChartRect(e){this.state.chartRect={x:e.x,y:e.y,width:Math.max(0,e.width),height:Math.max(0,e.height)},this.invalidate(),this.clampOffset(),this.updateVisibleRange()}updateData(t,n){let r=this.dataLength===0;this.dataLength=t.length,this.dataLength!==0&&(r&&(this.state.offset=this.endOffset()),this.clampOffset(),this.updateVisibleRange(),n&&(this.state.priceRange=(0,e.computePriceRange)(t,this.state.visibleRange.from,Math.min(this.state.visibleRange.to,this.dataLength-1),.08),this.invalidate()))}setPriceRange(e,t){this.state.priceRange={min:e,max:t},this.invalidate()}scalePriceRange(e){if(!Number.isFinite(e)||e<=0)return;let{min:t,max:n}=this.state.priceRange,r=(t+n)/2,i=(n-t)/2,a=Math.max(i*e,1e-9);this.state.priceRange={min:r-a,max:r+a},this.invalidate()}scrollBy(e){this.state.offset+=e,this.invalidate(),this.clampOffset(),this.updateVisibleRange()}panPriceRange(e){let t=this.state.chartRect.height;if(t<=0||e===0)return;let{min:n,max:r}=this.state.priceRange,i=(this.state.invertScale?-e:e)/t;if(this.isLogScale()&&n>0&&r>0){let e=Math.log(n),t=Math.log(r),a=(t-e)*i;this.state.priceRange={min:Math.exp(e-a),max:Math.exp(t-a)},this.invalidate();return}let a=(r-n)*i;this.state.priceRange={min:n-a,max:r-a},this.invalidate()}isAtEnd(){let e=this.state.barWidth+this.state.barSpacing;return Math.abs(this.state.offset-this.endOffset())<=e*2}scrollToEnd(){this.state.offset=this.endOffset(),this.invalidate(),this.updateVisibleRange()}zoom(t,n){let r=this.state.barWidth,i=(0,e.clamp)(r*(1+t),this.minBarWidth,this.maxBarWidth);if(i===r)return;let a=this.isAtEnd(),o=this.state.barWidth+this.state.barSpacing,s=(this.state.offset+n)/o;this.state.barWidth=i;let c=i+this.state.barSpacing;this.state.offset=a?this.endOffset():s*c-n,this.invalidate(),this.clampOffset(),this.updateVisibleRange()}zoomToBarRange(t,n){let r=this.state.chartRect.width;if(r<=0||!Number.isFinite(t)||!Number.isFinite(n)||n<t)return;let i=n-t+1;this.state.barWidth=(0,e.clamp)(r/i-this.state.barSpacing,this.minBarWidth,this.maxBarWidth);let a=this.state.barWidth+this.state.barSpacing;this.state.offset=(t+n+1)/2*a-r/2,this.invalidate(),this.clampOffset(),this.updateVisibleRange()}clampOffset(){if(this.state.chartRect.width<=0)return;let t=this.state.barWidth+this.state.barSpacing,n=this.state.chartRect.width,r=this.endOffset(),i,a;if(this.freePan&&this.dataLength>0){let e=Math.min(this.minVisibleBars,this.dataLength);i=e*t-n,a=(this.dataLength-e)*t,i=Math.min(i,r),a=Math.max(a,r)}else if(r>0)i=-(n*.5),a=r;else{let e=n*.5;i=r-e,a=r+e}this.state.offset=(0,e.clamp)(this.state.offset,i,a),this.invalidate()}updateVisibleRange(){let e=this.state.barWidth+this.state.barSpacing;if(e<=0||this.state.chartRect.width<=0)return;let t=Math.floor(this.state.offset/e),n=Math.ceil(this.state.chartRect.width/e)+1,r=Math.min(t+n,this.dataLength-1);this.state.visibleRange={from:Math.max(0,t),to:Math.max(0,r)},this.invalidate()}};function C(t,n){return(0,e.sliceVisibleData)(t,n.visibleRange.from,n.visibleRange.to)}var w=[`1D`,`5D`,`1M`,`3M`,`6M`,`YTD`,`1Y`,`5Y`,`All`],T=864e5,E=6e4,D={"1M":1,"3M":3,"6M":6,"1Y":12,"5Y":60};function O(e,t){let n=new Date(e),r=n.getUTCFullYear(),i=n.getUTCMonth()+t,a=new Date(Date.UTC(r,i+1,0)).getUTCDate();return Date.UTC(r,i,Math.min(n.getUTCDate(),a),n.getUTCHours(),n.getUTCMinutes(),n.getUTCSeconds(),n.getUTCMilliseconds())}function k(e,t){let n=new Date(e),r=n.getMonth()+t,i=new Date(n.getFullYear(),r+1,0).getDate();return new Date(n.getFullYear(),r,Math.min(n.getDate(),i),n.getHours(),n.getMinutes(),n.getSeconds(),n.getMilliseconds()).getTime()}function A(e,t,n=0){if(e===`All`)return null;if(e===`1D`)return t-T;if(e===`5D`)return t-5*T;let r=D[e]??0;if(n===null)return e===`YTD`?new Date(new Date(t).getFullYear(),0,1).getTime():k(t,-r);let i=n*E,a=t+i;return e===`YTD`?Date.UTC(new Date(a).getUTCFullYear(),0,1)-i:O(a,-r)-i}var ee=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,c=o/2,l=o+n.barSpacing,u=-n.offset+n.chartRect.x+c,{min:d,max:f}=n.priceRange;if(f-d===0)return;let p=e=>e*l+u,m=s(n),h=new Path2D,g=new Path2D,_=new Path2D,v=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=p(e),i=m(n.high),a=m(n.low),s=m(n.open),l=m(n.close),u=n.close>=n.open,d=u?h:g;d.moveTo(r,i),d.lineTo(r,a);let f=Math.min(s,l),y=Math.max(Math.abs(l-s),1);(u?_:v).rect(r-c,f,o,y)}e.strokeStyle=r.candleUpWick,e.lineWidth=1,e.stroke(h),e.strokeStyle=r.candleDownWick,e.stroke(g),e.fillStyle=r.candleUp,e.fill(_),e.fillStyle=r.candleDown,e.fill(v)}};function te(e,t,n){if(t>=e){let t=Array(Math.max(0,e));for(let n=0;n<e;n++)t[n]=n;return t}if(t<=2)return e>=2?[0,e-1]:e===1?[0]:[];let r=[0],i=(e-2)/(t-2),a=0;for(let o=0;o<t-2;o++){let t=Math.floor((o+1)*i)+1,s=Math.floor((o+2)*i)+1;s>e&&(s=e);let c=0,l=0,u=0;for(let e=t;e<s;e++)c+=e,l+=n(e),u++;if(u>0)c/=u,l/=u;else{let r=Math.min(t,e-1);c=r,l=n(r)}let d=Math.floor(o*i)+1,f=Math.floor((o+1)*i)+1,p=n(a),m=-1,h=d;for(let e=d;e<f;e++){let t=Math.abs((a-c)*(n(e)-p)-(a-e)*(l-p));t>m&&(m=t,h=e)}r.push(h),a=h}return r.push(e-1),r}var ne=64;function re(e,t,n,r,i){let a=Math.max(0,e),o=Math.min(t,n-1);if(o<a)return[];let s=o-a+1,c=Math.max(ne,Math.ceil(r*2));if(s<=c){let e=Array(s);for(let t=0;t<s;t++)e[t]=a+t;return e}let l=te(s,c,e=>i(a+e));for(let e=0;e<l.length;e++)l[e]+=a;return l}var ie=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let o=n.barWidth+n.barSpacing,c=-n.offset+n.chartRect.x+n.barWidth/2,{min:l,max:u}=n.priceRange;if(u-l===0)return;let d=s(n);e.beginPath(),e.strokeStyle=r.lineColor,e.lineWidth=2,e.lineJoin=`round`;let f=re(i,a,t.length,n.chartRect.width,e=>t[e].close),p=!1;for(let n of f){let r=n*o+c,i=d(t[n].close);p?e.lineTo(r,i):(e.moveTo(r,i),p=!0)}e.stroke()}},ae=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let o=n.barWidth+n.barSpacing,c=-n.offset+n.chartRect.x+n.barWidth/2,{min:l,max:u}=n.priceRange;if(u-l===0)return;let d=s(n),f=d(l),p=re(i,a,t.length,n.chartRect.width,e=>t[e].close);if(p.length===0)return;let m=p[0],h=m*o+c,g=d(t[m].close),_=e.createLinearGradient(0,d(u),0,f);_.addColorStop(0,r.areaTopColor),_.addColorStop(1,r.areaBottomColor),e.beginPath(),e.moveTo(h,f),e.lineTo(h,g);let v=h;for(let n=1;n<p.length;n++){let r=p[n];v=r*o+c,e.lineTo(v,d(t[r].close))}e.lineTo(v,f),e.closePath(),e.fillStyle=_,e.fill(),e.beginPath(),e.strokeStyle=r.lineColor,e.lineWidth=2,e.lineJoin=`round`,e.moveTo(h,g);for(let n=1;n<p.length;n++){let r=p[n];e.lineTo(r*o+c,d(t[r].close))}e.stroke()}},oe=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,c=o/2,l=o+n.barSpacing,u=-n.offset+n.chartRect.x+c,{min:d,max:f}=n.priceRange;if(f-d===0)return;let p=e=>e*l+u,m=s(n),h=new Path2D,g=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=p(e),i=n.close>=n.open?h:g,a=m(n.high),o=m(n.low),s=m(n.open),l=m(n.close);i.moveTo(r,a),i.lineTo(r,o),i.moveTo(r-c,s),i.lineTo(r,s),i.moveTo(r,l),i.lineTo(r+c,l)}e.lineWidth=1,e.strokeStyle=r.candleUp,e.stroke(h),e.strokeStyle=r.candleDown,e.stroke(g)}},se=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,c=o/2,l=o+n.barSpacing,u=-n.offset+n.chartRect.x+c,{min:d,max:f}=n.priceRange;if(f-d===0)return;let p=e=>e*l+u,m=s(n),h=new Path2D,g=new Path2D,_=[],v=[],y=new Path2D,b=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=p(e),i=n.close>=n.open,a=e===0||n.close>=t[e-1].close,s=m(n.high),l=m(n.low),u=m(n.open),d=m(n.close),f=Math.min(u,d),x=Math.max(Math.abs(d-u),1),S=a?h:g;S.moveTo(r,s),S.lineTo(r,l),i?(a?_:v).push({x:r-c,y:f,w:o,h:x}):(a?y:b).rect(r-c,f,o,x)}e.lineWidth=1,e.strokeStyle=r.candleUp,e.stroke(h),e.strokeStyle=r.candleDown,e.stroke(g),e.fillStyle=r.candleUp,e.fill(y),e.fillStyle=r.candleDown,e.fill(b),e.lineWidth=1.5,e.strokeStyle=r.candleUp;for(let t of _)e.strokeRect(t.x,t.y,t.w,t.h);e.strokeStyle=r.candleDown;for(let t of v)e.strokeRect(t.x,t.y,t.w,t.h)}},ce=class{baselinePrice=null;setBaseline(e){this.baselinePrice=e}render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let o=n.barWidth,c=o/2,l=o+n.barSpacing,u=-n.offset+n.chartRect.x+c,{min:d,max:f}=n.priceRange;if(f-d===0)return;let p=e=>e*l+u,m=s(n),h=m(this.baselinePrice??this.computeBaseline(t,i,a)),{chartRect:g}=n,_=[],v=[];for(let e=i;e<=a&&e<t.length;e++)_.push(p(e)),v.push(m(t[e].close));if(_.length<2)return;let y=_.length-1;e.save();let b=m(f),x=m(d),S=new Path2D;S.rect(g.x,Math.min(h,b),g.width,Math.abs(b-h)),e.clip(S);let C=new Path2D;C.moveTo(_[0],h);for(let e=0;e<=y;e++)C.lineTo(_[e],v[e]);C.lineTo(_[y],h),C.closePath(),e.fillStyle=`${r.candleUp}20`,e.fill(C),e.restore(),e.save();let w=new Path2D;w.rect(g.x,Math.min(h,x),g.width,Math.abs(x-h)),e.clip(w);let T=new Path2D;T.moveTo(_[0],h);for(let e=0;e<=y;e++)T.lineTo(_[e],v[e]);T.lineTo(_[y],h),T.closePath(),e.fillStyle=`${r.candleDown}20`,e.fill(T),e.restore();let E=new Path2D,D=new Path2D;for(let e=1;e<=y;e++){let t=(n.invertScale?v[e]>=h:v[e]<=h)?E:D;t.moveTo(_[e-1],v[e-1]),t.lineTo(_[e],v[e])}e.lineWidth=2,e.strokeStyle=r.candleUp,e.stroke(E),e.strokeStyle=r.candleDown,e.stroke(D),e.setLineDash([6,4]),e.strokeStyle=r.textSecondary,e.lineWidth=1;let O=new Path2D;O.moveTo(g.x,h),O.lineTo(g.x+g.width,h),e.stroke(O),e.setLineDash([])}computeBaseline(e,t,n){let r=0,i=0;for(let a=t;a<=n&&a<e.length;a++)r+=e[a].close,i++;return i>0?r/i:0}},le=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,c=o/2,l=o+n.barSpacing,u=-n.offset+n.chartRect.x+c,{min:d,max:f}=n.priceRange;if(f-d===0)return;let p=e=>e*l+u,m=s(n),h=new Path2D,g=new Path2D,_=new Path2D,v=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=p(e),i=n.close>=n.open,a=m(Math.max(n.open,n.close)),s=m(Math.min(n.open,n.close)),l=Math.min(a,s),u=Math.max(Math.abs(s-a),1),d=r-c;i?(h.rect(d,l,o,u),_.rect(d,l,o,u)):(g.rect(d,l,o,u),v.rect(d,l,o,u))}e.fillStyle=r.candleUp,e.fill(h),e.fillStyle=r.candleDown,e.fill(g),e.lineWidth=1,e.strokeStyle=r.candleUp,e.stroke(_),e.strokeStyle=r.candleDown,e.stroke(v)}},ue=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,c=o/2,l=o+n.barSpacing,u=-n.offset+n.chartRect.x+c,{min:d,max:f}=n.priceRange;if(f-d===0)return;let p=e=>e*l+u,m=s(n),h=new Path2D,g=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=p(e),i=n.close>=n.open,o=m(n.high),s=m(n.low),c=i?h:g;if(c.moveTo(r,o),c.lineTo(r,s),e<a&&e+1<t.length){let t=p(e+1),n=i?s:o;c.moveTo(r,n),c.lineTo(t,n)}}e.strokeStyle=r.candleUp,e.lineWidth=3,e.stroke(h),e.strokeStyle=r.candleDown,e.lineWidth=1,e.stroke(g)}},de=class{boxSize=1;setBoxSize(e){this.boxSize=e}render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,c=o/2,l=o+n.barSpacing,u=-n.offset+n.chartRect.x+c,{min:d,max:f}=n.priceRange,p=f-d;if(p===0)return;let m=n.chartRect.height/p,h=e=>e*l+u,g=s(n),_=Math.abs(this.boxSize*m),v=Math.min(c*.8,_*.8)*.5,y=new Path2D,b=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=h(e),i=n.close>=n.open,a=n.high,o=n.low,s=Math.max(1,Math.round((a-o)/this.boxSize));for(let e=0;e<s;e++){let t=g(o+(e+.5)*this.boxSize);i?(y.moveTo(r-v,t-v),y.lineTo(r+v,t+v),y.moveTo(r+v,t-v),y.lineTo(r-v,t+v)):(b.moveTo(r+v,t),b.arc(r,t,v,0,Math.PI*2))}}e.lineWidth=1.5,e.strokeStyle=r.candleUp,e.stroke(y),e.strokeStyle=r.candleDown,e.stroke(b)}},fe=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,{min:o,max:c}=n.priceRange;if(c-o===0||i>a||t.length===0)return;let l=n.barWidth+n.barSpacing,u=-n.offset+n.chartRect.x+n.barWidth/2,d=n.barWidth,f=0;for(let e=i;e<=a&&e<t.length;e++)t[e].volume>f&&(f=t[e].volume);f===0&&(f=1);let p=new Path2D,m=new Path2D,h=new Path2D,g=new Path2D,_=e=>e*l+u,v=s(n);for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=_(e),i=v(n.high),a=v(n.low),o=v(n.open),s=v(n.close),c=n.close>=n.open,l=d*Math.max(.2,n.volume/f),u=l/2,y=c?p:m;y.moveTo(r,i),y.lineTo(r,a);let b=Math.min(o,s),x=Math.max(Math.abs(s-o),1);(c?h:g).rect(r-u,b,l,x)}e.strokeStyle=r.candleUpWick,e.lineWidth=1,e.stroke(p),e.strokeStyle=r.candleDownWick,e.stroke(m),e.fillStyle=r.candleUp,e.fill(h),e.fillStyle=r.candleDown,e.fill(g)}},pe=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,{min:o,max:c}=n.priceRange;if(c-o===0||i>a||t.length===0)return;let l=n.barWidth+n.barSpacing,u=-n.offset+n.chartRect.x+n.barWidth/2,d=n.barWidth,f=0;for(let e=i;e<=a&&e<t.length;e++)t[e].volume>f&&(f=t[e].volume);f===0&&(f=1);let p=new Path2D,m=new Path2D,h=new Path2D,g=new Path2D,_=e=>e*l+u,v=s(n);for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=e>0?t[e-1]:n,i=_(e),a=v(n.high),o=v(n.low),s=n.close>=r.close,c=d*Math.max(.15,n.volume/f),l=c/2,u=Math.min(a,o),y=Math.max(Math.abs(o-a),1),b=s?p:m,x=s?h:g;b.rect(i-l,u,c,y),x.rect(i-l,u,c,y)}e.fillStyle=me(r.candleUp,.55),e.fill(p),e.fillStyle=me(r.candleDown,.55),e.fill(m),e.lineWidth=1,e.strokeStyle=r.candleUpWick,e.stroke(h),e.strokeStyle=r.candleDownWick,e.stroke(g)}};function me(e,t){if(e.startsWith(`#`)){let n=Math.round(Math.max(0,Math.min(1,t))*255).toString(16).padStart(2,`0`);if(e.length===7)return`${e}${n}`;if(e.length===9)return`${e.slice(0,7)}${n}`}return e}var he=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let{min:o,max:c}=n.priceRange;if(c-o===0)return;let l=n.barWidth+n.barSpacing,u=-n.offset+n.chartRect.x+n.barWidth/2,d=e=>e*l+u,f=s(n),p=[],m=[];for(let e=i;e<=a&&e<t.length;e++){let n=d(e);p.push({x:n,y:f(t[e].high)}),m.push({x:n,y:f(t[e].low)})}if(p.length===0)return;let h=e.createLinearGradient(0,f(c),0,f(o));h.addColorStop(0,r.areaTopColor),h.addColorStop(1,r.areaBottomColor),e.beginPath(),e.moveTo(p[0].x,p[0].y);for(let t=1;t<p.length;t++)e.lineTo(p[t].x,p[t].y);for(let t=m.length-1;t>=0;t--)e.lineTo(m[t].x,m[t].y);e.closePath(),e.fillStyle=h,e.fill(),e.beginPath(),e.strokeStyle=r.lineColor,e.lineWidth=2,e.lineJoin=`round`;for(let n=i;n<=a&&n<t.length;n++){let r=d(n),a=f(t[n].close);n===i?e.moveTo(r,a):e.lineTo(r,a)}e.stroke()}},ge=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let{min:o,max:c}=n.priceRange;if(c-o===0)return;let l=n.barWidth+n.barSpacing,u=-n.offset+n.chartRect.x+n.barWidth/2,d=e=>e*l+u,f=s(n);e.beginPath(),e.strokeStyle=r.lineColor,e.lineWidth=2,e.lineJoin=`miter`;let p=0;for(let n=i;n<=a&&n<t.length;n++){let r=d(n),a=f(t[n].close);n===i?e.moveTo(r,a):(e.lineTo(r,p),e.lineTo(r,a)),p=a}e.stroke()}},_e=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let{min:o,max:c}=n.priceRange;if(c-o===0)return;let l=n.barWidth+n.barSpacing,u=-n.offset+n.chartRect.x+n.barWidth/2,d=e=>e*l+u,f=s(n);e.beginPath(),e.strokeStyle=r.lineColor,e.lineWidth=2,e.lineJoin=`round`;let p=[];for(let n=i;n<=a&&n<t.length;n++){let r=d(n),a=f(t[n].close);p.push({x:r,y:a}),n===i?e.moveTo(r,a):e.lineTo(r,a)}e.stroke();let m=Math.max(2,Math.min(4,n.barWidth*.3)),h=new Path2D;for(let{x:e,y:t}of p)h.moveTo(e+m,t),h.arc(e,t,m,0,Math.PI*2);e.fillStyle=r.lineColor,e.fill(h),e.strokeStyle=r.background,e.lineWidth=1,e.stroke(h)}},ve=class{visible=!0;heightRatio=.2;setVisible(e){this.visible=e}setHeightRatio(e){this.heightRatio=Math.max(.05,Math.min(.5,e))}render(e,t,n,r){if(!this.visible||t.length===0)return;let{from:i,to:a}=n.visibleRange,{chartRect:o}=n,s=n.barWidth,c=s/2,l=s+n.barSpacing,u=-n.offset+o.x+c,d=0;for(let e=i;e<=a&&e<t.length;e++)t[e].volume>d&&(d=t[e].volume);if(d===0)return;let f=o.height*this.heightRatio,p=o.y+o.height,m=f/d,h=new Path2D,g=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=e*l+u,i=n.volume*m;(n.close>=n.open?h:g).rect(r-c,p-i,s,i)}e.globalAlpha=.35,e.fillStyle=r.candleUp,e.fill(h),e.fillStyle=r.candleDown,e.fill(g),e.globalAlpha=1}},ye=class{visible=!1;buckets=48;widthRatio=.18;opacity=.32;highlightPoC=!0;setVisible(e){this.visible=e}isVisible(){return this.visible}setBuckets(e){this.buckets=Math.max(8,Math.min(200,Math.floor(e)))}setWidthRatio(e){this.widthRatio=Math.max(.05,Math.min(.5,e))}setOpacity(e){this.opacity=Math.max(.05,Math.min(1,e))}setHighlightPoC(e){this.highlightPoC=e}render(e,t,n,r){if(!this.visible||t.length===0)return;let{from:i,to:a}=n.visibleRange,{chartRect:o,priceRange:l}=n,u=l.max-l.min;if(u<=0)return;let d=new Float64Array(this.buckets),f=new Float64Array(this.buckets),p=new Float64Array(this.buckets);for(let e=i;e<=a&&e<t.length;e++){let n=t[e];if(n.volume<=0)continue;let r=Math.max(n.low,l.min),i=Math.min(n.high,l.max);if(i<=r)continue;let a=(r-l.min)/u,o=(i-l.min)/u,s=Math.max(0,Math.floor(a*this.buckets)),c=Math.min(this.buckets-1,Math.floor(o*this.buckets)),m=Math.max(1,c-s+1),h=n.volume/m,g=n.close>=n.open;for(let e=s;e<=c;e++)d[e]+=h,g?f[e]+=h:p[e]+=h}let m=0,h=-1;for(let e=0;e<d.length;e++)d[e]>m&&(m=d[e],h=e);if(m===0)return;let g=o.width*this.widthRatio,_=o.x+o.width,v=s(n),y=1/m;e.save(),e.globalAlpha=this.opacity;for(let t=0;t<this.buckets;t++){let i=d[t];if(i===0)continue;let a=c(t,this.buckets,n,v),s=i*y*g,l=f[t]*y*g,u=p[t]*y*g;l>0&&(e.fillStyle=r.candleUp,e.fillRect(_-l,a.top+.5,l,a.height-1)),u>0&&(e.fillStyle=r.candleDown,e.fillRect(_-s,a.top+.5,u,a.height-1)),this.highlightPoC&&t===h&&(e.globalAlpha=1,e.strokeStyle=r.crosshair,e.lineWidth=1,e.setLineDash([3,2]),e.beginPath(),e.moveTo(o.x,a.mid+.5),e.lineTo(_-s-2,a.mid+.5),e.stroke(),e.setLineDash([]),e.globalAlpha=this.opacity)}e.restore()}};function be(e,t){return e<0?0:e>t?t:e}function xe(e,t,n,r={}){let i=Math.max(4,Math.min(500,Math.floor(r.buckets??48))),a=n-t;if(a<=0||e.length===0)return null;let o=a/i,s=new Float64Array(i);for(let r of e){let e=Math.min(r.low,r.high),a=Math.max(r.low,r.high);if(a<t||e>n)continue;let c=be(Math.floor((e-t)/o),i-1),l=be(Math.floor((a-t)/o),i-1);for(let e=c;e<=l;e++)s[e]+=1}let c=0,l=0,u=0;for(let e=0;e<i;e++)u+=s[e],s[e]>l&&(l=s[e],c=e);if(u===0)return null;let d=u*(r.valueAreaPct??.7),f=c,p=c,m=s[c];for(;m<d&&(f>0||p<i-1);){let e=f>0?s[f-1]:-1;(p<i-1?s[p+1]:-1)>=e?(p+=1,m+=s[p]):(--f,m+=s[f])}let h=[];for(let e=0;e<i;e++){let n=t+e*o;h.push({low:n,high:n+o,mid:n+o/2,count:s[e]})}return{buckets:h,pocIndex:c,maxCount:l,totalCount:u,valueAreaLow:t+f*o,valueAreaHigh:t+(p+1)*o}}function Se(e){let t=(e%52+52)%52;return t<26?String.fromCharCode(65+t):String.fromCharCode(97+t-26)}function Ce(e,t,n,r=48){let i=Math.max(4,Math.min(500,Math.floor(r))),a=n-t,o=Array.from({length:i},()=>[]);if(a<=0)return o;let s=a/i;return e.forEach((e,r)=>{let a=Math.min(e.low,e.high),c=Math.max(e.low,e.high);if(c<t||a>n)return;let l=Math.max(0,Math.min(i-1,Math.floor((a-t)/s))),u=Math.max(0,Math.min(i-1,Math.floor((c-t)/s)));for(let e=l;e<=u;e++)o[e].push(r)}),o}function we(t,n,r,i={}){if(t.length===0||r-n<=0)return[];let a=[],o=0,s=(0,e.timeframeBucketStart)(t[0].time,`1d`),c=(e,o,s)=>{let c=xe(t.slice(e,o+1),n,r,i);c&&a.push({startIndex:e,endIndex:o,startTime:s,profile:c})};for(let n=1;n<t.length;n++){let r=(0,e.timeframeBucketStart)(t[n].time,`1d`);r!==s&&(c(o,n-1,s),o=n,s=r)}return c(o,t.length-1,s),a}var Te=class{visible=!1;buckets=48;widthRatio=.18;opacity=.32;valueAreaPct=.7;highlightPoC=!0;showStats=!0;splitBySession=!1;letters=!1;lastStats=null;setVisible(e){this.visible=e,e||(this.lastStats=null)}isVisible(){return this.visible}setBuckets(e){this.buckets=Math.max(8,Math.min(200,Math.floor(e)))}setWidthRatio(e){this.widthRatio=Math.max(.05,Math.min(.5,e))}setOpacity(e){this.opacity=Math.max(.05,Math.min(1,e))}setValueAreaPct(e){this.valueAreaPct=Math.max(.3,Math.min(.95,e))}setHighlightPoC(e){this.highlightPoC=e}setShowStats(e){this.showStats=e}setSplitBySession(e){this.splitBySession=e}isSplitBySession(){return this.splitBySession}setLetters(e){this.letters=e}getStats(){return this.lastStats}render(e,t,n,r){if(!this.visible||t.length===0)return;let{from:i,to:a}=n.visibleRange,{chartRect:o,priceRange:l}=n,u=Math.max(0,i),d=Math.min(a,t.length-1);if(d<u)return;let f=t.slice(u,d+1);if(this.splitBySession){this.lastStats=null,this.renderSplit(e,f,u,n,r);return}let p=xe(f,l.min,l.max,{buckets:this.buckets,valueAreaPct:this.valueAreaPct});if(!p){this.lastStats=null;return}let m=p.buckets[p.pocIndex].mid;this.lastStats={poc:m,vah:p.valueAreaHigh,val:p.valueAreaLow,valueAreaPct:this.valueAreaPct};let h=p.buckets.length,g=o.width*this.widthRatio,_=o.x,v=s(n),y=1/p.maxCount;e.save();for(let t=0;t<h;t++){let i=p.buckets[t];if(i.count===0)continue;let a=c(t,h,n,v),o=i.count*y*g,s=i.mid>=p.valueAreaLow&&i.mid<=p.valueAreaHigh;e.globalAlpha=s?Math.min(1,this.opacity+.18):this.opacity,e.fillStyle=s?r.candleUp:r.textSecondary,e.fillRect(_,a.top+.5,o,a.height-1)}e.globalAlpha=.6,e.strokeStyle=r.candleUp,e.lineWidth=1,e.setLineDash([1,3]);for(let t of[p.valueAreaHigh,p.valueAreaLow]){let n=v(t);e.beginPath(),e.moveTo(_,Math.round(n)+.5),e.lineTo(o.x+o.width,Math.round(n)+.5),e.stroke()}if(e.setLineDash([]),this.highlightPoC){let t=v(m);e.globalAlpha=1,e.strokeStyle=r.crosshair,e.lineWidth=1,e.setLineDash([3,2]),e.beginPath(),e.moveTo(_,Math.round(t)+.5),e.lineTo(o.x+o.width,Math.round(t)+.5),e.stroke(),e.setLineDash([])}this.showStats&&this.drawStats(e,o.x+6,o.y+6,m,p.valueAreaHigh,p.valueAreaLow,r),e.restore()}renderSplit(e,t,n,r,i){let{chartRect:o,priceRange:l}=r,u=we(t,l.min,l.max,{buckets:this.buckets,valueAreaPct:this.valueAreaPct});if(u.length===0)return;let d=s(r),f=r.barWidth/2;e.save();for(let s of u){let u=s.profile,p=u.buckets.length,m=o.height/p,h=a(n+s.startIndex,r)-f,g=a(n+s.endIndex,r)+f,_=Math.max(2,g-h),v=1/u.maxCount,y=this.letters&&m>=7,b=y?Ce(t.slice(s.startIndex,s.endIndex+1),l.min,l.max,this.buckets):null;if(y&&b){e.font=`${Math.min(11,Math.floor(m))}px ui-monospace, monospace`,e.textBaseline=`middle`,e.textAlign=`left`;let t=Math.max(1,Math.floor(_/6));for(let n=0;n<p;n++){let a=b[n];if(a.length===0)continue;let o=c(n,p,r,d).mid,s=u.buckets[n].mid>=u.valueAreaLow&&u.buckets[n].mid<=u.valueAreaHigh;e.globalAlpha=s?.95:.6,e.fillStyle=s?i.candleUp:i.textSecondary;let l=Math.min(a.length,t);for(let t=0;t<l;t++)e.fillText(Se(a[t]),h+t*6,o)}}else for(let t=0;t<p;t++){let n=u.buckets[t];if(n.count===0)continue;let a=c(t,p,r,d),o=n.count*v*_,s=n.mid>=u.valueAreaLow&&n.mid<=u.valueAreaHigh;e.globalAlpha=s?Math.min(1,this.opacity+.18):this.opacity,e.fillStyle=s?i.candleUp:i.textSecondary,e.fillRect(h,a.top+.5,o,a.height-1)}if(this.highlightPoC){let t=d(u.buckets[u.pocIndex].mid);e.globalAlpha=1,e.strokeStyle=i.crosshair,e.lineWidth=1,e.setLineDash([3,2]),e.beginPath(),e.moveTo(h,Math.round(t)+.5),e.lineTo(Math.min(g,o.x+o.width),Math.round(t)+.5),e.stroke(),e.setLineDash([])}}e.restore()}drawStats(e,t,n,r,i,a,o){let s=Ee(r),c=[[`POC`,r.toFixed(s),o.crosshair],[`VAH`,i.toFixed(s),o.candleUp],[`VAL`,a.toFixed(s),o.candleUp]];e.globalAlpha=1,e.font=`600 10px ${o.font.family}`,e.textBaseline=`middle`;let l=0;for(let[,t]of c)l=Math.max(l,e.measureText(t).width);let u=38+l,d=6+c.length*14;e.fillStyle=o.background,e.globalAlpha=.82,De(e,t,n,u,d,4),e.fill(),e.globalAlpha=1,c.forEach(([r,i,a],s)=>{let c=n+6/2+14/2+s*14;e.fillStyle=a,e.textAlign=`left`,e.fillText(r,t+6,c),e.fillStyle=o.text,e.textAlign=`right`,e.fillText(i,t+u-6,c)}),e.textAlign=`left`}};function Ee(e){let t=Math.abs(e);return t>=1e3?2:t>=1?4:6}function De(e,t,n,r,i,a){e.beginPath(),e.moveTo(t+a,n),e.arcTo(t+r,n,t+r,n+i,a),e.arcTo(t+r,n+i,t,n+i,a),e.arcTo(t,n+i,t,n,a),e.arcTo(t,n,t+r,n,a),e.closePath()}function Oe(t,n){let r=n===`day`?`1d`:`1w`,i=[];for(let n of t){let t=(0,e.timeframeBucketStart)(n.time,r),a=i[i.length-1];a&&a.key===t?(a.high=Math.max(a.high,n.high),a.low=Math.min(a.low,n.low),a.close=n.close):i.push({key:t,open:n.open,high:n.high,low:n.low,close:n.close})}return i}function ke(e,t=`day`){let n=Oe(e,t);if(n.length<2)return[];let r=n[n.length-2],i=n[n.length-1],a=t===`day`?`D`:`W`;return[{id:`p${a}h`,label:`P${a}H`,price:r.high},{id:`p${a}c`,label:`P${a}C`,price:r.close},{id:`p${a}l`,label:`P${a}L`,price:r.low},{id:`open`,label:t===`day`?`Day Open`:`Week Open`,price:i.open}]}var Ae=class{visible=!1;period=`day`;setVisible(e){this.visible=e}isVisible(){return this.visible}setPeriod(e){this.period=e}getPeriod(){return this.period}render(e,t,n,r){if(!this.visible||t.length===0)return;let i=ke(t,this.period);if(i.length===0)return;let{chartRect:a}=n,s=a.y,c=a.y+a.height;e.save(),e.font=`600 10px ${r.font.family}`,e.textBaseline=`middle`;for(let t of i){let i=o(t.price,n);if(i<s||i>c)continue;let l=je(t,r);e.strokeStyle=l,e.globalAlpha=.7,e.lineWidth=1,e.setLineDash([5,4]),e.beginPath(),e.moveTo(a.x,Math.round(i)+.5),e.lineTo(a.x+a.width,Math.round(i)+.5),e.stroke(),e.setLineDash([]),e.globalAlpha=1;let u=t.label,d=e.measureText(u).width,f=a.x+a.width-d-10;e.fillStyle=r.background,e.globalAlpha=.85,e.fillRect(f-4,i-7,d+8,14),e.globalAlpha=1,e.fillStyle=l,e.textAlign=`left`,e.fillText(u,f,i+.5)}e.restore()}};function je(e,t){return e.id.endsWith(`h`)?t.candleUp:e.id.endsWith(`l`)?t.candleDown:t.textSecondary}function Me(e){let t,n;return e.map(e=>{let r;return e.type===`high`?(r=t===void 0||e.price>t?`HH`:`LH`,t=e.price):(r=n===void 0||e.price<n?`LL`:`HL`,n=e.price),{...e,label:r}})}function Ne(e,t=5,n=5){let r=Math.max(1,Math.floor(t)),i=Math.max(1,Math.floor(n)),a=[];for(let t=r;t<e.length-i;t++){let n=e[t].high,o=e[t].low,s=!0,c=!0;for(let a=t-r;a<=t+i&&!(a!==t&&(e[a].high>=n&&(s=!1),e[a].low<=o&&(c=!1),!s&&!c));a++);s?a.push({index:t,price:n,type:`high`}):c&&a.push({index:t,price:o,type:`low`})}return a}var Pe=class{visible=!1;left=5;right=5;showLabels=!1;structureLabels=!1;setVisible(e){this.visible=e}isVisible(){return this.visible}setStrength(e,t){this.left=Math.max(1,Math.floor(e)),this.right=Math.max(1,Math.floor(t))}setShowLabels(e){this.showLabels=e}setStructureLabels(e){this.structureLabels=e}render(e,t,n,r){if(!this.visible||t.length===0)return;let i=Ne(t,this.left,this.right);if(i.length===0)return;let s=this.structureLabels?Me(i):i,{from:c,to:l}=n.visibleRange;e.save(),e.font=`10px ${r.font.family}`,e.textAlign=`center`;for(let t of s){if(t.index<c-1||t.index>l+1)continue;let i=a(t.index,n),s=o(t.price,n),u=t.type===`high`,d=u?r.candleDown:r.candleUp,f=u!==(n.invertScale===!0),p=f?s-8:s+8;e.fillStyle=d,e.beginPath(),f?(e.moveTo(i-5,p-5),e.lineTo(i+5,p-5),e.lineTo(i,p)):(e.moveTo(i-5,p+5),e.lineTo(i+5,p+5),e.lineTo(i,p)),e.closePath(),e.fill();let m=this.structureLabels&&`label`in t?String(t.label):this.showLabels?Fe(t.price):null;m&&(e.textBaseline=f?`bottom`:`top`,e.fillText(m,i,f?p-5-1:p+5+1))}e.restore()}};function Fe(e){let t=Math.abs(e);return t>=1e3||t>=1?e.toFixed(2):e.toPrecision(4)}var Ie=class{buffer=[];constructor(e=240){this.capacity=e,this.capacity=Math.max(1,Math.floor(e))}push(e,t){let n={time:e,bids:t.bids.map(e=>({...e})),asks:t.asks.map(e=>({...e}))},r=this.buffer[this.buffer.length-1];r&&r.time===e?this.buffer[this.buffer.length-1]=n:(this.buffer.push(n),this.buffer.length>this.capacity&&(this.buffer=this.buffer.slice(this.buffer.length-this.capacity)))}snapshots(){return this.buffer}maxVolume(){let e=0;for(let t of this.buffer){for(let n of t.bids)n.volume>e&&(e=n.volume);for(let n of t.asks)n.volume>e&&(e=n.volume)}return e}setCapacity(e){this.capacity=Math.max(1,Math.floor(e)),this.buffer.length>this.capacity&&(this.buffer=this.buffer.slice(this.buffer.length-this.capacity))}clear(){this.buffer=[]}get size(){return this.buffer.length}},Le=class{buffer=new Ie(240);visible=!1;opacity=.7;setVisible(e){this.visible=e}isVisible(){return this.visible}setOpacity(e){this.opacity=Math.max(.1,Math.min(1,e))}setCapacity(e){this.buffer.setCapacity(e)}push(e,t){this.buffer.push(e,t)}clear(){this.buffer.clear()}render(e,t,n){if(!this.visible)return;let r=this.buffer.snapshots();if(r.length===0)return;let i=this.buffer.maxVolume();if(i<=0)return;let a=1/i,{chartRect:o}=t,s=Math.max(2,t.barWidth+t.barSpacing),c=o.x,l=o.x+o.width,u=o.y,d=o.y+o.height;e.save();for(let i of r){let r=_(i.time,t);if(r<c-s||r>l+s)continue;let o=r-s/2;this.drawSide(e,i.bids,n.candleUp,o,s,t,a,u,d),this.drawSide(e,i.asks,n.candleDown,o,s,t,a,u,d)}e.restore()}drawSide(e,t,n,r,i,a,s,c,l){if(t.length===0)return;let u=Re(t,a);e.fillStyle=n;for(let n of t){let t=o(n.price,a);t<c-u||t>l+u||(e.globalAlpha=Math.min(1,Math.sqrt(n.volume*s))*this.opacity,e.fillRect(r,t-u/2,i,u))}e.globalAlpha=1}};function Re(e,t){if(e.length<2)return 3;let n=e.map(e=>e.price).sort((e,t)=>e-t),r=[];for(let e=1;e<n.length;e++){let t=n[e]-n[e-1];t>0&&r.push(t)}if(r.length===0)return 3;r.sort((e,t)=>e-t);let i=r[Math.floor(r.length/2)],a=Math.abs(o(n[0],t)-o(n[0]+i,t));return Math.max(2,Math.min(a,12))}var ze=class{symbols=new Map;mode=`percent`;setMode(e){this.mode=e}addSymbol(e){this.symbols.set(e.id,e)}removeSymbol(e){this.symbols.delete(e)}setSymbolData(e,t){let n=this.symbols.get(e);n&&(n.data=t)}setSymbolVisible(e,t){let n=this.symbols.get(e);n&&(n.visible=t)}getSymbols(){return Array.from(this.symbols.values())}clear(){this.symbols.clear()}render(e,t,n,r){if(this.symbols.size===0||t.length===0)return;let{chartRect:i}=n;e.save(),e.beginPath(),e.rect(i.x,i.y,i.width,i.height),e.clip();for(let i of this.symbols.values())!i.visible||i.data.length===0||this.renderSymbol(e,i,t,n,r);e.restore()}renderSymbol(e,t,n,r,i){let{chartRect:s}=r,c=r.barWidth+r.barSpacing,l=Math.max(0,Math.floor(r.offset/c));if(l>=n.length||l>=t.data.length)return;let u=n[l].close,d=t.data[l].close;if(u===0||d===0)return;e.strokeStyle=t.color,e.lineWidth=t.lineWidth??1.5,e.lineJoin=`round`,e.beginPath();let f=!1,p=Math.min(n.length,t.data.length);for(let n=l;n<p;n++){let i=a(n,r);if(i<s.x-c)continue;if(i>s.x+s.width+c)break;let l;l=this.mode===`percent`?o(u*(1+(t.data[n].close-d)/d),r):o(t.data[n].close,r),f?e.lineTo(i,l):(e.moveTo(i,l),f=!0)}if(e.stroke(),f){let n=Math.min(l+2,p-1),i=a(n,r)+4,s;s=this.mode===`percent`?o(u*(1+(t.data[n].close-d)/d),r)-4:o(t.data[n].close,r)-4,e.fillStyle=t.color,e.font=`bold 10px sans-serif`,e.textBaseline=`bottom`,e.textAlign=`left`,e.fillText(t.label,i,s)}}};function Be(e){if(e.length===0)return[];let t=[],n=e[0].open,r=(e[0].open+e[0].high+e[0].low+e[0].close)/4;for(let i=0;i<e.length;i++){let a=e[i],o=(a.open+a.high+a.low+a.close)/4,s=i===0?a.open:(n+r)/2,c=Math.max(a.high,s,o),l=Math.min(a.low,s,o);t.push({time:a.time,open:s,high:c,low:l,close:o,volume:a.volume}),n=s,r=o}return t}function Ve(e,t){if(e.length===0)return[];let n=t.brickSize;t.useATR&&e.length>(t.atrPeriod??14)&&(n=He(e,t.atrPeriod??14)),n<=0&&(n=1);let r=[],i=Math.round(e[0].close/n)*n,a=e[0].time;for(let t=1;t<e.length;t++){let o=e[t].close-i,s=Math.floor(Math.abs(o)/n);if(s>=1){let c=o>0?1:-1;for(let o=0;o<s;o++){let o=i;i+=c*n,r.push({time:a++,open:o,high:Math.max(o,i),low:Math.min(o,i),close:i,volume:e[t].volume/s})}}}return r}function He(e,t){let n=0;for(let r=1;r<=Math.min(t,e.length-1);r++){let t=Math.max(e[r].high-e[r].low,Math.abs(e[r].high-e[r-1].close),Math.abs(e[r].low-e[r-1].close));n+=t}return n/t}function Ue(e,t=3){if(e.length===0)return[];let n=[],r=0;n.push({time:r++,open:e[0].open,high:Math.max(e[0].open,e[0].close),low:Math.min(e[0].open,e[0].close),close:e[0].close,volume:e[0].volume});for(let i=1;i<e.length;i++){let a=e[i].close,o=n[n.length-1],s=o.close>=o.open,c=Math.min(t,n.length),l=-1/0,u=1/0;for(let e=n.length-c;e<n.length;e++)l=Math.max(l,n[e].high),u=Math.min(u,n[e].low);s&&a>o.close?n.push({time:r++,open:o.close,high:a,low:o.close,close:a,volume:e[i].volume}):!s&&a<o.close||s&&a<u?n.push({time:r++,open:o.close,high:o.close,low:a,close:a,volume:e[i].volume}):!s&&a>l&&n.push({time:r++,open:o.close,high:a,low:o.close,close:a,volume:e[i].volume})}return n}function We(e,t=4){if(e.length<2)return e.slice();let n=[],r=e[1].close>=e[0].close?1:-1,i=e[0].close,a=e[0].close,o=e[0].close,s=0;for(let c=1;c<e.length;c++){let l=e[c].close,u=t/100*o;r===1?(l>i&&(i=l),i-l>=u&&(n.push({time:s++,open:o,high:i,low:o,close:i,volume:e[c].volume}),r=-1,o=i,a=l,i=l)):(l<a&&(a=l),l-a>=u&&(n.push({time:s++,open:o,high:o,low:a,close:a,volume:e[c].volume}),r=1,o=a,i=l,a=l))}return r===1?n.push({time:s,open:o,high:i,low:o,close:i,volume:0}):n.push({time:s,open:o,high:o,low:a,close:a,volume:0}),n}function Ge(e,t,n=3){if(e.length===0||t<=0)return[];let r=[],i=0,a=0,o=0,s=0,c=Math.round(e[0].close/t)*t;a=c,o=c,i=1;for(let c=1;c<e.length;c++){let l=e[c].close,u=Math.round(l/t)*t;i===1?u>a?a=u:a-u>=t*n&&(r.push({time:s++,open:o,high:a,low:o,close:a,volume:e[c].volume}),i=-1,o=u,a-=t):u<o?o=u:u-o>=t*n&&(r.push({time:s++,open:a,high:a,low:o,close:o,volume:e[c].volume}),i=1,a=u,o+=t)}return r.push({time:s,open:i===1?o:a,high:a,low:o,close:i===1?a:o,volume:0}),r}function Ke(e,t){if(e.length===0||t.rangeSize<=0)return[];let n=[],r=e[0].time,i=e[0].open,a=i,o=i,s=0,c=(e,c)=>{for(e>a&&(a=e),e<o&&(o=e),s+=c;a-o>=t.rangeSize;){let c=e>=i,l=c?i+t.rangeSize:i-t.rangeSize;n.push({time:r++,open:i,high:c?l:i,low:c?i:l,close:l,volume:s}),i=l,a=l,o=l,s=0}};for(let t of e){let e=t.close>=t.open?[t.low,t.high,t.close]:[t.high,t.low,t.close],n=t.volume/e.length;for(let t of e)c(t,n)}return n}var j=class{canResume(e,t,n){let r=t.series;if(!r||n<=0||n>r.length||r.length>e.length)return!1;for(let i=n;i<r.length;i++)if(r[i]&&!t.values.has(e[i].time))return!1;return!0}writePoint(e,t,n,r){e.series[n]=r,r?e.values.set(t[n].time,r):e.values.delete(t[n].time)}drawLine(e,t,n,r){if(!(t.length<2)){e.beginPath(),e.strokeStyle=n,e.lineWidth=r,e.lineJoin=`round`,e.moveTo(t[0].x,t[0].y);for(let n=1;n<t.length;n++)e.lineTo(t[n].x,t[n].y);e.stroke()}}drawBand(e,t,n,r){if(!(t.length<2||n.length<2)){e.beginPath(),e.moveTo(t[0].x,t[0].y);for(let n=1;n<t.length;n++)e.lineTo(t[n].x,t[n].y);for(let t=n.length-1;t>=0;t--)e.lineTo(n[t].x,n[t].y);e.closePath(),e.fillStyle=r,e.fill()}}drawHistogram(e,t,n){let r=n/2;for(let i of t){e.fillStyle=i.color;let t=Math.min(i.y,i.baseY),a=Math.abs(i.y-i.baseY);e.fillRect(i.x-r,t,n,Math.max(a,1))}}valuesToPoints(e,t,n,r){let i=[],{from:s,to:c}=r.visibleRange;for(let l=s;l<=c&&l<n.length;l++){let s=e.values.get(n[l].time);s&&s[t]!==void 0&&i.push({x:a(l,r),y:o(s[t],r)})}return i}},qe=1,Je=class{registry=new Map;instances=new Map;register(e){this.registry.set(e.descriptor.id,e)}getAvailableIndicators(){return Array.from(this.registry.values()).map(e=>e.descriptor)}addIndicator(t,n={},r){let i=this.registry.get(t);if(!i)throw Error(`Unknown indicator: ${t}`);let a=`tc_${t}_${qe++}`,o={id:t,instanceId:a,params:{...i.descriptor.defaultConfig,...n},visible:!0},s=new Set;for(let e of this.instances.values())e.config.id===t&&s.add(e.style.colors[0]);let c=e.TC_SERIES_COLORS.findIndex(e=>!s.has(e));c<0&&(c=s.size%e.TC_SERIES_COLORS.length);let l={plugin:i,config:o,output:null,style:{colors:o.style?.colors??[...e.TC_SERIES_COLORS.slice(c),...e.TC_SERIES_COLORS.slice(0,c)],lineWidths:o.style?.lineWidths??[1.5],opacity:o.style?.opacity??1}};return r&&(l.output=i.calculate(r,o)),this.instances.set(a,l),a}removeIndicator(e){this.instances.delete(e)}updateIndicator(e,t,n){let r=this.instances.get(e);r&&(Object.assign(r.config.params,t),n&&(r.output=r.plugin.calculate(n,r.config)))}recalculateAll(e){for(let t of this.instances.values())t.output=t.plugin.calculate(e,t.config)}recalculateFrom(e,t){for(let n of this.instances.values()){let r=n.output,i=null;r&&n.plugin.update&&t>0&&(i=n.plugin.update(e,n.config,r,t)),n.output=i??n.plugin.calculate(e,n.config)}}getOutput(e){return this.instances.get(e)?.output??null}renderOverlays(e,t){for(let n of this.instances.values())!n.output||!n.config.visible||n.plugin.descriptor.placement===`overlay`&&n.plugin.render(e,n.output,t,n.style)}renderPanel(e,t,n){let r=this.instances.get(t);!r?.output||!r.config.visible||r.plugin.render(e,r.output,n,r.style)}getIndicatorConfig(e){return this.instances.get(e)?.config??null}setVisible(e,t){let n=this.instances.get(e);return n?(n.config.visible=t,t):null}isVisible(e){return this.instances.get(e)?.config.visible??!1}getIndicatorDescriptor(e){return this.instances.get(e)?.plugin.descriptor??null}getActiveIndicators(){let e=[];for(let[t,n]of this.instances)e.push({instanceId:t,id:n.config.id,params:{...n.config.params},descriptor:n.plugin.descriptor,visible:n.config.visible??!0});return e}getIndicatorStyle(e){let t=this.instances.get(e)?.style;return t?{colors:[...t.colors],lineWidths:[...t.lineWidths],opacity:t.opacity}:null}updateIndicatorStyle(e,t){let n=this.instances.get(e);n&&Object.assign(n.style,t)}getOverlayPriceRange(e,t){let n=1/0,r=-1/0;for(let i of this.instances.values()){if(!i.output||!i.config.visible||i.plugin.descriptor.placement!==`overlay`)continue;let a=i.output.series;if(!a)continue;let o=Math.min(t,a.length-1);for(let t=Math.max(0,e);t<=o;t++){let e=a[t];if(e)for(let t in e){let i=e[t];i!==void 0&&isFinite(i)&&(i<n&&(n=i),i>r&&(r=i))}}}return n===1/0?null:{min:n,max:r}}getPanelIndicators(){let e=[];for(let[t,n]of this.instances)n.plugin.descriptor.placement===`panel`&&e.push({instanceId:t,descriptor:n.plugin.descriptor});return e}},M=class extends Map{keyBuf=[];valBuf=[];folded=!1;constructor(){super()}set(e,t){if(this.folded)return super.set(e,t);let n=this.keyBuf,r=n.length;if(r===0||e>n[r-1])return n.push(e),this.valBuf.push(t),this;let i=this.indexOf(e);return i>=0?(this.valBuf[i]=t,this):(this.fold(),super.set(e,t))}get(e){if(this.folded)return super.get(e);let t=this.indexOf(e);return t>=0?this.valBuf[t]:void 0}has(e){return this.folded?super.has(e):this.indexOf(e)>=0}delete(e){if(this.folded)return super.delete(e);let t=this.indexOf(e);return t<0?!1:(this.keyBuf.splice(t,1),this.valBuf.splice(t,1),!0)}clear(){super.clear(),this.keyBuf=[],this.valBuf=[],this.folded=!1}get size(){return this.folded?super.size:this.keyBuf.length}forEach(e,t){this.fold(),super.forEach(e,t)}entries(){return this.fold(),super.entries()}keys(){return this.fold(),super.keys()}values(){return this.fold(),super.values()}[Symbol.iterator](){return this.fold(),super[Symbol.iterator]()}indexOf(e){let t=this.keyBuf,n=0,r=t.length-1;for(;n<=r;){let i=n+r>>1,a=t[i];if(a===e)return i;a<e?n=i+1:r=i-1}return-1}fold(){if(this.folded)return;this.folded=!0;let e=this.keyBuf,t=this.valBuf;for(let n=0;n<e.length;n++)super.set(e[n],t[n]);this.keyBuf=[],this.valBuf=[]}};function N(e,t,n){let r=e.params[t];if(typeof r==`number`&&Number.isFinite(r))return r;if(typeof r==`string`){let e=Number(r);if(Number.isFinite(e))return e}return n}function P(e,t,n,r=1){let i=N(e,t,n);return Math.max(r,Math.floor(i))}var Ye=class extends j{descriptor={id:`sma`,name:`Simple Moving Average`,placement:`overlay`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new M,i=Array(e.length).fill(null),a=0;for(let t=0;t<e.length;t++)if(a+=e[t].close,t>=n&&(a-=e[t-n].close),t>=n-1){let o={value:a/n};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=P(t,`period`,20,1);for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0;for(let n=t-i+1;n<=t;n++)r+=e[n].close;this.writePoint(n,e,t,{value:r/i})}return n}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},Xe=class extends j{descriptor={id:`ema`,name:`Exponential Moving Average`,placement:`overlay`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=2/(n+1),i=new M,a=Array(e.length).fill(null),o=0;for(let t=0;t<e.length;t++){if(t<n-1){o+=e[t].close;continue}o=t===n-1?(o+e[t].close)/n:(e[t].close-o)*r+o;let s={value:o};i.set(e[t].time,s),a[t]=s}return{values:i,series:a}}update(e,t,n,r){let i=P(t,`period`,20,1);if(r<i||!this.canResume(e,n,r))return null;let a=n.series[r-1]?.value;if(a===void 0)return null;let o=2/(i+1);for(let t=r;t<e.length;t++)a=(e[t].close-a)*o+a,this.writePoint(n,e,t,{value:a});return n}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},Ze=class extends j{descriptor={id:`bb`,name:`Bollinger Bands`,placement:`overlay`,defaultConfig:{period:20,stdDev:2}};calculate(e,t){let n=P(t,`period`,20,1),r=N(t,`stdDev`,2),i=new M,a=Array(e.length).fill(null),o=0,s=0;for(let t=0;t<e.length;t++){let c=e[t].close;if(o+=c,s+=c*c,t>=n){let r=e[t-n].close;o-=r,s-=r*r}if(t>=n-1){let c=o/n,l=s/n-c*c,u=Math.sqrt(Math.max(0,l)),d={middle:c,upper:c+r*u,lower:c-r*u};i.set(e[t].time,d),a[t]=d}}return{values:i,series:a}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=P(t,`period`,20,1),a=N(t,`stdDev`,2);for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0,o=0;for(let n=t-i+1;n<=t;n++){let t=e[n].close;r+=t,o+=t*t}let s=r/i,c=Math.sqrt(Math.max(0,o/i-s*s));this.writePoint(n,e,t,{middle:s,upper:s+a*c,lower:s-a*c})}return n}render(t,n,r,i){let s=n.series;if(!s)return;let{from:c,to:l}=r.visibleRange,u=0,d=l-c+1,f=new Float64Array(d),p=new Float64Array(d),m=new Float64Array(d),h=new Float64Array(d),g=new Float64Array(d),_=new Float64Array(d);for(let e=c;e<=l&&e<s.length;e++){let t=s[e];if(!t||t.upper===void 0)continue;let n=a(e,r);f[u]=n,p[u]=o(t.upper,r),m[u]=n,h[u]=o(t.middle,r),g[u]=n,_[u]=o(t.lower,r),u++}if(!(u<2)){t.beginPath(),t.moveTo(f[0],p[0]);for(let e=1;e<u;e++)t.lineTo(f[e],p[e]);for(let e=u-1;e>=0;e--)t.lineTo(g[e],_[e]);t.closePath(),t.fillStyle=(0,e.withAlpha)(i.colors[0],.1),t.fill(),t.beginPath(),t.strokeStyle=i.colors[0],t.lineWidth=i.lineWidths[0],t.lineJoin=`round`,t.moveTo(f[0],p[0]);for(let e=1;e<u;e++)t.lineTo(f[e],p[e]);t.stroke(),t.beginPath(),t.strokeStyle=i.colors[1]??i.colors[0],t.moveTo(m[0],h[0]);for(let e=1;e<u;e++)t.lineTo(m[e],h[e]);t.stroke(),t.beginPath(),t.strokeStyle=i.colors[0],t.moveTo(g[0],_[0]);for(let e=1;e<u;e++)t.lineTo(g[e],_[e]);t.stroke()}}},Qe=class extends j{descriptor={id:`vwap`,name:`Volume Weighted Average Price`,placement:`overlay`,defaultConfig:{}};calculate(e,t){let n=new M,r=Array(e.length).fill(null),i=0,a=0;for(let t=0;t<e.length;t++){let o=(e[t].high+e[t].low+e[t].close)/3;if(i+=e[t].volume,a+=o*e[t].volume,i>0){let o={value:a/i};n.set(e[t].time,o),r[t]=o}}return{values:n,series:r}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},$e=class extends j{descriptor={id:`ichimoku`,name:`Ichimoku Cloud`,placement:`overlay`,defaultConfig:{tenkan:9,kijun:26,senkou:52,displacement:26}};calculate(e,t){let n=P(t,`tenkan`,9,1),r=P(t,`kijun`,26,1),i=P(t,`senkou`,52,1),a=new M,o=Array(e.length).fill(null),s=t=>{let n=new Float64Array(e.length),r=new Float64Array(e.length);for(let i=0;i<e.length;i++){let a=-1/0,o=1/0,s=Math.max(0,i-t+1);for(let t=s;t<=i;t++)e[t].high>a&&(a=e[t].high),e[t].low<o&&(o=e[t].low);n[i]=a,r[i]=o}return{highs:n,lows:r}},c=s(n),l=s(r),u=s(i);for(let t=0;t<e.length;t++){let s={};t>=n-1&&(s.tenkan=(c.highs[t]+c.lows[t])/2),t>=r-1&&(s.kijun=(l.highs[t]+l.lows[t])/2),s.tenkan!==void 0&&s.kijun!==void 0&&(s.senkouA=(s.tenkan+s.kijun)/2),t>=i-1&&(s.senkouB=(u.highs[t]+u.lows[t])/2),t>=r-1&&(s.chikou=e[t].close),(s.tenkan!==void 0||s.kijun!==void 0||s.senkouA!==void 0||s.senkouB!==void 0)&&(a.set(e[t].time,s),o[t]=s)}return{values:a,series:o}}render(t,n,r,i){let s=n.series;if(!s)return;let{from:c,to:l}=r.visibleRange,u=l-c+1,d=new Float64Array(u),f=new Float64Array(u),p=0,m=new Float64Array(u),h=new Float64Array(u),g=0,_=new Float64Array(u),v=new Float64Array(u),y=0,b=new Float64Array(u),x=new Float64Array(u),S=0;for(let e=c;e<=l&&e<s.length;e++){let t=s[e];if(!t)continue;let n=a(e,r);t.tenkan!==void 0&&(d[p]=n,f[p]=o(t.tenkan,r),p++),t.kijun!==void 0&&(m[g]=n,h[g]=o(t.kijun,r),g++),t.senkouA!==void 0&&(_[y]=n,v[y]=o(t.senkouA,r),y++),t.senkouB!==void 0&&(b[S]=n,x[S]=o(t.senkouB,r),S++)}if(y>1&&S>1){let n=Math.min(y,S);t.beginPath(),t.moveTo(_[0],v[0]);for(let e=1;e<n;e++)t.lineTo(_[e],v[e]);for(let e=n-1;e>=0;e--)t.lineTo(b[e],x[e]);t.closePath(),t.fillStyle=(0,e.withAlpha)(i.colors[2]??`#1fa874`,.15),t.fill()}let C=(e,n,r,i,a)=>{if(!(r<2)){t.beginPath(),t.strokeStyle=i,t.lineWidth=a,t.lineJoin=`round`,t.moveTo(e[0],n[0]);for(let i=1;i<r;i++)t.lineTo(e[i],n[i]);t.stroke()}};C(d,f,p,i.colors[0],i.lineWidths[0]),C(m,h,g,i.colors[1]??`#f2a93b`,i.lineWidths[0]),C(_,v,y,i.colors[2]??`#1fa874`,1),C(b,x,S,i.colors[3]??`#e8505b`,1)}},et=class extends j{descriptor={id:`psar`,name:`Parabolic SAR`,placement:`overlay`,defaultConfig:{step:.02,max:.2}};calculate(e,t){let n=N(t,`step`,.02),r=N(t,`max`,.2),i=new M,a=Array(e.length).fill(null);if(e.length<2)return{values:i,series:a};let o=e[1].close>e[0].close,s=n,c=o?e[0].high:e[0].low,l=o?e[0].low:e[0].high,u={value:l,trend:o?1:-1};i.set(e[0].time,u),a[0]=u;for(let t=1;t<e.length;t++){let u=l;l=u+s*(c-u),o?(l=Math.min(l,e[t-1].low),t>=2&&(l=Math.min(l,e[t-2].low)),e[t].low<l?(o=!1,l=c,c=e[t].low,s=n):e[t].high>c&&(c=e[t].high,s=Math.min(s+n,r))):(l=Math.max(l,e[t-1].high),t>=2&&(l=Math.max(l,e[t-2].high)),e[t].high>l?(o=!0,l=c,c=e[t].high,s=n):e[t].low<c&&(c=e[t].low,s=Math.min(s+n,r)));let d={value:l,trend:o?1:-1};i.set(e[t].time,d),a[t]=d}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange,l=Math.max(1.5,n.barWidth*.15);for(let t=s;t<=c&&t<i.length;t++){let s=i[t];if(!s||s.value===void 0)continue;let c=a(t,n),u=o(s.value,n);e.beginPath(),e.arc(c,u,l,0,Math.PI*2),e.fillStyle=s.trend===1?r.colors[0]:r.colors[1]??`#e8505b`,e.fill()}}},tt=class extends j{descriptor={id:`supertrend`,name:`Supertrend`,placement:`overlay`,defaultConfig:{period:10,multiplier:3}};calculate(e,t){let n=P(t,`period`,10,1),r=N(t,`multiplier`,3),i=new M,a=Array(e.length).fill(null);if(e.length<n)return{values:i,series:a};let o=[e[0].high-e[0].low];for(let t=1;t<e.length;t++)o.push(Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close)));let s=0;for(let e=0;e<n;e++)s+=o[e];s/=n;let c=0,l=0,u=0,d=0,f=0,p=0,m=1;for(let t=n-1;t<e.length;t++){t>n-1&&(s=(s*(n-1)+o[t])/n);let h=(e[t].high+e[t].low)/2,g=h+r*s,_=h-r*s;c=g<u||e[t-1].close>u?g:u,l=_>d||e[t-1].close<d?_:d,f=p===u?e[t].close<=c?c:l:e[t].close>=l?l:c,m=f===l?1:-1;let v={value:f,trend:m};i.set(e[t].time,v),a[t]=v,u=c,d=l,p=f}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange,l=r.colors[0],u=r.colors[1]??`#e8505b`,d=0,f=0,p=0;for(let t=s;t<=c&&t<i.length;t++){let s=i[t];if(!s||s.value===void 0)continue;let c=a(t,n),m=o(s.value,n),h=s.trend??1;p!==0&&(e.beginPath(),e.strokeStyle=h===1?l:u,e.lineWidth=r.lineWidths[0]+.5,e.moveTo(d,f),e.lineTo(c,m),e.stroke()),d=c,f=m,p=h}}},nt=class extends j{descriptor={id:`keltner`,name:`Keltner Channel`,placement:`overlay`,defaultConfig:{emaPeriod:20,atrPeriod:10,multiplier:1.5}};calculate(e,t){let n=P(t,`emaPeriod`,20,1),r=P(t,`atrPeriod`,10,1),i=N(t,`multiplier`,1.5),a=new M;if(e.length<Math.max(n,r))return{values:a};let o=2/(n+1),s=e[0].close,c=[s];for(let t=1;t<e.length;t++)s=(e[t].close-s)*o+s,c.push(s);let l=[e[0].high-e[0].low];for(let t=1;t<e.length;t++)l.push(Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close)));let u=0;for(let e=0;e<r;e++)u+=l[e];u/=r;let d=Array(e.length).fill(null),f=Math.max(n,r)-1;for(let t=f;t<e.length;t++){t>f&&(u=(u*(r-1)+l[t])/r);let n={middle:c[t],upper:c[t]+i*u,lower:c[t]-i*u};a.set(e[t].time,n),d[t]=n}return{values:a,series:d}}render(t,n,r,i){let s=n.series;if(!s)return;let{from:c,to:l}=r.visibleRange,u=[],d=[],f=[];for(let e=c;e<=l&&e<s.length;e++){let t=s[e];if(!t)continue;let n=a(e,r);t.upper!==void 0&&u.push({x:n,y:o(t.upper,r)}),t.middle!==void 0&&d.push({x:n,y:o(t.middle,r)}),t.lower!==void 0&&f.push({x:n,y:o(t.lower,r)})}this.drawBand(t,u,f,(0,e.withAlpha)(i.colors[0],.08)),this.drawLine(t,u,i.colors[0],i.lineWidths[0]),this.drawLine(t,d,i.colors[1]??i.colors[0],i.lineWidths[0]),this.drawLine(t,f,i.colors[0],i.lineWidths[0])}},rt=class extends j{descriptor={id:`donchian`,name:`Donchian Channel`,placement:`overlay`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new M,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=-1/0,o=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>a&&(a=e[r].high),e[r].low<o&&(o=e[r].low);let s={upper:a,middle:(a+o)/2,lower:o};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}render(t,n,r,i){let s=n.series;if(!s)return;let{from:c,to:l}=r.visibleRange,u=[],d=[],f=[];for(let e=c;e<=l&&e<s.length;e++){let t=s[e];if(!t)continue;let n=a(e,r);t.upper!==void 0&&u.push({x:n,y:o(t.upper,r)}),t.middle!==void 0&&d.push({x:n,y:o(t.middle,r)}),t.lower!==void 0&&f.push({x:n,y:o(t.lower,r)})}this.drawBand(t,u,f,(0,e.withAlpha)(i.colors[0],.08)),this.drawLine(t,u,i.colors[0],i.lineWidths[0]),this.drawLine(t,d,i.colors[1]??`#7d8696`,1),this.drawLine(t,f,i.colors[0],i.lineWidths[0])}},it=[`s3`,`s2`,`s1`,`pp`,`r1`,`r2`,`r3`],at=class extends j{descriptor={id:`pivots`,name:`Pivot Points (Classic)`,placement:`overlay`,defaultConfig:{lookback:24}};calculate(e,t){let n=P(t,`lookback`,24,1),r=new M,i=Array(e.length).fill(null);if(e.length<=n)return{values:r,series:i};for(let t=n;t<e.length;t++){let a=-1/0,o=1/0;for(let r=t-n;r<t;r++)e[r].high>a&&(a=e[r].high),e[r].low<o&&(o=e[r].low);let s=e[t-1].close,c=(a+o+s)/3,l=a-o,u={pp:c,r1:2*c-o,s1:2*c-a,r2:c+l,s2:c-l,r3:a+2*(c-o),s3:o-2*(a-c)};r.set(e[t].time,u),i[t]=u}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange,l=r.colors[0],u=r.colors[1]??`#e8505b`,d=r.colors[2]??`#1fa874`,f=r.lineWidths[0],p=e=>e===`pp`?l:e.startsWith(`r`)?u:d;for(let t of it){e.beginPath(),e.strokeStyle=p(t),e.lineWidth=t===`pp`?f:Math.max(1,f-1),t!==`pp`&&e.setLineDash([4,3]);let r=!1;for(let l=s;l<=c&&l<i.length;l++){let s=i[l]?.[t];if(s===void 0)continue;let c=a(l,n),u=o(s,n);r?e.lineTo(c,u):(e.moveTo(c,u),r=!0)}e.stroke(),e.setLineDash([])}}},ot=class extends j{descriptor={id:`avwap`,name:`Anchored VWAP`,placement:`overlay`,defaultConfig:{anchorTime:0}};calculate(e,t){let n=N(t,`anchorTime`,0),r=new M,i=Array(e.length).fill(null),a=0;if(n>0&&(a=e.findIndex(e=>e.time>=n),a<0))return{values:r,series:i};let o=0,s=0;for(let t=a;t<e.length;t++){let n=(e[t].high+e[t].low+e[t].close)/3;if(o+=e[t].volume,s+=n*e[t].volume,o>0){let n={value:s/o};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},st=class extends j{descriptor={id:`zigzag`,name:`ZigZag`,placement:`overlay`,defaultConfig:{deviation:5}};calculate(e,t){let n=Math.max(.01,N(t,`deviation`,5))/100,r=new M,i=Array(e.length).fill(null);if(e.length<2)return{values:r,series:i,meta:{pivots:[]}};let a=[],o=null,s=0,c=e[0].close;for(let t=1;t<e.length;t++){let r=e[t].high,i=e[t].low;if(o===null){r>=c*(1+n)?(a.push({idx:s,price:c,type:`low`}),o=`up`,s=t,c=r):i<=c*(1-n)&&(a.push({idx:s,price:c,type:`high`}),o=`down`,s=t,c=i);continue}o===`up`?r>c?(s=t,c=r):i<=c*(1-n)&&(a.push({idx:s,price:c,type:`high`}),o=`down`,s=t,c=i):i<c?(s=t,c=i):r>=c*(1+n)&&(a.push({idx:s,price:c,type:`low`}),o=`up`,s=t,c=r)}a.push({idx:s,price:c,type:o===`up`?`high`:`low`});for(let t of a){let n={pivot:t.price};r.set(e[t.idx].time,n),i[t.idx]=n}return{values:r,series:i,meta:{pivots:a}}}render(e,t,n,r){let i=t.meta?.pivots;if(!(!i||i.length<2)){e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;for(let t=0;t<i.length;t++){let r=i[t],s=a(r.idx,n),c=o(r.price,n);t===0?e.moveTo(s,c):e.lineTo(s,c)}e.stroke()}}},ct=class extends j{descriptor={id:`lrc`,name:`Linear Regression Channel`,placement:`overlay`,defaultConfig:{period:100,stdDev:2}};calculate(e,t){let n=P(t,`period`,100,2),r=N(t,`stdDev`,2),i=new M,a=Array(e.length).fill(null);if(e.length<n)return{values:i,series:a};for(let t=n-1;t<e.length;t++){let o=t-n+1,s=0,c=0,l=0,u=0;for(let t=0;t<n;t++){let n=t,r=e[o+t].close;s+=n,c+=r,l+=n*r,u+=n*n}let d=n*u-s*s;if(d===0)continue;let f=(n*l-s*c)/d,p=(c-f*s)/n,m=0;for(let t=0;t<n;t++){let n=f*t+p,r=e[o+t].close-n;m+=r*r}let h=Math.sqrt(m/n),g=f*(n-1)+p,_={middle:g,upper:g+r*h,lower:g-r*h,slope:f};i.set(e[t].time,_),a[t]=_}return{values:i,series:a}}render(t,n,r,i){let s=n.series;if(!s)return;let{from:c,to:l}=r.visibleRange,u=[],d=[],f=[];for(let e=c;e<=l&&e<s.length;e++){let t=s[e];if(!t)continue;let n=a(e,r);t.middle!==void 0&&d.push({x:n,y:o(t.middle,r)}),t.upper!==void 0&&u.push({x:n,y:o(t.upper,r)}),t.lower!==void 0&&f.push({x:n,y:o(t.lower,r)})}this.drawBand(t,u,f,(0,e.withAlpha)(i.colors[0],.08)),this.drawLine(t,u,i.colors[0],i.lineWidths[0]),this.drawLine(t,d,i.colors[1]??i.colors[0],i.lineWidths[0]),this.drawLine(t,f,i.colors[0],i.lineWidths[0])}},lt=class extends j{descriptor={id:`hma`,name:`Hull Moving Average`,placement:`overlay`,defaultConfig:{period:21}};calculate(e,t){let n=P(t,`period`,21,2),r=new M,i=Array(e.length).fill(null);if(e.length<n)return{values:r,series:i};let a=e.map(e=>e.close),o=Math.max(2,Math.floor(n/2)),s=Math.max(2,Math.floor(Math.sqrt(n))),c=ut(a,n),l=ut(a,o),u=dt(a.map((e,t)=>c[t]===null||l[t]===null?null:2*l[t]-c[t]),s);for(let t=0;t<e.length;t++){if(u[t]===null)continue;let n={value:u[t]};r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}};function ut(e,t){let n=Array(e.length).fill(null);if(e.length<t)return n;let r=t*(t+1)/2;for(let i=t-1;i<e.length;i++){let a=0;for(let n=0;n<t;n++)a+=e[i-n]*(t-n);n[i]=a/r}return n}function dt(e,t){let n=Array(e.length).fill(null),r=t*(t+1)/2;for(let i=t-1;i<e.length;i++){let a=0,o=!0;for(let n=0;n<t;n++){let r=e[i-n];if(r===null){o=!1;break}a+=r*(t-n)}o&&(n[i]=a/r)}return n}var ft=class extends j{descriptor={id:`mtfma`,name:`MTF Moving Average`,placement:`overlay`,defaultConfig:{period:50,timeframe:`1d`}};calculate(t,n){let r=P(n,`period`,50,1),i=String(n.params.timeframe??`1d`),a=new M,o=Array(t.length).fill(null);if(t.length===0)return{values:a,series:o};let s=[],c=(0,e.timeframeBucketStart)(t[0].time,i),l=t[0].close,u=null,d=()=>{if(s.length<r)return;let e=0;for(let t=s.length-r;t<s.length;t++)e+=s[t];u=e/r};for(let n=0;n<t.length;n++){let r=(0,e.timeframeBucketStart)(t[n].time,i);if(r!==c&&(s.push(l),d(),c=r),l=t[n].close,u!==null){let e={value:u};a.set(t[n].time,e),o[n]=e}}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},pt=class extends j{descriptor={id:`svwap`,name:`Session VWAP`,placement:`overlay`,defaultConfig:{bands:1}};calculate(t,n){let r=Math.min(3,P(n,`bands`,1,0)),i=new M,a=Array(t.length).fill(null);if(t.length===0)return{values:i,series:a};let o=(0,e.timeframeBucketStart)(t[0].time,`1d`),s=0,c=0,l=0;for(let n=0;n<t.length;n++){let u=t[n],d=(0,e.timeframeBucketStart)(u.time,`1d`);d!==o&&(s=0,c=0,l=0,o=d);let f=(u.high+u.low+u.close)/3;if(s+=f*u.volume,c+=f*f*u.volume,l+=u.volume,l>0){let e=s/l,t={value:e,session:o};if(r>0){let n=Math.max(0,c/l-e*e),i=Math.sqrt(n);for(let n=1;n<=r;n++)t[`u${n}`]=e+n*i,t[`l${n}`]=e-n*i}i.set(u.time,t),a[n]=t}}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:a,to:o}=n.visibleRange;e.globalAlpha=.55,e.lineWidth=1,e.setLineDash([4,3]),e.strokeStyle=r.colors[1]??r.colors[0];for(let t=1;t<=3;t++)this.strokeBandSeries(e,i,n,a,o,e=>e[`u${t}`]),this.strokeBandSeries(e,i,n,a,o,e=>e[`l${t}`]);e.setLineDash([]),e.globalAlpha=1,e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`,this.strokeBandSeries(e,i,n,a,o,e=>e.value)}strokeBandSeries(e,t,n,r,i,s){e.beginPath();let c,l=!1;for(let u=r;u<=i&&u<t.length;u++){let r=t[u],i=r?s(r):void 0;if(r===null||i===void 0){l=!1;continue}let d=a(u,n),f=o(i,n),p=r.session!==c;!l||p?(e.moveTo(d,f),l=!0):e.lineTo(d,f),c=r.session}e.stroke()}},mt=class extends j{descriptor={id:`chandelier`,name:`Chandelier Exit`,placement:`overlay`,defaultConfig:{period:22,multiplier:3}};calculate(e,t){let n=P(t,`period`,22,1),r=N(t,`multiplier`,3),i=new M,a=Array(e.length).fill(null),o=e.length;if(o<=n)return{values:i,series:a};let s=Array(o).fill(0);for(let t=1;t<o;t++){let n=e[t-1].close;s[t]=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-n),Math.abs(e[t].low-n))}let c=0;for(let e=1;e<=n;e++)c+=s[e];c/=n;for(let t=n;t<o;t++){t>n&&(c=(c*(n-1)+s[t])/n);let o=-1/0,l=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>o&&(o=e[r].high),e[r].low<l&&(l=e[r].low);let u={long:o-r*c,short:l+r*c};i.set(e[t].time,u),a[t]=u}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange,l=(t,l)=>{e.beginPath(),e.strokeStyle=l,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`,e.setLineDash([5,3]);let u=!1;for(let r=s;r<=c&&r<i.length;r++){let s=i[r];if(!s||s[t]===void 0){u=!1;continue}let c=a(r,n),l=o(s[t],n);u?e.lineTo(c,l):(e.moveTo(c,l),u=!0)}e.stroke(),e.setLineDash([])};l(`long`,r.colors[0]??`#1fa874`),l(`short`,r.colors[1]??`#e8505b`)}},ht=class extends j{descriptor={id:`alligator`,name:`Alligator`,placement:`overlay`,defaultConfig:{jaw:13,teeth:8,lips:5,jawShift:8,teethShift:5,lipsShift:3}};calculate(e,t){let n=P(t,`jaw`,13,1),r=P(t,`teeth`,8,1),i=P(t,`lips`,5,1),a=P(t,`jawShift`,8,0),o=P(t,`teethShift`,5,0),s=P(t,`lipsShift`,3,0),c=new M,l=e.length,u=Array(l).fill(null);if(l===0)return{values:c,series:u};let d=e.map(e=>(e.high+e.low)/2),f=gt(d,n),p=gt(d,r),m=gt(d,i),h=Array(l).fill(void 0),g=Array(l).fill(void 0),_=Array(l).fill(void 0);for(let e=0;e<l;e++)f[e]!==void 0&&e+a<l&&(h[e+a]=f[e]),p[e]!==void 0&&e+o<l&&(g[e+o]=p[e]),m[e]!==void 0&&e+s<l&&(_[e+s]=m[e]);for(let t=0;t<l;t++){if(h[t]===void 0&&g[t]===void 0&&_[t]===void 0)continue;let n={};h[t]!==void 0&&(n.jaw=h[t]),g[t]!==void 0&&(n.teeth=g[t]),_[t]!==void 0&&(n.lips=_[t]),c.set(e[t].time,n),u[t]=n}return{values:c,series:u}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange,l=(t,l)=>{e.beginPath(),e.strokeStyle=l,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let r=s;r<=c&&r<i.length;r++){let s=i[r];if(!s||s[t]===void 0){u=!1;continue}let c=a(r,n),l=o(s[t],n);u?e.lineTo(c,l):(e.moveTo(c,l),u=!0)}e.stroke()};l(`jaw`,r.colors[0]??`#4c8dff`),l(`teeth`,r.colors[1]??`#e8505b`),l(`lips`,r.colors[2]??`#1fa874`)}};function gt(e,t){let n=e.length,r=Array(n).fill(void 0);if(n<t)return r;let i=0;for(let n=0;n<t;n++)i+=e[n];let a=i/t;r[t-1]=a;for(let i=t;i<n;i++)a=(a*(t-1)+e[i])/t,r[i]=a;return r}var _t=class extends j{descriptor={id:`vwma`,name:`Volume Weighted Moving Average`,placement:`overlay`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new M,i=Array(e.length).fill(null),a=0,o=0;for(let t=0;t<e.length;t++){let s=e[t].close*e[t].volume;if(a+=s,o+=e[t].volume,t>=n){let r=e[t-n];a-=r.close*r.volume,o-=r.volume}if(t>=n-1&&o>0){let n={value:a/o};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=P(t,`period`,20,1);for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0,a=0;for(let n=t-i+1;n<=t;n++)r+=e[n].close*e[n].volume,a+=e[n].volume;this.writePoint(n,e,t,a>0?{value:r/a}:null)}return n}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},vt=class extends j{descriptor={id:`wma`,name:`Weighted Moving Average`,placement:`overlay`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new M,i=Array(e.length).fill(null),a=n*(n+1)/2,o=0,s=0;for(let t=0;t<e.length;t++){let c=e[t].close;if(s+=c*n-o,o+=c,t>=n&&(o-=e[t-n].close),t>=n-1){let n={value:s/a};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=P(t,`period`,20,1),a=i*(i+1)/2;for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0,o=t-i+1;for(let t=0;t<i;t++)r+=e[o+t].close*(t+1);this.writePoint(n,e,t,{value:r/a})}return n}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},yt=class extends j{descriptor={id:`envelope`,name:`Moving Average Envelope`,placement:`overlay`,defaultConfig:{period:20,percent:2.5}};calculate(e,t){let n=P(t,`period`,20,1),r=N(t,`percent`,2.5)/100,i=new M,a=Array(e.length).fill(null),o=0;for(let t=0;t<e.length;t++)if(o+=e[t].close,t>=n&&(o-=e[t-n].close),t>=n-1){let s=o/n,c={basis:s,upper:s*(1+r),lower:s*(1-r)};i.set(e[t].time,c),a[t]=c}return{values:i,series:a}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=P(t,`period`,20,1),a=N(t,`percent`,2.5)/100;for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0;for(let n=t-i+1;n<=t;n++)r+=e[n].close;let o=r/i;this.writePoint(n,e,t,{basis:o,upper:o*(1+a),lower:o*(1-a)})}return n}render(t,n,r,i){let s=n.series;if(!s)return;let{from:c,to:l}=r.visibleRange,u=[],d=[],f=[];for(let e=c;e<=l&&e<s.length;e++){let t=s[e];if(!t||t.upper===void 0)continue;let n=a(e,r);u.push({x:n,y:o(t.upper,r)}),d.push({x:n,y:o(t.lower,r)}),f.push({x:n,y:o(t.basis,r)})}this.drawBand(t,u,d,(0,e.withAlpha)(i.colors[0],.08)),this.drawLine(t,u,i.colors[0],i.lineWidths[0]),this.drawLine(t,d,i.colors[0],i.lineWidths[0]),this.drawLine(t,f,i.colors[1]??i.colors[0],i.lineWidths[0])}};function bt(e,t){let n=2/(t+1),r=Array(e.length).fill(null),i=0,a=0;for(let o=0;o<e.length;o++){if(o<t-1){a+=e[o];continue}i=o===t-1?(a+e[o])/t:(e[o]-i)*n+i,r[o]=i}return r}function xt(e,t,n){let r=Array(n).fill(null);for(let n=0;n<e.length;n++)e[n]!==null&&(r[t[n]]=e[n]);return r}function St(e){let t=[],n=[];for(let r=0;r<e.length;r++)e[r]!==null&&(t.push(e[r]),n.push(r));return{values:t,indices:n}}var Ct=class extends j{descriptor={id:`tema`,name:`Triple EMA`,placement:`overlay`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new M,i=Array(e.length).fill(null),a=bt(e.map(e=>e.close),n),o=St(a),s=xt(bt(o.values,n),o.indices,e.length),c=St(s),l=xt(bt(c.values,n),c.indices,e.length);for(let t=0;t<e.length;t++){let n=a[t],o=s[t],c=l[t];if(n===null||o===null||c===null)continue;let u={value:3*n-3*o+c};r.set(e[t].time,u),i[t]=u}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},wt=class extends j{descriptor={id:`ao`,name:`Awesome Oscillator`,placement:`panel`,defaultConfig:{fast:5,slow:34}};calculate(e,t){let n=P(t,`fast`,5,1),r=P(t,`slow`,34,1),i=new M,a=Array(e.length).fill(null);if(e.length<r)return{values:i,series:a};let o=Array(e.length);for(let t=0;t<e.length;t++)o[t]=(e[t].high+e[t].low)/2;let s=0,c=0,l;for(let t=0;t<e.length;t++)if(c+=o[t],t>=r&&(c-=o[t-r]),s+=o[t],t>=n&&(s-=o[t-n]),t>=r-1){let o=s/n-c/r,u={value:o,up:+(l===void 0||o>=l)};i.set(e[t].time,u),a[t]=u,l=o}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&(t<l&&(l=t),t>u&&(u=t))}if(l===1/0)return;let d=Math.max(Math.abs(l),Math.abs(u))||1,f=e=>o.y+o.height*(1-(e+d)/(2*d)),p=f(0),m=n.barWidth/2,h=r.colors[0]??`#1fa874`,g=r.colors[1]??`#e8505b`;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=f(r.value),c=Math.min(s,p),l=Math.max(Math.abs(s-p),1);e.fillStyle=r.up?h:g,e.fillRect(o-m,c,n.barWidth,l)}}},Tt=class extends j{descriptor={id:`chaikinOsc`,name:`Chaikin Oscillator`,placement:`panel`,defaultConfig:{fast:3,slow:10}};calculate(e,t){let n=P(t,`fast`,3,1),r=P(t,`slow`,10,1),i=new M,a=Array(e.length).fill(null);if(e.length<r)return{values:i,series:a};let o=2/(n+1),s=2/(r+1),c=0,l=0,u=0;for(let t=0;t<e.length;t++){let{high:n,low:d,close:f,volume:p}=e[t],m=n-d,h=m===0?0:(f-d-(n-f))/m;if(c+=h*p,t===0?(l=c,u=c):(l=(c-l)*o+l,u=(c-u)*s+u),t>=r-1){let n={value:l-u,adl:c};i.set(e[t].time,n),a[t]=n}}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&(t<l&&(l=t),t>u&&(u=t))}if(l===1/0)return;let d=Math.max(Math.abs(l),Math.abs(u))||1,f=e=>o.y+o.height*(1-(e+d)/(2*d)),p=f(0),m=n.barWidth/2,h=r.colors[0]??`#1fa874`,g=r.colors[1]??`#e8505b`;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=f(r.value),c=Math.min(s,p),l=Math.max(Math.abs(s-p),1);e.fillStyle=r.value>=0?h:g,e.fillRect(o-m,c,n.barWidth,l)}}},Et=class extends j{descriptor={id:`rsi`,name:`Relative Strength Index`,placement:`panel`,defaultConfig:{period:14}};smoothing=new WeakMap;calculate(e,t){let n=P(t,`period`,14,1),r=new M,i=Array(e.length).fill(null),a={values:r,series:i};if(e.length<n+1)return a;let o=[],s=[],c=0,l=0;for(let t=1;t<=n;t++){let n=e[t].close-e[t-1].close;n>0?c+=n:l-=n}c/=n,l/=n,o[n]=c,s[n]=l;let u={value:l===0?100:100-100/(1+c/l)};r.set(e[n].time,u),i[n]=u;for(let t=n+1;t<e.length;t++){let a=e[t].close-e[t-1].close,u=a>0?a:0,d=a<0?-a:0;c=(c*(n-1)+u)/n,l=(l*(n-1)+d)/n,o[t]=c,s[t]=l;let f={value:l===0?100:100-100/(1+c/l)};r.set(e[t].time,f),i[t]=f}return this.smoothing.set(a,{gain:o,loss:s}),a}update(e,t,n,r){let i=P(t,`period`,14,1),a=this.smoothing.get(n);if(!a||r<=i||!this.canResume(e,n,r))return null;let o=a.gain[r-1],s=a.loss[r-1];if(o===void 0||s===void 0)return null;for(let t=r;t<e.length;t++){let r=e[t].close-e[t-1].close,c=r>0?r:0,l=r<0?-r:0;o=(o*(i-1)+c)/i,s=(s*(i-1)+l)/i,a.gain[t]=o,a.loss[t]=s;let u=s===0?100:100-100/(1+o/s);this.writePoint(n,e,t,{value:u})}return n}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath();for(let t of[30,70]){let n=l(t);e.moveTo(o.x,n),e.lineTo(o.x+o.width,n)}e.stroke(),e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}},Dt=class extends j{descriptor={id:`macd`,name:`MACD`,placement:`panel`,defaultConfig:{fast:12,slow:26,signal:9}};emas=new WeakMap;calculate(e,t){let n=P(t,`fast`,12,1),r=P(t,`slow`,26,1),i=P(t,`signal`,9,1),a=new M,o=Array(e.length).fill(null),s={values:a,series:o};if(e.length<r)return s;let c=2/(n+1),l=2/(r+1),u=2/(i+1),d=Array(e.length),f=Array(e.length),p=e[0].close,m=e[0].close,h=0,g=!1;for(let t=0;t<e.length;t++){let n=e[t].close;if(t===0?(p=n,m=n):(p=(n-p)*c+p,m=(n-m)*l+m),d[t]=p,f[t]=m,t>=r-1){let n=p-m;g?h=(n-h)*u+h:(h=n,g=!0);let r=n-h,i={macd:n,signal:h,histogram:r};a.set(e[t].time,i),o[t]=i}}return this.emas.set(s,{fast:d,slow:f}),s}update(e,t,n,r){let i=P(t,`fast`,12,1),a=P(t,`slow`,26,1),o=P(t,`signal`,9,1),s=this.emas.get(n);if(!s||r<a||!this.canResume(e,n,r))return null;let c=s.fast[r-1],l=s.slow[r-1],u=n.series[r-1]?.signal;if(c===void 0||l===void 0||u===void 0)return null;let d=2/(i+1),f=2/(a+1),p=2/(o+1);for(let t=r;t<e.length;t++){let r=e[t].close;c=(r-c)*d+c,l=(r-l)*f+l,s.fast[t]=c,s.slow[t]=l;let i=c-l;u=(i-u)*p+u,this.writePoint(n,e,t,{macd:i,signal:u,histogram:i-u})}return n}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&(t.macd!==void 0&&(t.macd<l&&(l=t.macd),t.macd>u&&(u=t.macd)),t.signal!==void 0&&(t.signal<l&&(l=t.signal),t.signal>u&&(u=t.signal)),t.histogram!==void 0&&(t.histogram<l&&(l=t.histogram),t.histogram>u&&(u=t.histogram)))}if(l===1/0)return;let d=u-l||1,f=e=>o.y+o.height*(1-(e-l)/d),p=f(0),m=n.barWidth/2,h=r.colors[2]??`#1fa874`,g=r.colors[3]??`#e8505b`,_=r.colors[0],v=r.colors[1]??`#f2a93b`;e.beginPath();let y=new Path2D,b=new Path2D,x=!1,S=!1,C=new Path2D,w=new Path2D;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(!t)continue;let r=a(e,n);if(t.histogram!==void 0){let e=f(t.histogram),i=Math.min(e,p),a=Math.max(Math.abs(e-p),1);t.histogram>=0?y.rect(r-m,i,n.barWidth,a):b.rect(r-m,i,n.barWidth,a)}if(t.macd!==void 0){let e=f(t.macd);x?C.lineTo(r,e):(C.moveTo(r,e),x=!0)}if(t.signal!==void 0){let e=f(t.signal);S?w.lineTo(r,e):(w.moveTo(r,e),S=!0)}}e.fillStyle=h,e.fill(y),e.fillStyle=g,e.fill(b),e.strokeStyle=_,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`,e.stroke(C),e.strokeStyle=v,e.stroke(w)}},Ot=class extends j{descriptor={id:`stochastic`,name:`Stochastic Oscillator`,placement:`panel`,defaultConfig:{kPeriod:14,dPeriod:3,smooth:3}};calculate(e,t){let n=P(t,`kPeriod`,14,1),r=P(t,`dPeriod`,3,1),i=P(t,`smooth`,3,1),a=new M,o=Array(e.length).fill(null);if(e.length<n)return{values:a,series:o};let s=[];for(let t=0;t<e.length;t++){if(t<n-1){s.push(0);continue}let r=-1/0,i=1/0;for(let a=t-n+1;a<=t;a++)e[a].high>r&&(r=e[a].high),e[a].low<i&&(i=e[a].low);s.push(r===i?50:(e[t].close-i)/(r-i)*100)}let c=[];for(let e=0;e<s.length;e++){if(e<n-1+i-1){c.push(0);continue}let t=0;for(let n=e-i+1;n<=e;n++)t+=s[n];c.push(t/i)}let l=n-1+i-1;for(let t=l;t<c.length;t++){let n={k:c[t]};if(t>=l+r-1){let e=0;for(let n=t-r+1;n<=t;n++)e+=c[n];n.d=e/r}a.set(e[t].time,n),o[t]=n}return{values:a,series:o}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=P(t,`kPeriod`,14,1),a=P(t,`dPeriod`,3,1),o=P(t,`smooth`,3,1),s=i-1+o-1,c=t=>{let n=-1/0,r=1/0;for(let a=t-i+1;a<=t;a++)e[a].high>n&&(n=e[a].high),e[a].low<r&&(r=e[a].low);return n===r?50:(e[t].close-r)/(n-r)*100},l=e=>{let t=0;for(let n=e-o+1;n<=e;n++)t+=c(n);return t/o};for(let t=r;t<e.length;t++){if(t<s||e.length<i){this.writePoint(n,e,t,null);continue}let r={k:l(t)};if(t>=s+a-1){let e=0;for(let n=t-a+1;n<=t;n++)e+=l(n);r.d=e/a}this.writePoint(n,e,t,r)}return n}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[2]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[20,80]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]);let u=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0)continue;let s=a(r,n),c=l(o[t]);u?e.lineTo(s,c):(e.moveTo(s,c),u=!0)}e.stroke()};u(`k`,r.colors[0]),u(`d`,r.colors[1]??`#f2a93b`)}},kt=class extends j{descriptor={id:`atr`,name:`Average True Range`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new M,i=Array(e.length).fill(null);if(e.length<Math.max(2,n))return{values:r,series:i};let a=[e[0].high-e[0].low];for(let t=1;t<e.length;t++){let n=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close));a.push(n)}let o=0;for(let e=0;e<n;e++)o+=a[e];o/=n;let s={value:o};r.set(e[n-1].time,s),i[n-1]=s;for(let t=n;t<e.length;t++){o=(o*(n-1)+a[t])/n;let s={value:o};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}update(e,t,n,r){let i=P(t,`period`,14,1);if(r<i||!this.canResume(e,n,r))return null;let a=n.series[r-1]?.value;if(a===void 0)return null;for(let t=r;t<e.length;t++){let r=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close));a=(a*(i-1)+r)/i,this.writePoint(n,e,t,{value:a})}return n}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d-f,m=e=>o.y+o.height*(1-(e-f)/p);e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let h=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=m(r.value);h?e.lineTo(i,o):(e.moveTo(i,o),h=!0)}}e.stroke()}},At=class extends j{descriptor={id:`adx`,name:`Average Directional Index`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new M,i=Array(e.length).fill(null);if(e.length<n*2)return{values:r,series:i};let a=[],o=[],s=[];for(let t=1;t<e.length;t++){let n=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close));a.push(n);let r=e[t].high-e[t-1].high,i=e[t-1].low-e[t].low;o.push(r>i&&r>0?r:0),s.push(i>r&&i>0?i:0)}let c=0,l=0,u=0;for(let e=0;e<n;e++)c+=a[e],l+=o[e],u+=s[e];let d=[];for(let t=n;t<a.length;t++){t>n&&(c=c-c/n+a[t],l=l-l/n+o[t],u=u-u/n+s[t]);let f=c===0?0:l/c*100,p=c===0?0:u/c*100,m=f+p,h=m===0?0:Math.abs(f-p)/m*100;d.push(h);let g=t+1,_={plusDI:f,minusDI:p,dx:h};r.set(e[g].time,_),i[g]=_}if(d.length>=n){let t=0;for(let e=0;e<n;e++)t+=d[e];t/=n;let a=n*2;if(a<e.length){let n=r.get(e[a].time);n&&(n.adx=t),i[a]&&(i[a].adx=t)}for(let a=n;a<d.length;a++){t=(t*(n-1)+d[a])/n;let o=a+n+1;if(o<e.length){let n=r.get(e[o].time);n&&(n.adx=t),i[o]&&(i[o].adx=t)}}}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100),u=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0)continue;let s=a(r,n),c=l(o[t]);u?e.lineTo(s,c):(e.moveTo(s,c),u=!0)}e.stroke()};u(`adx`,r.colors[0]),u(`plusDI`,r.colors[1]??`#1fa874`),u(`minusDI`,r.colors[2]??`#e8505b`)}},jt=class extends j{descriptor={id:`obv`,name:`On Balance Volume`,placement:`panel`,defaultConfig:{}};calculate(e,t){let n=new M,r=Array(e.length).fill(null);if(e.length===0)return{values:n,series:r};let i=0,a={value:i};n.set(e[0].time,a),r[0]=a;for(let t=1;t<e.length;t++){e[t].close>e[t-1].close?i+=e[t].volume:e[t].close<e[t-1].close&&(i-=e[t].volume);let a={value:i};n.set(e[t].time,a),r[t]=a}return{values:n,series:r}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=n.series[r-1]?.value;if(i===void 0)return null;for(let t=r;t<e.length;t++)e[t].close>e[t-1].close?i+=e[t].volume:e[t].close<e[t-1].close&&(i-=e[t].volume),this.writePoint(n,e,t,{value:i});return n}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d-f,m=e=>o.y+o.height*(1-(e-f)/p);e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let h=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=m(r.value);h?e.lineTo(i,o):(e.moveTo(i,o),h=!0)}}e.stroke()}},Mt=class extends j{descriptor={id:`williamsR`,name:`Williams %R`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new M,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=-1/0,o=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>a&&(a=e[r].high),e[r].low<o&&(o=e[r].low);let s={value:a===o?-50:(a-e[t].close)/(a-o)*-100};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-(e+100)/100);e.strokeStyle=r.colors[1]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[-20,-80]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=l(r.value);u?e.lineTo(i,o):(e.moveTo(i,o),u=!0)}}e.stroke()}},Nt=class extends j{descriptor={id:`cci`,name:`Commodity Channel Index`,placement:`panel`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new M,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=0;for(let r=t-n+1;r<=t;r++)a+=(e[r].high+e[r].low+e[r].close)/3;let o=a/n,s=0;for(let r=t-n+1;r<=t;r++){let t=(e[r].high+e[r].low+e[r].close)/3;s+=Math.abs(t-o)}let c=s/n,l=(e[t].high+e[t].low+e[t].close)/3,u={value:c===0?0:(l-o)/(.015*c)};r.set(e[t].time,u),i[t]=u}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d,m=p-f,h=e=>o.y+o.height*(1-(e-f)/m);e.strokeStyle=r.colors[1]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[-100,0,100])if(t>=f&&t<=p){let n=h(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let g=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=h(r.value);g?e.lineTo(i,o):(e.moveTo(i,o),g=!0)}}e.stroke()}},Pt=class extends j{descriptor={id:`mfi`,name:`Money Flow Index`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new M,i=Array(e.length).fill(null);if(e.length<n+1)return{values:r,series:i};let a=e.map(e=>(e.high+e.low+e.close)/3),o=a.map((t,n)=>t*e[n].volume);for(let t=n;t<e.length;t++){let s=0,c=0;for(let e=t-n+1;e<=t;e++)a[e]>a[e-1]?s+=o[e]:a[e]<a[e-1]&&(c+=o[e]);let l={value:c===0?100:100-100/(1+s/c)};r.set(e[t].time,l),i[t]=l}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[20,80]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=l(r.value);u?e.lineTo(i,o):(e.moveTo(i,o),u=!0)}}e.stroke()}},Ft=class extends j{descriptor={id:`aroon`,name:`Aroon`,placement:`panel`,defaultConfig:{period:25}};calculate(e,t){let n=P(t,`period`,25,1),r=new M,i=Array(e.length).fill(null);for(let t=n;t<e.length;t++){let a=0,o=0,s=-1/0,c=1/0;for(let r=0;r<=n;r++){let i=t-n+r;e[i].high>s&&(s=e[i].high,a=r),e[i].low<c&&(c=e[i].low,o=r)}let l={up:a/n*100,down:o/n*100};r.set(e[t].time,l),i[t]=l}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100),u=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0)continue;let s=a(r,n),c=l(o[t]);u?e.lineTo(s,c):(e.moveTo(s,c),u=!0)}e.stroke()};u(`up`,r.colors[0]),u(`down`,r.colors[1]??`#e8505b`)}},It=class extends j{descriptor={id:`roc`,name:`Rate of Change`,placement:`panel`,defaultConfig:{period:12}};calculate(e,t){let n=P(t,`period`,12,1),r=new M,i=Array(e.length).fill(null);for(let t=n;t<e.length;t++){let a=e[t-n].close,o={value:a===0?0:(e[t].close-a)/a*100};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d,m=p-f,h=e=>o.y+o.height*(1-(e-f)/m);if(0>=f&&0<=p){e.strokeStyle=r.colors[1]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]);let t=h(0);e.beginPath(),e.moveTo(o.x,t),e.lineTo(o.x+o.width,t),e.stroke(),e.setLineDash([])}e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let g=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=h(r.value);g?e.lineTo(i,o):(e.moveTo(i,o),g=!0)}}e.stroke()}},Lt=class extends j{descriptor={id:`tsi`,name:`True Strength Index`,placement:`panel`,defaultConfig:{longPeriod:25,shortPeriod:13,signalPeriod:7}};emaSmooth(e,t){let n=2/(t+1),r=[e[0]];for(let t=1;t<e.length;t++)r.push((e[t]-r[t-1])*n+r[t-1]);return r}calculate(e,t){let n=P(t,`longPeriod`,25,1),r=P(t,`shortPeriod`,13,1),i=P(t,`signalPeriod`,7,1),a=new M,o=Array(e.length).fill(null);if(e.length<2)return{values:a,series:o};let s=[],c=[];for(let t=1;t<e.length;t++){let n=e[t].close-e[t-1].close;s.push(n),c.push(Math.abs(n))}let l=this.emaSmooth(this.emaSmooth(s,n),r),u=this.emaSmooth(this.emaSmooth(c,n),r),d=[];for(let e=0;e<l.length;e++)d.push(u[e]===0?0:l[e]/u[e]*100);let f=this.emaSmooth(d,i);for(let t=0;t<d.length;t++){let n=t+1;if(n<e.length){let r={tsi:d[t],signal:f[t]};a.set(e[n].time,r),o[n]=r}}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&(t.tsi!==void 0&&(l=Math.min(l,t.tsi),u=Math.max(u,t.tsi)),t.signal!==void 0&&(l=Math.min(l,t.signal),u=Math.max(u,t.signal)))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d,m=p-f,h=e=>o.y+o.height*(1-(e-f)/m);0>=f&&0<=p&&(e.strokeStyle=`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,h(0)),e.lineTo(o.x+o.width,h(0)),e.stroke(),e.setLineDash([]));let g=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0)continue;let s=a(r,n),c=h(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};g(`tsi`,r.colors[0]),g(`signal`,r.colors[1]??`#f2a93b`)}},Rt=class extends j{descriptor={id:`cmf`,name:`Chaikin Money Flow`,placement:`panel`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new M,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=0,o=0;for(let r=t-n+1;r<=t;r++){let t=e[r].high-e[r].low,n=t===0?0:(e[r].close-e[r].low-(e[r].high-e[r].close))/t;a+=n*e[r].volume,o+=e[r].volume}let s={value:o===0?0:a/o};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d,m=p-f,h=e=>o.y+o.height*(1-(e-f)/m);0>=f&&0<=p&&(e.strokeStyle=`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,h(0)),e.lineTo(o.x+o.width,h(0)),e.stroke(),e.setLineDash([]));let g=n.barWidth/2;for(let t=s;t<=c&&t<i.length;t++){let o=i[t];if(o&&o.value!==void 0){let i=a(t,n),s=h(o.value),c=h(0);e.fillStyle=o.value>=0?r.colors[0]:r.colors[1]??`#e8505b`;let l=Math.min(s,c);e.fillRect(i-g,l,n.barWidth,Math.max(Math.abs(s-c),1))}}}},zt=class extends j{descriptor={id:`voldelta`,name:`Volume Delta`,placement:`panel`,defaultConfig:{mode:0}};calculate(e,t){let n=N(t,`mode`,0)>=1,r=new M,i=Array(e.length).fill(null),a=0;for(let t=0;t<e.length;t++){let o=e[t],s=o.close>=o.open,c=s?o.volume:-o.volume;a+=c;let l={value:n?a:c,up:+!!s};r.set(o.time,l),i[t]=l}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0),f=n.barWidth/2,p=r.colors[0]??`#1fa874`,m=r.colors[1]??`#e8505b`;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=u(r.value),c=Math.min(s,d),l=Math.max(Math.abs(s-d),1);e.fillStyle=r.up?p:m,e.fillRect(o-f,c,n.barWidth,l)}}},Bt=class extends j{descriptor={id:`vortex`,name:`Vortex Indicator`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new M,i=Array(e.length).fill(null);if(e.length<=n)return{values:r,series:i};let a=Array(e.length).fill(0),o=Array(e.length).fill(0),s=Array(e.length).fill(0);for(let t=1;t<e.length;t++){a[t]=Math.abs(e[t].high-e[t-1].low),o[t]=Math.abs(e[t].low-e[t-1].high);let n=e[t].high,r=e[t].low,i=e[t-1].close;s[t]=Math.max(n-r,Math.abs(n-i),Math.abs(r-i))}let c=0,l=0,u=0;for(let t=1;t<e.length;t++)if(c+=a[t],l+=o[t],u+=s[t],t>n&&(c-=a[t-n],l-=o[t-n],u-=s[t-n]),t>=n&&u>0){let n={viPlus:c/u,viMinus:l/u};r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`viPlus`,`viMinus`]){let n=t[e];n!==void 0&&(n<l&&(l=n),n>u&&(u=n))}}if(l===1/0)return;let d=(u-l)*.1||.1;l-=d,u+=d;let f=u-l||1,p=e=>o.y+o.height*(1-(e-l)/f);if(1>=l&&1<=u){e.strokeStyle=r.colors[2]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]);let t=p(1);e.beginPath(),e.moveTo(o.x,t),e.lineTo(o.x+o.width,t),e.stroke(),e.setLineDash([])}let m=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0)continue;let s=a(r,n),c=p(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};m(`viPlus`,r.colors[0]??`#1fa874`),m(`viMinus`,r.colors[1]??`#e8505b`)}},Vt=class extends j{descriptor={id:`chop`,name:`Choppiness Index`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,2),r=new M,i=Array(e.length).fill(null);if(e.length<=n)return{values:r,series:i};let a=Array(e.length).fill(0);for(let t=1;t<e.length;t++){let n=e[t].high,r=e[t].low,i=e[t-1].close;a[t]=Math.max(n-r,Math.abs(n-i),Math.abs(r-i))}let o=Math.log10(n),s=0;for(let t=1;t<e.length;t++)if(s+=a[t],t>n&&(s-=a[t-n]),t>=n){let a=-1/0,c=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>a&&(a=e[r].high),e[r].low<c&&(c=e[r].low);let l=a-c;if(l>0&&s>0){let n={value:Math.max(0,Math.min(100,100*Math.log10(s/l)/o))};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[38.2,61.8]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}},Ht=class extends j{descriptor={id:`uo`,name:`Ultimate Oscillator`,placement:`panel`,defaultConfig:{fast:7,mid:14,slow:28}};calculate(e,t){let n=P(t,`fast`,7,1),r=P(t,`mid`,14,1),i=P(t,`slow`,28,1),a=new M,o=Array(e.length).fill(null);if(e.length<=i)return{values:a,series:o};let s=Array(e.length).fill(0),c=Array(e.length).fill(0);for(let t=1;t<e.length;t++){let n=e[t-1].close,r=Math.min(e[t].low,n),i=Math.max(e[t].high,n);s[t]=e[t].close-r,c[t]=i-r}let l=(e,t,n)=>{let r=0;for(let i=t-n+1;i<=t;i++)r+=e[i];return r};for(let t=i;t<e.length;t++){let u=Ut(l(s,t,n),l(c,t,n)),d=Ut(l(s,t,r),l(c,t,r)),f=Ut(l(s,t,i),l(c,t,i)),p={value:100*(4*u+2*d+f)/7};a.set(e[t].time,p),o[t]=p}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[30,70]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}};function Ut(e,t){return t===0?0:e/t}var Wt=class extends j{descriptor={id:`fi`,name:`Force Index`,placement:`panel`,defaultConfig:{period:13}};calculate(e,t){let n=P(t,`period`,13,1),r=new M,i=Array(e.length).fill(null);if(e.length<2)return{values:r,series:i};let a=2/(n+1),o;for(let t=1;t<e.length;t++){let s=(e[t].close-e[t-1].close)*e[t].volume;if(o=o===void 0?s:s*a+o*(1-a),t>=n){let n={value:o};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[1]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let f=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=u(r.value);f?e.lineTo(o,s):(e.moveTo(o,s),f=!0)}e.stroke()}},Gt=class extends j{descriptor={id:`crsi`,name:`Connors RSI`,placement:`panel`,defaultConfig:{rsiPeriod:3,streakPeriod:2,rankPeriod:100}};calculate(e,t){let n=P(t,`rsiPeriod`,3,1),r=P(t,`streakPeriod`,2,1),i=P(t,`rankPeriod`,100,1),a=new M,o=Array(e.length).fill(null),s=e.length;if(s<2)return{values:a,series:o};let c=e.map(e=>e.close),l=Kt(c,n),u=Array(s).fill(0);for(let e=1;e<s;e++)c[e]>c[e-1]?u[e]=u[e-1]>0?u[e-1]+1:1:c[e]<c[e-1]?u[e]=u[e-1]<0?u[e-1]-1:-1:u[e]=0;let d=Kt(u,r),f=Array(s).fill(0);for(let e=1;e<s;e++)f[e]=c[e-1]===0?0:(c[e]-c[e-1])/c[e-1]*100;for(let t=0;t<s;t++){if(t<i+1)continue;let n=l[t],r=d[t];if(n===void 0||r===void 0)continue;let s=0;for(let e=t-i;e<t;e++)f[e]<f[t]&&s++;let c=s/i*100,u={value:(n+r+c)/3};a.set(e[t].time,u),o[t]=u}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[10,90]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}};function Kt(e,t){let n=e.length,r=Array(n).fill(void 0);if(n<=t)return r;let i=0,a=0;for(let n=1;n<=t;n++){let t=e[n]-e[n-1];t>=0?i+=t:a-=t}i/=t,a/=t,r[t]=a===0?100:100-100/(1+i/a);for(let o=t+1;o<n;o++){let n=e[o]-e[o-1],s=n>0?n:0,c=n<0?-n:0;i=(i*(t-1)+s)/t,a=(a*(t-1)+c)/t,r[o]=a===0?100:100-100/(1+i/a)}return r}var qt=class extends j{descriptor={id:`coppock`,name:`Coppock Curve`,placement:`panel`,defaultConfig:{longRoc:14,shortRoc:11,wma:10}};calculate(e,t){let n=P(t,`longRoc`,14,1),r=P(t,`shortRoc`,11,1),i=P(t,`wma`,10,1),a=new M,o=Array(e.length).fill(null),s=e.length,c=Math.max(n,r);if(s<=c+i)return{values:a,series:o};let l=e.map(e=>e.close),u=(e,t)=>l[e-t]===0?0:(l[e]-l[e-t])/l[e-t]*100,d=Array(s).fill(void 0);for(let e=c;e<s;e++)d[e]=u(e,n)+u(e,r);let f=i*(i+1)/2;for(let t=c+i-1;t<s;t++){let n=0,r=!0;for(let e=0;e<i;e++){let a=d[t-e];if(a===void 0){r=!1;break}n+=a*(i-e)}if(!r)continue;let s={value:n/f};a.set(e[t].time,s),o[t]=s}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[1]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let f=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=u(r.value);f?e.lineTo(o,s):(e.moveTo(o,s),f=!0)}e.stroke()}},Jt=class extends j{descriptor={id:`kst`,name:`Know Sure Thing`,placement:`panel`,defaultConfig:{roc1:10,roc2:15,roc3:20,roc4:30,sma1:10,sma2:10,sma3:10,sma4:15,signal:9}};calculate(e,t){let n=P(t,`roc1`,10,1),r=P(t,`roc2`,15,1),i=P(t,`roc3`,20,1),a=P(t,`roc4`,30,1),o=P(t,`sma1`,10,1),s=P(t,`sma2`,10,1),c=P(t,`sma3`,10,1),l=P(t,`sma4`,15,1),u=P(t,`signal`,9,1),d=new M,f=Array(e.length).fill(null),p=e.length;if(p<2)return{values:d,series:f};let m=e.map(e=>e.close),h=F(Yt(m,n),o),g=F(Yt(m,r),s),_=F(Yt(m,i),c),v=F(Yt(m,a),l),y=Array(p).fill(void 0);for(let e=0;e<p;e++)h[e]===void 0||g[e]===void 0||_[e]===void 0||v[e]===void 0||(y[e]=h[e]*1+g[e]*2+_[e]*3+v[e]*4);let b=F(y,u);for(let t=0;t<p;t++){if(y[t]===void 0)continue;let n={value:y[t]};b[t]!==void 0&&(n.signal=b[t]),d.set(e[t].time,n),f[t]=n}return{values:d,series:f}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`signal`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[2]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};f(`value`,r.colors[0]??`#4c8dff`),f(`signal`,r.colors[1]??`#f2a93b`)}};function Yt(e,t){let n=Array(e.length).fill(void 0);for(let r=t;r<e.length;r++)n[r]=e[r-t]===0?0:(e[r]-e[r-t])/e[r-t]*100;return n}function F(e,t){let n=Array(e.length).fill(void 0);for(let r=t-1;r<e.length;r++){let i=0,a=!0;for(let n=r-t+1;n<=r;n++){let t=e[n];if(t===void 0){a=!1;break}i+=t}a&&(n[r]=i/t)}return n}var Xt=class extends j{descriptor={id:`elderray`,name:`Elder Ray`,placement:`panel`,defaultConfig:{period:13}};calculate(e,t){let n=P(t,`period`,13,1),r=new M,i=Array(e.length).fill(null),a=e.length;if(a===0)return{values:r,series:i};let o=2/(n+1),s;for(let t=0;t<a;t++)if(s=s===void 0?e[t].close:e[t].close*o+s*(1-o),t>=n-1){let n={bull:e[t].high-s,bear:e[t].low-s};r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`bull`,`bear`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0),f=n.barWidth/2;e.strokeStyle=r.colors[2]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let p=r.colors[0]??`#1fa874`,m=r.colors[1]??`#e8505b`;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r)continue;let o=a(t,n);if(r.bull!==void 0){let t=u(r.bull);e.fillStyle=p,e.globalAlpha=.8,e.fillRect(o-f,Math.min(t,d),Math.max(1,f),Math.abs(t-d))}if(r.bear!==void 0){let t=u(r.bear);e.fillStyle=m,e.globalAlpha=.8,e.fillRect(o,Math.min(t,d),Math.max(1,f),Math.abs(t-d))}}e.globalAlpha=1}},Zt=class extends j{descriptor={id:`stc`,name:`Schaff Trend Cycle`,placement:`panel`,defaultConfig:{fast:23,slow:50,cycle:10}};calculate(e,t){let n=P(t,`fast`,23,1),r=P(t,`slow`,50,1),i=P(t,`cycle`,10,1),a=new M,o=Array(e.length).fill(null),s=e.length;if(s===0)return{values:a,series:o};let c=e.map(e=>e.close),l=2/(n+1),u=2/(r+1),d=c[0],f=c[0],p=Array(s);for(let e=0;e<s;e++)d=e===0?c[0]:c[e]*l+d*(1-l),f=e===0?c[0]:c[e]*u+f*(1-u),p[e]=d-f;let m=Qt(Qt(p,i),i);for(let t=0;t<s;t++){let n=m[t];if(n===void 0)continue;let r={value:Math.max(0,Math.min(100,n))};a.set(e[t].time,r),o[t]=r}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[25,75]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}};function Qt(e,t){let n=e.length,r=Array(n).fill(void 0),i;for(let a=0;a<n;a++){if(a<t-1)continue;let n=1/0,o=-1/0,s=!0;for(let r=a-t+1;r<=a;r++){let t=e[r];if(t===void 0){s=!1;break}t<n&&(n=t),t>o&&(o=t)}if(!s||e[a]===void 0)continue;let c=o-n>0?(e[a]-n)/(o-n)*100:50;i=i===void 0?c:i+.5*(c-i),r[a]=i}return r}var $t=class extends j{descriptor={id:`kvo`,name:`Klinger Oscillator`,placement:`panel`,defaultConfig:{fast:34,slow:55,signal:13}};calculate(e,t){let n=P(t,`fast`,34,1),r=P(t,`slow`,55,1),i=P(t,`signal`,13,1),a=new M,o=Array(e.length).fill(null),s=e.length;if(s<2)return{values:a,series:o};let c=2/(n+1),l=2/(r+1),u=2/(i+1),d,f=1,p=0,m=0,h,g,_;for(let t=0;t<s;t++){let n=e[t],i=n.high+n.low+n.close,s=d===void 0||i>d?1:-1,v=n.high-n.low;m=d===void 0?v:s===f?m+v:p+v;let y=m===0?0:n.volume*Math.abs(2*(v/m-1))*s*100;h=h===void 0?y:y*c+h*(1-c),g=g===void 0?y:y*l+g*(1-l);let b=h-g;if(_=_===void 0?b:b*u+_*(1-u),d=i,f=s,p=v,t>=r){let e={value:b,signal:_};a.set(n.time,e),o[t]=e}}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`signal`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[2]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};f(`value`,r.colors[0]??`#4c8dff`),f(`signal`,r.colors[1]??`#f2a93b`)}},en=class extends j{descriptor={id:`fisher`,name:`Fisher Transform`,placement:`panel`,defaultConfig:{period:9}};calculate(e,t){let n=P(t,`period`,9,1),r=new M,i=Array(e.length).fill(null),a=e.length;if(a<n)return{values:r,series:i};let o=e.map(e=>(e.high+e.low)/2),s=0,c=0;for(let t=n-1;t<a;t++){let a=-1/0,l=1/0;for(let e=t-n+1;e<=t;e++)o[e]>a&&(a=o[e]),o[e]<l&&(l=o[e]);s=.33*(a-l>0?2*(o[t]-l)/(a-l)-1:0)+.67*s,s=Math.max(-.999,Math.min(.999,s));let u=c;c=.5*Math.log((1+s)/(1-s))+.5*c;let d={value:c,trigger:u};r.set(e[t].time,d),i[t]=d}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`trigger`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[2]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};f(`value`,r.colors[0]??`#4c8dff`),f(`trigger`,r.colors[1]??`#f2a93b`)}},tn=class extends j{descriptor={id:`dpo`,name:`Detrended Price Oscillator`,placement:`panel`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,2),r=Math.floor(n/2)+1,i=new M,a=Array(e.length).fill(null),o=e.length;if(o<n)return{values:i,series:a};let s=0;for(let t=0;t<o;t++)if(s+=e[t].close,t>=n&&(s-=e[t-n].close),t>=n-1&&t-r>=0){let o=s/n,c={value:e[t-r].close-o};i.set(e[t].time,c),a[t]=c}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0),f=n.barWidth/2;e.strokeStyle=r.colors[2]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let p=r.colors[0]??`#1fa874`,m=r.colors[1]??`#e8505b`;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=u(r.value);e.fillStyle=r.value>=0?p:m,e.fillRect(o-f,Math.min(s,d),n.barWidth,Math.max(1,Math.abs(s-d)))}}},nn=class extends j{descriptor={id:`bop`,name:`Balance of Power`,placement:`panel`,defaultConfig:{smooth:14}};calculate(e,t){let n=P(t,`smooth`,14,1),r=new M,i=Array(e.length).fill(null),a=e.length;if(a===0)return{values:r,series:i};let o=Array(a);for(let t=0;t<a;t++){let n=e[t].high-e[t].low;o[t]=n>0?(e[t].close-e[t].open)/n:0}let s=0;for(let t=0;t<a;t++)if(s+=o[t],t>=n&&(s-=o[t-n]),t>=n-1){let a={value:s/n};r.set(e[t].time,a),i[t]=a}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-(e+1)/2),u=l(0);e.strokeStyle=r.colors[2]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,u),e.lineTo(o.x+o.width,u),e.stroke(),e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let d=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(Math.max(-1,Math.min(1,r.value)));d?e.lineTo(o,s):(e.moveTo(o,s),d=!0)}e.stroke()}},rn=class extends j{descriptor={id:`massindex`,name:`Mass Index`,placement:`panel`,defaultConfig:{ema:9,sum:25}};calculate(e,t){let n=P(t,`ema`,9,1),r=P(t,`sum`,25,1),i=new M,a=Array(e.length).fill(null),o=e.length;if(o<r)return{values:i,series:a};let s=2/(n+1),c,l,u=Array(o).fill(0);for(let t=0;t<o;t++){let n=e[t].high-e[t].low;c=c===void 0?n:n*s+c*(1-s),l=l===void 0?c:c*s+l*(1-s),u[t]=l===0?1:c/l}let d=0;for(let t=0;t<o;t++)if(d+=u[t],t>=r&&(d-=u[t-r]),t>=n+r){let n={value:d};i.set(e[t].time,n),a[t]=n}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&(t<l&&(l=t),t>u&&(u=t))}if(l===1/0)return;l=Math.min(l,26),u=Math.max(u,27.5);let d=u-l||1,f=e=>o.y+o.height*(1-(e-l)/d);e.strokeStyle=r.colors[1]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[26.5,27]){let n=f(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let p=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=f(r.value);p?e.lineTo(o,s):(e.moveTo(o,s),p=!0)}e.stroke()}},an=class extends j{descriptor={id:`cmo`,name:`Chande Momentum`,placement:`panel`,defaultConfig:{period:9}};calculate(e,t){let n=P(t,`period`,9,1),r=new M,i=Array(e.length).fill(null),a=e.length;if(a<=n)return{values:r,series:i};let o=Array(a).fill(0),s=Array(a).fill(0);for(let t=1;t<a;t++){let n=e[t].close-e[t-1].close;o[t]=n>0?n:0,s[t]=n<0?-n:0}let c=0,l=0;for(let t=1;t<a;t++)if(c+=o[t],l+=s[t],t>n&&(c-=o[t-n],l-=s[t-n]),t>=n){let n=c+l,a={value:n>0?100*(c-l)/n:0};r.set(e[t].time,a),i[t]=a}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-(e+100)/200);e.strokeStyle=r.colors[1]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[-50,0,50]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}},on=class extends j{descriptor={id:`trix`,name:`TRIX`,placement:`panel`,defaultConfig:{period:15,signal:9}};calculate(e,t){let n=P(t,`period`,15,1),r=P(t,`signal`,9,1),i=new M,a=Array(e.length).fill(null),o=e.length;if(o<2)return{values:i,series:a};let s=sn(sn(sn(e.map(e=>e.close),n),n),n),c=Array(o).fill(0);for(let e=1;e<o;e++)c[e]=s[e-1]===0?0:(s[e]-s[e-1])/s[e-1]*100;let l=sn(c,r),u=3*n;for(let t=u;t<o;t++){let n={value:c[t],signal:l[t]};i.set(e[t].time,n),a[t]=n}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`signal`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[2]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};f(`value`,r.colors[0]??`#4c8dff`),f(`signal`,r.colors[1]??`#f2a93b`)}};function sn(e,t){let n=2/(t+1),r=Array(e.length).fill(0),i=e[0]??0;r[0]=i;for(let t=1;t<e.length;t++)i=e[t]*n+i*(1-n),r[t]=i;return r}var cn=class extends j{descriptor={id:`emv`,name:`Ease of Movement`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new M,i=Array(e.length).fill(null),a=e.length;if(a<2)return{values:r,series:i};let o=Array(a).fill(0);for(let t=1;t<a;t++){let n=(e[t].high+e[t].low)/2,r=(e[t-1].high+e[t-1].low)/2,i=e[t].high-e[t].low,a=e[t].volume;o[t]=a>0?(n-r)*i/a:0}let s=0;for(let t=1;t<a;t++)if(s+=o[t],t>n&&(s-=o[t-n]),t>=n){let a={value:s/n};r.set(e[t].time,a),i[t]=a}return{values:r,series:i}}render(e,t,n,r){ln(e,t,n,r)}};function ln(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[1]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let f=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=u(r.value);f?e.lineTo(o,s):(e.moveTo(o,s),f=!0)}e.stroke()}var un=class extends j{descriptor={id:`wad`,name:`Williams A/D`,placement:`panel`,defaultConfig:{}};calculate(e,t){let n=new M,r=Array(e.length).fill(null),i=e.length;if(i===0)return{values:n,series:r};let a=0;n.set(e[0].time,{value:0}),r[0]={value:0};for(let t=1;t<i;t++){let i=e[t-1].close,o=e[t].close;o>i?a+=o-Math.min(e[t].low,i):o<i&&(a+=o-Math.max(e[t].high,i));let s={value:a};n.set(e[t].time,s),r[t]=s}return{values:n,series:r}}render(e,t,n,r){dn(e,t,n,r,a)}};function dn(e,t,n,r,i){let a=t.series;if(!a)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<a.length;e++){let t=a[e]?.value;t!==void 0&&(t<l&&(l=t),t>u&&(u=t))}if(l===1/0)return;let d=u-l||1,f=e=>o.y+o.height*(1-(e-l)/d);e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let p=!1;for(let t=s;t<=c&&t<a.length;t++){let r=a[t];if(!r||r.value===void 0)continue;let o=i(t,n),s=f(r.value);p?e.lineTo(o,s):(e.moveTo(o,s),p=!0)}e.stroke()}var fn=class extends j{descriptor={id:`pvt`,name:`Price Volume Trend`,placement:`panel`,defaultConfig:{}};calculate(e,t){let n=new M,r=Array(e.length).fill(null),i=e.length;if(i===0)return{values:n,series:r};let a=0;n.set(e[0].time,{value:0}),r[0]={value:0};for(let t=1;t<i;t++){let i=e[t-1].close;i!==0&&(a+=e[t].volume*(e[t].close-i)/i);let o={value:a};n.set(e[t].time,o),r[t]=o}return{values:n,series:r}}render(e,t,n,r){dn(e,t,n,r,a)}},pn=class extends j{descriptor={id:`chaikinvol`,name:`Chaikin Volatility`,placement:`panel`,defaultConfig:{ema:10,roc:10}};calculate(e,t){let n=P(t,`ema`,10,1),r=P(t,`roc`,10,1),i=new M,a=Array(e.length).fill(null),o=e.length;if(o<=r)return{values:i,series:a};let s=2/(n+1),c=Array(o),l=e[0].high-e[0].low;c[0]=l;for(let t=1;t<o;t++)l=(e[t].high-e[t].low)*s+l*(1-s),c[t]=l;for(let t=n+r;t<o;t++){let n=c[t-r],o={value:n===0?0:(c[t]-n)/n*100};i.set(e[t].time,o),a[t]=o}return{values:i,series:a}}render(e,t,n,r){ln(e,t,n,r)}},mn=class extends j{descriptor={id:`rvi`,name:`Relative Vigor Index`,placement:`panel`,defaultConfig:{period:10}};calculate(e,t){let n=P(t,`period`,10,1),r=new M,i=Array(e.length).fill(null),a=e.length;if(a<n+3)return{values:r,series:i};let o=Array(a).fill(0),s=Array(a).fill(0);for(let t=0;t<a;t++)o[t]=e[t].close-e[t].open,s[t]=e[t].high-e[t].low;let c=(e,t)=>(e[t]+2*e[t-1]+2*e[t-2]+e[t-3])/6,l=Array(a).fill(void 0),u=Array(a).fill(void 0);for(let e=3;e<a;e++)l[e]=c(o,e),u[e]=c(s,e);let d=Array(a).fill(void 0);for(let e=3+n-1;e<a;e++){let t=0,r=0;for(let i=e-n+1;i<=e;i++)t+=l[i],r+=u[i];d[e]=r===0?0:t/r}for(let t=0;t<a;t++){if(d[t]===void 0)continue;let n={value:d[t]};t>=3&&d[t-3]!==void 0&&(n.signal=(d[t]+2*d[t-1]+2*d[t-2]+d[t-3])/6),r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`signal`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[2]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};f(`value`,r.colors[0]??`#4c8dff`),f(`signal`,r.colors[1]??`#f2a93b`)}},hn=class extends j{descriptor={id:`stochrsi`,name:`Stochastic RSI`,placement:`panel`,defaultConfig:{rsiPeriod:14,stochPeriod:14,k:3,d:3}};calculate(e,t){let n=P(t,`rsiPeriod`,14,1),r=P(t,`stochPeriod`,14,1),i=P(t,`k`,3,1),a=P(t,`d`,3,1),o=new M,s=Array(e.length).fill(null),c=e.length;if(c<=n+r)return{values:o,series:s};let l=gn(e.map(e=>e.close),n),u=Array(c).fill(void 0);for(let e=0;e<c;e++){if(l[e]===void 0)continue;let t=1/0,n=-1/0,i=!0;for(let a=e-r+1;a<=e;a++){if(a<0||l[a]===void 0){i=!1;break}l[a]<t&&(t=l[a]),l[a]>n&&(n=l[a])}i&&(u[e]=n-t>0?(l[e]-t)/(n-t)*100:0)}let d=_n(u,i),f=_n(d,a);for(let t=0;t<c;t++){if(d[t]===void 0)continue;let n={k:d[t]};f[t]!==void 0&&(n.d=f[t]),o.set(e[t].time,n),s[t]=n}return{values:o,series:s}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[2]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[20,80]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]);let u=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){u=!1;continue}let s=a(r,n),c=l(o[t]);u?e.lineTo(s,c):(e.moveTo(s,c),u=!0)}e.stroke()};u(`k`,r.colors[0]??`#4c8dff`),u(`d`,r.colors[1]??`#f2a93b`)}};function gn(e,t){let n=e.length,r=Array(n).fill(void 0);if(n<=t)return r;let i=0,a=0;for(let n=1;n<=t;n++){let t=e[n]-e[n-1];t>=0?i+=t:a-=t}i/=t,a/=t,r[t]=a===0?100:100-100/(1+i/a);for(let o=t+1;o<n;o++){let n=e[o]-e[o-1];i=(i*(t-1)+(n>0?n:0))/t,a=(a*(t-1)+(n<0?-n:0))/t,r[o]=a===0?100:100-100/(1+i/a)}return r}function _n(e,t){let n=Array(e.length).fill(void 0);for(let r=t-1;r<e.length;r++){let i=0,a=!0;for(let n=r-t+1;n<=r;n++){if(e[n]===void 0){a=!1;break}i+=e[n]}a&&(n[r]=i/t)}return n}var vn=class extends j{descriptor={id:`ppo`,name:`Percentage Price Oscillator`,placement:`panel`,defaultConfig:{fast:12,slow:26,signal:9}};calculate(e,t){let n=P(t,`fast`,12,1),r=P(t,`slow`,26,1),i=P(t,`signal`,9,1),a=new M,o=Array(e.length).fill(null),s=e.length;if(s<=r)return{values:a,series:o};let c=e.map(e=>e.close),l=yn(c,n),u=yn(c,r),d=Array(s).fill(void 0);for(let e=0;e<s;e++)l[e]===void 0||u[e]===void 0||u[e]===0||(d[e]=(l[e]-u[e])/u[e]*100);let f=yn(d,i);for(let t=0;t<s;t++){if(d[t]===void 0)continue;let n={value:d[t]};f[t]!==void 0&&(n.signal=f[t],n.hist=d[t]-f[t]),a.set(e[t].time,n),o[t]=n}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`signal`,`hist`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0),f=Math.max(1,o.width/(c-s+1)*.6);for(let t=s;t<=c&&t<i.length;t++){let r=i[t]?.hist;if(r===void 0)continue;let o=a(t,n),s=u(r);e.fillStyle=r>=0?`rgba(31, 168, 116,0.5)`:`rgba(232, 80, 91,0.5)`;let c=Math.min(s,d);e.fillRect(o-f/2,c,f,Math.max(1,Math.abs(s-d)))}e.strokeStyle=r.colors[2]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let p=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};p(`value`,r.colors[0]??`#4c8dff`),p(`signal`,r.colors[1]??`#f2a93b`)}};function yn(e,t){let n=e.length,r=Array(n).fill(void 0),i=2/(t+1),a,o=0,s=0;for(let c=0;c<n;c++){let n=e[c];n!==void 0&&(a===void 0?(o+=n,s++,s===t&&(a=o/t,r[c]=a)):(a=n*i+a*(1-i),r[c]=a))}return r}var bn=class extends j{descriptor={id:`ac`,name:`Accelerator Oscillator`,placement:`panel`,defaultConfig:{}};calculate(e){let t=new M,n=Array(e.length).fill(null),r=e.length;if(r<38)return{values:t,series:n};let i=e.map(e=>(e.high+e.low)/2),a=Array(r).fill(void 0);for(let e=33;e<r;e++)a[e]=xn(i,e,5)-xn(i,e,34);for(let i=37;i<r;i++){let r=0;for(let e=i-4;e<=i;e++)r+=a[e];let o={value:a[i]-r/5};t.set(e[i].time,o),n[i]=o}return{values:t,series:n}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[1]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=Math.max(1,o.width/(c-s+1)*.6),p;for(let t=s;t<=c&&t<i.length;t++){let r=i[t]?.value;if(r===void 0){p=void 0;continue}let o=a(t,n),s=u(r);e.fillStyle=(p===void 0?r>=0:r>=p)?`rgba(31, 168, 116,0.85)`:`rgba(232, 80, 91,0.85)`;let c=Math.min(s,d);e.fillRect(o-f/2,c,f,Math.max(1,Math.abs(s-d))),p=r}}};function xn(e,t,n){let r=0;for(let i=t-n+1;i<=t;i++)r+=e[i];return r/n}var Sn=class extends j{descriptor={id:`rmi`,name:`Relative Momentum Index`,placement:`panel`,defaultConfig:{period:20,momentum:5}};calculate(e,t){let n=P(t,`period`,20,1),r=P(t,`momentum`,5,1),i=new M,a=Array(e.length).fill(null),o=e.length;if(o<=n+r)return{values:i,series:a};let s=e.map(e=>e.close),c=Array(o).fill(0),l=Array(o).fill(0);for(let e=r;e<o;e++){let t=s[e]-s[e-r];c[e]=t>0?t:0,l[e]=t<0?-t:0}let u=0,d=0,f=r+n;for(let e=r+1;e<=f;e++)u+=c[e],d+=l[e];u/=n,d/=n;let p=t=>{let n={value:d===0?100:100-100/(1+u/d)};i.set(e[t].time,n),a[t]=n};p(f);for(let e=f+1;e<o;e++)u=(u*(n-1)+c[e])/n,d=(d*(n-1)+l[e])/n,p(e);return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[30,70]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0]??`#4c8dff`,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0){u=!1;continue}let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}},Cn=class extends j{descriptor={id:`disparity`,name:`Disparity Index`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new M,i=Array(e.length).fill(null),a=e.length;if(a<n)return{values:r,series:i};let o=0;for(let t=0;t<a;t++)if(o+=e[t].close,t>=n&&(o-=e[t-n].close),t>=n-1){let a=o/n,s={value:a===0?0:(e[t].close-a)/a*100};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}render(e,t,n,r){ln(e,t,n,r)}},wn=class extends j{descriptor={id:`qstick`,name:`Qstick`,placement:`panel`,defaultConfig:{period:8}};calculate(e,t){let n=P(t,`period`,8,1),r=new M,i=Array(e.length).fill(null),a=e.length;if(a<n)return{values:r,series:i};let o=0;for(let t=0;t<a;t++){let a=e[t].close-e[t].open;if(o+=a,t>=n&&(o-=e[t-n].close-e[t-n].open),t>=n-1){let a={value:o/n};r.set(e[t].time,a),i[t]=a}}return{values:r,series:i}}render(e,t,n,r){ln(e,t,n,r)}},Tn=class extends j{descriptor={id:`pgo`,name:`Pretty Good Oscillator`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new M,i=Array(e.length).fill(null),a=e.length;if(a<=n)return{values:r,series:i};let o=Array(a).fill(0);for(let t=0;t<a;t++){if(t===0){o[t]=e[t].high-e[t].low;continue}let n=e[t-1].close;o[t]=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-n),Math.abs(e[t].low-n))}let s=Array(a).fill(void 0),c=0;for(let e=1;e<=n;e++)c+=o[e];s[n]=c/n;for(let e=n+1;e<a;e++)s[e]=(s[e-1]*(n-1)+o[e])/n;let l=0;for(let t=0;t<a;t++)if(l+=e[t].close,t>=n&&(l-=e[t-n].close),t>=n&&s[t]!==void 0&&s[t]>0){let a=l/n,o={value:(e[t].close-a)/s[t]};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=3;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}let u=e=>o.y+o.height*(1-(e+l)/(2*l));e.strokeStyle=r.colors[1]??`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[-3,0,3]){let n=u(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0]??`#4c8dff`,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let d=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0){d=!1;continue}let o=a(t,n),s=u(r.value);d?e.lineTo(o,s):(e.moveTo(o,s),d=!0)}e.stroke()}},En=class extends j{descriptor={id:`stddev`,name:`Standard Deviation`,placement:`panel`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new M,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=0;for(let r=t-n+1;r<=t;r++)a+=e[r].close;let o=a/n,s=0;for(let r=t-n+1;r<=t;r++){let t=e[r].close-o;s+=t*t}let c={value:Math.sqrt(s/n)};r.set(e[t].time,c),i[t]=c}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d-f,m=e=>o.y+o.height*(1-(e-f)/p);e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let h=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=m(r.value);h?e.lineTo(i,o):(e.moveTo(i,o),h=!0)}}e.stroke()}},Dn=class extends j{descriptor={id:`volumeProfile`,name:`Volume Profile`,placement:`panel`,defaultConfig:{rows:24}};calculate(e,t){let n=P(t,`rows`,24,1),r=new M,i=Array(e.length).fill(null);if(e.length===0)return{values:r,series:i};let a=1/0,o=-1/0;for(let t of e)t.low<a&&(a=t.low),t.high>o&&(o=t.high);let s=(o-a||1)/n,c=Array(n).fill(0);for(let t of e){let e=(t.high+t.low+t.close)/3,r=Math.min(n-1,Math.floor((e-a)/s));c[r]+=t.volume}for(let e=0;e<n;e++){let t=a+(e+.5)*s;r.set(e,{price:t,volume:c[e],rowIndex:e})}return{values:r,series:i,meta:{minPrice:a,maxPrice:o,rows:n,rowHeight:s,bins:c,maxVolume:Math.max(...c)}}}render(e,t,n,r){let{chartRect:i}=n,a=t.meta;if(!a||a.maxVolume===0)return;let{minPrice:o,rows:c,rowHeight:l,bins:u,maxVolume:d}=a,f=i.width*.3,p=s(n);for(let t=0;t<c;t++){let n=p(o+t*l),a=p(o+(t+1)*l),s=u[t]/d*f;e.fillStyle=u[t]>d*.7?r.colors[1]??`rgba(242, 169, 59, 0.5)`:r.colors[0]??`rgba(76, 141, 255, 0.3)`,e.fillRect(i.x,Math.min(n,a),s,Math.max(Math.abs(n-a)-1,1))}}},On=class extends j{descriptor={id:`ad`,name:`Accumulation/Distribution`,placement:`panel`,defaultConfig:{}};calculate(e,t){let n=new M,r=Array(e.length).fill(null);if(e.length===0)return{values:n,series:r};let i=0;for(let t=0;t<e.length;t++){let a=e[t].high-e[t].low,o=a===0?0:(e[t].close-e[t].low-(e[t].high-e[t].close))/a;i+=o*e[t].volume;let s={value:i};n.set(e[t].time,s),r[t]=s}return{values:n,series:r}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d-f,m=e=>o.y+o.height*(1-(e-f)/p);e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let h=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=m(r.value);h?e.lineTo(i,o):(e.moveTo(i,o),h=!0)}}e.stroke()}},kn=class extends j{descriptor={id:`vroc`,name:`Volume Rate of Change`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new M,i=Array(e.length).fill(null);for(let t=n;t<e.length;t++){let a=e[t-n].volume,o={value:a===0?0:(e[t].volume-a)/a*100};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d,m=p-f,h=e=>o.y+o.height*(1-(e-f)/m);0>=f&&0<=p&&(e.strokeStyle=`#7d8696`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,h(0)),e.lineTo(o.x+o.width,h(0)),e.stroke(),e.setLineDash([])),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let g=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=h(r.value);g?e.lineTo(i,o):(e.moveTo(i,o),g=!0)}}e.stroke()}};function An(e){e.register(new Ye),e.register(new Xe),e.register(new Ze),e.register(new Qe),e.register(new $e),e.register(new et),e.register(new tt),e.register(new nt),e.register(new rt),e.register(new at),e.register(new ot),e.register(new st),e.register(new ct),e.register(new lt),e.register(new ft),e.register(new pt),e.register(new mt),e.register(new ht),e.register(new _t),e.register(new vt),e.register(new yt),e.register(new Ct),e.register(new Et),e.register(new Dt),e.register(new Ot),e.register(new kt),e.register(new At),e.register(new jt),e.register(new Mt),e.register(new Nt),e.register(new Pt),e.register(new Ft),e.register(new It),e.register(new Lt),e.register(new Rt),e.register(new En),e.register(new Dn),e.register(new On),e.register(new kn),e.register(new wt),e.register(new Tt),e.register(new zt),e.register(new Bt),e.register(new Vt),e.register(new Ht),e.register(new Wt),e.register(new Gt),e.register(new qt),e.register(new Jt),e.register(new Xt),e.register(new Zt),e.register(new $t),e.register(new en),e.register(new tn),e.register(new nn),e.register(new rn),e.register(new an),e.register(new on),e.register(new cn),e.register(new fn),e.register(new un),e.register(new pn),e.register(new mn),e.register(new hn),e.register(new vn),e.register(new bn),e.register(new Sn),e.register(new Cn),e.register(new wn),e.register(new Tn)}function jn(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.requestId==`number`?t.type===`result`||t.type===`pong`||t.type===`error`:!1}var Mn=class{worker;fallbackPlugins;timeoutMs;nextRequestId=1;pending=new Map;messageHandler;constructor(e,t={}){this.worker=e,this.fallbackPlugins=t.fallbackPlugins??new Map,this.timeoutMs=t.timeoutMs??3e4,this.messageHandler=e=>this.handleMessage(e),this.worker&&(this.worker.addEventListener(`message`,this.messageHandler),this.worker.addEventListener(`error`,this.messageHandler))}hasWorker(){return this.worker!==null}registerFallbackPlugin(e){this.fallbackPlugins.set(e.descriptor.id,e)}async calculate(e,t,n){if(!this.worker){let r=this.fallbackPlugins.get(e);if(!r)throw Error(`Unknown indicator: ${e}`);return r.calculate(n,t)}let r=this.nextRequestId++,i={type:`calculate`,requestId:r,indicatorId:e,config:t,data:n};return new Promise((t,n)=>{let a={resolve:t,reject:n,timer:null};this.timeoutMs>0&&(a.timer=setTimeout(()=>{this.pending.delete(r),n(Error(`Indicator worker timeout (${this.timeoutMs}ms): ${e}`))},this.timeoutMs)),this.pending.set(r,a),this.worker.postMessage(i)})}ping(){if(!this.worker)return Promise.resolve();let e=this.nextRequestId++;return new Promise((t,n)=>{let r={resolve:()=>t(),reject:n,timer:this.timeoutMs>0?setTimeout(()=>{this.pending.delete(e),n(Error(`Indicator worker ping timeout`))},this.timeoutMs):null};this.pending.set(e,r),this.worker.postMessage({type:`ping`,requestId:e})})}terminate(){this.worker&&=(this.worker.removeEventListener(`message`,this.messageHandler),this.worker.removeEventListener(`error`,this.messageHandler),this.worker.terminate(),null);for(let e of this.pending.values())e.timer&&clearTimeout(e.timer),e.reject(Error(`Indicator worker terminated`));this.pending.clear()}handleMessage(e){let t=e.data;if(t!==void 0){if(!jn(t))return;this.dispatchResponse(t);return}let n=e.message??`Indicator worker error`;for(let[e,t]of this.pending)t.timer&&clearTimeout(t.timer),t.reject(Error(n)),this.pending.delete(e)}dispatchResponse(e){let t=this.pending.get(e.requestId);if(t){if(this.pending.delete(e.requestId),t.timer&&clearTimeout(t.timer),e.type===`error`){t.reject(Error(e.message));return}if(e.type===`pong`){t.resolve(void 0);return}t.resolve(e.output)}}},Nn=class{visible=!0;setVisible(e){this.visible=e}isVisible(){return this.visible}render(t,n,r){if(!this.visible)return;let{chartRect:i,priceRange:a}=n;if(t.strokeStyle=r.grid,t.lineWidth=1,a.max-a.min<=0)return;let o=s(n);t.beginPath();let c=(0,e.computeTickStep)(a.min,a.max,8),l=Math.ceil(a.min/c)*c;for(let e=l;e<=a.max;e+=c){let n=Math.round(o(e))+.5;t.moveTo(i.x,n),t.lineTo(i.x+i.width,n)}let u=n.barWidth+n.barSpacing,d=Math.max(1,Math.ceil(80/u)),f=-n.offset+i.x+n.barWidth/2,p=Math.floor(n.offset/u),m=Math.ceil((n.offset+i.width)/u);for(let e=p;e<=m;e++){if(e%d!==0)continue;let n=Math.round(e*u+f)+.5;t.moveTo(n,i.y),t.lineTo(n,i.y+i.height)}t.stroke()}},Pn=12,Fn=class{locale=`en-US`;reservedPrice=null;setReservedPriceProvider(e){this.reservedPrice=e}setLocale(e){this.locale=e}render(t,n,r){let{chartRect:i,priceRange:a}=n,c=i.x+i.width;if(a.max-a.min<=0)return;let l=s(n);t.strokeStyle=r.axisLine,t.lineWidth=1,t.globalAlpha=.65,t.beginPath(),t.moveTo(c+.5,i.y),t.lineTo(c+.5,i.y+i.height),t.stroke(),t.globalAlpha=1;let u=(0,e.computeTickStep)(a.min,a.max,8),d=Math.ceil(a.min/u)*u,f=(0,e.autoPricePrecision)(a.min,a.max),p=`500 ${r.font.sizeSmall}px ${r.font.family}`,m=n.scaleMode??(n.logScale?`logarithmic`:`regular`),h=n.scaleBaseline,g=[],_=this.reservedPrice?.()??null,v=_===null?null:o(_,n);for(let t=d;t<=a.max;t+=u){let n=l(t);v!==null&&Math.abs(n-v)<Pn||g.push({y:n,text:(0,e.formatPriceScaleLabel)(t,m,h,f,this.locale)})}t.font=p,t.textBaseline=`middle`,t.textAlign=`left`,t.strokeStyle=r.axisLine,t.globalAlpha=.45,t.beginPath();for(let{y:e}of g)t.moveTo(c+1,e+.5),t.lineTo(c+4,e+.5);t.stroke(),t.globalAlpha=1,t.fillStyle=r.axisLabel;for(let{y:e,text:n}of g)t.fillText(n,c+8,e)}},In=e=>e<10?`0`+e:``+e,Ln=class{tzOffsetMinutes=null;setTimezoneOffset(e){this.tzOffsetMinutes=e}render(t,n,r,i,a){let{chartRect:o}=n,s=a??o.y+o.height;t.strokeStyle=r.axisLine,t.lineWidth=1,t.globalAlpha=.65,t.beginPath(),t.moveTo(o.x,s+.5),t.lineTo(o.x+o.width,s+.5),t.stroke(),t.globalAlpha=1;let c=n.barWidth+n.barSpacing,l=Math.max(1,Math.ceil(80/c)),u=-n.offset+o.x+n.barWidth/2,d=Math.floor(n.offset/c),f=Math.ceil((n.offset+o.width)/c),p=(0,e.tzLabel)(this.tzOffsetMinutes),h=`500 ${r.font.sizeSmall-1}px ${r.font.family}`,g=o.x+o.width-4;t.font=h;let _=g-t.measureText(p).width-8;t.font=`500 ${r.font.sizeSmall}px ${r.font.family}`,t.textBaseline=`top`,t.textAlign=`center`,t.fillStyle=r.axisLabel;let v=-1;for(let n=d;n<=f&&i.length>0;n++){if(n%l!==0)continue;let r=n*c+u,a=m(n,i),o=(0,e.timeParts)(a>0xe8d4a51000?a:a*1e3,this.tzOffsetMinutes),{year:d,day:f,month:p,hours:h,minutes:g}=o,y;(0,e.isDateOnly)(o)?y=`${p}/${f}/${d}`:f===v?y=`${In(h)}:${In(g)}`:(y=`${p}/${f}`,v=f),!(r+t.measureText(y).width/2>_)&&t.fillText(y,r,s+7)}t.font=h,t.textAlign=`right`,t.textBaseline=`top`,t.globalAlpha=.75,t.fillStyle=r.textSecondary,t.fillText(p,g,s+7),t.globalAlpha=1}},Rn=new Set,I=null,zn=class{panHandler=null;zoomHandler=null;crosshairHandler=null;axisDragHandler=null;alertDragHandler=null;axisViewportGetter=null;onAxisDoubleClick=null;measureHandlers=null;measuring=!1;boxSelectHandlers=null;boxSelecting=!1;onAltClick=null;onEscape=null;onConfirm=null;onClick=null;downPos=null;downMoved=!1;pressForClick=!1;drawingManager=null;tradingManager=null;paneResizeHandler=null;viewportGetter=null;onOverlayDirty=null;boundHandlers=[];lastTouchDist=0;lastTouchMid={x:0,y:0};touchActive=!1;touchStartPos={x:0,y:0};longPressTimer=null;longPressMs=500;longPressMaxMove=8;cachedRect=null;constructor(e){this.element=e}setOverlayDirtyCallback(e){this.onOverlayDirty=e}setPanHandler(e){this.panHandler=e}setZoomHandler(e){this.zoomHandler=e}setCrosshairHandler(e){this.crosshairHandler=e}setAltClickHandler(e){this.onAltClick=e}setEscapeHandler(e){this.onEscape=e}setConfirmHandler(e){this.onConfirm=e}setClickHandler(e){this.onClick=e}setBoxSelectHandlers(e){this.boxSelectHandlers=e}setMeasureHandlers(e){this.measureHandlers=e}setAxisDragHandler(e,t,n){this.axisDragHandler=e,this.axisViewportGetter=t,this.onAxisDoubleClick=n??null}setDrawingManager(e,t){this.drawingManager=e,this.viewportGetter=t}setAlertDragHandler(e){this.alertDragHandler=e}setTradingManager(e,t){this.tradingManager=e,this.viewportGetter=t}setPaneResizeHandler(e){this.paneResizeHandler=e}attach(){let e=()=>this.viewportGetter?.()??null;Rn.add(this.element);let t=e=>{let t=this.axisViewportGetter?.();if(!t)return null;let n=t.chartRect;return e.y>n.y+n.height?`time`:e.x>n.x+n.width?`price`:null},n=e=>{let t=(this.viewportGetter?.()??this.axisViewportGetter?.())?.chartRect;return t?{x:Math.max(t.x,Math.min(t.x+t.width,e.x)),y:Math.max(t.y,Math.min(t.y+t.height,e.y))}:e},r=()=>this.crosshairHandler&&this.crosshairHandler.getMode()!==`hidden`?`crosshair`:``,i=e=>{this.element.style.cursor!==e&&(this.element.style.cursor=e)},a=n=>{let i=t(n);if(i===`price`)return`ns-resize`;if(i===`time`)return`ew-resize`;let a=this.paneResizeHandler?.cursorAt(n);if(a)return a;if(this.alertDragHandler?.isOverAlert(n))return`ns-resize`;let o=e();return o&&this.tradingManager?.isOverDraggableLine(n,o)?`ns-resize`:(o?this.drawingManager?.hoverCursorAt(n,o):null)??r()},o=!1,s=``,c=e=>{if(!(e.buttons&1)){h(e);return}m(e)},l=()=>{o||(o=!0,s=document.documentElement.style.userSelect,document.documentElement.style.userSelect=`none`,document.addEventListener(`mousemove`,c))},u=()=>{o&&(o=!1,document.documentElement.style.userSelect=s,document.removeEventListener(`mousemove`,c))},d=e=>e===this.element||e instanceof HTMLCanvasElement,f=n=>{if(I=this.element,n.button!==0||!d(n.target))return;this.panHandler?.cancelMomentum(),l(),this.invalidateRect();let a=this.getMousePos(n),o=e();this.downPos=a,this.downMoved=!1,this.pressForClick=!1;let s=t(a);if(s&&this.axisDragHandler){this.axisDragHandler.begin(s,a);return}if(this.paneResizeHandler?.tryBegin(a))return;let c=!!this.drawingManager?.getActiveTool()||!!this.tradingManager?.isBracketActive()||!!this.tradingManager?.isOrderDraftActive();if((n.ctrlKey||n.metaKey)&&this.boxSelectHandlers&&!c){this.boxSelecting=!0,this.boxSelectHandlers.begin(a),i(r()),this.onOverlayDirty?.(!0);return}if(n.shiftKey&&this.measureHandlers){this.measuring=!0,this.measureHandlers.begin(a),this.onOverlayDirty?.(!0);return}if(n.altKey&&this.onAltClick){this.onAltClick(a);return}if(this.tradingManager&&o&&this.tradingManager.onPointerDown(a,o)){i(`ns-resize`);return}if(this.drawingManager&&o&&this.drawingManager.onPointerDown(a,o)){this.drawingManager.isDragging()&&i(`grabbing`);return}if(this.alertDragHandler?.tryBegin(a)){this.onOverlayDirty?.();return}this.pressForClick=!0,this.panHandler&&(this.panHandler.onPointerDown(a),i(`grabbing`))},p=e=>{o||d(e.target)&&m(e)},m=t=>{let r=this.getMousePos(t),s=e();if(this.downPos&&!this.downMoved){let e=r.x-this.downPos.x,t=r.y-this.downPos.y;e*e+t*t>16&&(this.downMoved=!0)}if(this.axisDragHandler?.isActive()){this.axisDragHandler.move(r);return}if(this.paneResizeHandler?.isActive()){this.paneResizeHandler.move(r);return}if(this.alertDragHandler?.isActive()){this.alertDragHandler.move(n(r)),this.onOverlayDirty?.();return}if(this.measuring&&this.measureHandlers){this.measureHandlers.move(r),this.onOverlayDirty?.(!0);return}if(this.boxSelecting&&this.boxSelectHandlers){this.boxSelectHandlers.move(r),this.onOverlayDirty?.(!0);return}if(o||i(a(r)),this.tradingManager&&s&&this.tradingManager.onPointerMove(o?n(r):r,s)){this.crosshairHandler?.onPointerMove(r),this.onOverlayDirty?.();return}if(this.drawingManager&&s&&this.drawingManager.onPointerMove(r,s)){this.crosshairHandler?.onPointerMove(r),this.onOverlayDirty?.();return}this.panHandler?.onPointerMove(r),this.crosshairHandler?.onPointerMove(r),this.onOverlayDirty?.(!o)},h=e=>{if(!(e.button!==0&&e.type===`mouseup`)&&o){if(u(),i(a(this.getMousePos(e))),this.boxSelecting&&this.boxSelectHandlers){this.boxSelecting=!1,this.boxSelectHandlers.end(),this.onOverlayDirty?.(!0);return}if(this.axisDragHandler?.isActive()){this.axisDragHandler.end();return}if(this.paneResizeHandler?.isActive()){this.paneResizeHandler.end();return}if(this.alertDragHandler?.isActive()){this.alertDragHandler.end(),this.onOverlayDirty?.();return}if(this.measuring&&this.measureHandlers){this.measuring=!1,this.measureHandlers.end(),this.onOverlayDirty?.(!0);return}this.tradingManager?.onPointerUp()||this.drawingManager?.onPointerUp()||(this.panHandler?.onPointerUp(),this.pressForClick&&!this.downMoved&&this.downPos&&this.onClick&&this.onClick(this.downPos),this.pressForClick=!1,this.downPos=null)}},g=e=>{let n=t(this.getMousePos(e));n&&this.onAxisDoubleClick&&this.onAxisDoubleClick(n)},_=()=>{if(o){this.crosshairHandler?.onPointerLeave(),this.onOverlayDirty?.(!0);return}i(``),this.panHandler?.onPointerUp(),this.drawingManager?.onPointerUp(),this.tradingManager?.onPointerUp(),this.alertDragHandler?.end(),this.paneResizeHandler?.end(),this.crosshairHandler?.onPointerLeave(),this.pressForClick=!1,this.downPos=null,this.onOverlayDirty?.()},v=e=>{e.preventDefault();let t=this.getMousePos(e);this.zoomHandler?.onWheel(e.deltaY,t)},y=e=>{if(e.key===`Escape`&&this.boxSelecting&&this.boxSelectHandlers&&(this.boxSelecting=!1,this.boxSelectHandlers.cancel(),this.onOverlayDirty?.(!0)),e.key===`Escape`&&this.onEscape&&this.onEscape(),e.key===`Enter`&&this.onConfirm&&this.onConfirm()){e.preventDefault();return}e.key!==`Escape`&&!this.ownsShortcuts()||this.drawingManager?.onKeyDown(e.key,e.ctrlKey||e.metaKey)&&e.preventDefault()},b=t=>{let n=e();!this.tradingManager||!n||this.tradingManager.onContextMenu(this.getMousePos(t),n)&&t.preventDefault()},x=n=>{if(I=this.element,!(!this.touchActive&&!d(n.target)))if(n.preventDefault(),this.invalidateRect(),n.touches.length===1){let r=this.getTouchPos(n.touches[0]);this.touchStartPos=r;let i=t(r);if(i&&this.axisDragHandler){this.axisDragHandler.begin(i,r),this.touchActive=!0;return}if(this.paneResizeHandler?.tryBegin(r)){this.touchActive=!0;return}let a=e();if(this.tradingManager&&a&&this.tradingManager.onPointerDown(r,a)){this.touchActive=!0,this.onOverlayDirty?.();return}this.onAltClick&&(this.clearLongPress(),this.longPressTimer=setTimeout(()=>{this.longPressTimer=null,this.onAltClick?.(r),this.panHandler?.onPointerUp(),this.onOverlayDirty?.(!0)},this.longPressMs)),this.panHandler?.onPointerDown(r),this.crosshairHandler?.onPointerMove(r),this.touchActive=!0}else n.touches.length===2&&(this.clearLongPress(),this.panHandler?.onPointerUp(),this.lastTouchDist=this.getTouchDistance(n.touches[0],n.touches[1]),this.lastTouchMid=this.getTouchMidpoint(n.touches[0],n.touches[1]),this.touchActive=!0)},S=t=>{if(!(!this.touchActive&&!d(t.target))){if(t.preventDefault(),t.touches.length===1&&this.touchActive){let n=this.getTouchPos(t.touches[0]);if(this.longPressTimer){let e=n.x-this.touchStartPos.x,t=n.y-this.touchStartPos.y;Math.hypot(e,t)>this.longPressMaxMove&&this.clearLongPress()}if(this.axisDragHandler?.isActive()){this.axisDragHandler.move(n),this.onOverlayDirty?.();return}if(this.paneResizeHandler?.isActive()){this.paneResizeHandler.move(n),this.onOverlayDirty?.();return}let r=e();if(this.tradingManager&&r&&this.tradingManager.onPointerMove(n,r)){this.onOverlayDirty?.();return}this.panHandler?.onPointerMove(n),this.crosshairHandler?.onPointerMove(n)}else if(t.touches.length===2){let e=this.getTouchDistance(t.touches[0],t.touches[1]),n=this.getTouchMidpoint(t.touches[0],t.touches[1]);if(this.lastTouchDist>0){let t=(e/this.lastTouchDist-1)*.5;this.zoomHandler?.onWheel(-t*100,n)}let r=this.lastTouchMid.x-n.x;Math.abs(r)>1&&(this.panHandler?.onPointerDown(this.lastTouchMid),this.panHandler?.onPointerMove({x:n.x,y:this.lastTouchMid.y})),this.lastTouchDist=e,this.lastTouchMid=n}this.onOverlayDirty?.()}},C=e=>{if(this.clearLongPress(),e.touches.length===0)this.axisDragHandler?.isActive()&&this.axisDragHandler.end(),this.paneResizeHandler?.end(),this.tradingManager?.onPointerUp(),this.panHandler?.onPointerUp(),this.crosshairHandler?.onPointerLeave(),this.touchActive=!1,this.lastTouchDist=0;else if(e.touches.length===1){let t=this.getTouchPos(e.touches[0]);this.panHandler?.onPointerDown(t)}},w=()=>this.invalidateRect(),T=()=>this.invalidateRect(),E=()=>this.invalidateRect();this.element.addEventListener(`mousedown`,f),this.element.addEventListener(`mousemove`,p),document.addEventListener(`mouseup`,h),this.element.addEventListener(`mouseleave`,_),this.element.addEventListener(`dblclick`,g),this.element.addEventListener(`wheel`,v,{passive:!1}),this.element.addEventListener(`contextmenu`,b),this.element.addEventListener(`touchstart`,x,{passive:!1}),this.element.addEventListener(`touchmove`,S,{passive:!1}),this.element.addEventListener(`touchend`,C),document.addEventListener(`keydown`,y),window.addEventListener(`resize`,w),document.addEventListener(`scroll`,T,{capture:!0,passive:!0}),this.element.addEventListener(`mouseenter`,E),this.boundHandlers.push(u,()=>this.element.removeEventListener(`mousedown`,f),()=>this.element.removeEventListener(`mousemove`,p),()=>document.removeEventListener(`mouseup`,h),()=>this.element.removeEventListener(`mouseleave`,_),()=>this.element.removeEventListener(`dblclick`,g),()=>this.element.removeEventListener(`wheel`,v),()=>this.element.removeEventListener(`contextmenu`,b),()=>this.element.removeEventListener(`touchstart`,x),()=>this.element.removeEventListener(`touchmove`,S),()=>this.element.removeEventListener(`touchend`,C),()=>document.removeEventListener(`keydown`,y),()=>window.removeEventListener(`resize`,w),()=>document.removeEventListener(`scroll`,T,{capture:!0}),()=>this.element.removeEventListener(`mouseenter`,E))}detach(){Rn.delete(this.element),I===this.element&&(I=null);for(let e of this.boundHandlers)e();this.boundHandlers=[],this.cachedRect=null,this.clearLongPress()}clearLongPress(){this.longPressTimer&&=(clearTimeout(this.longPressTimer),null)}invalidateRect(){this.cachedRect=null}getRect(){return this.cachedRect||=this.element.getBoundingClientRect(),this.cachedRect}ownsShortcuts(){let e=document.activeElement;if(e&&(e.tagName===`INPUT`||e.tagName===`TEXTAREA`||e.tagName===`SELECT`||e.isContentEditable))return!1;for(let t of Rn)if(e&&t.contains(e))return t===this.element;return I===null||I===this.element}getMousePos(e){let t=this.getRect();return{x:e.clientX-t.left,y:e.clientY-t.top}}getTouchPos(e){let t=this.getRect();return{x:e.clientX-t.left,y:e.clientY-t.top}}getTouchDistance(e,t){return Math.hypot(t.clientX-e.clientX,t.clientY-e.clientY)}getTouchMidpoint(e,t){let n=this.getRect();return{x:(e.clientX+t.clientX)/2-n.left,y:(e.clientY+t.clientY)/2-n.top}}},Bn=100,Vn=50,Hn=.1,Un=60,Wn=16,Gn=class{dragging=!1;lastX=0;lastY=0;samples=[];momentumId=0;callback;onStart;friction=.92;constructor(e,t){this.callback=e,this.onStart=t}isDragging(){return this.dragging}onPointerDown(e){this.dragging=!0,this.lastX=e.x,this.lastY=e.y,this.samples=[{t:Date.now(),x:e.x,y:e.y}],this.stopMomentum(),this.onStart?.()}onPointerMove(e){if(!this.dragging)return;let t=this.lastX-e.x,n=this.lastY-e.y;this.lastX=e.x,this.lastY=e.y;let r=Date.now();for(this.samples.push({t:r,x:e.x,y:e.y});this.samples.length>2&&r-this.samples[1].t>Bn;)this.samples.shift();(t||n)&&this.callback(t,n)}onPointerUp(){if(!this.dragging)return;this.dragging=!1;let e=this.releaseVelocity(Date.now());this.samples=[],e&&Math.hypot(e.x,e.y)>Hn&&this.startMomentum(e.x,e.y)}cancelMomentum(){this.stopMomentum()}releaseVelocity(e){let t=this.samples[this.samples.length-1];if(!t||e-t.t>Vn)return null;let n=this.samples.find(e=>t.t-e.t<=Bn)??this.samples[0],r=t.t-n.t;return r<=0?null:{x:(n.x-t.x)/r,y:(n.y-t.y)/r}}startMomentum(e,t){this.stopMomentum();let n=e*Wn,r=t*Wn,i=Math.hypot(n,r);i>Un&&(n*=Un/i,r*=Un/i);let a=()=>{if(n*=this.friction,r*=this.friction,Math.hypot(n,r)<.5){this.momentumId=0;return}this.callback(n,r),this.momentumId=requestAnimationFrame(a)};this.momentumId=requestAnimationFrame(a)}stopMomentum(){this.momentumId&&=(cancelAnimationFrame(this.momentumId),0)}},Kn=class{callback;sensitivity;pendingDelta=0;pendingCenterX=0;rafId=0;constructor(e,t=.001){this.callback=e,this.sensitivity=t}onWheel(e,t){this.pendingDelta+=-e*this.sensitivity,this.pendingCenterX=t.x,this.rafId||=requestAnimationFrame(()=>{this.rafId=0;let e=this.pendingDelta,t=this.pendingCenterX;this.pendingDelta=0,this.callback(e,t)})}dispose(){this.rafId&&=(cancelAnimationFrame(this.rafId),0)}},qn=class{dragging=!1;axis=null;startPos={x:0,y:0};lastPos={x:0,y:0};moved=!1;threshold=3;sensitivity=.005;constructor(e,t){this.onPriceScale=e,this.onTimeScale=t}begin(e,t){this.dragging=!0,this.axis=e,this.startPos=t,this.lastPos=t,this.moved=!1}move(e){if(!this.dragging||!this.axis)return!1;let t=e.x-this.startPos.x,n=e.y-this.startPos.y;if(!this.moved&&Math.hypot(t,n)<this.threshold)return!1;if(this.moved=!0,this.axis===`price`){let t=e.y-this.lastPos.y,n=Math.exp(t*this.sensitivity);this.onPriceScale(n)}else{let t=e.x-this.lastPos.x,n=Math.exp(t*this.sensitivity);this.onTimeScale(n)}return this.lastPos=e,!0}end(){let e=this.dragging&&this.moved;return this.dragging=!1,this.axis=null,this.moved=!1,e}isActive(){return this.dragging}},Jn=class{draggingId=null;constructor(e,t){this.alerts=e,this.viewportGetter=t}isOverAlert(e){let t=this.viewportGetter();return t?this.alerts.getAlertAtPoint(e,t)!==null:!1}tryBegin(e){let t=this.viewportGetter();if(!t)return!1;let n=this.alerts.getAlertAtPoint(e,t);return n?(this.draggingId=n.id,!0):!1}move(e){if(this.draggingId===null)return;let t=this.viewportGetter();t&&this.alerts.updateAlertPrice(this.draggingId,u(e.y,t))}end(){this.draggingId=null}isActive(){return this.draggingId!==null}},Yn=class{state=null;layoutGetter=null;onResize=null;constructor(e=4){this.tolerance=e}configure(e,t){this.layoutGetter=e,this.onResize=t}hitTest(e,t){for(let n of t.dividers)if(Xn(e,n.rect,this.tolerance)){let e=t.panels.find(e=>e.config.id===n.panelId);if(e)return{panelId:n.panelId,orientation:n.orientation,position:e.config.position,size:e.config.size}}return null}cursorAt(e){let t=this.layoutGetter?.();if(!t)return null;let n=this.hitTest(e,t);return n?n.orientation===`horizontal`?`ns-resize`:`ew-resize`:null}tryBegin(e){let t=this.layoutGetter?.();if(!t)return!1;let n=this.hitTest(e,t);return n?(this.state={panelId:n.panelId,position:n.position,startSize:n.size,startPos:e},!0):!1}move(e){let t=this.computeSize(e);t&&this.onResize?.(t.panelId,t.size)}computeSize(e){let t=this.state;if(!t)return null;let n=0;switch(t.position){case`bottom`:n=t.startPos.y-e.y;break;case`top`:n=e.y-t.startPos.y;break;case`left`:n=e.x-t.startPos.x;break;case`right`:n=t.startPos.x-e.x;break}return{panelId:t.panelId,size:t.startSize+n}}end(){this.state=null}isActive(){return this.state!==null}};function Xn(e,t,n){return e.x>=t.x-n&&e.x<=t.x+t.width+n&&e.y>=t.y-n&&e.y<=t.y+t.height+n}var Zn=class{position=null;callback=null;data=[];tzOffsetMinutes=null;setTimezoneOffset(e){this.tzOffsetMinutes=e}magnetMode=!0;mode=`magnet`;pricePrecision=null;locale=`en-US`;syncedSlot=null;pendingBarIndex=null;pendingPoint=null;callbackScheduled=!1;lastCallbackBarIndex=-1;reportTop=null;reportBottom=null;setCallback(e){this.callback=e}setData(e){this.data=e}setMagnetMode(e){this.magnetMode=e,this.mode=e?`magnet`:`normal`}setMode(e){this.mode=e,this.magnetMode=e===`magnet`}getMode(){return this.mode}setPricePrecision(e){this.pricePrecision=e}setLocale(e){this.locale=e}getPosition(){return this.position}setSyncedSlot(e){this.syncedSlot=e!==null&&Number.isFinite(e)?e:null}getSyncedSlot(){return this.syncedSlot}setReportBounds(e){this.reportTop=e?.top??null,this.reportBottom=e?.bottom??null}onPointerMove(e){this.position=e}onPointerLeave(){this.position=null,this.pendingBarIndex=null,this.pendingPoint=null,this.lastCallbackBarIndex=-1,this.flushCallback(null,null)}render(e,t,n){if(this.mode===`hidden`)return;if(!this.position){this.syncedSlot!==null&&this.renderSynced(e,t,n,this.syncedSlot);return}let{chartRect:r}=t,{x:i,y:o}=this.position;if(i<r.x||i>r.x+r.width)return;let s=r.y+r.height;if(o<Math.min(this.reportTop??r.y,r.y)||o>Math.max(this.reportBottom??s,s))return;let c=o>=r.y&&o<=s,u=l(i,t),d=Math.max(0,Math.min(this.data.length-1,u)),f=u>=0&&u<this.data.length;this.magnetMode&&(i=a(u,t)),d!==this.lastCallbackBarIndex&&(this.pendingBarIndex=d,this.pendingPoint={x:i,y:o},this.lastCallbackBarIndex=d,this.scheduleCallback()),c&&(this.magnetMode&&f&&Qn(e,i,t,n),$n(e,i,r,n),e.setLineDash([4,4]),e.beginPath(),e.moveTo(r.x,Math.round(o)+.5),e.lineTo(r.x+r.width,Math.round(o)+.5),e.stroke(),e.setLineDash([]))}renderAxisLabels(t,n,r,i,o){if(this.mode===`hidden`)return;if(!this.position){this.syncedSlot!==null&&this.renderSyncedTimeLabel(t,n,r,i,this.syncedSlot,o);return}let{chartRect:s}=n,{x:c,y:d}=this.position;if(c<s.x||c>s.x+s.width||d<s.y||d>s.y+s.height)return;let f=l(c,n);this.magnetMode&&(c=a(f,n));let p=`600 ${r.font.sizeSmall}px ${r.font.family}`;er(t,{text:(0,e.formatPrice)(u(d,n),this.pricePrecision??(0,e.autoPricePrecision)(n.priceRange.min,n.priceRange.max),this.locale),anchorX:s.x+s.width,anchorY:d,orientation:`right`,bg:r.text,fg:r.background,font:p}),this.drawTimePill(t,n,r,i,f,c,o)}renderSynced(e,t,n,r){let i=a(r,t),{chartRect:o}=t;i<o.x||i>o.x+o.width||(this.magnetMode&&r>=0&&r<this.data.length&&Qn(e,i,t,n),$n(e,i,o,n))}renderSyncedTimeLabel(e,t,n,r,i,o){let s=a(i,t),{chartRect:c}=t;s<c.x||s>c.x+c.width||this.drawTimePill(e,t,n,r,i,s,o)}drawTimePill(e,t,n,r,i,a,o){r.length!==0&&er(e,{text:tr(m(i,r),this.tzOffsetMinutes),anchorX:a,anchorY:o??t.chartRect.y+t.chartRect.height,orientation:`bottom`,bg:n.text,fg:n.background,font:`600 ${n.font.sizeSmall}px ${n.font.family}`})}scheduleCallback(){this.callbackScheduled||(this.callbackScheduled=!0,queueMicrotask(()=>{this.callbackScheduled=!1,this.flushCallback(this.pendingBarIndex,this.pendingPoint)}))}flushCallback(e,t){this.callback?.(e,t)}};function Qn(e,t,n,r){let i=n.barWidth+n.barSpacing;e.fillStyle=r.crosshair,e.globalAlpha=.08,e.fillRect(t-i/2,n.chartRect.y,i,n.chartRect.height),e.globalAlpha=1}function $n(e,t,n,r){e.setLineDash([4,4]),e.strokeStyle=r.crosshair,e.lineWidth=1,e.beginPath(),e.moveTo(Math.round(t)+.5,n.y),e.lineTo(Math.round(t)+.5,n.y+n.height),e.stroke(),e.setLineDash([])}function er(e,t){e.save(),e.font=t.font;let n=Math.ceil(e.measureText(t.text).width)+16;if(t.orientation===`right`){let r=t.anchorX+5,i=t.anchorY-20/2;e.beginPath(),e.moveTo(t.anchorX,t.anchorY),e.lineTo(r,t.anchorY-5),e.lineTo(r,i),e.lineTo(r+n,i),e.lineTo(r+n,i+20),e.lineTo(r,i+20),e.lineTo(r,t.anchorY+5),e.closePath(),e.fillStyle=t.bg,e.fill(),e.fillStyle=t.fg,e.textBaseline=`middle`,e.textAlign=`left`,e.fillText(t.text,r+8,t.anchorY)}else{let r=t.anchorX-n/2,i=t.anchorY+5;e.beginPath(),e.moveTo(t.anchorX,t.anchorY),e.lineTo(t.anchorX+5,i),e.lineTo(r+n,i),e.lineTo(r+n,i+20),e.lineTo(r,i+20),e.lineTo(r,i),e.lineTo(t.anchorX-5,i),e.closePath(),e.fillStyle=t.bg,e.fill(),e.fillStyle=t.fg,e.textBaseline=`middle`,e.textAlign=`center`,e.fillText(t.text,t.anchorX,i+20/2)}e.restore()}function tr(t,n){let r=(0,e.timeParts)(t>0xe8d4a51000?t:t*1e3,n),{year:i,month:a,day:o,hours:s,minutes:c}=r;return(0,e.isDateOnly)(r)?`${a}/${o}/${i}`:`${a}/${o} ${s<10?`0`+s:s}:${c<10?`0`+c:c}`}var nr=class{callbacks;enabled=!0;constructor(e){this.callbacks=e}setEnabled(e){this.enabled=e}handleKey(e){if(!this.enabled)return!1;let t=e.shiftKey?10:1;switch(e.key){case`ArrowLeft`:return this.callbacks.scrollBars(-t),!0;case`ArrowRight`:return this.callbacks.scrollBars(t),!0;case`ArrowUp`:case`+`:case`=`:return this.callbacks.zoom(.1),!0;case`ArrowDown`:case`-`:return this.callbacks.zoom(-.1),!0;case`Home`:return this.callbacks.goToStart(),!0;case`End`:return this.callbacks.goToEnd(),!0;case` `:return this.callbacks.fitContent(),!0;default:return!1}}},rr=16,ir=80,ar=864e5,or=new Map;function sr(e,t,n,r){let i=t!==null,a=`${n}|${r?`y`:``}|${i?`utc`:`local`}`,o=or.get(a);if(!o){let e={month:`short`,day:`numeric`,...r?{year:`numeric`}:{},...i?{timeZone:`UTC`}:{}};try{o=new Intl.DateTimeFormat(n,e)}catch{o=new Intl.DateTimeFormat(`en-US`,e)}or.set(a,o)}return o.format(new Date(i?e+t*6e4:e))}var cr=e=>e<10?`0${e}`:`${e}`;function lr(t,n,r,i=`en-US`){let a=(0,e.normalizeBarTime)(t),o=(0,e.timeParts)(a,n);if(r!==void 0&&r>0?r>=ar:(0,e.isDateOnly)(o))return sr(a,n,i,!0);let s=sr(a,n,i,!1),c=`${cr(o.hours)}:${cr(o.minutes)}`;return r!==void 0&&r>0&&r<6e4?`${s} ยท ${c}:${cr(new Date(a).getUTCSeconds())}`:`${s} ยท ${c}`}function ur(t,n){return Number.isFinite(t)?t>=1e9?`${(0,e.formatPrice)(t/1e9,2,n)}B`:t>=1e6?`${(0,e.formatPrice)(t/1e6,2,n)}M`:t>=1e3?`${(0,e.formatPrice)(t/1e3,1,n)}K`:(0,e.formatPrice)(t,t%1==0?0:2,n):`โ€”`}var dr=class{el=null;visible=!1;appliedTheme=null;locale=`en-US`;pricePrecision=null;tzOffsetMinutes=null;dirEl;timeEl;changeEl;valueEls;labelEls=[];dividerEl;width=176;height=112;create(e){if(this.el)return;let t=document.createElement(`div`);t.setAttribute(`aria-hidden`,`true`),Object.assign(t.style,{position:`absolute`,left:`0`,top:`0`,display:`none`,minWidth:`168px`,padding:`8px 10px 9px`,borderRadius:`8px`,fontSize:`11.5px`,lineHeight:`1.45`,fontVariantNumeric:`tabular-nums`,pointerEvents:`none`,zIndex:`100`,whiteSpace:`nowrap`,willChange:`transform`,contain:`layout paint`,backdropFilter:`blur(10px)`});let n=L({display:`flex`,alignItems:`center`,gap:`7px`,marginBottom:`6px`});this.dirEl=L({width:`3px`,height:`12px`,borderRadius:`2px`,flex:`none`}),this.timeEl=L({flex:`1`,fontSize:`11px`,letterSpacing:`0.01em`}),this.changeEl=L({padding:`1px 6px`,borderRadius:`999px`,fontSize:`10.5px`,fontWeight:`600`}),n.append(this.dirEl,this.timeEl,this.changeEl);let r=L({display:`grid`,gridTemplateColumns:`auto 1fr auto 1fr`,columnGap:`8px`,rowGap:`1px`,alignItems:`baseline`}),i=e=>{let t=L({fontSize:`10px`,letterSpacing:`0.04em`});t.textContent=e,this.labelEls.push(t);let n=L({textAlign:`right`,fontWeight:`500`});return r.append(t,n),n},a=i(`O`),o=i(`H`),s=i(`L`),c=i(`C`);this.dividerEl=L({height:`1px`,margin:`6px 0 5px`});let l=L({display:`flex`,justifyContent:`space-between`,gap:`12px`}),u=L({fontSize:`10px`,letterSpacing:`0.04em`});u.textContent=`VOL`,this.labelEls.push(u);let d=L({fontWeight:`500`});l.append(u,d),this.valueEls={open:a,high:o,low:s,close:c,volume:d},t.append(n,r,this.dividerEl,l),e.appendChild(t),this.el=t}setLocale(e){this.locale=e}setPricePrecision(e){this.pricePrecision=e}setTimezoneOffset(e){this.tzOffsetMinutes=e}show(t,n,r,i,a={}){let o=this.el;if(!o)return;this.appliedTheme!==r&&this.applyTheme(r);let s=this.pricePrecision??(a.priceRange?(0,e.autoPricePrecision)(a.priceRange.min,a.priceRange.max):(0,e.autoPricePrecision)(n.low,n.high)),c=t=>(0,e.formatPrice)(t,s,this.locale),l=a.prevClose??n.open,u=n.close-l,d=l===0?0:u/l*100,f=u>=0,p=f?r.candleUp:r.candleDown,m=f?`+`:`โˆ’`;this.timeEl.textContent=lr(n.time,this.tzOffsetMinutes,a.barStepMs,this.locale),this.changeEl.textContent=`${m}${(0,e.formatPrice)(Math.abs(d),2,this.locale)}%`,this.changeEl.style.color=p,this.changeEl.style.background=mr(p,.14),this.dirEl.style.background=n.close>=n.open?r.candleUp:r.candleDown,this.valueEls.open.textContent=c(n.open),this.valueEls.high.textContent=c(n.high),this.valueEls.low.textContent=c(n.low),this.valueEls.close.textContent=c(n.close),this.valueEls.close.style.color=n.close>=n.open?r.candleUp:r.candleDown,this.valueEls.volume.textContent=ur(n.volume,this.locale),this.visible||=(o.style.display=`block`,!0),this.width=o.offsetWidth||this.width,this.height=o.offsetHeight||this.height;let h=a.plot??{x:0,y:0,width:i.width-ir,height:i.height},g=h.x+h.width,_=h.y+h.height,v=t.x+rr,y=t.y-this.height/2;v+this.width>g-4&&(v=t.x-this.width-rr),v<h.x+4&&(v=h.x+4),y+this.height>_-4&&(y=_-this.height-4),y<h.y+4&&(y=h.y+4),o.style.transform=`translate(${Math.round(v)}px, ${Math.round(y)}px)`}hide(){this.el&&this.visible&&(this.el.style.display=`none`,this.visible=!1)}isVisible(){return this.visible}destroy(){this.el?.remove(),this.el=null,this.visible=!1,this.appliedTheme=null,this.labelEls=[]}applyTheme(e){let t=this.el,n=fr(e.background);t.style.background=mr(e.background,n?.9:.94),t.style.border=`1px solid ${e.axisLine}`,t.style.boxShadow=n?`0 12px 32px -8px rgba(0, 0, 0, 0.6), 0 2px 6px rgba(0, 0, 0, 0.35)`:`0 12px 32px -10px rgba(15, 19, 26, 0.22), 0 2px 6px rgba(15, 19, 26, 0.08)`,t.style.color=e.text,t.style.fontFamily=e.font.family,this.timeEl.style.color=e.textSecondary;for(let t of this.labelEls)t.style.color=e.textSecondary;this.dividerEl.style.background=e.axisLine,this.appliedTheme=e}};function L(e){let t=document.createElement(`div`);return Object.assign(t.style,e),t}function fr(e){let t=pr(e);return t?(.299*t[0]+.587*t[1]+.114*t[2])/255<.5:!0}function pr(e){if(e.startsWith(`#`)){let t=e.slice(1),n=t.length===3?t.split(``).map(e=>e+e).join(``):t.slice(0,6);return[parseInt(n.slice(0,2),16),parseInt(n.slice(2,4),16),parseInt(n.slice(4,6),16)]}let t=e.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}function mr(e,t){let n=pr(e);return n?`rgba(${n[0]}, ${n[1]}, ${n[2]}, ${t})`:`color-mix(in srgb, ${e} ${Math.round(t*100)}%, transparent)`}var hr=class{el=null;deltaEl=null;timeEl=null;ohlcEl=null;pinnedBar=null;pinnedIndex=-1;create(e){if(this.el)return;this.el=document.createElement(`div`),Object.assign(this.el.style,{position:`absolute`,display:`none`,padding:`6px 10px`,borderRadius:`4px`,fontSize:`11px`,fontFamily:`-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif`,lineHeight:`1.5`,pointerEvents:`auto`,cursor:`pointer`,zIndex:`99`,whiteSpace:`nowrap`,willChange:`transform`}),this.timeEl=document.createElement(`div`),this.ohlcEl=document.createElement(`div`),this.deltaEl=document.createElement(`div`),this.deltaEl.style.marginTop=`4px`,this.deltaEl.style.paddingTop=`4px`,this.deltaEl.style.borderTop=`1px solid currentColor`,this.deltaEl.style.opacity=`0.85`,this.deltaEl.style.fontVariantNumeric=`tabular-nums`,this.el.appendChild(this.timeEl),this.el.appendChild(this.ohlcEl),this.el.appendChild(this.deltaEl);let t=document.createElement(`div`);t.textContent=`๐Ÿ“Œ pinned`,t.style.fontSize=`9px`,t.style.opacity=`0.6`,t.style.marginBottom=`2px`,t.style.letterSpacing=`0.04em`,t.style.textTransform=`uppercase`,this.el.insertBefore(t,this.timeEl),e.appendChild(this.el)}pin(e,t,n){if(!this.el||!this.timeEl||!this.ohlcEl)return;this.pinnedBar=e,this.pinnedIndex=t;let r=e.close>=e.open?n.candleUp:n.candleDown,i=new Date(e.time>0xe8d4a51000?e.time:e.time*1e3);this.timeEl.textContent=`${i.getMonth()+1}/${i.getDate()} ${gr(i.getHours())}:${gr(i.getMinutes())}`,this.timeEl.style.color=n.textSecondary,this.ohlcEl.innerHTML=`
2
+ <span style="opacity:.6">O </span><span style="color:${r}">${R(e.open)}</span>
3
+ <span style="opacity:.6"> H </span><span style="color:${r}">${R(e.high)}</span>
4
+ <span style="opacity:.6"> L </span><span style="color:${r}">${R(e.low)}</span>
5
+ <span style="opacity:.6"> C </span><span style="color:${r}">${R(e.close)}</span>
6
+ `;let a=_r(n.background);this.el.style.background=vr(n.background,a?.96:.97),this.el.style.border=`1px solid ${r}`,this.el.style.boxShadow=a?`0 4px 12px rgba(0,0,0,0.55)`:`0 4px 12px rgba(0,0,0,0.18)`,this.el.style.color=n.text,this.el.style.backdropFilter=`blur(8px)`,this.el.style.display=`block`}unpin(){this.pinnedBar=null,this.pinnedIndex=-1,this.el&&(this.el.style.display=`none`)}isPinned(){return this.pinnedBar!==null}getPinnedIndex(){return this.pinnedIndex}reposition(e,t,n,r){if(!this.el||!this.pinnedBar)return;let i=a(this.pinnedIndex,e),s=o(this.pinnedBar.close,e),c=e.chartRect,l=i>=c.x-4&&i<=c.x+c.width+4;this.el.style.opacity=l?`1`:`0.35`;let u=Math.max(c.x,Math.min(c.x+c.width-180,i+8)),d=Math.max(c.y,Math.min(c.y+c.height-90,s-64));if(this.el.style.transform=`translate(${Math.round(u)}px, ${Math.round(d)}px)`,this.el.style.left=`0`,this.el.style.top=`0`,this.deltaEl)if(t&&n!==null&&n!==this.pinnedIndex){let e=t.close-this.pinnedBar.close,i=this.pinnedBar.close===0?0:e/this.pinnedBar.close*100,a=e>0?`+`:e<0?`โˆ’`:``,o=n-this.pinnedIndex,s=e>=0?r.candleUp:r.candleDown;this.deltaEl.style.color=s,this.deltaEl.innerHTML=`ฮ” ${a}${R(Math.abs(e))} <span style="opacity:.7">(${a}${Math.abs(i).toFixed(2)}%)</span> ยท ${o>0?`+`:``}${o} bars`,this.deltaEl.style.display=`block`}else this.deltaEl.style.display=`none`}destroy(){this.el?.remove(),this.el=null,this.deltaEl=null,this.timeEl=null,this.ohlcEl=null,this.pinnedBar=null,this.pinnedIndex=-1}};function R(e){return e.toFixed(2)}function gr(e){return e<10?`0`+e:``+e}function _r(e){if(e.startsWith(`#`)){let t=e.slice(1),n=t.length===3?t.split(``).map(e=>e+e).join(``):t.slice(0,6),r=parseInt(n.slice(0,2),16),i=parseInt(n.slice(2,4),16),a=parseInt(n.slice(4,6),16);return(.299*r+.587*i+.114*a)/255<.5}return!0}function vr(e,t){if(e.startsWith(`#`)){let n=e.slice(1),r=n.length===3?n.split(``).map(e=>e+e).join(``):n.slice(0,6);return`rgba(${parseInt(r.slice(0,2),16)}, ${parseInt(r.slice(2,4),16)}, ${parseInt(r.slice(4,6),16)}, ${t})`}return e}var yr=class{listeners=new Map;tauriBridge=null;on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}emit(e,t){let n={type:e,timestamp:Date.now(),payload:t},r=this.listeners.get(e);if(r)for(let e of r)e(n);if(this.tauriBridge?.enabled&&window.__TAURI__){let t=this.tauriBridge.eventPrefix??`tc-chart`;window.__TAURI__.event.emit(`${t}:${e}`,n).catch(()=>{})}}enableTauriBridge(e){this.tauriBridge=e}disableTauriBridge(){this.tauriBridge=null}destroy(){this.listeners.clear(),this.tauriBridge=null}},z=class{hitTestAnchor(e,t,n,r){for(let i=0;i<t.anchors.length;i++){let a=this.anchorToPixel(t.anchors[i],n);if(Math.hypot(e.x-a.x,e.y-a.y)<=r)return i}return-1}anchorToPixel(e,t){return{x:_(e.time,t),y:o(e.price,t)}}pixelToAnchor(e,t){return{time:v(e.x,t),price:u(e.y,t)}}applyLineStyle(e,t){switch(e.strokeStyle=t.color,e.lineWidth=t.lineWidth,t.lineStyle){case`dashed`:e.setLineDash([6,4]);break;case`dotted`:e.setLineDash([2,2]);break;default:e.setLineDash([]);break}}resetLineStyle(e){e.setLineDash([])}renderAnchorHandles(e,t,n){e.fillStyle=`#FFFFFF`,e.strokeStyle=t.style.color,e.lineWidth=1;for(let r of t.anchors){let t=this.anchorToPixel(r,n);e.fillRect(t.x-4,t.y-4,8,8),e.strokeRect(t.x-4,t.y-4,8,8)}}distanceToLine(e,t,n){let r=n.x-t.x,i=n.y-t.y,a=r*r+i*i;if(a===0)return Math.hypot(e.x-t.x,e.y-t.y);let o=((e.x-t.x)*r+(e.y-t.y)*i)/a;o=Math.max(0,Math.min(1,o));let s=t.x+o*r,c=t.y+o*i;return Math.hypot(e.x-s,e.y-c)}distanceToInfiniteLine(e,t,n){let r=n.x-t.x,i=n.y-t.y,a=Math.hypot(r,i);return a===0?Math.hypot(e.x-t.x,e.y-t.y):Math.abs(r*(t.y-e.y)-i*(t.x-e.x))/a}},br=1,B={drawings:[],pastes:0};function V(e){return{...e,anchors:e.anchors.map(e=>({...e})),style:{...e.style},meta:e.meta?{...e.meta}:void 0}}var xr=3;function Sr(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n].time!==t[n].time||e[n].price!==t[n].price)return!1;return!0}var Cr=class{registry=new Map;drawings=[];state=`idle`;activeTool=null;activeStyle={color:`#4c8dff`,lineWidth:1,lineStyle:`solid`,fillColor:`rgba(76, 141, 255, 0.1)`,fillOpacity:.1,fontSize:12};creatingDrawing=null;committedAnchors=0;previewAnchor=null;selectedDrawingId=null;groupIds=new Set;groupDrag=[];dragAnchorIndex=-1;dragStartPoint=null;dragStartAnchors=[];dragBeforeState=null;eventCallback=null;requestRender=null;undoRedo=null;magnetMode=`none`;dataGetter=null;displayDataGetter=null;stayInDrawingMode=!1;toolAllowed=()=>!0;register(e){this.registry.set(e.descriptor.type,e)}setEventCallback(e){this.eventCallback=e}setRequestRender(e){this.requestRender=e}setUndoRedoManager(e){this.undoRedo=e}setMagnetMode(e){this.magnetMode=e}getMagnetMode(){return this.magnetMode}setDataGetter(e){this.dataGetter=e}setDisplayDataGetter(e){this.displayDataGetter=e}snapToOHLC(e,t,n){if(this.magnetMode===`none`||!this.dataGetter)return{time:e,price:t};let r=this.displayDataGetter?.()??this.dataGetter();if(r.length===0)return{time:e,price:t};let i=!!(n?.data&&n.data.length>0),a=Math.round(i?h(e,r):e);if(a<0||a>r.length-1)return{time:e,price:t};let o=a,s=r[o],c=[s.open,s.high,s.low,s.close],l=c[0],u=Math.abs(t-l);for(let e=1;e<c.length;e++){let n=Math.abs(t-c[e]);n<u&&(u=n,l=c[e])}if(n){let e=n.chartRect.height/(n.priceRange.max-n.priceRange.min||1);if(u*e>30)return{time:i?s.time:o,price:t}}return{time:i?s.time:o,price:l}}undo(){if(!this.undoRedo)return!1;let e=this.undoRedo.undo();return e?(this.applyUndoAction(e),!0):!1}redo(){if(!this.undoRedo)return!1;let e=this.undoRedo.redo();return e?(this.applyRedoAction(e),!0):!1}applyUndoAction(e){this.undoOne(e),this.settleAfterHistory()}settleAfterHistory(){this.clearSelection(),this.creatingDrawing=null,this.committedAnchors=0,this.previewAnchor=null,this.state=this.activeTool?`creating`:`idle`,this.requestRender?.()}undoOne(e){switch(e.type){case`drawingBatch`:for(let t of[...e.actions??[]].reverse())this.undoOne(t);break;case`drawingCreate`:e.after&&(this.drawings=this.drawings.filter(t=>t.id!==e.after.id));break;case`drawingRemove`:e.before&&this.drawings.push(e.before);break;case`drawingModify`:if(e.before){let t=this.drawings.findIndex(t=>t.id===e.before.id);t>=0&&(this.drawings[t]=structuredClone(e.before))}break}}applyRedoAction(e){this.redoOne(e),this.settleAfterHistory()}redoOne(e){switch(e.type){case`drawingBatch`:for(let t of e.actions??[])this.redoOne(t);break;case`drawingCreate`:e.after&&this.drawings.push(structuredClone(e.after));break;case`drawingRemove`:e.before&&(this.drawings=this.drawings.filter(t=>t.id!==e.before.id));break;case`drawingModify`:if(e.after){let t=this.drawings.findIndex(t=>t.id===e.after.id);t>=0&&(this.drawings[t]=structuredClone(e.after))}break}}batchUndo(e){let t=this.undoRedo;if(!t){e();return}let n=[];this.undoRedo={push:e=>{n.push(e)}};try{e()}finally{this.undoRedo=t}n.length===1?t.push(n[0]):n.length>1&&t.push({type:`drawingBatch`,before:null,after:null,actions:n})}isSelectedId(e){return e===this.selectedDrawingId||this.groupIds.has(e)}clearSelection(){this.selectedDrawingId=null,this.groupIds.clear()}addToSelection(e){this.selectedDrawingId?e!==this.selectedDrawingId&&this.groupIds.add(e):this.selectedDrawingId=e,this.state=`selected`}getSelectedDrawingIds(){return this.selectedDrawingId?[this.selectedDrawingId,...this.groupIds]:[]}selectInRect(e,t){if(this.state===`creating`)return 0;this.clearSelection(),this.state=`idle`;let n=Math.min(e.x0,e.x1),r=Math.max(e.x0,e.x1),i=Math.min(e.y0,e.y1),a=Math.max(e.y0,e.y1);for(let e of this.drawings)e.visible&&e.anchors.some(e=>{let s=_(e.time,t),c=o(e.price,t);return s>=n&&s<=r&&c>=i&&c<=a})&&this.addToSelection(e.id);return this.requestRender?.(),this.getSelectedDrawingIds().length}toggleSelectionAt(e,t){if(this.state===`creating`)return!1;for(let n=this.drawings.length-1;n>=0;n--){let r=this.drawings[n];if(r.visible&&this.registry.get(r.type)?.hitTest(e,r,t,8)){if(!this.isSelectedId(r.id))this.addToSelection(r.id);else if(r.id===this.selectedDrawingId){let e=this.groupIds.values().next();this.selectedDrawingId=e.done?null:e.value,e.done||this.groupIds.delete(e.value)}else this.groupIds.delete(r.id);return this.selectedDrawingId||(this.state=`idle`),this.requestRender?.(),!0}}return!1}beginMove(e,t){this.state=`moving`,this.dragStartPoint=e,this.dragStartAnchors=t.anchors.map(e=>({...e})),this.dragBeforeState=V(t),this.groupDrag=[];for(let e of this.getSelectedDrawingIds()){if(e===t.id)continue;let n=this.drawings.find(t=>t.id===e);n&&!n.locked&&this.groupDrag.push({id:e,anchors:n.anchors.map(e=>({...e})),before:V(n)})}}lockAllDrawings(){for(let e of this.drawings)e.locked=!0;this.requestRender?.()}unlockAllDrawings(){for(let e of this.drawings)e.locked=!1;this.requestRender?.()}hideAllDrawings(){for(let e of this.drawings)e.visible=!1;this.clearSelection(),this.state=`idle`,this.requestRender?.()}showAllDrawings(){for(let e of this.drawings)e.visible=!0;this.requestRender?.()}setDrawingVisible(e,t){let n=this.drawings.find(t=>t.id===e);return n?(n.visible=t,!t&&this.isSelectedId(e)&&this.clearSelection(),this.requestRender?.(),t):null}setDrawingLocked(e,t){let n=this.drawings.find(t=>t.id===e);return n?(n.locked=t,this.requestRender?.(),t):null}setActiveTool(e){let t=e!==this.activeTool;this.activeTool=e,this.state=e?`creating`:`idle`,this.creatingDrawing=null,this.committedAnchors=0,this.previewAnchor=null,t&&this.eventCallback?.(`drawingToolChange`,{tool:e})}setStayInDrawingMode(e){this.stayInDrawingMode=e}isStayInDrawingMode(){return this.stayInDrawingMode}setToolFilter(e){this.toolAllowed=e}copySelection(){let e=this.getSelectedDrawingIds().map(e=>this.drawings.find(t=>t.id===e)).filter(e=>e!==void 0);return e.length===0?0:(B.drawings=e.map(e=>structuredClone(e)),B.pastes=0,e.length)}paste(){if(B.drawings.length===0||this.state===`creating`)return[];let e=B.drawings.every(e=>this.drawings.some(t=>t.id===e.id));B.pastes+=1;let t=e?this.computeBarOffsetTime(3*B.pastes):0,n=[];if(this.batchUndo(()=>{for(let e of B.drawings)!this.registry.has(e.type)||!this.toolAllowed(e.type)||n.push(this.addDrawing({type:e.type,anchors:e.anchors.map(e=>({...e,time:e.time+t})),style:{...e.style},meta:e.meta?structuredClone(e.meta):void 0}))}),n.length===0)return n;this.clearSelection();for(let e of n)this.addToSelection(e);return this.requestRender?.(),n}getActiveTool(){return this.activeTool}setStyle(e){Object.assign(this.activeStyle,e)}getActiveStyle(){return{...this.activeStyle}}setSelectedDrawingStyle(e,t){let n=t?[t]:this.getSelectedDrawingIds(),r=!1;return this.batchUndo(()=>{for(let t of n){let n=this.drawings.find(e=>e.id===t);if(!n||n.locked)continue;let i=V(n);n.style={...n.style,...e},this.undoRedo?.push({type:`drawingModify`,before:i,after:V(n)}),r=!0}}),r&&this.requestRender?.(),r}onPointerDown(e,t){return this.state===`creating`&&this.activeTool?this.handleCreationClick(e,t):this.state===`idle`||this.state===`selected`?this.handleSelectionClick(e,t):!1}onPointerMove(e,t){if(this.state===`creating`&&this.creatingDrawing){let n=this.registry.get(this.creatingDrawing.type);if(n&&this.committedAnchors<n.descriptor.requiredAnchors){let n=v(e.x,t),r=u(e.y,t);return this.previewAnchor=this.snapToOHLC(n,r,t),this.requestRender?.(),!0}}return this.state===`moving`&&this.selectedDrawingId&&this.dragStartPoint?this.handleMove(e,t):this.state===`resizing`&&this.selectedDrawingId&&this.dragAnchorIndex>=0?this.handleResize(e,t):!1}onPointerUp(){if(this.state===`moving`||this.state===`resizing`){let e=[...this.dragBeforeState&&this.selectedDrawingId?[{id:this.selectedDrawingId,before:this.dragBeforeState}]:[],...this.groupDrag.map(e=>({id:e.id,before:e.before}))];return this.batchUndo(()=>{for(let{id:t,before:n}of e){let e=this.drawings.find(e=>e.id===t);e&&!Sr(e.anchors,n.anchors)&&this.undoRedo?.push({type:`drawingModify`,before:n,after:V(e)})}}),this.groupDrag=[],this.state=`selected`,this.dragStartPoint=null,this.dragStartAnchors=[],this.dragAnchorIndex=-1,this.dragBeforeState=null,!0}return!1}onKeyDown(e,t=!1){if(t&&(e===`c`||e===`C`))return this.state===`selected`&&this.copySelection()>0;if(t&&(e===`v`||e===`V`))return this.paste().length>0;if(t&&(e===`d`||e===`D`)&&this.state===`selected`&&this.selectedDrawingId&&this.duplicateDrawing(this.selectedDrawingId)||t&&(e===`z`||e===`Z`)&&this.undo()||t&&(e===`y`||e===`Y`)&&this.redo())return!0;if(e===`Escape`){if(this.state===`creating`)return this.setActiveTool(null),this.requestRender?.(),!0;if(this.state===`selected`)return this.clearSelection(),this.state=`idle`,this.requestRender?.(),!0}if((e===`Delete`||e===`Backspace`)&&this.state===`selected`&&this.selectedDrawingId){let e=this.getSelectedDrawingIds().filter(e=>!this.drawings.find(t=>t.id===e)?.locked);return e.length===0?!1:(this.batchUndo(()=>{for(let t of e)this.removeDrawing(t)}),this.clearSelection(),this.state=`idle`,this.requestRender?.(),!0)}return!1}getDrawings(){return this.drawings}setDrawings(e){this.drawings=this.upgradeLegacyAnchors(e),this.requestRender?.()}addDrawing(e){let t=e.id??`tc_drawing_${br++}`,n={id:t,type:e.type,anchors:e.anchors.map(e=>({...e})),style:{...this.activeStyle,...e.style},visible:e.visible??!0,locked:e.locked??!1,meta:e.meta};return this.drawings=[...this.drawings,n],this.undoRedo?.push({type:`drawingCreate`,before:null,after:V(n)}),this.eventCallback?.(`drawingCreate`,{id:t,type:n.type}),this.requestRender?.(),t}upgradeLegacyAnchors(e){let t=this.dataGetter?.();return!t||t.length===0?e:e.map(e=>({...e,anchors:e.anchors.map(e=>{if(e.time>=1e9)return e;let n=Math.max(0,Math.min(t.length-1,Math.round(e.time)));return{...e,time:t[n].time}})}))}removeDrawing(e){let t=this.drawings.find(t=>t.id===e);this.drawings=this.drawings.filter(t=>t.id!==e),t&&this.undoRedo?.push({type:`drawingRemove`,before:structuredClone(t),after:null}),this.eventCallback?.(`drawingRemove`,{id:e}),this.requestRender?.()}duplicateDrawing(e){let t=this.drawings.find(t=>t.id===e);if(!t)return null;let n=structuredClone(t);n.id=`tc_drawing_${br++}`;let r=this.computeBarOffsetTime(3);return n.anchors=n.anchors.map(e=>({...e,time:e.time+r})),n.locked=!1,this.drawings.push(n),this.undoRedo?.push({type:`drawingCreate`,before:null,after:structuredClone(n)}),this.selectedDrawingId=n.id,this.state=`selected`,this.eventCallback?.(`drawingCreate`,{drawing:n}),this.requestRender?.(),n.id}clearDrawings(){this.drawings=[],this.clearSelection(),this.state=`idle`,this.requestRender?.()}getSelectedDrawingId(){return this.selectedDrawingId}render(e,t){e.save(),e.beginPath(),e.rect(t.chartRect.x,t.chartRect.y,t.chartRect.width,t.chartRect.height),e.clip();for(let n of this.drawings){if(!n.visible)continue;let r=this.registry.get(n.type);if(!r)continue;let i=this.isSelectedId(n.id);r.render(e,n,t,i)}if(this.creatingDrawing&&this.committedAnchors>0){let n=this.registry.get(this.creatingDrawing.type);if(n){let r={...this.creatingDrawing,anchors:this.previewAnchor?[...this.creatingDrawing.anchors,this.previewAnchor]:[...this.creatingDrawing.anchors]};n.render(e,r,t,!1)}}e.restore()}computeBarOffsetTime(e){let t=this.dataGetter?.();if(!t||t.length<2)return e;let n=Math.max(0,t.length-20),r=[];for(let e=n+1;e<t.length;e++)r.push(t[e].time-t[e-1].time);return r.length===0?e:(r.sort((e,t)=>e-t),e*r[Math.floor(r.length/2)])}handleCreationClick(e,t){if(!this.activeTool)return!1;let n=this.registry.get(this.activeTool);if(!n)return!1;let r=v(e.x,t),i=u(e.y,t),a=this.snapToOHLC(r,i,t);return this.creatingDrawing?(this.creatingDrawing.anchors.push(a),this.committedAnchors++,this.previewAnchor=null,this.committedAnchors>=n.descriptor.requiredAnchors&&this.finalizeCreation(),this.requestRender?.(),!0):(this.creatingDrawing={id:`tc_drawing_${br++}`,type:this.activeTool,anchors:[a],style:{...this.activeStyle},visible:!0,locked:!1},this.committedAnchors=1,this.previewAnchor=null,n.descriptor.requiredAnchors===1&&this.finalizeCreation(),this.requestRender?.(),!0)}finalizeCreation(){if(this.creatingDrawing){if(this.drawings.push(this.creatingDrawing),this.selectedDrawingId=this.creatingDrawing.id,this.undoRedo?.push({type:`drawingCreate`,before:null,after:structuredClone(this.creatingDrawing)}),this.eventCallback?.(`drawingCreate`,{drawing:this.creatingDrawing}),this.creatingDrawing=null,this.committedAnchors=0,this.previewAnchor=null,this.stayInDrawingMode&&this.activeTool){this.clearSelection(),this.state=`creating`;return}this.activeTool=null,this.state=`selected`,this.eventCallback?.(`drawingToolChange`,{tool:null})}}isDragging(){return this.state===`moving`||this.state===`resizing`}hoverCursorAt(e,t){if(this.activeTool||this.state===`creating`)return null;if(this.selectedDrawingId){let n=this.drawings.find(e=>e.id===this.selectedDrawingId),r=n&&!n.locked?this.registry.get(n.type):void 0;if(n&&r&&r.hitTestAnchor(e,n,t,8)>=0)return`move`}for(let n=this.drawings.length-1;n>=0;n--){let r=this.drawings[n];if(!(!r.visible||r.locked)&&this.registry.get(r.type)?.hitTest(e,r,t,8))return`pointer`}return null}handleSelectionClick(e,t){if(this.selectedDrawingId){let n=this.drawings.find(e=>e.id===this.selectedDrawingId);if(n&&!n.locked){let r=this.registry.get(n.type);if(r){let i=r.hitTestAnchor(e,n,t,8);if(i>=0)return this.state=`resizing`,this.dragAnchorIndex=i,this.dragStartPoint=e,this.dragBeforeState=V(n),!0;if(r.hitTest(e,n,t,8))return this.beginMove(e,n),!0}}}for(let n=this.drawings.length-1;n>=0;n--){let r=this.drawings[n];if(!r.visible)continue;let i=this.registry.get(r.type);if(i&&i.hitTest(e,r,t,8))return this.isSelectedId(r.id)?(this.selectedDrawingId&&this.selectedDrawingId!==r.id&&this.groupIds.add(this.selectedDrawingId),this.groupIds.delete(r.id),this.selectedDrawingId=r.id):(this.clearSelection(),this.selectedDrawingId=r.id),this.requestRender?.(),r.locked?(this.state=`selected`,!1):(this.beginMove(e,r),!0)}return this.selectedDrawingId&&(this.clearSelection(),this.state=`idle`,this.requestRender?.()),!1}handleMove(e,t){let n=this.drawings.find(e=>e.id===this.selectedDrawingId);if(!n||!this.dragStartPoint)return!1;if(Math.hypot(e.x-this.dragStartPoint.x,e.y-this.dragStartPoint.y)<xr&&n.anchors.every((e,t)=>e.time===this.dragStartAnchors[t]?.time&&e.price===this.dragStartAnchors[t]?.price))return!0;let r=v(e.x,t)-v(this.dragStartPoint.x,t),i=u(e.y,t)-u(this.dragStartPoint.y,t);n.anchors=this.dragStartAnchors.map(e=>({time:e.time+r,price:e.price+i}));for(let e of this.groupDrag){let t=this.drawings.find(t=>t.id===e.id);t&&(t.anchors=e.anchors.map(e=>({time:e.time+r,price:e.price+i})))}return this.requestRender?.(),!0}handleResize(e,t){let n=this.drawings.find(e=>e.id===this.selectedDrawingId);return!n||this.dragAnchorIndex<0?!1:(n.anchors[this.dragAnchorIndex]={time:v(e.x,t),price:u(e.y,t)},this.requestRender?.(),!0)}},wr=class{constructor(e){this.manager=e}render(e,t){this.manager.render(e,t)}};function Tr(e,t,n){let r=Math.max(0,t),i=Math.min(e.length-1,n);if(i<=r)return null;let a=r,o=r;for(let t=r;t<=i;t++)e[t].high>e[a].high&&(a=t),e[t].low<e[o].low&&(o=t);if(a===o)return null;let s={time:e[a].time,price:e[a].high},c={time:e[o].time,price:e[o].low};return a<o?[s,c]:[c,s]}var Er=class extends z{descriptor={type:`trendLine`,name:`Trend Line`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return this.distanceToLine(e,i,a)<=r}},Dr=class extends z{descriptor={type:`horizontalLine`,name:`Horizontal Line`,requiredAnchors:1};render(e,t,n,r){if(t.anchors.length<1)return;let i=o(t.anchors[0].price,n),{chartRect:a}=n;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(a.x,i),e.lineTo(a.x+a.width,i),e.stroke(),this.resetLineStyle(e),e.fillStyle=t.style.color,e.font=`11px sans-serif`,e.textBaseline=`bottom`,e.fillText(t.anchors[0].price.toFixed(2),a.x+4,i-3),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=o(t.anchors[0].price,n);return Math.abs(e.y-i)<=r&&e.x>=n.chartRect.x&&e.x<=n.chartRect.x+n.chartRect.width}},Or=class extends z{descriptor={type:`horizontalRay`,name:`Horizontal Ray`,requiredAnchors:1};render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n),a=i.y,{chartRect:o}=n;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,a),e.lineTo(o.x+o.width,a),e.stroke(),this.resetLineStyle(e),e.fillStyle=t.style.color,e.font=`11px sans-serif`,e.textBaseline=`bottom`,e.fillText(t.anchors[0].price.toFixed(2),i.x+4,a-3),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n);return Math.abs(e.y-i.y)<=r&&e.x>=i.x-r&&e.x<=n.chartRect.x+n.chartRect.width}},kr=class extends z{descriptor={type:`verticalLine`,name:`Vertical Line`,requiredAnchors:1};render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n),{chartRect:a}=n;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,a.y),e.lineTo(i.x,a.y+a.height),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n),{chartRect:a}=n;return Math.abs(e.x-i.x)<=r&&e.y>=a.y&&e.y<=a.y+a.height}},Ar=class extends z{descriptor={type:`ray`,name:`Ray`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),{chartRect:o}=n,s=a.x-i.x,c=a.y-i.y,l=Math.hypot(s,c);if(l===0)return;let u=Math.hypot(o.width,o.height)*2,d=i.x+s/l*u,f=i.y+c/l*u;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(d,f),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=a.x-i.x,s=a.y-i.y;return((e.x-i.x)*o+(e.y-i.y)*s)/(o*o+s*s)<0?!1:this.distanceToInfiniteLine(e,i,a)<=r}},jr=class extends z{descriptor={type:`extendedLine`,name:`Extended Line`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),{chartRect:o}=n,s=a.x-i.x,c=a.y-i.y,l=Math.hypot(s,c);if(l===0)return;let u=Math.hypot(o.width,o.height)*2,d=i.x-s/l*u,f=i.y-c/l*u,p=i.x+s/l*u,m=i.y+c/l*u;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(d,f),e.lineTo(p,m),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return this.distanceToInfiniteLine(e,i,a)<=r}},Mr=class extends z{descriptor={type:`parallelChannel`,name:`Parallel Channel`,requiredAnchors:3};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);if(this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),t.anchors.length>=3){let r=this.anchorToPixel(t.anchors[2],n),o=a.x-i.x,s=a.y-i.y,c=Math.hypot(o,s)||1,l=-s/c,u=o/c,d=(r.x-i.x)*l+(r.y-i.y)*u,f={x:i.x+l*d,y:i.y+u*d},p={x:a.x+l*d,y:a.y+u*d};e.beginPath(),e.moveTo(f.x,f.y),e.lineTo(p.x,p.y),e.stroke(),t.style.fillColor&&(e.fillStyle=t.style.fillColor,e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.lineTo(p.x,p.y),e.lineTo(f.x,f.y),e.closePath(),e.fill())}this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);if(this.distanceToLine(e,i,a)<=r)return!0;if(t.anchors.length>=3){let o=this.anchorToPixel(t.anchors[2],n),s=a.x-i.x,c=a.y-i.y,l=Math.hypot(s,c)||1,u=-c/l,d=s/l,f=(o.x-i.x)*u+(o.y-i.y)*d,p={x:i.x+u*f,y:i.y+d*f},m={x:a.x+u*f,y:a.y+d*f};if(this.distanceToLine(e,p,m)<=r)return!0}return!1}},Nr=class extends z{descriptor={type:`regressionChannel`,name:`Regression Channel`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke();let o=a.x-i.x,s=a.y-i.y,c=Math.hypot(o,s);if(c===0){this.resetLineStyle(e);return}let l=Math.max(10,Math.min(c*.2,100)),u=-s/c*l,d=o/c*l;e.setLineDash([4,4]),e.beginPath(),e.moveTo(i.x+u,i.y+d),e.lineTo(a.x+u,a.y+d),e.stroke(),e.beginPath(),e.moveTo(i.x-u,i.y-d),e.lineTo(a.x-u,a.y-d),e.stroke(),t.style.fillColor&&(e.fillStyle=t.style.fillColor,e.beginPath(),e.moveTo(i.x+u,i.y+d),e.lineTo(a.x+u,a.y+d),e.lineTo(a.x-u,a.y-d),e.lineTo(i.x-u,i.y-d),e.closePath(),e.fill()),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.hypot(a.x-i.x,a.y-i.y),s=Math.max(10,Math.min(o*.2,100));return this.distanceToLine(e,i,a)<=r+s}},H=[0,.236,.382,.5,.618,.786,1],Pr=class extends z{descriptor={type:`fibRetracement`,name:`Fibonacci Retracement`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let{chartRect:i}=n,a=t.anchors[0].price,s=t.anchors[1].price,c=a-s;e.font=`11px sans-serif`,e.textBaseline=`middle`;for(let r of H){let a=s+c*(1-r),l=o(a,n);this.applyLineStyle(e,t.style),e.globalAlpha=r===0||r===1?1:.7,e.beginPath(),e.moveTo(i.x,l),e.lineTo(i.x+i.width,l),e.stroke(),e.fillStyle=t.style.color,e.textAlign=`left`,e.fillText(`${(r*100).toFixed(1)}% (${a.toFixed(2)})`,i.x+4,l-2)}if(e.globalAlpha=1,t.style.fillColor){for(let r=0;r<H.length-1;r++){let a=s+c*(1-H[r]),l=s+c*(1-H[r+1]),u=o(a,n),d=o(l,n);e.fillStyle=t.style.fillColor,e.globalAlpha=.05+r*.02,e.fillRect(i.x,Math.min(u,d),i.width,Math.abs(d-u))}e.globalAlpha=1}this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let{chartRect:i}=n;if(e.x<i.x-r||e.x>i.x+i.width+r)return!1;let a=t.anchors[0].price,s=t.anchors[1].price,c=a-s;for(let t of H){let i=o(s+c*(1-t),n);if(Math.abs(e.y-i)<=r)return!0}return!1}},Fr=[0,.618,1,1.618,2,2.618,3.618,4.236],Ir=class extends z{descriptor={type:`fibExtension`,name:`Fibonacci Extension`,requiredAnchors:3};render(e,t,n,r){if(t.anchors.length<3){if(t.anchors.length===2){let r=this.anchorToPixel(t.anchors[0],n),i=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(r.x,r.y),e.lineTo(i.x,i.y),e.stroke(),this.resetLineStyle(e)}return}let{chartRect:i}=n,a=t.anchors[0].price,s=t.anchors[1].price,c=t.anchors[2].price,l=a-s;e.font=`11px sans-serif`,e.textBaseline=`middle`,e.textAlign=`left`;for(let r of Fr){let a=o(c+l*r,n);this.applyLineStyle(e,t.style),e.globalAlpha=r===0||r===1?1:.6,e.beginPath(),e.moveTo(i.x,a),e.lineTo(i.x+i.width,a),e.stroke(),e.fillStyle=t.style.color,e.fillText(`${(r*100).toFixed(1)}%`,i.x+4,a-2)}e.globalAlpha=1,this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<3)return!1;let{chartRect:i}=n;if(e.x<i.x-r||e.x>i.x+i.width+r)return!1;let a=t.anchors[0].price-t.anchors[1].price;for(let i of Fr){let s=o(t.anchors[2].price+a*i,n);if(Math.abs(e.y-s)<=r)return!0}return!1}},Lr=class extends z{descriptor={type:`rectangle`,name:`Rectangle`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.min(i.y,a.y),c=Math.abs(a.x-i.x),l=Math.abs(a.y-i.y);t.style.fillColor&&(e.fillStyle=t.style.fillColor,e.fillRect(o,s,c,l)),this.applyLineStyle(e,t.style),e.strokeRect(o,s,c,l),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x)-r,s=Math.min(i.y,a.y)-r,c=Math.max(i.x,a.x)+r,l=Math.max(i.y,a.y)+r;if(e.x<o||e.x>c||e.y<s||e.y>l)return!1;let u=Math.min(i.x,a.x)+r,d=Math.min(i.y,a.y)+r,f=Math.max(i.x,a.x)-r,p=Math.max(i.y,a.y)-r;return!(e.x>u&&e.x<f&&e.y>d&&e.y<p)||!!t.style.fillColor}},Rr=class extends z{descriptor={type:`ellipse`,name:`Ellipse`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=(i.x+a.x)/2,s=(i.y+a.y)/2,c=Math.abs(a.x-i.x)/2,l=Math.abs(a.y-i.y)/2;e.beginPath(),e.ellipse(o,s,Math.max(c,1),Math.max(l,1),0,0,Math.PI*2),t.style.fillColor&&(e.fillStyle=t.style.fillColor,e.fill()),this.applyLineStyle(e,t.style),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=(i.x+a.x)/2,s=(i.y+a.y)/2,c=Math.max(Math.abs(a.x-i.x)/2,1),l=Math.max(Math.abs(a.y-i.y)/2,1),u=(e.x-o)/c,d=(e.y-s)/l,f=Math.sqrt(u*u+d*d),p=r/Math.max(Math.min(c,l),4);return t.style.fillColor?f<=1+p:Math.abs(f-1)<=p}},zr=class extends z{descriptor={type:`triangle`,name:`Triangle`,requiredAnchors:3};render(e,t,n,r){if(t.anchors.length<3){if(t.anchors.length===2){let r=this.anchorToPixel(t.anchors[0],n),i=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(r.x,r.y),e.lineTo(i.x,i.y),e.stroke(),this.resetLineStyle(e)}return}let i=t.anchors.map(e=>this.anchorToPixel(e,n));e.beginPath(),e.moveTo(i[0].x,i[0].y),e.lineTo(i[1].x,i[1].y),e.lineTo(i[2].x,i[2].y),e.closePath(),t.style.fillColor&&(e.fillStyle=t.style.fillColor,e.fill()),this.applyLineStyle(e,t.style),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<3)return!1;let i=t.anchors.map(e=>this.anchorToPixel(e,n));for(let t=0;t<3;t++){let n=(t+1)%3;if(this.distanceToLine(e,i[t],i[n])<=r)return!0}return!1}},U=class extends z{descriptor={type:`pitchfork`,name:`Andrews' Pitchfork`,requiredAnchors:3};origin(e,t){return e}render(e,t,n,r){if(t.anchors.length<3){if(t.anchors.length===2){let r=this.anchorToPixel(t.anchors[0],n),i=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(r.x,r.y),e.lineTo(i.x,i.y),e.stroke(),this.resetLineStyle(e)}return}let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=this.anchorToPixel(t.anchors[2],n),s=this.origin(i,a),c={x:(a.x+o.x)/2,y:(a.y+o.y)/2};(s.x!==i.x||s.y!==i.y)&&(e.strokeStyle=t.style.color,e.lineWidth=1,e.setLineDash([3,3]),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(s.x,s.y),e.stroke(),e.setLineDash([]));let l=c.x-s.x,u=c.y-s.y,d=Math.hypot(l,u)||1,f=Math.hypot(n.chartRect.width,n.chartRect.height),p=s.x+l/d*f,m=s.y+u/d*f;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(s.x,s.y),e.lineTo(p,m),e.stroke(),e.beginPath(),e.moveTo(a.x,a.y),e.lineTo(a.x+l/d*f,a.y+u/d*f),e.stroke(),e.beginPath(),e.moveTo(o.x,o.y),e.lineTo(o.x+l/d*f,o.y+u/d*f),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<3)return!1;let i=this.anchorToPixel(t.anchors[1],n),a=this.anchorToPixel(t.anchors[2],n),o=this.origin(this.anchorToPixel(t.anchors[0],n),i),s={x:(i.x+a.x)/2,y:(i.y+a.y)/2};if(this.distanceToInfiniteLine(e,o,s)<=r)return!0;let c=s.x-o.x,l=s.y-o.y,u={x:i.x+c,y:i.y+l},d={x:a.x+c,y:a.y+l};return this.distanceToInfiniteLine(e,i,u)<=r||this.distanceToInfiniteLine(e,a,d)<=r}},Br=class extends U{descriptor={type:`schiffPitchfork`,name:`Schiff Pitchfork`,requiredAnchors:3};origin(e,t){return{x:e.x,y:(e.y+t.y)/2}}},Vr=class extends U{descriptor={type:`modifiedSchiffPitchfork`,name:`Modified Schiff Pitchfork`,requiredAnchors:3};origin(e,t){return{x:(e.x+t.x)/2,y:(e.y+t.y)/2}}},Hr=[`1`,`2`,`3`,`4`,`5`,`A`,`B`,`C`],Ur=class extends z{descriptor={type:`elliottWave`,name:`Elliott Wave`,requiredAnchors:8};render(e,t,n,r){if(t.anchors.length<2)return;let i=t.anchors.map(e=>this.anchorToPixel(e,n));this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i[0].x,i[0].y);for(let t=1;t<i.length;t++)e.lineTo(i[t].x,i[t].y);e.stroke(),this.resetLineStyle(e),e.font=`bold 12px sans-serif`,e.fillStyle=t.style.color,e.textAlign=`center`;for(let t=0;t<i.length&&t<Hr.length;t++){let n=t%2==0?-12:12;e.textBaseline=n<0?`bottom`:`top`,e.fillText(Hr[t],i[t].x,i[t].y+n)}r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=t.anchors.map(e=>this.anchorToPixel(e,n));for(let t=0;t<i.length-1;t++)if(this.distanceToLine(e,i[t],i[t+1])<=r)return!0;return!1}},Wr=class extends z{descriptor={type:`priceRange`,name:`Price Range`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.abs(a.x-i.x),c=Math.min(i.y,a.y),l=Math.abs(a.y-i.y),u=t.anchors[1].price>t.anchors[0].price;e.fillStyle=u?`rgba(31, 168, 116, 0.15)`:`rgba(232, 80, 91, 0.15)`,e.fillRect(o,c,s,l),this.applyLineStyle(e,t.style),e.strokeRect(o,c,s,l),this.resetLineStyle(e);let d=t.anchors[1].price-t.anchors[0].price,f=t.anchors[0].price===0?0:d/t.anchors[0].price*100,p=`${d>=0?`+`:``}${d.toFixed(2)} (${f>=0?`+`:``}${f.toFixed(2)}%)`;e.font=`12px sans-serif`,e.fillStyle=u?`#1fa874`:`#e8505b`,e.textAlign=`center`,e.textBaseline=`middle`,e.fillText(p,o+s/2,c+l/2),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.max(i.x,a.x),c=Math.min(i.y,a.y),l=Math.max(i.y,a.y);return e.x>=o-r&&e.x<=s+r&&e.y>=c-r&&e.y<=l+r}},Gr=class extends z{descriptor={type:`dateRange`,name:`Date Range`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),{chartRect:o}=n,s=Math.min(i.x,a.x),c=Math.max(i.x,a.x);e.fillStyle=`rgba(76, 141, 255, 0.08)`,e.fillRect(s,o.y,c-s,o.height),this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(s,o.y),e.lineTo(s,o.y+o.height),e.stroke(),e.beginPath(),e.moveTo(c,o.y),e.lineTo(c,o.y+o.height),e.stroke(),this.resetLineStyle(e);let l=g(t.anchors[0].time,n),u=g(t.anchors[1].time,n),d=Math.max(0,Math.round(Math.abs(u-l)));e.font=`12px sans-serif`,e.fillStyle=t.style.color,e.textAlign=`center`,e.textBaseline=`top`,e.fillText(`${d} bars`,(s+c)/2,o.y+4),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),{chartRect:o}=n,s=Math.min(i.x,a.x),c=Math.max(i.x,a.x);return e.x>=s-r&&e.x<=c+r&&e.y>=o.y&&e.y<=o.y+o.height}},Kr=class extends z{descriptor={type:`measure`,name:`Measure`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.setLineDash([4,4]),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),this.resetLineStyle(e);let o=t.anchors[1].price-t.anchors[0].price,s=g(t.anchors[0].time,n),c=g(t.anchors[1].time,n),l=Math.max(0,Math.round(Math.abs(c-s))),u=t.anchors[0].price===0?0:o/t.anchors[0].price*100,d=[`Price: ${o>=0?`+`:``}${o.toFixed(2)} (${u>=0?`+`:``}${u.toFixed(2)}%)`,`Bars: ${l}`],f=(i.x+a.x)/2,p=(i.y+a.y)/2;e.font=`11px sans-serif`,e.textAlign=`center`,e.textBaseline=`bottom`;let m=Math.max(...d.map(t=>e.measureText(t).width));e.fillStyle=`rgba(0, 0, 0, 0.7)`,e.fillRect(f-m/2-6,p-d.length*14-4,m+12,d.length*14+8),e.fillStyle=`#FFFFFF`;for(let t=0;t<d.length;t++)e.fillText(d[t],f,p-(d.length-1-t)*14);r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return this.distanceToLine(e,i,a)<=r}};function qr(e,t=`Text`){if(typeof e.style.text==`string`&&e.style.text.length>0)return e.style.text;let n=e.meta?.text;return typeof n==`string`&&n.length>0?n:t}var Jr=class extends z{descriptor={type:`text`,name:`Text`,requiredAnchors:1};render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n),a=qr(t),o=t.style.fontSize||14;if(e.font=`${o}px sans-serif`,e.fillStyle=t.style.color,e.textAlign=`left`,e.textBaseline=`top`,r){let n=e.measureText(a);e.strokeStyle=t.style.color,e.lineWidth=1,e.setLineDash([3,3]),e.strokeRect(i.x-2,i.y-2,n.width+4,o+4),e.setLineDash([])}e.fillText(a,i.x,i.y),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=t.style.fontSize||14;return e.x>=i.x-r&&e.x<=i.x+80+r&&e.y>=i.y-r&&e.y<=i.y+a+r}},Yr=class extends z{descriptor={type:`arrow`,name:`Arrow`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke();let o=Math.atan2(a.y-i.y,a.x-i.x);e.beginPath(),e.moveTo(a.x,a.y),e.lineTo(a.x-12*Math.cos(o-Math.PI/6),a.y-12*Math.sin(o-Math.PI/6)),e.lineTo(a.x-12*Math.cos(o+Math.PI/6),a.y-12*Math.sin(o+Math.PI/6)),e.closePath(),e.fillStyle=t.style.color,e.fill(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return this.distanceToLine(e,i,a)<=r}},Xr=[{label:`8x1`,ratio:8},{label:`4x1`,ratio:4},{label:`3x1`,ratio:3},{label:`2x1`,ratio:2},{label:`1x1`,ratio:1},{label:`1x2`,ratio:.5},{label:`1x3`,ratio:1/3},{label:`1x4`,ratio:.25},{label:`1x8`,ratio:.125}],Zr=class extends z{descriptor={type:`gannFan`,name:`Gann Fan`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=a.x-i.x,s=a.y-i.y;if(Math.abs(o)<1)return;let c=s/o,l=o>0?1:-1,{chartRect:u}=n,d=l>0?u.x+u.width:u.x;this.applyLineStyle(e,t.style);for(let{label:n,ratio:r}of Xr){let a=c*r,o=d,s=i.y+a*(o-i.x);e.globalAlpha=r===1?1:.5,e.lineWidth=r===1?t.style.lineWidth:Math.max(.5,t.style.lineWidth*.7),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(o,s),e.stroke();let f=o-l*4,p=s;p>u.y&&p<u.y+u.height&&(e.globalAlpha=.7,e.fillStyle=t.style.color,e.font=`9px sans-serif`,e.textAlign=l>0?`right`:`left`,e.textBaseline=`bottom`,e.fillText(n,f,p-2))}e.globalAlpha=1,this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=a.x-i.x,s=a.y-i.y;if(Math.abs(o)<1)return!1;let c=s/o,l=o>0?1:-1,{chartRect:u}=n,d=l>0?u.x+u.width:u.x;for(let{ratio:t}of Xr){let n=c*t,a=d,o=i.y+n*(a-i.x);if(this.distanceToLine(e,i,{x:a,y:o})<=r)return!0}return!1}},Qr=[0,.25,.333,.5,.667,.75,1],$r=class extends z{descriptor={type:`gannBox`,name:`Gann Box`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.max(i.x,a.x),c=Math.min(i.y,a.y),l=Math.max(i.y,a.y),u=s-o,d=l-c;if(!(u<2||d<2)){this.applyLineStyle(e,t.style),e.strokeRect(o,c,u,d),e.save(),e.globalAlpha=.35;for(let t of Qr){if(t===0||t===1)continue;let n=c+d*t;e.beginPath(),e.moveTo(o,n),e.lineTo(s,n),e.stroke()}for(let t of Qr){if(t===0||t===1)continue;let n=o+u*t;e.beginPath(),e.moveTo(n,c),e.lineTo(n,l),e.stroke()}e.globalAlpha=.5,e.setLineDash([4,3]),e.beginPath(),e.moveTo(o,c),e.lineTo(s,l),e.stroke(),e.beginPath(),e.moveTo(s,c),e.lineTo(o,l),e.stroke(),e.restore(),this.resetLineStyle(e),e.fillStyle=t.style.color,e.font=`8px sans-serif`,e.globalAlpha=.6,e.textBaseline=`bottom`,e.textAlign=`right`;for(let t of Qr){if(t===0||t===1)continue;let n=c+d*t;e.fillText(`${(t*100).toFixed(0)}%`,o-3,n)}e.globalAlpha=1,r&&this.renderAnchorHandles(e,t,n)}}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.max(i.x,a.x),c=Math.min(i.y,a.y),l=Math.max(i.y,a.y);return Math.abs(e.x-o)<=r&&e.y>=c-r&&e.y<=l+r||Math.abs(e.x-s)<=r&&e.y>=c-r&&e.y<=l+r||Math.abs(e.y-c)<=r&&e.x>=o-r&&e.x<=s+r||Math.abs(e.y-l)<=r&&e.x>=o-r&&e.x<=s+r||this.distanceToLine(e,{x:o,y:c},{x:s,y:l})<=r||this.distanceToLine(e,{x:s,y:c},{x:o,y:l})<=r}},ei=class extends z{descriptor={type:`anchoredVWAP`,name:`Anchored VWAP`,requiredAnchors:1};dataGetter=null;showBands=!0;setDataGetter(e){this.dataGetter=e}setShowBands(e){this.showBands=e}render(e,t,n,r){if(t.anchors.length<1||!this.dataGetter)return;let i=this.dataGetter(),s=Math.max(0,Math.round(g(t.anchors[0].time,n)));if(s>=i.length)return;let{vwap:c,upper1:l,lower1:u,upper2:d,lower2:f}=this.computeVWAP(i,s),{chartRect:p}=n,m=n.barWidth+n.barSpacing;if(this.applyLineStyle(e,t.style),e.lineWidth=t.style.lineWidth+.5,this.drawLine(e,c,s,n,p,m),this.showBands&&c.length>1&&(e.globalAlpha=.4,e.lineWidth=Math.max(.5,t.style.lineWidth*.6),e.setLineDash([4,3]),this.drawLine(e,l,s,n,p,m),this.drawLine(e,u,s,n,p,m),e.globalAlpha=.25,this.drawLine(e,d,s,n,p,m),this.drawLine(e,f,s,n,p,m),e.globalAlpha=1),this.resetLineStyle(e),c.length>0){let r=c[c.length-1],i=a(s+c.length-1,n),l=o(r,n);i>=p.x&&i<=p.x+p.width&&(e.fillStyle=t.style.color,e.font=`bold 9px sans-serif`,e.textAlign=`left`,e.textBaseline=`middle`,e.fillText(`AVWAP ${r.toFixed(2)}`,i+6,l))}r&&this.renderAnchorHandles(e,t,n)}drawLine(e,t,n,r,i,s){e.beginPath();let c=!1;for(let l=0;l<t.length;l++){let u=a(n+l,r);if(u<i.x-s)continue;if(u>i.x+i.width+s)break;let d=o(t[l],r);c?e.lineTo(u,d):(e.moveTo(u,d),c=!0)}e.stroke()}vwapCache=null;computeVWAP(e,t){let n=e[e.length-1],r=this.vwapCache;if(r&&r.data===e&&r.length===e.length&&r.startIdx===t&&r.lastClose===n?.close&&r.lastVolume===(n?.volume??0))return r.result;let i=this.computeVWAPUncached(e,t);return this.vwapCache={data:e,length:e.length,startIdx:t,lastClose:n?.close,lastVolume:n?.volume??0,result:i},i}computeVWAPUncached(e,t){let n=e.length-t,r=Array(n),i=Array(n),a=Array(n),o=Array(n),s=Array(n),c=0,l=0,u=0;for(let d=0;d<n;d++){let n=e[t+d],f=(n.high+n.low+n.close)/3,p=n.volume??1;c+=f*p,l+=p,u+=f*f*p;let m=l>0?c/l:f;r[d]=m;let h=l>0?u/l-m*m:0,g=Math.sqrt(Math.max(0,h));i[d]=m+g,a[d]=m-g,o[d]=m+2*g,s[d]=m-2*g}return{vwap:r,upper1:i,lower1:a,upper2:o,lower2:s}}hitTest(e,t,n,r){if(t.anchors.length<1||!this.dataGetter)return!1;let i=this.dataGetter(),s=Math.max(0,Math.round(g(t.anchors[0].time,n)));if(s>=i.length)return!1;let{vwap:c}=this.computeVWAP(i,s);for(let t=1;t<c.length;t++){let i=a(s+t-1,n),l=o(c[t-1],n),u=a(s+t,n),d=o(c[t],n);if(this.distanceToLine(e,{x:i,y:l},{x:u,y:d})<=r)return!0}return!1}},ti=class extends z{descriptor={type:`volumeProfileRange`,name:`Volume Profile (Range)`,requiredAnchors:2};dataGetter=null;numBins=40;setDataGetter(e){this.dataGetter=e}render(e,t,n,r){if(t.anchors.length<2||!this.dataGetter)return;let i=this.dataGetter(),s=Math.round(g(t.anchors[0].time,n)),c=Math.round(g(t.anchors[1].time,n)),l=Math.max(0,Math.min(s,c)),u=Math.min(i.length-1,Math.max(s,c));if(l>=i.length||u<0||l>u)return;let d=1/0,f=-1/0;for(let e=l;e<=u;e++)i[e].low<d&&(d=i[e].low),i[e].high>f&&(f=i[e].high);if(d>=f)return;let p=(f-d)/this.numBins,m=new Float64Array(this.numBins),h=0;for(let e=l;e<=u;e++){let t=i[e],n=t.volume??1,r=Math.max(0,Math.floor((t.low-d)/p)),a=Math.min(this.numBins-1,Math.floor((t.high-d)/p)),o=n/(a-r+1);for(let e=r;e<=a;e++)m[e]+=o,m[e]>h&&(h=m[e])}if(h===0)return;let _=0;for(let e=1;e<this.numBins;e++)m[e]>m[_]&&(_=e);let v=a(u,n)+n.barWidth,y=t.style.color,b=t.style.fillColor??`#f2a93b`;e.save();for(let t=0;t<this.numBins;t++){let r=m[t]/h*100,i=d+(t+1)*p,a=d+t*p,s=o(i,n),c=o(a,n),l=Math.abs(c-s);e.globalAlpha=.35,e.fillStyle=t===_?b:y,e.fillRect(v,Math.min(s,c),r,Math.max(1,l-.5))}let x=d+(_+.5)*p,S=o(x,n);e.globalAlpha=.7,e.strokeStyle=b,e.lineWidth=1,e.setLineDash([4,3]),e.beginPath();let C=a(l,n)-n.barWidth/2;e.moveTo(C,S),e.lineTo(v+100,S),e.stroke(),e.fillStyle=b,e.font=`9px sans-serif`,e.textAlign=`left`,e.textBaseline=`bottom`,e.globalAlpha=.8,e.fillText(`POC ${x.toFixed(2)}`,v+100+4,S-2),e.restore(),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x)-r,s=Math.max(i.x,a.x)+100+r,c=Math.min(i.y,a.y)-r,l=Math.max(i.y,a.y)+r;return e.x>=o&&e.x<=s&&e.y>=c&&e.y<=l}},ni=[1,2,3,5,8,13,21,34,55],ri=class extends z{descriptor={type:`fibTimeZones`,name:`Fibonacci Time Zones`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=t.anchors[0],a=t.anchors[1].time-i.time;if(a===0)return;let{chartRect:o}=n;e.font=`11px sans-serif`,e.textBaseline=`top`,e.textAlign=`center`,this.applyLineStyle(e,t.style);for(let r of ni){let s=_(i.time+a*r,n);s<o.x||s>o.x+o.width||(e.globalAlpha=r===1?1:.55,e.beginPath(),e.moveTo(s,o.y),e.lineTo(s,o.y+o.height),e.stroke(),e.fillStyle=t.style.color,e.fillText(String(r),s,o.y+2))}e.globalAlpha=1,this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=t.anchors[0],a=t.anchors[1].time-i.time;if(a===0)return!1;let{chartRect:o}=n;if(e.y<o.y||e.y>o.y+o.height)return!1;for(let t of ni){let o=_(i.time+a*t,n);if(Math.abs(e.x-o)<=r)return!0}return!1}},W=2,ii=class extends z{descriptor={type:`riskReward`,name:`Long/Short Position`,requiredAnchors:2};geometry(e){let t=e.anchors[0].price,n=e.anchors[1].price,r=Math.abs(t-n),i=n<t;return{entryPrice:t,stopPrice:n,targetPrice:i?t+r*W:t-r*W,risk:r,isLong:i}}render(e,t,n,r){if(t.anchors.length<2)return;let{entryPrice:i,stopPrice:a,targetPrice:o,risk:s,isLong:c}=this.geometry(t),l=this.anchorToPixel(t.anchors[0],n),u=this.anchorToPixel(t.anchors[1],n),d=Math.min(l.x,u.x),f=Math.max(Math.abs(u.x-l.x),40),p=l.y,m=u.y,h=this.anchorToPixel({time:t.anchors[1].time,price:o},n).y,g=Math.min(p,m),_=Math.abs(m-p),v=Math.min(p,h),y=Math.abs(h-p);e.fillStyle=`rgba(232, 80, 91, 0.18)`,e.fillRect(d,g,f,_),e.fillStyle=`rgba(31, 168, 116, 0.18)`,e.fillRect(d,v,f,y),e.strokeStyle=t.style.color,e.lineWidth=1,e.setLineDash([]),e.beginPath(),e.moveTo(d,p),e.lineTo(d+f,p),e.stroke();let b=e=>i===0?0:(e-i)/i*100;e.font=`11px sans-serif`,e.textAlign=`left`,e.textBaseline=`middle`,e.fillStyle=`#e8505b`,e.fillText(`Risk ${s.toFixed(2)} (${b(a).toFixed(2)}%)`,d+4,(p+m)/2),e.fillStyle=`#1fa874`;let x=`R:R 1:${W}`;e.fillText(`Reward ${(s*W).toFixed(2)} (${b(o).toFixed(2)}%) ยท ${x}`,d+4,(p+h)/2),e.fillStyle=t.style.color,e.fillText(c?`Long`:`Short`,d+4,p-8),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let{targetPrice:i}=this.geometry(t),a=this.anchorToPixel(t.anchors[0],n),o=this.anchorToPixel(t.anchors[1],n),s=this.anchorToPixel({time:t.anchors[1].time,price:i},n).y,c=Math.min(a.x,o.x)-r,l=Math.max(a.x,o.x)+r,u=Math.min(a.y,o.y,s)-r,d=Math.max(a.y,o.y,s)+r;return e.x>=c&&e.x<=l&&e.y>=u&&e.y<=d}},ai=class extends z{descriptor={type:`crossLine`,name:`Cross Line`,requiredAnchors:1};render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n),{chartRect:a}=n;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(a.x,i.y),e.lineTo(a.x+a.width,i.y),e.moveTo(i.x,a.y),e.lineTo(i.x,a.y+a.height),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n);return Math.abs(e.y-i.y)<=r||Math.abs(e.x-i.x)<=r}},oi=28,si=48;function ci(e,t){return Math.atan2(e.y-t.y,t.x-e.x)*180/Math.PI}var li=class extends z{descriptor={type:`trendAngle`,name:`Trend Angle`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=ci(i,a),s=a.x>=i.x?1:-1;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),this.resetLineStyle(e),e.strokeStyle=t.style.color,e.lineWidth=1,e.setLineDash([3,3]),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(i.x+s*si,i.y),e.stroke(),e.setLineDash([]);let c=Math.atan2(a.y-i.y,a.x-i.x),l=s>0?0:Math.PI;s<0&&c<0&&(c+=2*Math.PI),e.beginPath(),e.arc(i.x,i.y,oi,Math.min(l,c),Math.max(l,c)),e.stroke(),e.font=`11px sans-serif`,e.fillStyle=t.style.color,e.textAlign=s>0?`left`:`right`,e.textBaseline=`middle`,e.fillText(`${o.toFixed(1)}ยฐ`,i.x+s*(oi+6),i.y+(o>=0?-8:8)),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return this.distanceToLine(e,i,a)<=r}},ui=`11px sans-serif`,di=14,fi=6,pi=4,mi=`rgba(19, 23, 34, 0.85)`,hi=`#FFFFFF`,gi=6e4,G=60*gi,_i=24*G;function vi(e){let t=Math.abs(e);return t>=10||t===0?2:t>=1?4:Math.min(10,Math.ceil(-Math.log10(t))+3)}function yi(e,t=e){return e.toFixed(vi(t))}function bi(e,t){let n=t-e,r=e===0?0:n/e*100,i=n>=0?`+`:``;return`${i}${yi(n,e)} (${i}${r.toFixed(2)}%)`}function xi(e){let t=Math.abs(e);if(t<G)return`${Math.round(t/gi)}m`;if(t<_i){let e=Math.floor(t/G),n=Math.round((t-e*G)/gi);return n>0?`${e}h ${n}m`:`${e}h`}let n=Math.floor(t/_i),r=Math.round((t-n*_i)/G);if(n>=7){let e=Math.floor(n/7),t=n-e*7;return t>0?`${e}w ${t}d`:`${e}w`}return r>0?`${n}d ${r}h`:`${n}d`}function Si(e){return!!e.data&&e.data.length>0}function Ci(e,t,n,r){let i=g(e.anchors[t].time,r),a=g(e.anchors[n].time,r);return Math.round(Math.abs(a-i))}function wi(e,t,n,r){return Si(r)?xi(e.anchors[n].time-e.anchors[t].time):null}function Ti(e,t,n,r,i=`center`,a=!0){e.font=ui;let o=0;for(let n of t)o=Math.max(o,e.measureText(n).width);let s=o+fi*2,c=t.length*di+pi*2,l=i===`left`?n:i===`right`?n-s:n-s/2,u=a?r-c:r;e.fillStyle=mi,e.fillRect(l,u,s,c),e.fillStyle=hi,e.textAlign=`left`,e.textBaseline=`top`;for(let n=0;n<t.length;n++)e.fillText(t[n],l+fi,u+pi+n*di);return{x:l,y:u,width:s,height:c}}function Ei(e,t,n){let r=Math.abs(e.anchors[t[1]].price-e.anchors[t[0]].price),i=Math.abs(e.anchors[n[1]].price-e.anchors[n[0]].price);return i===0?`โ€”`:(r/i).toFixed(3)}function Di(e,t,n){let r=wi(e,0,1,t),i=Ci(e,0,1,t);return[bi(e.anchors[0].price,e.anchors[1].price),r?`${i} bars, ${r}`:`${i} bars`,`${n.toFixed(1)}ยฐ`]}var Oi=class extends z{descriptor={type:`infoLine`,name:`Info Line`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),this.resetLineStyle(e);let o=Di(t,n,ci(i,a)),s=a.y<=i.y;Ti(e,o,a.x+(a.x>=i.x?8:-8),a.y+(s?-6:6),a.x>=i.x?`left`:`right`,s),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return this.distanceToLine(e,i,a)<=r}},ki=[0,.236,.382,.5,.618,.786,1,1.618];function Ai(e,t,n){let r=t.x-e.x,i=t.y-e.y,a=r*r+i*i;if(a===0)return{x:n.x-e.x,y:n.y-e.y};let o=((n.x-e.x)*r+(n.y-e.y)*i)/a;return{x:n.x-(e.x+o*r),y:n.y-(e.y+o*i)}}function ji(e,t,n,r){let i=Ai(e,t,n);return[{x:e.x+i.x*r,y:e.y+i.y*r},{x:t.x+i.x*r,y:t.y+i.y*r}]}var Mi=class extends z{descriptor={type:`fibChannel`,name:`Fibonacci Channel`,requiredAnchors:3};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);if(t.anchors.length<3){this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),this.resetLineStyle(e);return}let o=this.anchorToPixel(t.anchors[2],n);e.font=`11px sans-serif`,e.textAlign=`right`,e.textBaseline=`middle`;for(let n of ki){let[r,s]=ji(i,a,o,n);this.applyLineStyle(e,t.style),e.globalAlpha=n===0||n===1?1:.6,e.beginPath(),e.moveTo(r.x,r.y),e.lineTo(s.x,s.y),e.stroke(),e.fillStyle=t.style.color;let c=r.x<=s.x?r:s;e.fillText(String(n),c.x-4,c.y)}e.globalAlpha=1,this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<3)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=this.anchorToPixel(t.anchors[2],n);for(let t of ki){let[n,s]=ji(i,a,o,t);if(this.distanceToLine(e,n,s)<=r)return!0}return!1}},Ni=[.25,.382,.5,.618,.75];function Pi(e,t,n){let r=t.x-e.x,i=t.y-e.y,a=Math.hypot(r,i);if(a===0)return null;let o=(n.chartRect.width+n.chartRect.height)*2;return{x:e.x+r/a*o,y:e.y+i/a*o}}function Fi(e,t){let n=[{level:1,kind:`diagonal`,point:t}];for(let r of Ni)n.push({level:r,kind:`price`,point:{x:t.x,y:e.y+(t.y-e.y)*r}}),n.push({level:r,kind:`time`,point:{x:e.x+(t.x-e.x)*r,y:t.y}});return n}var Ii=class extends z{descriptor={type:`fibSpeedResistanceFan`,name:`Fib Speed Resistance Fan`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);e.strokeStyle=t.style.color,e.lineWidth=1,e.globalAlpha=.25,e.strokeRect(Math.min(i.x,a.x),Math.min(i.y,a.y),Math.abs(a.x-i.x),Math.abs(a.y-i.y)),e.globalAlpha=1,e.font=`11px sans-serif`,e.textBaseline=`middle`;for(let r of Fi(i,a)){let o=Pi(i,r.point,n);o&&(this.applyLineStyle(e,t.style),e.globalAlpha=r.kind===`diagonal`?1:.65,e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(o.x,o.y),e.stroke(),r.kind===`price`&&(e.fillStyle=t.style.color,e.textAlign=a.x>=i.x?`left`:`right`,e.fillText(String(r.level),r.point.x+(a.x>=i.x?4:-4),r.point.y)))}e.globalAlpha=1,this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);for(let t of Fi(i,a)){let a=Pi(i,t.point,n);if(a&&this.distanceToLine(e,i,a)<=r)return!0}return!1}},Li=class extends z{ratioLinks=[];triangles=[];render(e,t,n,r){if(t.anchors.length<2)return;let i=t.anchors.map(e=>this.anchorToPixel(e,n));t.anchors.length>=this.descriptor.requiredAnchors&&this.renderTriangles(e,t,i),this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i[0].x,i[0].y);for(let t=1;t<i.length;t++)e.lineTo(i[t].x,i[t].y);e.stroke(),this.resetLineStyle(e),this.renderRatioLinks(e,t,i),this.renderPointLabels(e,t,i),this.renderExtras(e,t,i,n),r&&this.renderAnchorHandles(e,t,n)}renderExtras(e,t,n,r){}renderTriangles(e,t,n){e.fillStyle=t.style.fillColor??t.style.color,e.globalAlpha=t.style.fillColor?1:.12;for(let[t,r,i]of this.triangles)e.beginPath(),e.moveTo(n[t].x,n[t].y),e.lineTo(n[r].x,n[r].y),e.lineTo(n[i].x,n[i].y),e.closePath(),e.fill();e.globalAlpha=1}renderRatioLinks(e,t,n){e.font=`11px sans-serif`,e.textAlign=`center`,e.textBaseline=`middle`;for(let r of this.ratioLinks){if(Math.max(r.from,r.to,...r.num,...r.den)>=n.length)continue;let i=n[r.from],a=n[r.to];e.strokeStyle=t.style.color,e.lineWidth=1,e.globalAlpha=.7,e.setLineDash([4,4]),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),e.setLineDash([]),e.globalAlpha=1,e.fillStyle=t.style.color,e.fillText(Ei(t,r.num,r.den),(i.x+a.x)/2,(i.y+a.y)/2)}}renderPointLabels(e,t,n){e.font=`bold 12px sans-serif`,e.fillStyle=t.style.color,e.textAlign=`center`;for(let t=0;t<n.length&&t<this.pointLabels.length;t++){let r=n[t-1]??n[t+1],i=n[t+1]??n[t-1],a=!r||!i?!0:n[t].y<=Math.min(r.y,i.y);e.textBaseline=a?`bottom`:`top`,e.fillText(this.pointLabels[t],n[t].x,n[t].y+(a?-6:6))}}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=t.anchors.map(e=>this.anchorToPixel(e,n));for(let t=0;t<i.length-1;t++)if(this.distanceToLine(e,i[t],i[t+1])<=r)return!0;return!1}},Ri=class extends Li{descriptor={type:`xabcdPattern`,name:`XABCD Pattern`,requiredAnchors:5};pointLabels=[`X`,`A`,`B`,`C`,`D`];ratioLinks=[{from:0,to:2,num:[1,2],den:[0,1]},{from:1,to:3,num:[2,3],den:[1,2]},{from:2,to:4,num:[3,4],den:[2,3]},{from:0,to:4,num:[1,4],den:[0,1]}];triangles=[[0,1,2],[2,3,4]]},zi=class extends Li{descriptor={type:`abcdPattern`,name:`ABCD Pattern`,requiredAnchors:4};pointLabels=[`A`,`B`,`C`,`D`];ratioLinks=[{from:0,to:2,num:[1,2],den:[0,1]},{from:1,to:3,num:[2,3],den:[1,2]}]},Bi=class extends Li{descriptor={type:`headAndShoulders`,name:`Head and Shoulders`,requiredAnchors:7};pointLabels=[``,`Left Shoulder`,``,`Head`,``,`Right Shoulder`,``];triangles=[[0,1,2],[2,3,4],[4,5,6]];renderExtras(e,t,n){if(n.length<5)return;let r=n[2],i=n[4],a=n[0],o=n[n.length-1],s=i.x===r.x?0:(i.y-r.y)/(i.x-r.x),c=e=>r.y+s*(e-r.x);e.strokeStyle=t.style.color,e.lineWidth=Math.max(1,t.style.lineWidth),e.setLineDash([6,4]),e.beginPath(),e.moveTo(a.x,c(a.x)),e.lineTo(o.x,c(o.x)),e.stroke(),e.setLineDash([])}},Vi=class extends z{descriptor={type:`circle`,name:`Circle`,requiredAnchors:2};geometry(e,t){let n=this.anchorToPixel(e.anchors[0],t),r=this.anchorToPixel(e.anchors[1],t);return{c:n,r:Math.hypot(r.x-n.x,r.y-n.y)}}render(e,t,n,r){if(t.anchors.length<2)return;let{c:i,r:a}=this.geometry(t,n);e.beginPath(),e.arc(i.x,i.y,a,0,Math.PI*2),t.style.fillColor&&(e.fillStyle=t.style.fillColor,e.fill()),this.applyLineStyle(e,t.style),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let{c:i,r:a}=this.geometry(t,n),o=Math.hypot(e.x-i.x,e.y-i.y);return t.style.fillColor?o<=a+r:Math.abs(o-a)<=r}},Hi=`rgba(76, 141, 255, 0.12)`,Ui=`rgba(232, 80, 91, 0.12)`;function Wi(e,t){let n=t.data;if(!n||n.length===0)return null;let r=Math.round(g(e.anchors[0].time,t)),i=Math.round(g(e.anchors[1].time,t)),a=Math.max(0,Math.min(r,i)),o=Math.min(n.length-1,Math.max(r,i)),s=0;for(let e=a;e<=o;e++)s+=n[e].volume??0;return s}function Gi(e){return e>=1e9?`${(e/1e9).toFixed(2)}B`:e>=1e6?`${(e/1e6).toFixed(2)}M`:e>=1e3?`${(e/1e3).toFixed(2)}K`:e.toFixed(0)}function Ki(e,t){let n=wi(e,0,1,t),r=Ci(e,0,1,t),i=[bi(e.anchors[0].price,e.anchors[1].price),n?`${r} bars, ${n}`:`${r} bars`],a=Wi(e,t);return a!==null&&i.push(`Vol ${Gi(a)}`),i}var qi=class extends z{descriptor={type:`dateAndPriceRange`,name:`Date and Price Range`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.min(i.y,a.y),c=Math.abs(a.x-i.x),l=Math.abs(a.y-i.y),u=t.anchors[1].price>=t.anchors[0].price;e.fillStyle=u?Hi:Ui,e.fillRect(o,s,c,l),this.applyLineStyle(e,t.style);let d=o+c/2,f=s+l/2;e.beginPath(),e.moveTo(d,i.y),e.lineTo(d,a.y),e.moveTo(i.x,f),e.lineTo(a.x,f),e.stroke(),this.resetLineStyle(e),Ti(e,Ki(t,n),d,u?s-6:s+l+6,`center`,u),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return e.x>=Math.min(i.x,a.x)-r&&e.x<=Math.max(i.x,a.x)+r&&e.y>=Math.min(i.y,a.y)-r&&e.y<=Math.max(i.y,a.y)+r}},Ji=400,Yi=2;function Xi(e,t,n){let r=Math.abs(t.x-e.x);if(r<Yi)return[e.x];let i=n.chartRect.x+n.chartRect.width,a=[],o=Math.min(e.x,t.x);for(let e=o;e<=i&&a.length<Ji;e+=r)a.push(e);return a}var Zi=class extends z{descriptor={type:`cyclicLines`,name:`Cyclic Lines`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),{chartRect:o}=n;this.applyLineStyle(e,t.style),e.beginPath();for(let t of Xi(i,a,n))t<o.x||(e.moveTo(t,o.y),e.lineTo(t,o.y+o.height));e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){return t.anchors.length<2?!1:Xi(this.anchorToPixel(t.anchors[0],n),this.anchorToPixel(t.anchors[1],n),n).some(t=>Math.abs(e.x-t)<=r)}},Qi=14,$i=18,ea=6,ta=20,na=class extends z{descriptor={type:`priceLabel`,name:`Price Label`,requiredAnchors:1};text(e){return e.style.text||yi(e.anchors[0].price)}box(e,t,n){let r=t.style.fontSize??12,i=e?e.measureText(this.text(t)).width:this.text(t).length*r*.6;return{x:n.x+Qi,y:n.y-$i-ta/2,w:i+ea*2,h:ta}}render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n);e.font=`${t.style.fontSize??12}px sans-serif`;let a=this.box(e,t,i);e.strokeStyle=t.style.color,e.lineWidth=1,e.setLineDash([]),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y+a.h),e.stroke(),e.fillStyle=t.style.color,e.fillRect(a.x,a.y,a.w,a.h),e.fillStyle=`#FFFFFF`,e.textAlign=`left`,e.textBaseline=`middle`,e.fillText(this.text(t),a.x+ea,a.y+a.h/2),e.beginPath(),e.arc(i.x,i.y,3,0,Math.PI*2),e.fillStyle=t.style.color,e.fill(),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n);if(Math.hypot(e.x-i.x,e.y-i.y)<=r)return!0;let a=this.box(null,t,i);return e.x>=a.x-r&&e.x<=a.x+a.w+r&&e.y>=a.y-r&&e.y<=a.y+a.h+r}};function ra(e){e.register(new Er),e.register(new Dr),e.register(new Or),e.register(new kr),e.register(new Ar),e.register(new jr),e.register(new Mr),e.register(new Nr),e.register(new Pr),e.register(new Ir),e.register(new Lr),e.register(new Rr),e.register(new zr),e.register(new U),e.register(new Ur),e.register(new Wr),e.register(new Gr),e.register(new Kr),e.register(new Jr),e.register(new Yr),e.register(new Zr),e.register(new $r),e.register(new ei),e.register(new ti),e.register(new ri),e.register(new ii),e.register(new ai),e.register(new li),e.register(new Oi),e.register(new Mi),e.register(new Ii),e.register(new Br),e.register(new Vr),e.register(new Ri),e.register(new zi),e.register(new Bi),e.register(new Vi),e.register(new qi),e.register(new Zi),e.register(new na)}var ia=class{render(e,t,n,r,i,a){let s=i.orderColors?.buy??`#1fa874`,c=i.orderColors?.sell??`#e8505b`,{chartRect:l}=n;for(let i of t){let t=a?.orderId===i.id&&a.sourceType===`order`,u=o(t?a.currentPrice:i.price,n);if(u<l.y||u>l.y+l.height)continue;let d=i.side===`buy`?s:c;e.setLineDash([6,4]),e.strokeStyle=d,e.lineWidth=1,e.beginPath(),e.moveTo(l.x,Math.round(u)+.5),e.lineTo(l.x+l.width,Math.round(u)+.5),e.stroke(),e.setLineDash([]);let f=i.label??i.type.toUpperCase();e.font=`bold 10px ${r.font.family}`;let p=e.measureText(f).width+8;e.fillStyle=d,e.fillRect(l.x+4,u-8,p,16),e.fillStyle=`#FFFFFF`,e.textBaseline=`middle`,e.textAlign=`left`,e.fillText(f,l.x+8,u);let m=l.x+4+p+6;if(e.fillStyle=d,e.beginPath(),i.side===`buy`?(e.moveTo(m,u+4),e.lineTo(m+5,u-2),e.lineTo(m+10,u+4)):(e.moveTo(m,u-4),e.lineTo(m+5,u+2),e.lineTo(m+10,u-4)),e.fill(),t){let t=o(a.startPrice,n);e.setLineDash([2,4]),e.strokeStyle=d,e.globalAlpha=.3,e.beginPath(),e.moveTo(l.x,Math.round(t)+.5),e.lineTo(l.x+l.width,Math.round(t)+.5),e.stroke(),e.globalAlpha=1,e.setLineDash([])}}}renderAxisBadges(t,n,r,i,a,s){let c=a.orderColors?.buy??`#1fa874`,l=a.orderColors?.sell??`#e8505b`,u=a.pricePrecision??2,{chartRect:d}=r,f=d.x+d.width+1;for(let a of n){let n=s?.orderId===a.id&&s.sourceType===`order`?s.currentPrice:a.price,p=o(n,r);if(p<d.y||p>d.y+d.height)continue;let m=a.side===`buy`?c:l,h=`${n.toFixed(u)} x ${a.quantity}`;t.font=`11px ${i.font.family}`;let g=t.measureText(h).width+10;t.fillStyle=m,t.fillRect(f,p-9,Math.min(g,(r.priceAxisWidth??e.PRICE_AXIS_WIDTH)-2),18),t.fillStyle=`#FFFFFF`,t.textAlign=`left`,t.textBaseline=`middle`,t.fillText(h,f+5,p)}}hitTest(e,t,n,r){for(let i of t){if(i.draggable===!1)continue;let t=o(i.price,n);if(Math.abs(e-t)<=r)return i}return null}};function aa(e,t,n){let r=Math.min(Math.max(e.closedQuantity??0,0),e.quantity),i=e.quantity-r,a=e.side===`buy`?1:-1,o=(t-e.entryPrice)*i*a,s=e.entryPrice===0?0:(t-e.entryPrice)/e.entryPrice*100*a;return{side:e.side,quantity:e.quantity,closedQuantity:r,openQuantity:i,entryPrice:e.entryPrice,currentPrice:t,pnl:o,pnlPct:s,precision:n}}var oa=/\{(side|qty|closedQty|openQty|entry|price|pnl|pnlPct|pnlSign)\}/g;function sa(e,t){return e.replace(oa,(e,n)=>{switch(n){case`side`:return t.side.toUpperCase();case`qty`:return String(t.quantity);case`closedQty`:return String(t.closedQuantity);case`openQty`:return String(t.openQuantity);case`entry`:return t.entryPrice.toFixed(t.precision);case`price`:return t.currentPrice.toFixed(t.precision);case`pnl`:return t.pnl.toFixed(t.precision);case`pnlPct`:return`${t.pnlPct.toFixed(2)}%`;case`pnlSign`:return t.pnl>=0?`+`:``;default:return``}})}function ca(e,t){return typeof e==`function`?e(t):sa(e??`{side} {qty} | P&L: {pnlSign}{pnl}`,t)}function la(e,t,n){if(!t||t.length===0)return n;let r=[...t].sort((e,t)=>e.pnl-t.pnl),i;for(let t of r)if(e>=t.pnl)i=t.color;else break;return i??n}var ua=class{render(e,t,n,r,i,a){let{chartRect:s}=r,c=a.positionColors?.profit??`#1fa874`,l=a.positionColors?.loss??`#e8505b`,u=a.positionColors?.entry??`#4c8dff`,d=a.pricePrecision??2;for(let f of t){let t=o(f.entryPrice,r);if(e.strokeStyle=u,e.lineWidth=1.5,e.setLineDash([]),e.beginPath(),e.moveTo(s.x,Math.round(t)+.5),e.lineTo(s.x+s.width,Math.round(t)+.5),e.stroke(),n!==null){let p=o(n,r),m=aa(f,n,d),h=m.pnl,g=h>=0?c:l,_=la(h,a.pnlThresholds,g);e.fillStyle=_,e.globalAlpha=.08;let v=Math.min(t,p),y=Math.abs(p-t);if(e.fillRect(s.x,v,s.width,y),e.globalAlpha=1,m.closedQuantity>0&&f.quantity>0){let t=m.closedQuantity/f.quantity;e.fillStyle=u,e.globalAlpha=.25,e.fillRect(s.x,v,Math.max(2,s.width*t*.04)+2,y),e.globalAlpha=1}let b=ca(a.positionLabel,m);e.font=`bold 11px ${i.font.family}`;let x=e.measureText(b).width+12,S=s.x+8;e.fillStyle=_,e.globalAlpha=.9,e.fillRect(S,t-10,x,20),e.globalAlpha=1,e.fillStyle=`#FFFFFF`,e.textBaseline=`middle`,e.textAlign=`left`,e.fillText(b,S+6,t)}if(f.stopLoss!==void 0){let t=o(f.stopLoss,r);e.setLineDash([4,4]),e.strokeStyle=l,e.lineWidth=1,e.beginPath(),e.moveTo(s.x,Math.round(t)+.5),e.lineTo(s.x+s.width,Math.round(t)+.5),e.stroke(),e.font=`bold 10px ${i.font.family}`,e.fillStyle=l,e.fillRect(s.x+4,t-8,24,16),e.fillStyle=`#FFFFFF`,e.textAlign=`left`,e.textBaseline=`middle`,e.fillText(`SL`,s.x+8,t)}if(f.takeProfit!==void 0){let t=o(f.takeProfit,r);e.setLineDash([4,4]),e.strokeStyle=c,e.lineWidth=1,e.beginPath(),e.moveTo(s.x,Math.round(t)+.5),e.lineTo(s.x+s.width,Math.round(t)+.5),e.stroke(),e.font=`bold 10px ${i.font.family}`,e.fillStyle=c,e.fillRect(s.x+4,t-8,24,16),e.fillStyle=`#FFFFFF`,e.textAlign=`left`,e.textBaseline=`middle`,e.fillText(`TP`,s.x+8,t)}e.setLineDash([])}}renderAxisBadges(t,n,r,i,a){let{chartRect:s}=r,c=a.positionColors?.entry??`#4c8dff`,l=a.pricePrecision??2,u=s.x+s.width+1;for(let a of n){let n=o(a.entryPrice,r);t.fillStyle=c,t.fillRect(u,n-9,(r.priceAxisWidth??e.PRICE_AXIS_WIDTH)-2,18),t.fillStyle=`#FFFFFF`,t.font=`11px ${i.font.family}`,t.textAlign=`left`,t.textBaseline=`middle`,t.fillText(a.entryPrice.toFixed(l),u+5,n)}}},da=class{render(e,t,n,r){if(!r.depthOverlay?.enabled)return;let{chartRect:i}=n,a=r.depthOverlay.bidColor??`rgba(31, 168, 116,0.15)`,s=r.depthOverlay.askColor??`rgba(232, 80, 91,0.15)`,c=r.depthOverlay.maxWidth??100,l=0,u=[],d=0;for(let e of t.bids)d+=e.volume,u.push({price:e.price,cumVol:d}),d>l&&(l=d);let f=[];d=0;for(let e of t.asks)d+=e.volume,f.push({price:e.price,cumVol:d}),d>l&&(l=d);if(l===0)return;let p=Math.max(1,t.bids.length>1?Math.abs(o(t.bids[0].price,n)-o(t.bids[1].price,n)):4),m=i.x+i.width;e.fillStyle=a;for(let{price:t,cumVol:r}of u){let a=o(t,n);if(a<i.y||a>i.y+i.height)continue;let s=r/l*c;e.fillRect(m-s,a-p/2,s,p)}e.fillStyle=s;for(let{price:t,cumVol:r}of f){let a=o(t,n);if(a<i.y||a>i.y+i.height)continue;let s=r/l*c;e.fillRect(m-s,a-p/2,s,p)}}},fa=class{dragState=null;startY=0;dragging=!1;constructor(e=3){this.dragThreshold=e}onPointerDown(e,t,n,r,i){for(let n of t){if(n.draggable===!1)continue;let t=o(n.price,r);if(Math.abs(e.y-t)<=i)return this.dragState={orderId:n.id,sourceType:`order`,startPrice:n.price,currentPrice:n.price},this.startY=e.y,this.dragging=!1,!0}for(let t of n){if(t.stopLoss!==void 0){let n=o(t.stopLoss,r);if(Math.abs(e.y-n)<=i)return this.dragState={orderId:t.id,sourceType:`stopLoss`,startPrice:t.stopLoss,currentPrice:t.stopLoss},this.startY=e.y,this.dragging=!1,!0}if(t.takeProfit!==void 0){let n=o(t.takeProfit,r);if(Math.abs(e.y-n)<=i)return this.dragState={orderId:t.id,sourceType:`takeProfit`,startPrice:t.takeProfit,currentPrice:t.takeProfit},this.startY=e.y,this.dragging=!1,!0}}return!1}onPointerMove(e,t){if(!this.dragState)return!1;if(!this.dragging){if(Math.abs(e.y-this.startY)<this.dragThreshold)return!0;this.dragging=!0}return this.dragState.currentPrice=u(e.y,t),!0}onPointerUp(){if(!this.dragState)return null;let e=this.dragState;return this.dragState=null,this.dragging?(this.dragging=!1,{sourceType:e.sourceType,id:e.orderId,newPrice:e.currentPrice,previousPrice:e.startPrice}):null}getDragState(){return this.dragState}isActive(){return this.dragState!==null}},pa=class{menuElement=null;removeHandler=null;onItemSelect=null;show(e,t,n,r){if(this.hide(),!r.contextMenu?.enabled)return;let i=r.pricePrecision??2,a=t.toFixed(i),o=document.createElement(`div`);o.style.cssText=`
7
7
  position: absolute;
8
8
  left: ${e.x}px;
9
9
  top: ${e.y}px;
10
- background: #1e222d;
11
- border: 1px solid #363a45;
10
+ background: #161b23;
11
+ border: 1px solid #2a323e;
12
12
  border-radius: 6px;
13
13
  padding: 4px 0;
14
14
  z-index: 1000;
@@ -19,8 +19,8 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require
19
19
  `;let s=[{label:`Buy Limit @ ${a}`,intent:{side:`buy`,type:`limit`,price:t}},{label:`Sell Limit @ ${a}`,intent:{side:`sell`,type:`limit`,price:t}},{label:`Buy Stop @ ${a}`,intent:{side:`buy`,type:`stop`,price:t}},{label:`Sell Stop @ ${a}`,intent:{side:`sell`,type:`stop`,price:t}}];for(let e of s){let t=document.createElement(`div`),n=e.intent.side===`buy`;t.textContent=e.label,t.style.cssText=`
20
20
  padding: 6px 12px;
21
21
  cursor: pointer;
22
- color: ${n?`#26A69A`:`#EF5350`};
22
+ color: ${n?`#1fa874`:`#e8505b`};
23
23
  transition: background 0.1s;
24
- `,t.addEventListener(`mouseenter`,()=>{t.style.background=`#2a2e39`}),t.addEventListener(`mouseleave`,()=>{t.style.background=`transparent`}),t.addEventListener(`click`,()=>{this.onItemSelect?.(e.intent),this.hide()}),o.appendChild(t)}n.appendChild(o),this.menuElement=o;let c=e=>{(e instanceof KeyboardEvent&&e.key===`Escape`||e instanceof MouseEvent&&!o.contains(e.target))&&this.hide()};document.addEventListener(`mousedown`,c),document.addEventListener(`keydown`,c),this.removeHandler=()=>{document.removeEventListener(`mousedown`,c),document.removeEventListener(`keydown`,c)}}hide(){this.menuElement?.remove(),this.menuElement=null,this.removeHandler?.(),this.removeHandler=null}destroy(){this.hide(),this.onItemSelect=null}};function ji(e,t,n={}){let r=Math.max(Math.abs(t)*(n.riskFraction??.01),1e-8),i=r*(n.riskReward??2);return e===`buy`?{side:e,entry:t,stopLoss:t-r,takeProfit:t+i}:{side:e,entry:t,stopLoss:t+r,takeProfit:t-i}}function Mi(e){let t=Math.abs(e.entry-e.stopLoss);return t===0?0:Math.abs(e.takeProfit-e.entry)/t}var Ni=6,Pi=class{draft=null;dragging=null;defaults;constructor(e={}){this.defaults=e}start(e,t){this.draft=ji(e,t,this.defaults),this.dragging=null}cancel(){this.draft=null,this.dragging=null}isActive(){return this.draft!==null}getDraft(){return this.draft?{...this.draft}:null}hitTest(e,t){if(!this.draft)return null;let n=[`entry`,`sl`,`tp`],r=null,i=Ni;for(let a of n){let n=o(this.priceOf(a),t),s=Math.abs(n-e.y);s<=i&&(i=s,r=a)}return r}beginDrag(e,t){let n=this.hitTest(e,t);return n?(this.dragging=n,!0):!1}drag(e,t){if(!this.draft||!this.dragging)return!1;let n=c(e.y,t);return this.draft=Fi(this.draft,this.dragging,n),!0}endDrag(){this.dragging=null}isDragging(){return this.dragging!==null}priceOf(e){let t=this.draft;return e===`entry`?t.entry:e===`sl`?t.stopLoss:t.takeProfit}render(e,t,n,r=2){let i=this.draft;if(!i)return;let{chartRect:a}=t,s=a.x,c=a.x+a.width,l=o(i.entry,t),u=o(i.stopLoss,t),d=o(i.takeProfit,t),f=n.candleUp,p=n.candleDown;e.save(),e.globalAlpha=.12,e.fillStyle=f,e.fillRect(s,Math.min(l,d),a.width,Math.abs(d-l)),e.fillStyle=p,e.fillRect(s,Math.min(l,u),a.width,Math.abs(u-l)),e.globalAlpha=1,Ii(e,s,c,l,n.text,[6,3]),Ii(e,s,c,d,f,[]),Ii(e,s,c,u,p,[]);let m=Mi(i),h=i.side===`buy`?`LONG`:`SHORT`;Li(e,s+6,l,`${h} entry ${i.entry.toFixed(r)}`,n.text,n.background),Li(e,s+6,d,`TP ${i.takeProfit.toFixed(r)} ยท ${m.toFixed(2)}R`,f,n.background),Li(e,s+6,u,`SL ${i.stopLoss.toFixed(r)}`,p,n.background);for(let[r,a]of[[i.entry,n.text],[i.takeProfit,f],[i.stopLoss,p]]){let n=o(r,t);e.fillStyle=a,e.beginPath(),e.arc(c-6,n,3.5,0,Math.PI*2),e.fill()}e.restore()}};function Fi(e,t,n){let r=e.side===`buy`;if(t===`entry`){let t=n-e.entry;return{side:e.side,entry:n,stopLoss:e.stopLoss+t,takeProfit:e.takeProfit+t}}if(t===`sl`){let t=r?Math.min(n,e.entry):Math.max(n,e.entry);return{...e,stopLoss:t}}let i=r?Math.max(n,e.entry):Math.min(n,e.entry);return{...e,takeProfit:i}}function Ii(e,t,n,r,i,a){e.strokeStyle=i,e.lineWidth=1,e.setLineDash(a),e.beginPath(),e.moveTo(t,Math.round(r)+.5),e.lineTo(n,Math.round(r)+.5),e.stroke(),e.setLineDash([])}function Li(e,t,n,r,i,a){e.font=`600 10px system-ui, sans-serif`,e.textBaseline=`middle`,e.textAlign=`left`;let o=e.measureText(r).width;e.globalAlpha=.85,e.fillStyle=a,e.fillRect(t-3,n-8,o+6,16),e.globalAlpha=1,e.fillStyle=i,e.fillText(r,t,n+.5)}function Ri(e,t,n){return n==null?`limit`:e===`buy`?t<=n?`limit`:`stop`:t>=n?`limit`:`stop`}var zi=6,Bi=class{draft=null;dragging=!1;start(e,t,n=1){this.draft={side:e,price:t,quantity:n},this.dragging=!1}cancel(){this.draft=null,this.dragging=!1}isActive(){return this.draft!==null}isDragging(){return this.dragging}getDraft(){return this.draft?{...this.draft}:null}setPrice(e){return this.draft?(this.draft={...this.draft,price:e},!0):!1}toIntent(e){return this.draft?{side:this.draft.side,type:Ri(this.draft.side,this.draft.price,e),price:this.draft.price,quantity:this.draft.quantity}:null}hitTest(e,t){return this.draft?Math.abs(o(this.draft.price,t)-e.y)<=zi:!1}beginDrag(e,t){return this.hitTest(e,t)?(this.dragging=!0,!0):!1}drag(e,t){return!this.draft||!this.dragging?!1:this.setPrice(c(e.y,t))}endDrag(){this.dragging=!1}render(e,t,n,r,i=2){let a=this.draft;if(!a)return;let{chartRect:s}=t,c=s.x,l=s.x+s.width,u=o(a.price,t),d=Ri(a.side,a.price,r),f=a.side===`buy`?n.candleUp:n.candleDown;e.save(),Vi(e,c,l,u,f,[6,3]);let p=a.side===`buy`?`BUY`:`SELL`;Hi(e,c+6,u,`${p} ${d.toUpperCase()} ${a.price.toFixed(i)}`,f,n.background),e.fillStyle=f,e.beginPath(),e.arc(l-6,u,3.5,0,Math.PI*2),e.fill(),e.restore()}};function Vi(e,t,n,r,i,a){e.strokeStyle=i,e.lineWidth=1,e.setLineDash(a),e.beginPath(),e.moveTo(t,Math.round(r)+.5),e.lineTo(n,Math.round(r)+.5),e.stroke(),e.setLineDash([])}function Hi(e,t,n,r,i,a){e.font=`600 10px system-ui, sans-serif`,e.textBaseline=`middle`,e.textAlign=`left`;let o=e.measureText(r).width;e.globalAlpha=.85,e.fillStyle=a,e.fillRect(t-3,n-8,o+6,16),e.globalAlpha=1,e.fillStyle=i,e.fillText(r,t,n+.5)}var Ui=class{orders=[];positions=[];depthData=null;currentPrice=null;config;orderRenderer=new xi;positionRenderer=new Di;depthOverlay=new Oi;dragHandler;contextMenu=new Ai;bracket=new Pi;orderDraft=new Bi;requestRender=null;eventCallback=null;container=null;constructor(t){this.config={...e.DEFAULT_TRADING_CONFIG,...t},this.dragHandler=new ki(this.config.dragThreshold),this.contextMenu.onItemSelect=e=>{this.eventCallback?.(`orderPlace`,e)}}setContainer(e){this.container=e}setRequestRender(e){this.requestRender=e}setEventCallback(e){this.eventCallback=e}setOrders(e){this.orders=e,this.requestRender?.()}setPositions(e){this.positions=e,this.requestRender?.()}setDepthData(e){this.depthData=e,this.requestRender?.()}setCurrentPrice(e){this.currentPrice=e,this.requestRender?.()}setConfig(e){Object.assign(this.config,e),this.requestRender?.()}startBracket(e,t){this.bracket.start(e,t),this.requestRender?.()}cancelBracket(){this.bracket.isActive()&&(this.bracket.cancel(),this.requestRender?.())}confirmBracket(){let e=this.bracket.getDraft();return e?(this.eventCallback?.(`bracketPlace`,{side:e.side,entry:e.entry,stopLoss:e.stopLoss,takeProfit:e.takeProfit,riskReward:Mi(e)}),this.bracket.cancel(),this.requestRender?.(),!0):!1}isBracketActive(){return this.bracket.isActive()}startOrderDraft(e,t){this.orderDraft.start(e,t),this.requestRender?.()}cancelOrderDraft(){this.orderDraft.isActive()&&(this.orderDraft.cancel(),this.requestRender?.())}confirmOrderDraft(){let e=this.orderDraft.toIntent(this.currentPrice);return e?(this.eventCallback?.(`orderPlace`,e),this.orderDraft.cancel(),this.requestRender?.(),!0):!1}isOrderDraftActive(){return this.orderDraft.isActive()}onPointerDown(e,t){return this.config.enabled?this.bracket.isActive()&&this.bracket.beginDrag(e,t)||this.orderDraft.isActive()&&this.orderDraft.beginDrag(e,t)?(this.requestRender?.(),!0):this.dragHandler.onPointerDown(e,this.orders,this.positions,t,8):!1}onPointerMove(e,t){if(this.bracket.isDragging()){let n=this.bracket.drag(e,t);return n&&this.requestRender?.(),n}if(this.orderDraft.isDragging()){let n=this.orderDraft.drag(e,t);return n&&this.requestRender?.(),n}if(!this.dragHandler.isActive())return!1;let n=this.dragHandler.onPointerMove(e,t);return n&&this.requestRender?.(),n}onPointerUp(){if(this.bracket.isDragging())return this.bracket.endDrag(),this.requestRender?.(),!0;if(this.orderDraft.isDragging())return this.orderDraft.endDrag(),this.requestRender?.(),!0;let e=this.dragHandler.onPointerUp();return e?(e.sourceType===`order`?this.eventCallback?.(`orderModify`,{orderId:e.id,newPrice:e.newPrice,previousPrice:e.previousPrice}):this.eventCallback?.(`positionModify`,{positionId:e.id,[e.sourceType]:e.newPrice}),this.requestRender?.(),!0):!1}onContextMenu(e,t){if(!this.config.enabled||!this.config.contextMenu?.enabled||!this.container)return!1;let n=c(e.y,t);return this.contextMenu.show(e,n,this.container,this.config),!0}render(e,t,n){this.config.enabled&&(this.depthData&&this.depthOverlay.render(e,this.depthData,t,this.config),this.positions.length>0&&this.positionRenderer.render(e,this.positions,this.currentPrice,t,n,this.config),this.orders.length>0&&this.orderRenderer.render(e,this.orders,t,n,this.config,this.dragHandler.getDragState()),this.bracket.isActive()&&this.bracket.render(e,t,n,this.config.pricePrecision??2),this.orderDraft.isActive()&&this.orderDraft.render(e,t,n,this.currentPrice,this.config.pricePrecision??2))}renderAxisBadges(e,t,n){this.config.enabled&&(this.positions.length>0&&this.positionRenderer.renderAxisBadges(e,this.positions,t,n,this.config),this.orders.length>0&&this.orderRenderer.renderAxisBadges(e,this.orders,t,n,this.config,this.dragHandler.getDragState()))}destroy(){this.contextMenu.destroy()}},Wi=class{constructor(e){this.manager=e}render(e,t,n){this.manager.render(e,t,n)}renderAxisBadges(e,t,n){this.manager.renderAxisBadges(e,t,n)}},Gi=class{name=`paper`;state=`disconnected`;listeners=new Map;orders=[];positions=[];markPrice;seq=0;constructor(e={}){this.markPrice=e.markPrice??0}connect(e){this.state=`connected`,this.emit(`connectionChange`,this.state),this.emit(`orders`,this.orders),this.emit(`positions`,this.positions)}disconnect(){this.state=`disconnected`,this.emit(`connectionChange`,this.state)}getConnectionState(){return this.state}setMarkPrice(e){this.markPrice=e,this.checkPendingOrders(),this.checkStops()}getOrders(){return[...this.orders]}getPositions(){return[...this.positions]}async placeOrder(e){let t={id:this.nextId(`ord`),side:e.side,type:e.type,price:e.price,stopPrice:e.stopPrice,quantity:e.quantity??1,label:e.type===`market`?void 0:Ki(e.type),draggable:!0};return e.type===`market`?this.fill(t,this.markPrice||e.price):(this.orders=[...this.orders,t],this.emit(`orders`,this.orders)),t}async modifyOrder(e){this.orders=this.orders.map(t=>t.id===e.orderId?{...t,price:e.newPrice}:t),this.emit(`orders`,this.orders)}async cancelOrder(e){this.orders=this.orders.filter(t=>t.id!==e.orderId),this.emit(`orders`,this.orders)}async modifyPosition(e){this.positions=this.positions.map(t=>t.id===e.positionId?{...t,stopLoss:e.stopLoss??t.stopLoss,takeProfit:e.takeProfit??t.takeProfit}:t),this.emit(`positions`,this.positions)}async closePosition(e){this.positions=this.positions.filter(t=>t.id!==e.positionId),this.emit(`positions`,this.positions)}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}dispose(){this.disconnect(),this.listeners.clear(),this.orders=[],this.positions=[]}fill(e,t){this.orders=this.orders.filter(t=>t.id!==e.id);let n={id:this.nextId(`pos`),side:e.side,entryPrice:t,quantity:e.quantity};this.positions=[...this.positions,n];let r={orderId:e.id,side:e.side,price:t,quantity:e.quantity,time:Date.now()};this.emit(`fill`,r),this.emit(`orders`,this.orders),this.emit(`positions`,this.positions)}checkPendingOrders(){let e=this.orders.filter(e=>this.isTriggered(e));for(let t of e)this.fill(t,t.type===`limit`?t.price:t.stopPrice??t.price)}isTriggered(e){if(e.type===`limit`)return e.side===`buy`?this.markPrice<=e.price:this.markPrice>=e.price;if(e.type===`stop`||e.type===`stopLimit`){let t=e.stopPrice??e.price;return e.side===`buy`?this.markPrice>=t:this.markPrice<=t}return!1}checkStops(){let e=[],t=!1;for(let n of this.positions){let r=n.stopLoss!==void 0&&(n.side===`buy`?this.markPrice<=n.stopLoss:this.markPrice>=n.stopLoss),i=n.takeProfit!==void 0&&(n.side===`buy`?this.markPrice>=n.takeProfit:this.markPrice<=n.takeProfit);if(r||i){t=!0;continue}e.push(n)}t&&(this.positions=e,this.emit(`positions`,this.positions))}nextId(e){return`${e}-${++this.seq}`}emit(e,t){let n=this.listeners.get(e);if(n){let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}}};function Ki(e){switch(e){case`stop`:return`STOP`;case`stopLimit`:return`STOP LIMIT`;default:return`LIMIT`}}var G=class{listeners=new Map;on(e,t){let n=this.listeners.get(e);return n||(n=new Set,this.listeners.set(e,n)),n.add(t),()=>n.delete(t)}once(e,t){let n=this.on(e,e=>{n(),t(e)});return n}off(e,t){this.listeners.get(e)?.delete(t)}emit(e,t){let n=this.listeners.get(e);if(n)for(let e of n)e(t)}removeAllListeners(){this.listeners.clear()}},qi=class extends G{currentBar=null;timeframeMs;tickRing;ringHead=0;ringCount=0;ringCapacity;constructor(t,n=1e3){super(),this.timeframeMs=(0,e.timeframeToMs)(t),this.ringCapacity=n,this.tickRing=Array(n)}setTimeframe(t){this.timeframeMs=(0,e.timeframeToMs)(t),this.currentBar=null,this.ringHead=0,this.ringCount=0}processTick(e){let t=(this.ringHead+this.ringCount)%this.ringCapacity;this.tickRing[t]=e,this.ringCount<this.ringCapacity?this.ringCount++:this.ringHead=(this.ringHead+1)%this.ringCapacity;let n=this.alignToTimeframe(e.time);!this.currentBar||this.currentBar.time!==n?(this.currentBar&&(this.currentBar.closed=!0,this.emit(`barClose`,this.currentBar)),this.currentBar={time:n,open:e.price,high:e.price,low:e.price,close:e.price,volume:e.volume,closed:!1,tickCount:1}):(this.currentBar.high=Math.max(this.currentBar.high,e.price),this.currentBar.low=Math.min(this.currentBar.low,e.price),this.currentBar.close=e.price,this.currentBar.volume+=e.volume,this.currentBar.tickCount++),this.emit(`bar`,this.currentBar)}processBar(e,t){if(t&&this.currentBar&&this.currentBar.time===e.time)this.currentBar={...e,closed:!0,tickCount:this.currentBar.tickCount+1},this.emit(`barClose`,this.currentBar),this.currentBar=null;else if(!t)this.currentBar={...e,closed:!1,tickCount:(this.currentBar?.tickCount??0)+1},this.emit(`bar`,this.currentBar);else{let t={...e,closed:!0,tickCount:1};this.emit(`barClose`,t),this.currentBar=null}}getCurrentBar(){return this.currentBar?{...this.currentBar}:null}getTickBuffer(){let e=Array(this.ringCount);for(let t=0;t<this.ringCount;t++)e[t]=this.tickRing[(this.ringHead+t)%this.ringCapacity];return e}reset(){this.currentBar=null,this.ringHead=0,this.ringCount=0}alignToTimeframe(e){return Math.floor(e/this.timeframeMs)*this.timeframeMs}},Ji=class extends G{config;attempt=0;timer=null;active=!1;constructor(t){super(),this.config={...e.DEFAULT_RECONNECT,...t}}schedule(e){if(!this.config.enabled||!this.active)return;if(this.attempt++,this.attempt>this.config.maxRetries){this.emit(`giveUp`,{attempts:this.attempt-1}),this.active=!1;return}let t=this.computeDelay();this.emit(`attempt`,{attempt:this.attempt,delay:t}),this.timer=setTimeout(()=>{this.timer=null,this.active&&e()},t)}onConnected(){this.attempt=0,this.cancel(),this.emit(`success`,void 0)}start(){this.active=!0}stop(){this.active=!1,this.cancel(),this.attempt=0}cancel(){this.timer&&=(clearTimeout(this.timer),null)}getAttempt(){return this.attempt}isActive(){return this.active}computeDelay(){let e=this.config.baseDelay,t=this.config.backoffMultiplier**(this.attempt-1),n=Math.min(e*t,this.config.maxDelay),r=n*.25*(Math.random()*2-1);return Math.max(0,Math.round(n+r))}},Yi=class{price=null;previousClose=null;visible=!0;flashUntil=0;pricePrecision=null;locale=`en-US`;setLocale(e){this.locale=e}setPrice(e,t){this.price!==null&&e!==this.price&&(this.flashUntil=Date.now()+300),this.previousClose=t??this.price??e,this.price=e}setVisible(e){this.visible=e}setPricePrecision(e){this.pricePrecision=e}getPrice(){return this.price}render(t,n,r){if(!this.visible||this.price===null)return;let i=o(this.price,n),{chartRect:a}=n;if(i<a.y||i>a.y+a.height)return;let s=this.previousClose===null||this.price>=this.previousClose?r.candleUp??`#26A69A`:r.candleDown??`#EF5350`,c=Date.now()<this.flashUntil;t.setLineDash([4,3]),t.strokeStyle=s,t.lineWidth=1,t.globalAlpha=c?1:.7,t.beginPath(),t.moveTo(a.x,Math.round(i)+.5),t.lineTo(a.x+a.width,Math.round(i)+.5),t.stroke(),t.setLineDash([]),t.globalAlpha=1;let l=a.x+a.width+1,u=this.pricePrecision??(0,e.autoPricePrecision)(n.priceRange.min,n.priceRange.max),d=(0,e.formatPrice)(this.price,u,this.locale);t.font=`bold 11px ${r.font.family}`;let f=t.measureText(d).width,p=n.priceAxisWidth??e.PRICE_AXIS_WIDTH,m=Math.min(f+12,p-2);t.fillStyle=s,t.fillRect(l,i-10,m,20);let h=l-5;t.beginPath(),t.moveTo(h,i),t.lineTo(h+5,i-5),t.lineTo(h+5,i+5),t.closePath(),t.fill(),t.fillStyle=`#FFFFFF`,t.textBaseline=`middle`,t.textAlign=`left`,t.fillText(d,l+5,i)}},Xi=class extends G{config=null;adapter=null;aggregator=null;reconnector;priceLine=new Yi;state=`disconnected`;lastPrice=null;previousClose=null;unsubscribers=[];heartbeatTimer=null;lastMessageTime=0;connectSeq=0;constructor(){super(),this.reconnector=new Ji,this.wireReconnector()}async connect(t){this.disconnect(),this.config={...e.DEFAULT_STREAM_CONFIG,...t},this.adapter=t.adapter,this.aggregator=new qi(t.timeframe),this.reconnector.removeAllListeners(),this.reconnector.stop(),this.reconnector=new Ji(t.reconnect??e.DEFAULT_RECONNECT),this.wireReconnector(),this.aggregator.on(`bar`,e=>{this.emit(`barUpdate`,e),this.updatePrice(e.close)}),this.aggregator.on(`barClose`,e=>{this.previousClose=e.close,this.emit(`barClose`,e)}),this.wireAdapter(),this.reconnector.start(),await this.doConnect()}disconnect(){this.connectSeq++,this.reconnector.stop(),this.stopHeartbeat();for(let e of this.unsubscribers)e();this.unsubscribers=[],this.adapter&&=(this.adapter.disconnect(),null),this.aggregator?.reset(),this.aggregator?.removeAllListeners(),this.aggregator=null,this.config=null,this.lastPrice=null,this.previousClose=null,this.setState(`disconnected`)}async switchTo(e,t){!this.config||!this.adapter||(this.reconnector.stop(),this.adapter.disconnect(),this.reconnector.start(),this.aggregator?.reset(),this.aggregator?.setTimeframe(t),this.lastPrice=null,this.previousClose=null,this.config.symbol=e,this.config.timeframe=t,await this.doConnect())}getConnectionState(){return this.state}getConnectionInfo(){return{state:this.state,reconnectAttempt:this.reconnector.getAttempt(),lastMessageTime:this.lastMessageTime}}getLastPrice(){return this.lastPrice}async doConnect(){if(!this.config||!this.adapter)return;let e=++this.connectSeq,{symbol:t,timeframe:n}=this.config;this.setState(`connecting`);try{let r=await this.adapter.fetchHistory(t,n,this.config.historyLimit??500);if(e!==this.connectSeq||!this.adapter)return;r.length>0&&(this.previousClose=r[r.length-1].close,this.updatePrice(r[r.length-1].close)),this.emit(`snapshot`,r),this.adapter.connect({symbol:t,timeframe:n}),this.startHeartbeat()}catch(t){if(e!==this.connectSeq)return;let n=t instanceof Error?t.message:String(t);this.emit(`error`,{message:n,code:`CONNECT_FAILED`}),this.setState(`error`),this.reconnector.schedule(()=>this.doConnect())}}wireReconnector(){this.reconnector.on(`attempt`,({attempt:e,delay:t})=>{this.setState(`reconnecting`),this.emit(`connectionChange`,{state:`reconnecting`,reconnectAttempt:e,lastMessageTime:this.lastMessageTime})}),this.reconnector.on(`giveUp`,({attempts:e})=>{this.setState(`error`),this.emit(`error`,{message:`Reconnection failed after ${e} attempts`,code:`RECONNECT_EXHAUSTED`})})}wireAdapter(){if(!this.adapter)return;let e=this.adapter,t=e=>{let t=e.data;this.lastMessageTime=Date.now(),t===`connected`?(this.reconnector.onConnected(),this.setState(`connected`)):(t===`disconnected`||t===`error`)&&this.reconnector.schedule(()=>this.doConnect())};e.on(`connectionChange`,t),this.unsubscribers.push(()=>e.off(`connectionChange`,t));let n=e=>{this.lastMessageTime=Date.now();let t=e.data;this.emit(`tick`,t),this.config?.aggregateTicks&&this.aggregator?this.aggregator.processTick(t):this.updatePrice(t.price)};e.on(`tick`,n),this.unsubscribers.push(()=>e.off(`tick`,n));let r=e=>{this.lastMessageTime=Date.now();let{bar:t,closed:n}=e.data;this.aggregator&&this.aggregator.processBar(t,n)};e.on(`bar`,r),this.unsubscribers.push(()=>e.off(`bar`,r));let i=e=>{this.emit(`error`,{message:e.data?.message??`Adapter error`})};e.on(`error`,i),this.unsubscribers.push(()=>e.off(`error`,i))}updatePrice(e){e!==this.lastPrice&&(this.lastPrice=e,this.priceLine.setPrice(e,this.previousClose??void 0),this.emit(`priceChange`,{price:e,previousClose:this.previousClose}))}setState(e){this.state!==e&&(this.state=e,this.emit(`connectionChange`,{state:e,reconnectAttempt:this.reconnector.getAttempt(),lastMessageTime:this.lastMessageTime}))}startHeartbeat(){this.stopHeartbeat(),this.heartbeatTimer=setInterval(()=>{Date.now()-this.lastMessageTime>6e4&&this.state===`connected`&&(this.emit(`error`,{message:`Heartbeat timeout`,code:`HEARTBEAT_TIMEOUT`}),this.adapter?.disconnect(),this.reconnector.schedule(()=>this.doConnect()))},3e4)}stopHeartbeat(){this.heartbeatTimer&&=(clearInterval(this.heartbeatTimer),null)}dispose(){this.disconnect(),this.removeAllListeners()}},Zi=class extends G{data;speed;index;status=`idle`;timer=null;constructor(e){if(super(),e.data.length===0)throw Error(`ReplayController requires non-empty data`);this.data=e.data,this.speed=Math.max(.01,e.speed??1),this.index=Math.max(0,Math.min(e.startIndex??0,e.data.length)),e.autoStart&&this.start()}getStatus(){return this.status}getIndex(){return this.index}getTotal(){return this.data.length}getPrefix(){return this.data.slice(0,this.index)}start(){if(this.status!==`playing`){if(this.index>=this.data.length){this.transition(`finished`);return}this.transition(`playing`),this.scheduleNext()}}pause(){this.status===`playing`&&(this.clearTimer(),this.transition(`paused`))}resume(){this.status===`paused`&&this.start()}stop(){this.clearTimer(),this.index=0,this.transition(`idle`)}step(e=1){if(!(e<=0)){this.clearTimer();for(let t=0;t<e;t++)if(!this.emitNext())return;this.status!==`finished`&&this.transition(`paused`)}}seek(e){let t=Math.max(0,Math.min(e,this.data.length));this.clearTimer(),this.index=t;let n=t>=this.data.length?`finished`:`paused`;this.transition(n)}setSpeed(e){this.speed=Math.max(.01,e),this.status===`playing`&&(this.clearTimer(),this.scheduleNext())}destroy(){this.clearTimer(),this.removeAllListeners()}scheduleNext(){let e=1e3/this.speed;this.timer=setTimeout(()=>{this.timer=null,this.status===`playing`&&this.emitNext()&&this.scheduleNext()},e)}emitNext(){if(this.index>=this.data.length)return this.transition(`finished`),this.emit(`finished`,{total:this.data.length}),!1;let e=this.data[this.index],t=this.index;return this.index++,this.emit(`bar`,{bar:e,index:t,total:this.data.length}),this.index>=this.data.length?(this.transition(`finished`),this.emit(`finished`,{total:this.data.length}),!1):!0}clearTimer(){this.timer!==null&&(clearTimeout(this.timer),this.timer=null)}transition(e){this.status!==e&&(this.status=e,this.emit(`stateChange`,{status:e,index:this.index,total:this.data.length}))}};function Qi(e){if(!Array.isArray(e)||e.length<6)return null;let t=e[0];if(typeof t!=`number`||!Number.isFinite(t))return null;let n=K(e[1]),r=K(e[2]),i=K(e[3]),a=K(e[4]),o=K(e[5]);return n===null||r===null||i===null||a===null||o===null?null:{time:t,open:n,high:r,low:i,close:a,volume:o}}function $i(e){if(!ea(e))return null;let t=e.t;if(typeof t!=`number`||!Number.isFinite(t))return null;let n=K(e.o),r=K(e.h),i=K(e.l),a=K(e.c),o=K(e.v);if(n===null||r===null||i===null||a===null||o===null)return null;let s=typeof e.x==`boolean`?e.x:!1;return{bar:{time:t,open:n,high:r,low:i,close:a,volume:o},closed:s}}function K(e){if(typeof e==`number`)return Number.isFinite(e)?e:null;if(typeof e==`string`){let t=parseFloat(e);return Number.isFinite(t)?t:null}return null}function ea(e){return typeof e==`object`&&!!e}var ta={"1s":`1s`,"1m":`1m`,"3m":`3m`,"5m":`5m`,"15m":`15m`,"30m":`30m`,"1h":`1h`,"2h":`2h`,"4h":`4h`,"6h":`6h`,"8h":`8h`,"12h":`12h`,"1d":`1d`,"3d":`3d`,"1w":`1w`,"1M":`1M`},na=class{name=`binance`;ws=null;state=`disconnected`;listeners=new Map;config=null;restBase;wsBase;constructor(e){this.restBase=e?.restBase??`https://api.binance.com/api/v3`,this.wsBase=e?.wsBase??`wss://stream.binance.com:9443/ws`}connect(e){this.config=e,this.connectWs()}disconnect(){if(this.ws){let e=this.ws;e.onopen=null,e.onmessage=null,e.onerror=null,e.onclose=null,e.close(),this.ws=null}this.setState(`disconnected`)}getConnectionState(){return this.state}async fetchHistory(e,t,n=500){let r=ta[t]??`15m`,i=`${this.restBase}/klines?symbol=${e}&interval=${r}&limit=${n}`,a=await fetch(i);if(!a.ok)throw Error(`Binance REST error: ${a.status}`);let o=await a.json();if(!Array.isArray(o))return[];let s=[];for(let e of o){let t=Qi(e);t&&s.push(t)}return s}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}dispose(){this.disconnect(),this.listeners.clear()}connectWs(){if(!this.config)return;let e=`${this.config.symbol.toLowerCase()}@kline_${ta[this.config.timeframe]??`15m`}`,t=`${this.wsBase}/${e}`;this.setState(`connecting`);try{this.ws=new WebSocket(t)}catch{this.setState(`error`),this.emitEvent(`error`,{message:`WebSocket creation failed`}),this.emitEvent(`connectionChange`,`error`);return}this.ws.onopen=()=>{this.setState(`connected`),this.emitEvent(`connectionChange`,`connected`)},this.ws.onmessage=e=>{let t;try{t=JSON.parse(typeof e.data==`string`?e.data:``)}catch{return}typeof t==`object`&&t&&t.e===`kline`&&this.handleKline(t.k)},this.ws.onerror=()=>{this.setState(`error`),this.emitEvent(`error`,{message:`WebSocket error`})},this.ws.onclose=()=>{this.setState(`disconnected`),this.emitEvent(`connectionChange`,`disconnected`)}}handleKline(e){let t=$i(e);if(!t)return;let{bar:n,closed:r}=t;this.emitEvent(`bar`,{bar:n,closed:r}),this.emitEvent(`tick`,{time:Date.now(),price:n.close,volume:n.volume})}setState(e){this.state=e}emitEvent(e,t){let n=this.listeners.get(e);if(n){let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}}},ra=class{name=`mock`;state=`disconnected`;listeners=new Map;config=null;options;tickTimer=null;currentPrice;constructor(e){this.options={basePrice:100,volatility:1.5,tickInterval:2e3,historySize:500,...e},this.currentPrice=this.options.basePrice}connect(e){this.config=e,this.state=`connected`,this.emitEvent(`connectionChange`,`connected`),this.startTicking()}disconnect(){this.stopTicking(),this.state=`disconnected`,this.emitEvent(`connectionChange`,`disconnected`)}getConnectionState(){return this.state}async fetchHistory(e,t,n){return this.options.historyGenerator?this.options.historyGenerator(e,t,n??this.options.historySize):this.generateHistory(t,n??this.options.historySize)}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}dispose(){this.disconnect(),this.listeners.clear()}generateHistory(t,n){let r=[],i=Date.now(),a=(0,e.timeframeToMs)(t),o=this.options.basePrice,s=this.options.volatility/100;for(let e=n-1;e>=0;e--){let t=i-e*a,n=(Math.random()-.48)*o*s,c=o;o+=n;let l=Math.max(c,o)+Math.random()*o*s*.3,u=Math.min(c,o)-Math.random()*o*s*.3,d=Math.floor(1e4+Math.random()*1e5);r.push({time:t,open:c,high:l,low:u,close:o,volume:d})}return this.currentPrice=o,r}startTicking(){this.stopTicking();let t=this.options.tickInterval??2e3;this.tickTimer=setInterval(()=>{if(this.state!==`connected`||!this.config)return;let t=this.options.volatility/100,n=(Math.random()-.48)*this.currentPrice*t*.3;this.currentPrice+=n;let r=Date.now(),i=(0,e.timeframeToMs)(this.config.timeframe),a={time:Math.floor(r/i)*i,open:this.currentPrice-n,high:Math.max(this.currentPrice,this.currentPrice-n)+Math.abs(n)*.2,low:Math.min(this.currentPrice,this.currentPrice-n)-Math.abs(n)*.2,close:this.currentPrice,volume:Math.floor(100+Math.random()*5e3)};this.emitEvent(`bar`,{bar:a,closed:!1}),this.emitEvent(`tick`,{time:r,price:this.currentPrice,volume:a.volume})},t)}stopTicking(){this.tickTimer&&=(clearInterval(this.tickTimer),null)}emitEvent(e,t){let n=this.listeners.get(e);if(n){let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}}},ia=class{name;ws=null;state=`disconnected`;config=null;listeners=new Map;opts;constructor(e){this.opts=e,this.name=e.name}connect(e){this.config=e,this.openSocket()}disconnect(){let e=this.config;if(this.ws){if(this.opts.unsubscribeMessage&&e)try{this.sendMessage(this.opts.unsubscribeMessage(e))}catch{}let t=this.ws;t.onopen=null,t.onmessage=null,t.onerror=null,t.onclose=null,t.close(),this.ws=null}this.setState(`disconnected`)}getConnectionState(){return this.state}fetchHistory(e,t,n){return this.opts.fetchHistory(e,t,n??this.opts.defaultHistoryLimit??500)}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}dispose(){this.disconnect(),this.listeners.clear()}openSocket(){let e=this.config;if(!e)return;let t=this.opts.wsUrl(e);this.setState(`connecting`);let n;try{n=this.createSocket(t)}catch{this.setState(`error`),this.emitEvent(`error`,{message:`WebSocket creation failed`}),this.emitEvent(`connectionChange`,`error`);return}this.ws=n,n.onopen=()=>{if(this.setState(`connected`),this.emitEvent(`connectionChange`,`connected`),this.opts.subscribeMessage)try{this.sendMessage(this.opts.subscribeMessage(e))}catch{}},n.onmessage=t=>{let n=this.decode(t.data);if(n===void 0)return;let r;try{r=this.opts.parseMessage(n,e)}catch{return}r&&(r.bar&&this.emitEvent(`bar`,{bar:r.bar,closed:r.closed??!1}),r.tick?this.emitEvent(`tick`,r.tick):r.bar&&this.emitEvent(`tick`,{time:Date.now(),price:r.bar.close,volume:r.bar.volume}))},n.onerror=()=>{this.setState(`error`),this.emitEvent(`error`,{message:`WebSocket error`})},n.onclose=()=>{this.setState(`disconnected`),this.emitEvent(`connectionChange`,`disconnected`)}}sendMessage(e){e===void 0||!this.ws||this.ws.send(typeof e==`string`?e:JSON.stringify(e))}decode(e){if(this.opts.decode)try{return this.opts.decode(e)}catch{return}if(typeof e==`string`)try{return JSON.parse(e)}catch{return}return e}createSocket(e){if(this.opts.socketFactory)return this.opts.socketFactory(e);let t=globalThis.WebSocket;if(!t)throw Error(`No WebSocket implementation available`);return new t(e)}setState(e){this.state=e}emitEvent(e,t){let n=this.listeners.get(e);if(n){let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}}},aa=class{name;state=`disconnected`;listeners=new Map;config=null;timer=null;lastBarTime=0;opts;constructor(e){this.opts=e,this.name=e.name}connect(e){this.config=e,this.lastBarTime=0,this.state=`connected`,this.emitEvent(`connectionChange`,`connected`),this.startPolling()}disconnect(){this.stopPolling(),this.state=`disconnected`,this.emitEvent(`connectionChange`,`disconnected`)}getConnectionState(){return this.state}fetchHistory(e,t,n){return this.opts.fetchBars(e,t,n??this.opts.defaultHistoryLimit??500)}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}dispose(){this.disconnect(),this.listeners.clear()}async poll(){let e=this.config;if(!e||this.state!==`connected`)return;let t;try{t=await this.opts.fetchBars(e.symbol,e.timeframe,this.opts.pollLimit??2)}catch(e){this.emitEvent(`error`,{message:`Poll failed`,cause:e});return}if(t.length===0)return;let n=t[t.length-1];if(this.lastBarTime>0&&n.time>this.lastBarTime){let e=t.find(e=>e.time===this.lastBarTime);e&&this.emitEvent(`bar`,{bar:e,closed:!0})}this.emitEvent(`bar`,{bar:n,closed:!1}),this.emitEvent(`tick`,{time:Date.now(),price:n.close,volume:n.volume}),this.lastBarTime=n.time}startPolling(){this.stopPolling(),this.poll();let e=this.opts.setInterval??((e,t)=>setInterval(e,t));this.timer=e(()=>{this.poll()},this.opts.intervalMs??5e3)}stopPolling(){this.timer!==null&&((this.opts.clearInterval??(e=>clearInterval(e)))(this.timer),this.timer=null)}emitEvent(e,t){let n=this.listeners.get(e);if(n){let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}}};function q(e){if(typeof e==`number`)return Number.isFinite(e)?e:null;if(typeof e==`string`){let t=parseFloat(e);return Number.isFinite(t)?t:null}return null}function J(e){return typeof e==`object`&&!!e}var oa={"1m":60,"5m":300,"15m":900,"1h":3600,"6h":21600,"1d":86400};function sa(e){return oa[e]??3600}var ca=class extends aa{constructor(e={}){let t=e.restBase??`https://api.exchange.coinbase.com`;super({name:`coinbase`,intervalMs:e.intervalMs??5e3,pollLimit:2,fetchBars:(e,n)=>la(t,e,n)})}};async function la(e,t,n){let r=`${e}/products/${t}/candles?granularity=${sa(n)}`,i=await fetch(r);if(!i.ok)throw Error(`Coinbase REST error: ${i.status}`);return ua(await i.json())}function ua(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=da(n);e&&t.push(e)}return t.sort((e,t)=>e.time-t.time),t}function da(e){if(!Array.isArray(e)||e.length<6)return null;let t=q(e[0]),n=q(e[1]),r=q(e[2]),i=q(e[3]),a=q(e[4]),o=q(e[5]);return t===null||n===null||r===null||i===null||a===null||o===null?null:{time:t*1e3,open:i,high:r,low:n,close:a,volume:o}}var fa={"1m":`1`,"3m":`3`,"5m":`5`,"15m":`15`,"30m":`30`,"1h":`60`,"2h":`120`,"4h":`240`,"6h":`360`,"12h":`720`,"1d":`D`,"1w":`W`,"1M":`M`};function pa(e){return fa[e]??`1`}var ma=class extends ia{constructor(e={}){let t=e.restBase??`https://api.bybit.com`,n=e.wsBase??`wss://stream.bybit.com/v5/public/spot`,r=e.category??`spot`;super({name:`bybit`,wsUrl:()=>n,subscribeMessage:e=>({op:`subscribe`,args:[`kline.${pa(e.timeframe)}.${e.symbol}`]}),unsubscribeMessage:e=>({op:`unsubscribe`,args:[`kline.${pa(e.timeframe)}.${e.symbol}`]}),parseMessage:ha,fetchHistory:(e,n,i)=>ga(t,r,e,n,i)})}};function ha(e){if(!J(e)||typeof e.topic!=`string`||!e.topic.startsWith(`kline.`))return null;let t=e.data;if(!Array.isArray(t)||t.length===0)return null;let n=t[t.length-1];if(!J(n))return null;let r=q(n.start),i=q(n.open),a=q(n.high),o=q(n.low),s=q(n.close),c=q(n.volume);if(r===null||i===null||a===null||o===null||s===null||c===null)return null;let l=typeof n.confirm==`boolean`?n.confirm:!1;return{bar:{time:r,open:i,high:a,low:o,close:s,volume:c},closed:l}}async function ga(e,t,n,r,i){let a=`${e}/v5/market/kline?category=${t}&symbol=${n}&interval=${pa(r)}&limit=${Math.min(Math.max(i,1),1e3)}`,o=await fetch(a);if(!o.ok)throw Error(`Bybit REST error: ${o.status}`);return _a(await o.json())}function _a(e){if(!J(e)||!J(e.result))return[];let t=e.result.list;if(!Array.isArray(t))return[];let n=[];for(let e of t){let t=va(e);t&&n.push(t)}return n.sort((e,t)=>e.time-t.time),n}function va(e){if(!Array.isArray(e)||e.length<6)return null;let t=q(e[0]),n=q(e[1]),r=q(e[2]),i=q(e[3]),a=q(e[4]),o=q(e[5]);return t===null||n===null||r===null||i===null||a===null||o===null?null:{time:t,open:n,high:r,low:i,close:a,volume:o}}var ya={"1m":1,"5m":5,"15m":15,"30m":30,"1h":60,"4h":240,"1d":1440,"1w":10080};function ba(e){return ya[e]??1}var xa=class extends ia{constructor(e={}){let t=e.restBase??`https://api.kraken.com`,n=e.wsBase??`wss://ws.kraken.com/v2`;super({name:`kraken`,wsUrl:()=>n,subscribeMessage:e=>({method:`subscribe`,params:{channel:`ohlc`,symbol:[e.symbol],interval:ba(e.timeframe)}}),unsubscribeMessage:e=>({method:`unsubscribe`,params:{channel:`ohlc`,symbol:[e.symbol],interval:ba(e.timeframe)}}),parseMessage:Sa,fetchHistory:(e,n)=>Ca(t,e,n)})}};function Sa(e){if(!J(e)||e.channel!==`ohlc`)return null;let t=e.data;if(!Array.isArray(t)||t.length===0)return null;let n=t[t.length-1];if(!J(n))return null;let r=q(n.open),i=q(n.high),a=q(n.low),o=q(n.close),s=q(n.volume),c=typeof n.interval_begin==`string`?Date.parse(n.interval_begin):NaN;return r===null||i===null||a===null||o===null||s===null||!Number.isFinite(c)?null:{bar:{time:c,open:r,high:i,low:a,close:o,volume:s},closed:!1}}async function Ca(e,t,n){let r=ba(n),i=t.replace(`/`,``),a=`${e}/0/public/OHLC?pair=${encodeURIComponent(i)}&interval=${r}`,o=await fetch(a);if(!o.ok)throw Error(`Kraken REST error: ${o.status}`);return wa(await o.json())}function wa(e){if(!J(e)||!J(e.result))return[];let t=null;for(let[n,r]of Object.entries(e.result))if(n!==`last`&&Array.isArray(r)){t=r;break}if(!Array.isArray(t))return[];let n=[];for(let e of t){let t=Ta(e);t&&n.push(t)}return n.sort((e,t)=>e.time-t.time),n}function Ta(e){if(!Array.isArray(e)||e.length<7)return null;let t=q(e[0]),n=q(e[1]),r=q(e[2]),i=q(e[3]),a=q(e[4]),o=q(e[6]);return t===null||n===null||r===null||i===null||a===null||o===null?null:{time:t*1e3,open:n,high:r,low:i,close:a,volume:o}}var Ea={visible:!0,showSymbol:!0,showOHLC:!0,showChange:!0,showVolume:!0,position:`top-left`,fontSize:12},Da=class{config={...Ea};symbol=``;timeframe=``;hoverBar=null;indicators=[];statusText=null;locale=`en-US`;pricePrecision=null;setConfig(e){Object.assign(this.config,e)}setPricePrecision(e){this.pricePrecision=e}setLocale(e){this.locale=e}setSymbol(e){this.symbol=e}setTimeframe(e){this.timeframe=e}setChartType(e){}setHoverBar(e){this.hoverBar=e}setIndicatorValues(e){this.indicators=e}setStatusText(e){this.statusText=e}render(t,n,r,i){if(!this.config.visible||i.length===0)return;let a=this.hoverBar??i[i.length-1],o=i.length>1?i[i.length-2]:a,{chartRect:s}=n,c=this.config.fontSize,l=this.config.position===`top-left`,u=l?s.x+8:s.x+s.width-8,d=s.y+6;if(t.textAlign=l?`left`:`right`,t.textBaseline=`top`,this.config.showSymbol){t.font=`bold ${c+2}px ${r.font.family}`,t.fillStyle=r.text;let e=[this.symbol,this.timeframe].filter(Boolean).join(` ยท `),n=this.statusText?`${e} ${this.statusText}`:e;t.fillText(n,u,d),d+=c+6}else this.statusText&&(t.font=`${c}px ${r.font.family}`,t.fillStyle=r.textSecondary,t.fillText(this.statusText,u,d),d+=c+4);if(this.config.showOHLC){t.font=`${c}px ${r.font.family}`;let i=a.close>=a.open,s=this.pricePrecision??(0,e.autoPricePrecision)(n.priceRange.min,n.priceRange.max),f=t=>(0,e.formatPrice)(t,s,this.locale),p=[{label:`O`,value:f(a.open),color:r.text},{label:`H`,value:f(a.high),color:r.text},{label:`L`,value:f(a.low),color:r.text},{label:`C`,value:f(a.close),color:i?r.candleUp:r.candleDown}];if(this.config.showChange){let t=a.close-o.close,n=o.close===0?0:t/o.close*100,i=t>=0?`+`:``,s=(0,e.formatPrice)(n,2,this.locale);p.push({label:``,value:`${i}${f(t)} (${i}${s}%)`,color:t>=0?r.candleUp:r.candleDown})}let m=u;if(l)for(let e of p)e.label&&(t.fillStyle=r.textSecondary,t.fillText(e.label,m,d),m+=t.measureText(e.label+` `).width),t.fillStyle=e.color,t.fillText(e.value,m,d),m+=t.measureText(e.value+` `).width;else{let e=p.map(e=>`${e.label} ${e.value}`).join(` `);t.fillStyle=r.text,t.fillText(e,u,d)}d+=c+3}if(this.config.showVolume){t.font=`${c-1}px ${r.font.family}`,t.fillStyle=r.textSecondary;let e=a.volume>=1e6?`${(a.volume/1e6).toFixed(2)}M`:a.volume>=1e3?`${(a.volume/1e3).toFixed(2)}K`:a.volume.toFixed(0);t.fillText(`Vol ${e}`,u,d),d+=c+2}if(this.indicators.length>0){t.font=`${c-1}px ${r.font.family}`;let e=u;for(let n of this.indicators){t.fillStyle=n.color;let r=`${n.name} ${n.value}`;t.fillText(r,e,d),e+=t.measureText(r+` `).width}}}},Oa=class{static toDataURL(e,t){let n=e.querySelectorAll(`canvas`);if(n.length===0)return``;let r=n[0],i=r.width,a=r.height,o=document.createElement(`canvas`);o.width=i,o.height=a;let s=o.getContext(`2d`);t&&(s.fillStyle=t,s.fillRect(0,0,i,a));let c=Array.from(n).sort((e,t)=>(parseInt(e.style.zIndex)||0)-(parseInt(t.style.zIndex)||0));for(let e of c)s.drawImage(e,0,0);return o.toDataURL(`image/png`)}static async toBlob(e,t){let n=this.toDataURL(e,t);return n?(await fetch(n)).blob():null}static download(e,t=`chart.png`,n){let r=this.toDataURL(e,n);if(!r)return;let i=document.createElement(`a`);i.href=r,i.download=t,document.body.appendChild(i),i.click(),document.body.removeChild(i)}},ka=class{config=null;setConfig(e){this.config=e}render(e,t,n){if(!this.config?.text)return;let{chartRect:r}=t,i=this.config.fontSize??48,a=this.config.color??n.textSecondary;e.save(),e.globalAlpha=.07,e.font=`bold ${i}px ${n.font.family}`,e.fillStyle=a,e.textAlign=`center`,e.textBaseline=`middle`,e.fillText(this.config.text,r.x+r.width/2,r.y+r.height/2),e.restore()}},Aa=class{visible=!0;timeframeMs=0;setVisible(e){this.visible=e}isVisible(){return this.visible}setTimeframeMs(e){this.timeframeMs=e}render(e,t,n,r){if(!this.visible||this.timeframeMs<=0||r.length===0)return;let i=r[r.length-1],o=(i.time>0xe8d4a51000?i.time:i.time*1e3)+this.timeframeMs-Date.now();if(o<=0)return;let s=this.formatRemaining(o),c=a(r.length-1,t),l=t.chartRect.y+t.chartRect.height-4;c<t.chartRect.x||c>t.chartRect.x+t.chartRect.width||(e.font=`${n.font.sizeSmall}px ${n.font.family}`,e.textBaseline=`bottom`,e.textAlign=`center`,e.fillStyle=n.textSecondary,e.fillText(s,c,l))}formatRemaining(e){let t=Math.ceil(e/1e3),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60;return n>0?`${n}:${String(r).padStart(2,`0`)}:${String(i).padStart(2,`0`)}`:`${r}:${String(i).padStart(2,`0`)}`}},ja=class{config={visible:!1};cachedBreaksTyped=[];cachedMedianStep=0;cacheValid=!1;lastDataLength=0;locale=`en-US`;setConfig(e){Object.assign(this.config,e)}setLocale(e){this.locale=e}isVisible(){return this.config.visible}setVisible(e){this.config.visible=e}computeBreaksTyped(e){if(e.length<2)return[];if(this.cacheValid&&e.length===this.lastDataLength)return this.cachedBreaksTyped;let t=[],n=new Date(this.toMs(e[0].time));for(let r=1;r<e.length;r++){let i=new Date(this.toMs(e[r].time));if(i.getFullYear()!==n.getFullYear())t.push({idx:r,kind:`year`,date:i});else if(i.getMonth()!==n.getMonth())t.push({idx:r,kind:`month`,date:i});else if(i.getDate()!==n.getDate()){let e=i.getDay()===1;t.push({idx:r,kind:e?`week`:`day`,date:i})}n=i}return this.lastDataLength=e.length,this.cachedBreaksTyped=t,this.cachedMedianStep=La(e),this.cacheValid=!0,t}toMs(e){return e>0xe8d4a51000?e:e*1e3}render(e,t,n,r){if(!this.config.visible||r.length<2)return;let i=this.computeBreaksTyped(r);if(i.length===0||this.cachedMedianStep>=1380*60*1e3)return;let{chartRect:o}=t,s=this.config.color??n.axisLine,c=this.config.lineWidth??1,l=this.config.lineStyle??`dashed`;e.save(),l===`dashed`?e.setLineDash([6,4]):l===`dotted`&&e.setLineDash([2,3]),e.font=`600 11px ${n.font.family}`,e.textBaseline=`top`,e.textAlign=`left`;for(let r of i){let i=a(r.idx,t)-(t.barWidth+t.barSpacing)/2;if(i<o.x-1||i>o.x+o.width+1)continue;let l=Math.round(i)+.5,u=.25,d=c,f=null;r.kind===`day`?u=.22:r.kind===`week`?(u=.34,f=Fa(r.date,this.locale)):r.kind===`month`?(u=.5,d=c+.5,f=Ia(r.date,this.locale)):(u=.7,d=c+1,f=String(r.date.getFullYear())),e.globalAlpha=u,e.strokeStyle=s,e.lineWidth=d,e.beginPath(),e.moveTo(l,o.y),e.lineTo(l,o.y+o.height),e.stroke(),f&&(e.globalAlpha=Math.min(1,u+.35),e.fillStyle=n.textSecondary,e.fillText(f,l+4,o.y+4))}e.restore()}invalidateCache(){this.lastDataLength=0,this.cachedBreaksTyped=[],this.cachedMedianStep=0,this.cacheValid=!1}},Ma=new Map,Na=new Map;function Pa(e,t,n){let r=e.get(t);return r||(r=new Intl.DateTimeFormat(t,n),e.set(t,r)),r}function Fa(e,t){return Pa(Ma,t,{month:`short`,day:`numeric`}).format(e)}function Ia(e,t){return Pa(Na,t,{month:`short`,year:`numeric`}).format(e)}function La(e){if(e.length<2)return 0;let t=Math.min(50,e.length-1),n=[];for(let r=1;r<=t;r++){let t=e[r-1].time,i=e[r].time,a=t>0xe8d4a51000?t:t*1e3,o=i>0xe8d4a51000?i:i*1e3;n.push(o-a)}return n.sort((e,t)=>e-t),n[Math.floor(n.length/2)]}var Ra=864e5;function za(e,t){let n=((e+t*6e4)%Ra+Ra)%Ra;return Math.floor(n/6e4)}function Ba(e,t,n){return t===n?!0:t<n?e>=t&&e<n:e>=t||e<n}function Va(e,t){let n=za(e,t.tzOffsetMinutes);return t.windows&&t.windows.length>0?t.windows.some(e=>Ba(n,e.startMinute,e.endMinute)):Ba(n,t.startMinute,t.endMinute)}var Ha={startMinute:570,endMinute:960,tzOffsetMinutes:-300},Ua=class{visible=!1;config={...Ha};setVisible(e){this.visible=e}isVisible(){return this.visible}setConfig(e){let t={...this.config,...e};t.windows=t.windows?t.windows.map(e=>({...e})):void 0,this.config=t}getConfig(){return{...this.config,windows:this.config.windows?.map(e=>({...e}))}}render(e,t,n,r){if(!this.visible||t.length===0)return;let{chartRect:i}=n,{from:o,to:s}=n.visibleRange,c=Math.max(0,o),l=Math.min(s,t.length-1);if(l<c)return;let u=n.barWidth+n.barSpacing,d=r.name===`light`;e.save(),e.fillStyle=d?`rgba(0,0,0,0.045)`:`rgba(0,0,0,0.28)`;let f=-1,p=(t,r)=>{let o=a(t,n)-u/2,s=a(r,n)+u/2;e.fillRect(o,i.y,s-o,i.height)};for(let e=c;e<=l;e++){let n=!Va(t[e].time,this.config);n&&f===-1?f=e:!n&&f!==-1&&(p(f,e-1),f=-1)}f!==-1&&p(f,l),e.restore()}},Wa=1,Ga=class extends G{alerts=[];lastValues=new Map;requestRender=null;pricePrecision=2;setRequestRender(e){this.requestRender=e}setPricePrecision(e){this.pricePrecision=e}addAlert(e,t=`crossing`,n,r=!1,i=`price`,a){let o=`tc_alert_${Wa++}`,s={id:o,price:e,condition:t,message:n,triggered:!1,repeating:r,channel:i,label:a};return this.alerts.push(s),this.emit(`added`,s),this.requestRender?.(),o}removeAlert(e){this.alerts=this.alerts.filter(t=>t.id!==e),this.emit(`removed`,e),this.requestRender?.()}getAlerts(){return[...this.alerts]}getAlertAtPoint(e,t,n=6){let{chartRect:r}=t;if(e.y<r.y||e.y>r.y+r.height)return null;let i=null,a=n;for(let n of this.alerts){if(n.channel!==`price`)continue;let r=Math.abs(o(n.price,t)-e.y);r<=a&&(a=r,i=n)}return i}updateAlertPrice(e,t){let n=this.alerts.find(t=>t.id===e);!n||!Number.isFinite(t)||(n.price=t,n.triggered=!1,this.emit(`updated`,{...n}),this.requestRender?.())}clearAlerts(){this.alerts=[],this.requestRender?.()}checkPrice(e){this.checkChannel(`price`,e)}checkChannel(e,t){if(!Number.isFinite(t))return;let n=this.lastValues.get(e);if(n===void 0){this.lastValues.set(e,t);return}for(let r of this.alerts){if(r.channel!==e)continue;let i=!1;switch(r.condition){case`crossingUp`:i=n<r.price&&t>=r.price;break;case`crossingDown`:i=n>r.price&&t<=r.price;break;case`crossing`:i=n<r.price&&t>=r.price||n>r.price&&t<=r.price;break;case`greaterThan`:i=t>r.price;break;case`lessThan`:i=t<r.price;break}i?r.triggered||(r.triggered=!0,this.emit(`triggered`,{...r})):r.repeating&&(r.triggered=!1)}this.lastValues.set(e,t)}clearLastValues(){this.lastValues.clear()}saveToStorage(e){try{let t=this.alerts.map(e=>({id:e.id,price:e.price,condition:e.condition,message:e.message,triggered:e.triggered,repeating:e.repeating,channel:e.channel,label:e.label}));localStorage.setItem(e,JSON.stringify(t))}catch{}}loadFromStorage(e){try{let t=localStorage.getItem(e);if(!t)return;let n=JSON.parse(t);if(!Array.isArray(n))return;for(let e of n)e.price!=null&&Number.isFinite(e.price)&&e.condition&&!e.triggered&&this.addAlert(e.price,e.condition,e.message,e.repeating??!1,e.channel??`price`,e.label)}catch{}}render(e,t,n){let{chartRect:r}=t;for(let i of this.alerts){if(i.channel!==`price`)continue;let a=o(i.price,t);if(a<r.y||a>r.y+r.height)continue;let s=i.triggered?`#FF9800`:`#FFD700`;e.setLineDash([2,6]),e.strokeStyle=s,e.lineWidth=1,e.beginPath(),e.moveTo(r.x,Math.round(a)+.5),e.lineTo(r.x+r.width,Math.round(a)+.5),e.stroke(),e.setLineDash([]),e.font=`10px ${n.font.family}`,e.fillStyle=s,e.textBaseline=`bottom`,e.textAlign=`right`;let c=`๐Ÿ”” ${i.price.toFixed(this.pricePrecision)}${i.message?` - ${i.message}`:``}`;e.fillText(c,r.x+r.width-4,a-2)}}},Ka=class extends G{data=[];currentIndex=0;timer=null;state=`stopped`;config={speed:1,interval:500};load(e){this.stop(),this.data=e,this.currentIndex=0}play(e){this.data.length!==0&&(e&&Object.assign(this.config,e),e?.startIndex!==void 0&&(this.currentIndex=e.startIndex),this.state=`playing`,this.emit(`stateChange`,`playing`),this.timer=setInterval(()=>{if(this.currentIndex>=this.data.length){this.stop(),this.emit(`complete`,void 0);return}let e=this.data[this.currentIndex];this.emit(`bar`,{bar:e,index:this.currentIndex,total:this.data.length}),this.currentIndex++},this.config.interval/this.config.speed))}pause(){this.timer&&=(clearInterval(this.timer),null),this.state=`paused`,this.emit(`stateChange`,`paused`)}resume(){this.state===`paused`&&this.play()}stop(){this.timer&&=(clearInterval(this.timer),null),this.state=`stopped`,this.currentIndex=0,this.emit(`stateChange`,`stopped`)}seekTo(e){if(this.data.length===0)return;let t=Math.max(0,Math.min(e,this.data.length-1));this.currentIndex=t;let n=this.data[t];this.emit(`bar`,{bar:n,index:t,total:this.data.length})}setSpeed(e){this.config.speed=e,this.state===`playing`&&(this.pause(),this.play())}getState(){return this.state}getProgress(){return{current:this.currentIndex,total:this.data.length,percent:this.data.length>0?this.currentIndex/this.data.length*100:0}}dispose(){this.stop(),this.removeAllListeners(),this.data=[]}},Y=1;function X(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Z(e){return Array.isArray(e)?e:[]}function qa(e,t){return typeof e==`string`?e:t}function Ja(e,t){return typeof e==`number`&&Number.isFinite(e)?e:t}function Ya(e){if(!X(e)||typeof e.id!=`string`||typeof e.type!=`string`||!Array.isArray(e.anchors)||e.anchors.length===0||!X(e.style))return null;let t=[];for(let n of e.anchors){if(!X(n)||typeof n.time!=`number`||typeof n.price!=`number`||!Number.isFinite(n.time)||!Number.isFinite(n.price))return null;t.push({time:n.time,price:n.price})}let n=e.style;return typeof n.color!=`string`||typeof n.lineWidth!=`number`?null:{id:e.id,type:e.type,anchors:t,style:n,visible:typeof e.visible==`boolean`?e.visible:!0,locked:typeof e.locked==`boolean`?e.locked:!1,meta:X(e.meta)?e.meta:void 0}}function Xa(e){return!X(e)||typeof e.id!=`string`||typeof e.side!=`string`||typeof e.type!=`string`||typeof e.price!=`number`||typeof e.quantity!=`number`?null:e}function Za(e){return!X(e)||typeof e.id!=`string`||typeof e.side!=`string`||typeof e.entryPrice!=`number`||typeof e.quantity!=`number`?null:e}function Qa(e){if(!X(e))return $a();typeof e.version==`number`&&e.version!==Y&&console.warn(`Chart state version mismatch: ${e.version} vs ${Y}`);let t=X(e.viewport)?e.viewport:{},n=[];for(let t of Z(e.indicators))X(t)&&(typeof t.id!=`string`||typeof t.instanceId!=`string`||X(t.params)&&n.push({id:t.id,instanceId:t.instanceId,params:t.params,position:typeof t.position==`string`?t.position:void 0}));let r=[];for(let t of Z(e.drawings)){let e=Ya(t);e&&r.push(e)}let i=[];for(let t of Z(e.orders)){let e=Xa(t);e&&i.push(e)}let a=[];for(let t of Z(e.positions)){let e=Za(t);e&&a.push(e)}let o=[];for(let t of Z(e.alerts))X(t)&&typeof t.id==`string`&&o.push(t);return{version:typeof e.version==`number`?e.version:Y,timestamp:Ja(e.timestamp,Date.now()),symbol:typeof e.symbol==`string`?e.symbol:void 0,timeframe:typeof e.timeframe==`string`?e.timeframe:void 0,chartType:qa(e.chartType,`candlestick`),viewport:{barWidth:Ja(t.barWidth,8),barSpacing:Ja(t.barSpacing,2),offset:Ja(t.offset,0)},theme:typeof e.theme==`string`?e.theme:void 0,locale:typeof e.locale==`string`?e.locale:void 0,indicators:n,drawings:r,orders:i,positions:a,alerts:o}}function $a(){return{version:Y,timestamp:Date.now(),chartType:`candlestick`,viewport:{barWidth:8,barSpacing:2,offset:0},indicators:[],drawings:[],orders:[],positions:[],alerts:[]}}var eo=class{static capture(e,t){return{version:Y,timestamp:Date.now(),chartType:t?.chartType??`candlestick`,symbol:t?.symbol,timeframe:t?.timeframe,viewport:{barWidth:8,barSpacing:2,offset:0},theme:e.getTheme().name,indicators:e.getIndicators?.()??[],drawings:e.getDrawings(),orders:e.getOrders?.()??[],positions:e.getPositions?.()??[],alerts:e.getAlerts?.()??[]}}static serialize(e){return JSON.stringify(e)}static deserialize(e){return Qa(JSON.parse(e))}static saveToStorage(e,t){localStorage.setItem(e,this.serialize(t))}static loadFromStorage(e){let t=localStorage.getItem(e);return t?this.deserialize(t):null}static downloadFile(e,t=`tc-chart-state.json`){let n=new Blob([this.serialize(e)],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=t,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(r)}static loadFromFile(){return new Promise((e,t)=>{let n=document.createElement(`input`);n.type=`file`,n.accept=`.json`,n.onchange=async()=>{let r=n.files?.[0];if(!r){t(Error(`No file selected`));return}let i=await r.text();e(this.deserialize(i))},n.click()})}},to=class{undoStack=[];redoStack=[];maxHistory=50;onChange=null;setOnChange(e){this.onChange=e}push(e){this.undoStack.push(e),this.undoStack.length>this.maxHistory&&this.undoStack.shift(),this.redoStack.length=0,this.onChange?.()}canUndo(){return this.undoStack.length>0}canRedo(){return this.redoStack.length>0}undo(){let e=this.undoStack.pop();return e?(this.redoStack.push(e),this.onChange?.(),e):null}redo(){let e=this.redoStack.pop();return e?(this.undoStack.push(e),this.onChange?.(),e):null}clear(){this.undoStack.length=0,this.redoStack.length=0}getState(){return{canUndo:this.undoStack.length>0,canRedo:this.redoStack.length>0,undoCount:this.undoStack.length,redoCount:this.redoStack.length}}},no=class{static toCSV(e){return[`Time,Open,High,Low,Close,Volume`,...e.map(e=>`${new Date(e.time).toISOString()},${e.open},${e.high},${e.low},${e.close},${e.volume}`)].join(`
25
- `)}static toJSON(e){return JSON.stringify(e.map(e=>({time:new Date(e.time).toISOString(),open:e.open,high:e.high,low:e.low,close:e.close,volume:e.volume})),null,2)}static download(e,t,n){let r=new Blob([e],{type:n}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=t,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(i)}},ro=1,io=class extends G{markers=[];style={...e.DEFAULT_SIGNAL_STYLE};requestRender=null;dataGetter=null;setRequestRender(e){this.requestRender=e}setDataGetter(e){this.dataGetter=e}setStyle(e){this.style={...this.style,...e},this.requestRender?.()}getStyle(){return{...this.style}}addMarker(e){let t=e.id??`tc_signal_${ro++}`,n={...e,id:t};return this.markers.push(n),this.emit(`added`,n),this.requestRender?.(),t}removeMarker(e){this.markers=this.markers.filter(t=>t.id!==e),this.emit(`removed`,e),this.requestRender?.()}getMarkers(){return[...this.markers]}clearMarkers(){this.markers=[],this.emit(`cleared`,void 0),this.requestRender?.()}setMarkers(e){this.markers=[...e],this.requestRender?.()}render(e,t,n){let r=this.dataGetter?.();if(!r||r.length===0||this.markers.length===0)return;let{chartRect:i,visibleRange:s}=t,c=this.style,u=c.arrowSize??12;e.save(),e.beginPath(),e.rect(i.x,i.y,i.width,i.height),e.clip();for(let d of this.markers){let f=l(d.time,r);if(f<s.from-1||f>s.to+1)continue;let p=a(f,t),m=o(d.price,t);if(p<i.x-u||p>i.x+i.width+u||m<i.y-u||m>i.y+i.height+u)continue;let h=this.resolveColor(d,c),g=u*Math.max(.6,Math.min(1,d.confidence));if(this.renderArrow(e,p,m,d.direction,g,h),c.showLabel&&d.label){e.font=`10px ${n.font.family}`,e.fillStyle=h,e.textAlign=`center`,e.textBaseline=d.direction===`long`?`top`:`bottom`;let t=d.direction===`long`?m+g+3:m-g-3;e.fillText(d.label,p,t)}if(c.showConfidence&&d.confidence<1){e.font=`9px ${n.font.family}`,e.fillStyle=h,e.globalAlpha=.7,e.textAlign=`center`,e.textBaseline=d.direction===`long`?`top`:`bottom`;let t=d.direction===`long`?m+g+(d.label?14:3):m-g-(d.label?14:3);e.fillText(`${Math.round(d.confidence*100)}%`,p,t),e.globalAlpha=1}}e.restore()}resolveColor(e,t){if(e.color)return e.color;if(t.sourceColors?.[e.source])return t.sourceColors[e.source];switch(e.direction){case`long`:return t.longColor??`#26A69A`;case`short`:return t.shortColor??`#EF5350`;default:return t.neutralColor??`#9E9E9E`}}renderArrow(e,t,n,r,i,a){e.fillStyle=a,e.beginPath(),r===`long`?(e.moveTo(t,n-i),e.lineTo(t-i*.6,n),e.lineTo(t-i*.2,n),e.lineTo(t-i*.2,n+i*.4),e.lineTo(t+i*.2,n+i*.4),e.lineTo(t+i*.2,n),e.lineTo(t+i*.6,n)):r===`short`?(e.moveTo(t,n+i),e.lineTo(t-i*.6,n),e.lineTo(t-i*.2,n),e.lineTo(t-i*.2,n-i*.4),e.lineTo(t+i*.2,n-i*.4),e.lineTo(t+i*.2,n),e.lineTo(t+i*.6,n)):e.arc(t,n,i*.4,0,Math.PI*2),e.closePath(),e.fill()}},ao=1,oo=class extends G{zones=[];style={...e.DEFAULT_TRADE_ZONE_STYLE};requestRender=null;dataGetter=null;pricePrecision=2;setRequestRender(e){this.requestRender=e}setDataGetter(e){this.dataGetter=e}setPricePrecision(e){this.pricePrecision=e}setStyle(e){this.style={...this.style,...e},this.requestRender?.()}getStyle(){return{...this.style}}addZone(e){let t=e.id??`tc_zone_${ao++}`,n={...e,id:t};return this.zones.push(n),this.emit(`added`,n),this.requestRender?.(),t}updateZone(e,t){let n=this.zones.findIndex(t=>t.id===e);n!==-1&&(this.zones[n]={...this.zones[n],...t},this.requestRender?.())}removeZone(e){this.zones=this.zones.filter(t=>t.id!==e),this.emit(`removed`,e),this.requestRender?.()}getZones(){return[...this.zones]}clearZones(){this.zones=[],this.emit(`cleared`,void 0),this.requestRender?.()}setZones(e){this.zones=[...e],this.requestRender?.()}render(e,t,n){let r=this.dataGetter?.();if(!r||r.length===0||this.zones.length===0)return;let{chartRect:i}=t,a=this.style;e.save(),e.beginPath(),e.rect(i.x,i.y,i.width,i.height),e.clip();for(let i of this.zones)this.renderZone(e,i,r,t,n,a);e.restore()}renderZone(e,t,n,r,i,s){let{chartRect:c,visibleRange:u}=r,d=l(t.entryTime,n),f=t.exitTime==null?n.length-1:l(t.exitTime,n);if(f<u.from||d>u.to)return;let p=a(d,r),m=a(f,r),h=Math.max(c.x,Math.min(p,m)),g=Math.min(c.x+c.width,Math.max(p,m));if(g-h<1)return;let _=o(t.entryPrice,r),v=t.exitPrice==null?o(t.entryPrice,r):o(t.exitPrice,r),y=Math.min(_,v),b=Math.max(Math.max(_,v)-y,2),x=t.exitTime==null,S=t.pnl==null?t.direction===`long`?(t.exitPrice??t.entryPrice)>=t.entryPrice:(t.exitPrice??t.entryPrice)<=t.entryPrice:t.pnl>=0,C=x?s.activeColor??`#2196F3`:S?s.profitColor??`#26A69A`:s.lossColor??`#EF5350`;e.fillStyle=C,e.globalAlpha=s.fillOpacity??.12,e.fillRect(h,y,g-h,b),e.globalAlpha=1;let w=s.borderWidth??1;e.strokeStyle=C,e.lineWidth=w,e.setLineDash([]),e.beginPath(),e.moveTo(h,Math.round(_)+.5),e.lineTo(g,Math.round(_)+.5),e.stroke(),!x&&t.exitPrice!=null&&(e.setLineDash([3,3]),e.beginPath(),e.moveTo(h,Math.round(v)+.5),e.lineTo(g,Math.round(v)+.5),e.stroke(),e.setLineDash([]));let T=t.direction===`long`?`โ–ฒ`:`โ–ผ`;if(e.font=`bold 10px ${i.font.family}`,e.fillStyle=C,e.textBaseline=`bottom`,e.textAlign=`left`,e.fillText(`${T} ${t.entryPrice.toFixed(this.pricePrecision)}`,h+4,_-3),s.showPnl&&!x&&t.pnl!=null){let n=t.pnl>=0?`+`:``,r=t.pnlPercent==null?`${n}${t.pnl.toFixed(2)}`:`${n}${t.pnl.toFixed(2)} (${n}${t.pnlPercent.toFixed(2)}%)`;e.font=`bold 10px ${i.font.family}`,e.fillStyle=C,e.textBaseline=`top`,e.textAlign=`right`;let a=e.measureText(r).width+8,o=g-a-2,s=y+2;e.globalAlpha=.85,e.fillStyle=i.background,e.fillRect(o,s,a,14),e.globalAlpha=1,e.fillStyle=C,e.fillText(r,g-4,s+1)}s.showLabel&&t.label&&(e.font=`9px ${i.font.family}`,e.fillStyle=C,e.globalAlpha=.8,e.textBaseline=`top`,e.textAlign=`left`,e.fillText(t.label,h+4,_+3),e.globalAlpha=1)}},so=class{active=!1;startBar=0;startPrice=0;endBar=0;endPrice=0;startTime=null;endTime=null;isActive(){return this.active}begin(e,t,n){let r=Math.round(s(e.x,t)),i=c(e.y,t);this.startBar=r,this.startPrice=i,this.endBar=r,this.endPrice=i,this.startTime=co(r,n),this.endTime=this.startTime,this.active=!0}update(e,t,n){if(!this.active)return;let r=Math.round(s(e.x,t));this.endBar=r,this.endPrice=c(e.y,t),this.endTime=co(r,n)}end(){this.active=!1}render(e,t,n){if(!this.active)return;let r=a(this.startBar,t),i=a(this.endBar,t),s=o(this.startPrice,t),c=o(this.endPrice,t),l=Math.min(r,i),u=Math.max(r,i),d=Math.min(s,c),f=Math.max(s,c),p=u-l,m=f-d,h=this.endPrice>=this.startPrice?n.candleUp:n.candleDown,g=ho(h,.14);e.save(),e.fillStyle=g,e.fillRect(l,d,p,m),e.strokeStyle=h,e.lineWidth=1,e.setLineDash([4,3]),e.strokeRect(l+.5,d+.5,p,m),e.setLineDash([]),e.strokeStyle=h,e.lineWidth=1.5,e.beginPath(),e.moveTo(r,s),e.lineTo(i,c),e.stroke(),fo(e,r,s,h),fo(e,i,c,h);let _=Math.abs(this.endBar-this.startBar),v=this.endPrice-this.startPrice,y=this.startPrice===0?0:v/this.startPrice*100,b=this.startTime!==null&&this.endTime!==null?uo(Math.abs(this.endTime-this.startTime)):null,x=[],S=v>0?`+`:v<0?`โˆ’`:``,C=Math.abs(v);x.push(`${S}${lo(C)} (${S}${Math.abs(y).toFixed(2)}%)`),x.push(`${_} bars${b?` ยท `+b:``}`),po(e,i,c,x,h,n),e.restore()}};function co(e,t){if(e<0||e>=t.length)return null;let n=t[e].time;return n>0xe8d4a51000?n:n*1e3}function lo(e){return e>=1e3?e.toFixed(2):e>=1?e.toFixed(4):e.toPrecision(4)}function uo(e){let t=e/1e3;if(t<60)return`${t.toFixed(0)}s`;let n=t/60;if(n<60)return`${n.toFixed(1)}m`;let r=n/60;if(r<24)return`${r.toFixed(1)}h`;let i=r/24;if(i<30)return`${i.toFixed(1)}d`;let a=i/30;return a<12?`${a.toFixed(1)}mo`:`${(i/365).toFixed(1)}y`}function fo(e,t,n,r){e.fillStyle=r,e.beginPath(),e.arc(t,n,3.5,0,Math.PI*2),e.fill(),e.fillStyle=`#fff`,e.beginPath(),e.arc(t,n,1.5,0,Math.PI*2),e.fill()}function po(e,t,n,r,i,a){e.font=`600 11px ${a.font.family}`;let o=0;for(let t of r){let n=e.measureText(t).width;n>o&&(o=n)}let s=Math.ceil(o)+16,c=r.length*14+12,l=t+8,u=n+8,d=e.canvas.clientWidth||e.canvas.width;l+s>d-4&&(l=t-s-8),l<4&&(l=4),e.fillStyle=a.background,e.globalAlpha=.96,mo(e,l,u,s,c,6),e.fill(),e.globalAlpha=1,e.strokeStyle=i,e.lineWidth=1,mo(e,l+.5,u+.5,s-1,c-1,6),e.stroke(),e.fillStyle=a.text,e.textBaseline=`top`,e.textAlign=`left`;for(let t=0;t<r.length;t++)e.fillStyle=t===0?i:a.textSecondary,e.fillText(r[t],l+8,u+6+t*14)}function mo(e,t,n,r,i,a){e.beginPath(),e.moveTo(t+a,n),e.arcTo(t+r,n,t+r,n+i,a),e.arcTo(t+r,n+i,t,n+i,a),e.arcTo(t,n+i,t,n,a),e.arcTo(t,n,t+r,n,a),e.closePath()}function ho(e,t){if(e.startsWith(`#`)){let n=0,r=0,i=0;return e.length===4?(n=parseInt(e[1]+e[1],16),r=parseInt(e[2]+e[2],16),i=parseInt(e[3]+e[3],16)):e.length>=7&&(n=parseInt(e.slice(1,3),16),r=parseInt(e.slice(3,5),16),i=parseInt(e.slice(5,7),16)),`rgba(${n},${r},${i},${t})`}if(e.startsWith(`rgb`)){let n=e.match(/[\d.]+/g);if(n&&n.length>=3)return`rgba(${n[0]},${n[1]},${n[2]},${t})`}return e}var go={linear:e=>e,easeOutCubic:e=>1-(1-e)**3,easeOutQuart:e=>1-(1-e)**4,easeInOutCubic:e=>e<.5?4*e*e*e:1-(-2*e+2)**3/2,easeOutExpo:e=>e===1?1:1-2**(-10*e),easeOutElastic:e=>e===0||e===1?e:2**(-10*e)*Math.sin((e*10-.75)*(2*Math.PI/3))+1,spring:e=>1-Math.E**(-6*e)*Math.cos(8*e)},_o=class{animations=new Map;frameId=0;running=!1;animate(e,t){this.animations.set(e,{startTime:-1,duration:t.duration,easing:t.easing??go.easeOutCubic,onUpdate:t.onUpdate,onComplete:t.onComplete}),this.running||(this.running=!0,this.tick())}cancel(e){this.animations.delete(e),this.animations.size===0&&this.stop()}cancelAll(){this.animations.clear(),this.stop()}isAnimating(e){return e?this.animations.has(e):this.animations.size>0}tick(){this.frameId=requestAnimationFrame(e=>{let t=[];for(let[n,r]of this.animations){r.startTime<0&&(r.startTime=e);let i=e-r.startTime,a=Math.min(1,i/r.duration),o=r.easing(a);r.onUpdate(o),a>=1&&(r.onComplete?.(),t.push(n))}for(let e of t)this.animations.delete(e);this.animations.size>0?this.tick():this.running=!1})}stop(){this.frameId&&=(cancelAnimationFrame(this.frameId),0),this.running=!1}dispose(){this.cancelAll()}};function vo(t){return!t||t===`dark`?e.DARK_THEME:t===`light`?e.LIGHT_THEME:t}var yo=class{canvas;ctx;container;theme;width=0;height=0;dpr=1;frameId=null;resizeObserver;constructor(e,t){this.container=e,this.theme=vo(t),this.canvas=document.createElement(`canvas`),this.canvas.style.width=`100%`,this.canvas.style.height=`100%`,this.canvas.style.display=`block`,e.appendChild(this.canvas),this.ctx=this.canvas.getContext(`2d`),this.dpr=window.devicePixelRatio||1,this.updateSize(),this.resizeObserver=new ResizeObserver(()=>{this.updateSize(),this.requestRender()}),this.resizeObserver.observe(e)}updateSize(){this.dpr=window.devicePixelRatio||1;let e=this.container.getBoundingClientRect();this.width=e.width||this.container.clientWidth,this.height=e.height||this.container.clientHeight,this.canvas.width=Math.max(1,Math.floor(this.width*this.dpr)),this.canvas.height=Math.max(1,Math.floor(this.height*this.dpr))}requestRender(){this.frameId===null&&(this.frameId=requestAnimationFrame(()=>{this.frameId=null,(this.width===0||this.height===0)&&this.updateSize(),!(this.width===0||this.height===0)&&(this.ctx.save(),this.ctx.scale(this.dpr,this.dpr),this.ctx.clearRect(0,0,this.width,this.height),this.renderChart(this.ctx,this.width,this.height,this.theme),this.ctx.restore())}))}setTheme(e){this.theme=vo(e),this.requestRender()}destroy(){this.frameId!==null&&cancelAnimationFrame(this.frameId),this.resizeObserver.disconnect(),this.canvas.remove()}},bo=class{pos=null;canvas;onUpdate;handleMove;handleLeave;constructor(e,t){this.canvas=e,this.onUpdate=t,this.handleMove=t=>{let n=e.getBoundingClientRect();this.pos={x:t.clientX-n.left,y:t.clientY-n.top},this.onUpdate()},this.handleLeave=()=>{this.pos=null,this.onUpdate()},e.addEventListener(`pointermove`,this.handleMove),e.addEventListener(`pointerleave`,this.handleLeave)}getPosition(){return this.pos}isActive(){return this.pos!==null}drawCrosshair(e,t,n,r){this.pos&&(e.save(),e.strokeStyle=r,e.lineWidth=.5,e.setLineDash([4,4]),e.beginPath(),e.moveTo(this.pos.x,0),e.lineTo(this.pos.x,n),e.stroke(),e.beginPath(),e.moveTo(0,this.pos.y),e.lineTo(t,this.pos.y),e.stroke(),e.restore())}destroy(){this.canvas.removeEventListener(`pointermove`,this.handleMove),this.canvas.removeEventListener(`pointerleave`,this.handleLeave)}};function xo(e,t,n,r,i){let{data:a,mode:o=`area`,lineWidth:s=1.5,showLastPoint:c=!1,showMinMax:l=!1}=r;if(a.length<2||t<=0||n<=0)return;let u=r.color??i.lineColor,d=r.fillColor??u,f=t-4,p=n-4,m=1/0,h=-1/0,g=0,_=0;for(let e=0;e<a.length;e++)a[e]<m&&(m=a[e],g=e),a[e]>h&&(h=a[e],_=e);let v=h-m||1,y=e=>2+e/(a.length-1)*f,b=e=>2+p-(e-m)/v*p;if(o===`area`){let t=e.createLinearGradient(0,2,0,n-2);t.addColorStop(0,d+(d.startsWith(`#`)?`40`:``)),t.addColorStop(1,`transparent`),e.beginPath(),e.moveTo(y(0),b(a[0]));for(let t=1;t<a.length;t++)e.lineTo(y(t),b(a[t]));e.lineTo(y(a.length-1),n-2),e.lineTo(y(0),n-2),e.closePath(),e.fillStyle=t,e.fill()}e.beginPath(),e.moveTo(y(0),b(a[0]));for(let t=1;t<a.length;t++)e.lineTo(y(t),b(a[t]));if(e.strokeStyle=u,e.lineWidth=s,e.lineJoin=`round`,e.stroke(),c){let t=r.lastPointColor??u,n=y(a.length-1),i=b(a[a.length-1]);e.beginPath(),e.arc(n,i,3,0,Math.PI*2),e.fillStyle=t,e.fill()}if(l){let t=r.minPointColor??i.candleDown,n=r.maxPointColor??i.candleUp;e.beginPath(),e.arc(y(g),b(m),2.5,0,Math.PI*2),e.fillStyle=t,e.fill(),e.beginPath(),e.arc(y(_),b(h),2.5,0,Math.PI*2),e.fillStyle=n,e.fill()}}var So=50,Co=60,wo=20,To=.2;function Eo(e){let t=[...e].sort((e,t)=>t.price-e.price),n=[],r=0;for(let e of t)r+=e.volume,n.push({price:e.price,cumulativeVolume:r});return n}function Do(e){let t=[...e].sort((e,t)=>e.price-t.price),n=[],r=0;for(let e of t)r+=e.volume,n.push({price:e.price,cumulativeVolume:r});return n}function Oo(e,t){return{left:So,right:e-Co,top:wo,bottom:t-wo,plotWidth:e-So-Co,plotHeight:t-wo*2}}function ko(e,t,n,r){e.fillStyle=r,e.fillRect(0,0,t,n)}function Ao(t,n,r,i,a,o,s,c){let{left:l,right:u,top:d,bottom:f,plotWidth:p,plotHeight:m}=n;t.save(),t.strokeStyle=o.grid,t.lineWidth=.5,t.fillStyle=o.axisLabel,t.font=`${o.font.sizeSmall}px ${o.font.family}`;let h=(0,e.computeTickStep)(0,a,5);for(let e=0;e<=a;e+=h){let n=f-e/a*m;t.beginPath(),t.moveTo(l,n),t.lineTo(u,n),t.stroke(),t.textAlign=`right`,t.textBaseline=`middle`,t.fillText(c(e),l-4,n)}let g=i-r,_=(0,e.computeTickStep)(r,i,6),v=Math.ceil(r/_)*_;for(let e=v;e<=i;e+=_){let n=l+(e-r)/g*p;t.beginPath(),t.moveTo(n,d),t.lineTo(n,f),t.stroke(),t.textAlign=`center`,t.textBaseline=`top`,t.fillText(s(e),n,f+4)}t.restore()}function jo(e,t,n,r,i,a,o,s,c){if(t.length===0)return;let{left:l,bottom:u,plotWidth:d,plotHeight:f}=n,p=e=>l+(e-r)/i*d,m=e=>u-e/a*f;if(e.beginPath(),c===`bid`){e.moveTo(p(t[0].price),u);for(let n=0;n<t.length;n++){let r=p(t[n].price),i=m(t[n].cumulativeVolume);e.lineTo(r,i),n<t.length-1&&e.lineTo(p(t[n+1].price),i)}e.lineTo(p(t[t.length-1].price),u)}else{e.moveTo(p(t[0].price),u);for(let n=0;n<t.length;n++){let r=p(t[n].price),i=m(t[n].cumulativeVolume);e.lineTo(r,i),n<t.length-1&&e.lineTo(p(t[n+1].price),i)}e.lineTo(p(t[t.length-1].price),u)}if(e.closePath(),e.fillStyle=o,e.fill(),e.beginPath(),c===`bid`){e.moveTo(p(t[0].price),m(t[0].cumulativeVolume));for(let n=0;n<t.length;n++){let r=p(t[n].price),i=m(t[n].cumulativeVolume);n>0&&e.lineTo(r,m(t[n-1].cumulativeVolume)),e.lineTo(r,i)}}else{e.moveTo(p(t[0].price),m(t[0].cumulativeVolume));for(let n=1;n<t.length;n++){let r=m(t[n-1].cumulativeVolume),i=p(t[n].price),a=m(t[n].cumulativeVolume);e.lineTo(i,r),e.lineTo(i,a)}}e.strokeStyle=s,e.lineWidth=1.5,e.stroke()}function Mo(e,t,n,r,i,a,o,s,c){let{left:l,top:u,bottom:d,plotWidth:f}=r,p=l+(t-i)/a*f;if(e.save(),e.strokeStyle=o.textSecondary,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(p,u),e.lineTo(p,d),e.stroke(),e.restore(),s){let t=`Spread: ${c(n)}`;e.save(),e.font=`${o.font.sizeSmall}px ${o.font.family}`,e.fillStyle=o.textSecondary,e.textAlign=`center`,e.textBaseline=`bottom`,e.fillText(t,p,u-2),e.restore()}}function No(e,t,n,r,i,a,o,s,c,l,u){let{left:d,top:f,bottom:p,plotWidth:m,plotHeight:h}=i,g=t.x;if(g<d||g>i.right)return;let _=a+(g-d)/m*o,v=0,y=``;if(n.length>0&&_<=n[0].price){y=`Bid`;for(let e of n)if(_<=e.price)v=e.cumulativeVolume;else break}if(r.length>0&&_>=r[0].price){y=`Ask`;for(let e of r)if(_>=e.price)v=e.cumulativeVolume;else break}if(e.save(),e.strokeStyle=c.crosshair,e.lineWidth=.5,e.setLineDash([4,4]),e.beginPath(),e.moveTo(g,f),e.lineTo(g,p),e.stroke(),v>0){let t=p-v/s*h;e.beginPath(),e.moveTo(d,t),e.lineTo(i.right,t),e.stroke()}e.restore();let b=[`Price: ${l(_)}`,y?`${y} Vol: ${u(v)}`:``].filter(Boolean);e.save(),e.font=`${c.font.sizeSmall}px ${c.font.family}`;let x=Math.max(...b.map(t=>e.measureText(t).width))+16,S=b.length*(c.font.sizeSmall+4)+12,C=g+10,w=t.y-S/2;C+x>i.right&&(C=g-x-10),w<f&&(w=f),w+S>p&&(w=p-S),e.fillStyle=c.axisLabelBackground,e.globalAlpha=.9,e.fillRect(C,w,x,S),e.globalAlpha=1,e.fillStyle=c.text,e.textBaseline=`top`,e.textAlign=`left`;for(let t=0;t<b.length;t++)e.fillText(b[t],C+8,w+6+t*(c.font.sizeSmall+4));e.restore()}function Po(e){return e.toFixed(2)}function Fo(e){return e>=1e6?(e/1e6).toFixed(2)+`M`:e>=1e3?(e/1e3).toFixed(1)+`K`:e.toFixed(0)}function Io(e,t,n,r,i,a){let{data:o}=r;if(o.bids.length===0&&o.asks.length===0||t<=0||n<=0)return;let s=r.bidColor??i.candleUp,c=r.askColor??i.candleDown,l=r.bidFillColor??s+`40`,u=r.askFillColor??c+`40`,d=r.midPriceLine!==!1,f=r.spreadLabel!==!1,p=r.priceFormat??Po,m=r.volumeFormat??Fo,h=Eo(o.bids),g=Do(o.asks),_=h.length>0?h[0].price:0,v=g.length>0?g[0].price:0,y=h.length>0&&g.length>0?(_+v)/2:_||v,b=g.length>0&&h.length>0?v-_:0,x=h.length>0?h[h.length-1].price:y,S=g.length>0?g[g.length-1].price:y,C=Math.max(y-x,S-y)*(1+To),w=y-C,T=y+C,E=T-w,D=h.length>0?h[h.length-1].cumulativeVolume:0,O=g.length>0?g[g.length-1].cumulativeVolume:0,k=Math.max(D,O)||1,A=Oo(t,n);ko(e,t,n,i.background),Ao(e,A,w,T,k,i,p,m),jo(e,h,A,w,E,k,l,s,`bid`),jo(e,g,A,w,E,k,u,c,`ask`),d&&Mo(e,y,b,A,w,E,i,f,p),a&&No(e,a,h,g,A,w,E,k,i,p,m)}var Lo=70,Ro=30,zo=20,Bo=20,Vo=.05;function Ho(e,t){return{left:Lo,right:e-zo,top:Bo,bottom:t-Ro,plotWidth:e-Lo-zo,plotHeight:t-Bo-Ro}}function Uo(e,t){let n=1/0,r=-1/0;for(let t of e)t.value<n&&(n=t.value),t.value>r&&(r=t.value);if(t)for(let e of t)e.value<n&&(n=e.value),e.value>r&&(r=e.value);let i=(r-n)*Vo;return{valMin:n-i,valMax:r+i}}function Wo(e){let t=[],n=-1/0;for(let r of e)r.value>n&&(n=r.value),t.push(n);return t}function Go(e){let t=864e5;if(365.25*t,e<7*t){let e=new Intl.DateTimeFormat(void 0,{hour:`2-digit`,minute:`2-digit`});return t=>e.format(new Date(t))}if(e<315576e5){let e=new Intl.DateTimeFormat(void 0,{month:`short`,day:`numeric`});return t=>e.format(new Date(t))}let n=new Intl.DateTimeFormat(void 0,{month:`short`,year:`numeric`});return e=>n.format(new Date(e))}function Ko(e){return Math.abs(e)>=1e6?(e/1e6).toFixed(2)+`M`:Math.abs(e)>=1e3?(e/1e3).toFixed(1)+`K`:e.toFixed(2)}function qo(e,t,n,r){e.fillStyle=r,e.fillRect(0,0,t,n)}function Jo(t,n,r,i,a,o,s,c,l){let{left:u,right:d,top:f,bottom:p,plotWidth:m,plotHeight:h}=n;t.save(),t.strokeStyle=s.grid,t.lineWidth=.5,t.fillStyle=s.axisLabel,t.font=`${s.font.sizeSmall}px ${s.font.family}`;let g=(0,e.computeTickStep)(r,i,6),_=Math.ceil(r/g)*g;for(let e=_;e<=i;e+=g){let n=p-(e-r)/(i-r)*h;t.beginPath(),t.moveTo(u,n),t.lineTo(d,n),t.stroke(),t.textAlign=`right`,t.textBaseline=`middle`,t.fillText(c(e),u-6,n)}let v=o-a,y=(0,e.computeTickStep)(a,o,6),b=Math.ceil(a/y)*y;for(let e=b;e<=o;e+=y){let n=u+(e-a)/v*m;t.beginPath(),t.moveTo(n,f),t.lineTo(n,p),t.stroke(),t.textAlign=`center`,t.textBaseline=`top`,t.fillText(l(e),n,p+4)}t.restore()}function Yo(e,t,n,r,i,a,o,s,c){if(t.length<2)return;let{left:l,bottom:u,plotWidth:d,plotHeight:f}=n,p=e=>l+(e-r)/i*d,m=e=>u-(e-a)/o*f;e.save(),e.beginPath(),e.moveTo(p(t[0].time),m(t[0].value));for(let n=1;n<t.length;n++)e.lineTo(p(t[n].time),m(t[n].value));e.strokeStyle=s,e.lineWidth=c,e.lineJoin=`round`,e.stroke(),e.restore()}function Xo(e,t,n,r,i,a,o,s){if(t.length<2)return;let{left:c,bottom:l,plotWidth:u,plotHeight:d}=n,f=e=>c+(e-r)/i*u,p=e=>l-(e-a)/o*d,m=e.createLinearGradient(0,n.top,0,l);m.addColorStop(0,s+`40`),m.addColorStop(1,`transparent`),e.save(),e.beginPath(),e.moveTo(f(t[0].time),p(t[0].value));for(let n=1;n<t.length;n++)e.lineTo(f(t[n].time),p(t[n].value));e.lineTo(f(t[t.length-1].time),l),e.lineTo(f(t[0].time),l),e.closePath(),e.fillStyle=m,e.fill(),e.restore()}function Zo(e,t,n,r,i,a,o,s,c){if(t.length<2)return;let{left:l,bottom:u,plotWidth:d,plotHeight:f}=r,p=e=>l+(e-i)/a*d,m=e=>u-(e-o)/s*f;e.save(),e.fillStyle=c,e.beginPath(),e.moveTo(p(t[0].time),m(n[0]));for(let r=1;r<t.length;r++)e.lineTo(p(t[r].time),m(n[r]));for(let n=t.length-1;n>=0;n--)e.lineTo(p(t[n].time),m(t[n].value));e.closePath(),e.fill(),e.restore()}function Qo(e,t,n,r,i,a,o,s,c,l){if(t.length===0)return;let{left:u,bottom:d,plotWidth:f,plotHeight:p}=n,m=t[t.length-1],h=u+(m.time-r)/i*f,g=d-(m.value-a)/o*p;e.save(),e.font=`${l.font.sizeSmall}px ${l.font.family}`,e.fillStyle=c,e.textAlign=`left`,e.textBaseline=`middle`,e.fillText(s,h+4,g),e.restore()}function $o(e,t,n,r,i,a,o,s,c,l,u,d){let{left:f,top:p,bottom:m,plotWidth:h,plotHeight:g}=i,_=t.x;if(_<f||_>i.right)return;e.save(),e.strokeStyle=l.crosshair,e.lineWidth=.5,e.setLineDash([4,4]),e.beginPath(),e.moveTo(_,p),e.lineTo(_,m),e.stroke(),e.restore();let v=a+(_-f)/h*o,y=0,b=1/0;for(let e=0;e<n.length;e++){let t=Math.abs(n[e].time-v);t<b&&(b=t,y=e)}let x=n[y],S=[u(x.time),`Value: ${d(x.value)}`];r&&r.length>y&&S.push(`Benchmark: ${d(r[y].value)}`);let C=f+(x.time-a)/o*h,w=m-(x.value-s)/c*g;e.beginPath(),e.arc(C,w,3,0,Math.PI*2),e.fillStyle=l.lineColor,e.fill(),e.save(),e.font=`${l.font.sizeSmall}px ${l.font.family}`;let T=Math.max(...S.map(t=>e.measureText(t).width))+16,E=S.length*(l.font.sizeSmall+4)+12,D=_+10,O=t.y-E/2;D+T>i.right&&(D=_-T-10),O<p&&(O=p),O+E>m&&(O=m-E),e.fillStyle=l.axisLabelBackground,e.globalAlpha=.9,e.fillRect(D,O,T,E),e.globalAlpha=1,e.fillStyle=l.text,e.textBaseline=`top`,e.textAlign=`left`;for(let t=0;t<S.length;t++)e.fillText(S[t],D+8,O+6+t*(l.font.sizeSmall+4));e.restore()}function es(e,t,n,r,i,a){let{data:o}=r;if(o.length<2||t<=0||n<=0)return;let s=r.lineColor??i.lineColor,c=r.lineWidth??1.5,l=r.drawdown===!0,u=r.drawdownColor??i.candleDown+`30`,d=r.fillArea===!0,f=r.benchmark,p=r.benchmarkColor??i.textSecondary,m=r.benchmarkLabel??`Benchmark`,h=r.valueFormat??Ko,{valMin:g,valMax:_}=Uo(o,f),v=_-g||1,y=o[0].time,b=o[o.length-1].time,x=b-y||1,S=r.timeFormat??Go(x),C=Ho(t,n);qo(e,t,n,i.background),Jo(e,C,g,_,y,b,i,h,S),l&&Zo(e,o,Wo(o),C,y,x,g,v,u),d&&Xo(e,o,C,y,x,g,v,s),Yo(e,o,C,y,x,g,v,s,c),f&&f.length>=2&&(Yo(e,f,C,y,x,g,v,p,1),Qo(e,f,C,y,x,g,v,m,p,i)),a&&$o(e,a,o,f,C,y,x,g,v,i,S,h)}function ts(e,t,n){if(e.length===0)return[];let r=e.length,i=Math.ceil(Math.sqrt(r)),a=Math.ceil(r/i),o=t.width/i,s=t.height/a,c=[];for(let a=0;a<r;a++){let r=a%i,l=Math.floor(a/i);c.push({id:e[a].id,rect:{x:t.x+r*o+n,y:t.y+l*s+n,width:Math.max(0,o-n*2),height:Math.max(0,s-n*2)}})}return c}function ns(e,t){let n=e.reduce((e,t)=>e+t,0);if(n===0||t===0)return 1/0;let r=0;for(let i of e){let e=n/t,a=i/e,o=e>a?e/a:a/e;o>r&&(r=o)}return r}function rs(e,t,n,r,i,a){let o=r?n.height:n.width,s=e.reduce((e,t)=>e+t,0),c=o>0?s/o:0,l=0;for(let o=0;o<e.length;o++){let s=c>0?e[o]/c:0,u;u=r?{x:n.x+i,y:n.y+l+i,width:Math.max(0,c-i*2),height:Math.max(0,s-i*2)}:{x:n.x+l+i,y:n.y+i,width:Math.max(0,s-i*2),height:Math.max(0,c-i*2)},a.push({id:t[o],rect:u}),l+=s}}function is(e,t,n,r,i){if(e.length===0)return;let a=n.width>=n.height,o=a?n.height:n.width;if(e.length===1){rs(e,t,n,a,r,i);return}let s=[],c=[],l=0;for(;l<e.length;){let u=[...s,e[l]];if(s.length===0||ns(u,o)<=ns(s,o))s.push(e[l]),c.push(t[l]),l++;else{rs(s,c,n,a,r,i);let u=s.reduce((e,t)=>e+t,0),d=o>0?u/o:0;n=a?{x:n.x+d,y:n.y,width:n.width-d,height:n.height}:{x:n.x,y:n.y+d,width:n.width,height:n.height-d},is(e.slice(l),t.slice(l),n,r,i);return}}s.length>0&&rs(s,c,n,a,r,i)}function as(e,t,n){if(e.length===0)return[];let r=[...e].sort((e,t)=>t.weight-e.weight),i=r.reduce((e,t)=>e+Math.max(0,t.weight),0);if(i===0)return[];let a=t.width*t.height,o=r.map(e=>Math.max(0,e.weight)/i*a),s=r.map(e=>e.id),c=[];return is(o,s,{...t},n,c),c}function os(e){return(e>=0?`+`:``)+e.toFixed(2)+`%`}function ss(e){return e.label}function cs(t,n){let r=n.min??-5,i=n.max??5;if(t<=r)return n.negative;if(t>=i)return n.positive;if(t<0){let i=1-t/r;return(0,e.lerpColor)(n.negative,n.zero,i)}let a=t/i;return(0,e.lerpColor)(n.zero,n.positive,a)}function ls(e,t,n,r,i,a){let o=Math.min(a,r/2,i/2);e.beginPath(),e.moveTo(t+o,n),e.lineTo(t+r-o,n),e.arcTo(t+r,n,t+r,n+o,o),e.lineTo(t+r,n+i-o),e.arcTo(t+r,n+i,t+r-o,n+i,o),e.lineTo(t+o,n+i),e.arcTo(t,n+i,t,n+i-o,o),e.lineTo(t,n+o),e.arcTo(t,n,t+o,n,o),e.closePath()}function us(e,t,n,r,i,a,o,s,c,l,u){if(i<40||a<30)return;let d=n+i/2,f=r+a/2;if(e.save(),e.shadowColor=`rgba(0,0,0,0.6)`,e.shadowBlur=2,e.fillStyle=`#FFFFFF`,e.textAlign=`center`,s){let n=l(t),r=Math.min(o.font.sizeMedium,i/n.length*1.5,a/4);e.font=`bold `+Math.max(8,r)+`px `+o.font.family,e.textBaseline=c?`bottom`:`middle`,e.fillText(n,d,c?f-1:f,i-8)}if(c){let n=u(t.value),r=Math.min(o.font.sizeSmall,i/n.length*1.5,a/4);e.font=Math.max(7,r)+`px `+o.font.family,e.textBaseline=s?`top`:`middle`,e.fillText(n,d,s?f+1:f,i-8)}e.restore()}function ds(e,t,n,r,i,a,o,s){let c=[o(t),s(t.value)];if(t.meta)for(let[e,n]of Object.entries(t.meta))c.push(e+`: `+String(n));e.save(),e.font=a.font.sizeSmall+`px `+a.font.family;let l=Math.max(...c.map(t=>e.measureText(t).width))+16,u=a.font.sizeSmall+4,d=c.length*u+12,f=n.x+14,p=n.y-d/2;f+l>r&&(f=n.x-l-14),p<0&&(p=0),p+d>i&&(p=i-d),e.fillStyle=a.axisLabelBackground,e.globalAlpha=.92,ls(e,f,p,l,d,4),e.fill(),e.globalAlpha=1,e.fillStyle=a.text,e.textBaseline=`top`,e.textAlign=`left`;for(let t=0;t<c.length;t++)e.fillText(c[t],f+8,p+6+t*u);e.restore()}function fs(e,t,n,r,i,a,o,s){if(r.length===0||i.length===0||t<=0||n<=0)return null;let c=a.colorScale??{negative:`#EF5350`,zero:`#424242`,positive:`#26A69A`},l=a.cellRadius??4,u=a.showLabels!==!1,d=a.showValues!==!1,f=a.valueFormat??os,p=a.labelFormat??ss,m=new Map;for(let e of r)m.set(e.id,e);let h=null,g=null;if(s)for(let e of i){let{x:t,y:n,width:r,height:i}=e.rect;if(s.x>=t&&s.x<=t+r&&s.y>=n&&s.y<=n+i){h=e.id;let t=m.get(e.id);t&&(g={cell:t,rect:e});break}}e.fillStyle=o.background,e.fillRect(0,0,t,n);for(let t of i){let n=m.get(t.id);if(!n)continue;let{x:r,y:i,width:a,height:s}=t.rect;if(a<=0||s<=0)continue;let g=cs(n.value,c);ls(e,r,i,a,s,l),e.fillStyle=g,e.fill(),us(e,n,r,i,a,s,o,u,d,p,f),t.id===h&&(ls(e,r,i,a,s,l),e.strokeStyle=`#FFFFFF`,e.lineWidth=1.5,e.stroke())}return g&&s&&ds(e,g.cell,s,t,n,o,p,f),g}var ps=60,ms=12,hs=24,gs=40,_s=.7,vs=1;function ys(e){return e.type?e.type:e.value>0?`positive`:e.value<0?`negative`:`subtotal`}function bs(e){let t=Math.abs(e);return t>=1e6?(e/1e6).toFixed(2)+`M`:t>=1e3?(e/1e3).toFixed(1)+`K`:e.toFixed(2)}function xs(e,t){return{left:ps,right:e-ms,top:hs,bottom:t-gs,plotWidth:e-ps-ms,plotHeight:t-hs-gs}}function Ss(e,t,n,r,i){let a=Array(e.length),o=Array(e.length),s=t.plotWidth/e.length,c=s*n,l=(s-c)/2,{left:u,bottom:d,plotHeight:f}=t,p=0;for(let t=0;t<e.length;t++){let n=e[t],m=ys(n),h,g;m===`total`||m===`subtotal`?(h=0,g=n.value,p=n.value):(h=p,g=p+n.value,p=g);let _=Math.min(h,g),v=Math.max(h,g),y=d-(_-r)/i*f,b=d-(v-r)/i*f,x=Math.min(y,b),S=Math.max(Math.abs(b-y),vs),C=u+t*s,w=C+l;a[t]={label:n.label,value:n.value,start:h,end:g,type:m,rectX:w,rectY:x,rectW:c,rectH:S,slotX:C,slotW:s},o[t]=p}return{bars:a,cumulatives:o}}function Cs(e){if(e.length===0)return{valMin:0,valMax:1};let t=0,n=0,r=0;for(let i=0;i<e.length;i++){let a=e[i],o=ys(a),s,c;o===`total`||o===`subtotal`?(s=0,c=a.value,r=a.value):(s=r,c=r+a.value,r=c),s<t&&(t=s),c<t&&(t=c),s>n&&(n=s),c>n&&(n=c)}let i=(n-t||1)*.1;return{valMin:t-i,valMax:n+i}}function ws(e,t,n,r){e.fillStyle=r,e.fillRect(0,0,t,n)}function Ts(t,n,r,i,a,o){let{left:s,right:c,top:l,bottom:u,plotHeight:d}=n,f=i-r||1;t.strokeStyle=a.grid,t.lineWidth=.5,t.fillStyle=a.axisLabel,t.font=`${a.font.sizeSmall}px ${a.font.family}`,t.textAlign=`right`,t.textBaseline=`middle`;let p=(0,e.computeTickStep)(r,i,5),m=Math.ceil(r/p)*p;t.beginPath();for(let e=m;e<=i;e+=p){let n=Math.round(u-(e-r)/f*d)+.5;n<l||n>u||(t.moveTo(s,n),t.lineTo(c,n))}t.stroke();for(let e=m;e<=i;e+=p){let n=u-(e-r)/f*d;n<l-1||n>u+1||t.fillText(o(e),s-6,n)}if(r<0&&i>0){let e=Math.round(u-(0-r)/f*d)+.5;t.strokeStyle=a.axisLine,t.lineWidth=1,t.beginPath(),t.moveTo(s,e),t.lineTo(c,e),t.stroke()}}function Es(e,t,n){let r=[`positive`,`negative`,`total`,`subtotal`];for(let i=0;i<r.length;i++){let a=r[i],o=n[a],s=!1;e.beginPath();for(let n=0;n<t.length;n++){let r=t[n];if(r.type!==a)continue;let i=Math.round(r.rectX),o=Math.round(r.rectY),c=Math.round(r.rectW),l=Math.round(r.rectH);e.rect(i,o,c,l),s=!0}s&&(e.fillStyle=o,e.fill())}}function Ds(e,t,n,r,i,a,o){if(o===`none`||t.length<2)return;let{bottom:s,plotHeight:c}=n;e.strokeStyle=a,e.lineWidth=1,o===`dashed`?e.setLineDash([4,4]):e.setLineDash([]),e.beginPath();for(let n=0;n<t.length-1;n++){let a=t[n],o=t[n+1],l=a.end,u=Math.round(s-(l-r)/i*c)+.5,d=Math.round(a.rectX+a.rectW),f=Math.round(o.rectX);f<=d||(e.moveTo(d,u),e.lineTo(f,u))}e.stroke(),e.setLineDash([])}function Os(e,t,n,r,i,a){e.fillStyle=r.text,e.font=`${r.font.sizeSmall}px ${r.font.family}`,e.textAlign=`center`;for(let r=0;r<t.length;r++){let o=t[r],s;s=o.type===`total`||o.type===`subtotal`?i(o.value):a?`${o.value>=0?`+`:``}${i(o.value)}`:i(n[r]);let c=o.rectX+o.rectW/2;o.end<o.start?(e.textBaseline=`top`,e.fillText(s,c,o.rectY+o.rectH+4)):(e.textBaseline=`bottom`,e.fillText(s,c,o.rectY-4))}}function ks(e,t,n,r,i){e.fillStyle=r.axisLabel,e.font=`${r.font.sizeSmall}px ${r.font.family}`,e.textAlign=`center`,e.textBaseline=`top`;let a=n.bottom+6,o=t.length>0?t[0].slotW-4:0,s=!1;for(let n=0;n<t.length;n++)if(e.measureText(i(t[n].label)).width>o){s=!0;break}if(!s){for(let n=0;n<t.length;n++){let r=t[n],o=r.slotX+r.slotW/2;e.fillText(i(r.label),o,a)}return}e.save(),e.textAlign=`right`,e.textBaseline=`middle`;for(let n=0;n<t.length;n++){let r=t[n],o=r.slotX+r.slotW/2;e.setTransform(1,0,0,1,o,a+4),e.rotate(-Math.PI/4),e.fillText(i(r.label),0,0)}e.setTransform(1,0,0,1,0,0),e.restore()}function As(e,t,n){if(t<n.left||t>n.right)return null;for(let n=0;n<e.length;n++){let r=e[n];if(t>=r.slotX&&t<=r.slotX+r.slotW)return n}return null}function js(e,t,n,r,i,a,o,s){let c=t[r],l=n[r],u=Math.round(c.slotX+c.slotW/2)+.5;e.strokeStyle=o.crosshair,e.lineWidth=.5,e.setLineDash([4,4]),e.beginPath(),e.moveTo(u,a.top),e.lineTo(u,a.bottom),e.stroke(),e.setLineDash([]);let d=[c.label,`Value: ${c.value>=0&&(c.type===`positive`||c.type===`negative`)?`+`:``}${s(c.value)}`,`Total: ${s(l)}`];e.font=`${o.font.sizeSmall}px ${o.font.family}`;let f=0;for(let t=0;t<d.length;t++){let n=e.measureText(d[t]).width;n>f&&(f=n)}let p=f+16,m=d.length*(o.font.sizeSmall+4)+12,h=i.x+10,g=i.y-m/2;h+p>a.right&&(h=i.x-p-10),g<a.top&&(g=a.top),g+m>a.bottom&&(g=a.bottom-m),e.fillStyle=o.axisLabelBackground,e.globalAlpha=.9,e.fillRect(h,g,p,m),e.globalAlpha=1,e.fillStyle=o.text,e.textAlign=`left`,e.textBaseline=`top`;let _=o.font.sizeSmall+4;for(let t=0;t<d.length;t++)e.fillText(d[t],h+8,g+6+t*_)}function Ms(e,t,n,r,i,a){let{data:o}=r;if(!o||o.length===0||t<=0||n<=0)return{hitBar:null};let s=r.positiveColor??i.candleUp,c=r.negativeColor??i.candleDown,l=r.totalColor??i.lineColor,u=r.subtotalColor??i.textSecondary,d=r.connectorColor??i.textSecondary,f=r.connectorStyle??`dashed`,p=r.barWidth??_s,m=r.showValues!==!1,h=r.showDelta!==!1,g=r.valueFormat??bs,_=r.labelFormat??(e=>e),{valMin:v,valMax:y}=Cs(o),b=y-v||1,x=xs(t,n),{bars:S,cumulatives:C}=Ss(o,x,p,v,b);ws(e,t,n,i.background),Ts(e,x,v,y,i,g),Ds(e,S,x,v,b,d,f),Es(e,S,{positive:s,negative:c,total:l,subtotal:u}),m&&Os(e,S,C,i,g,h),ks(e,S,x,i,_);let w=a?As(S,a.x,x):null;return a&&w!==null&&js(e,S,C,w,a,x,i,g),{hitBar:w}}var Ns=Math.PI/180,Ps=135,Fs=405,Is=.25;function Ls(e){let t=Math.abs(e);return t>=1e6?(e/1e6).toFixed(2)+`M`:t>=1e3?(e/1e3).toFixed(1)+`K`:Number.isInteger(e)?e.toFixed(0):e.toFixed(1)}function Q(e,t,n){return e<t?t:e>n?n:e}function Rs(e,t,n){let r=n.min??0,i=n.max??100,a=i-r||1,o=(n.startAngle??Ps)*Ns,s=(n.endAngle??Fs)*Ns,c=n.thickness??Is,l=e/2,u=t/2+t*.05,d=Math.max(10,Math.min(e,t)/2-24);return{cx:l,cy:u,radius:d,innerRadius:Math.max(2,d*(1-c)),startAngle:o,endAngle:s,angleRange:s-o,min:r,max:i,range:a}}function $(e,t){let n=Q((e-t.min)/t.range,0,1);return t.startAngle+t.angleRange*n}function zs(e,t,n,r){e.fillStyle=r,e.fillRect(0,0,t,n)}function Bs(e,t,n){e.beginPath(),e.arc(t.cx,t.cy,t.radius,t.startAngle,t.endAngle,!1),e.arc(t.cx,t.cy,t.innerRadius,t.endAngle,t.startAngle,!0),e.closePath(),e.fillStyle=n,e.fill()}function Vs(e,t,n){let r=Q(n.from,t.min,t.max),i=Q(n.to,t.min,t.max);if(i<=r)return;let a=$(r,t),o=$(i,t);e.beginPath(),e.arc(t.cx,t.cy,t.radius,a,o,!1),e.arc(t.cx,t.cy,t.innerRadius,o,a,!0),e.closePath(),e.fillStyle=n.color,e.fill()}function Hs(e,t,n,r,i){let a=$(n,t);a<=t.startAngle||(e.globalAlpha=i,e.beginPath(),e.arc(t.cx,t.cy,t.radius,t.startAngle,a,!1),e.arc(t.cx,t.cy,t.innerRadius,a,t.startAngle,!0),e.closePath(),e.fillStyle=r,e.fill(),e.globalAlpha=1)}function Us(e,t,n,r){let i=$(n,t),a=Math.cos(i),o=Math.sin(i),s=t.radius-2,c=t.innerRadius*.25,l=-o,u=a,d=t.cx+a*s,f=t.cy+o*s,p=t.cx+l*4-a*c,m=t.cy+u*4-o*c,h=t.cx-l*4-a*c,g=t.cy-u*4-o*c;e.beginPath(),e.moveTo(d,f),e.lineTo(p,m),e.lineTo(h,g),e.closePath(),e.fillStyle=r,e.fill(),e.beginPath(),e.arc(t.cx,t.cy,Math.max(4,t.innerRadius*.12),0,Math.PI*2),e.fill()}function Ws(e,t,n,r,i){let a=Math.round(t.innerRadius*.55),o=Math.round(i.font.sizeMedium);e.fillStyle=i.text,e.textAlign=`center`,e.textBaseline=`middle`,e.font=`600 ${a}px ${i.font.family}`;let s=!!r,c=s?t.cy-o*.6:t.cy-a*.1;e.fillText(n,t.cx,c),s&&(e.fillStyle=i.textSecondary,e.font=`${o}px ${i.font.family}`,e.fillText(r,t.cx,t.cy+a*.55))}function Gs(e,t,n,r){e.fillStyle=r.textSecondary,e.font=`${r.font.sizeSmall}px ${r.font.family}`;let i=t.radius+10,a=Math.cos(t.startAngle),o=Math.sin(t.startAngle),s=Math.cos(t.endAngle),c=Math.sin(t.endAngle),l=t.cx+a*i,u=t.cy+o*i,d=t.cx+s*i,f=t.cy+c*i;e.textBaseline=`middle`,e.textAlign=a<-.2?`right`:a>.2?`left`:`center`,e.fillText(n(t.min),l,u),e.textAlign=s<-.2?`right`:s>.2?`left`:`center`,e.fillText(n(t.max),d,f)}function Ks(e,t,n,r){e.fillStyle=r.textSecondary,e.font=`${r.font.sizeSmall}px ${r.font.family}`,e.textAlign=`center`,e.textBaseline=`middle`;let i=(t.radius+t.innerRadius)/2;for(let r=0;r<n.length;r++){let a=n[r];if(!a.label)continue;let o=$((Q(a.from,t.min,t.max)+Q(a.to,t.min,t.max))/2,t),s=t.cx+Math.cos(o)*i,c=t.cy+Math.sin(o)*i;e.fillText(a.label,s,c)}}function qs(e,t,n,r,i,a){if(t<=0||n<=0)return;let o=Rs(t,n,r),s=r.trackColor??i.grid,c=r.needleColor??i.text,l=r.showValue!==!1,u=r.showZoneLabels===!0,d=r.valueFormat??Ls,f=Q(a,o.min,o.max);zs(e,t,n,i.background),Bs(e,o,s);let p=r.zones;if(p&&p.length>0)for(let t=0;t<p.length;t++)Vs(e,o,p[t]);Hs(e,o,f,c,.12),Us(e,o,f,c),l&&Ws(e,o,d(f),r.label,i),Gs(e,o,d,i),u&&p&&p.length>0&&Ks(e,o,p,i)}exports.ABCDPatternTool=ni,exports.ADXIndicator=ht,exports.ATRIndicator=mt,exports.AcceleratorOscillatorIndicator=tn,exports.AccumulationDistributionIndicator=un,exports.AlertDragHandler=Cn,exports.AlertManager=Ga,exports.AlligatorIndicator=et,exports.AnchoredVWAPIndicator=Ge,exports.AnchoredVWAPTool=gr,exports.Animator=_o,exports.AreaRenderer=x,exports.AroonIndicator=bt,exports.ArrowTool=dr,exports.AwesomeOscillatorIndicator=lt,exports.AxisDragHandler=Sn,exports.BalanceOfPowerIndicator=Bt,exports.BarCountdown=Aa,exports.BarRenderer=S,exports.BaseFinanceChart=yo,exports.BaselineRenderer=w,exports.BinanceAdapter=na,exports.BollingerBandsIndicator=Ie,exports.BracketTool=Pi,exports.BybitAdapter=ma,exports.CCIIndicator=vt,exports.CMFIndicator=Ct,exports.CandlestickRenderer=g,exports.CanvasLayer=t,exports.ChaikinOscillatorIndicator=ut,exports.ChaikinVolatilityIndicator=Jt,exports.ChandeMomentumIndicator=Ht,exports.ChandelierExitIndicator=$e,exports.ChartLegend=Da,exports.ChartStateManager=eo,exports.ChoppinessIndexIndicator=Et,exports.CircleTool=ii,exports.CoinbaseAdapter=ca,exports.CompareRenderer=we,exports.ConnorsRSIIndicator=At,exports.CoppockIndicator=Mt,exports.CrossLineTool=Sr,exports.CrosshairHandler=En,exports.CrosshairTooltip=An,exports.CurrentPriceLine=Yi,exports.CyclicLinesTool=mi,exports.DEFAULT_LEGEND_CONFIG=Ea,exports.DEFAULT_SESSION_HOURS=Ha,exports.DPRManager=i,exports.DataExporter=no,exports.DateAndPriceRangeTool=ui,exports.DateRangeTool=sr,exports.DepthHeatmapBuffer=xe,exports.DepthHeatmapRenderer=Se,exports.DepthOverlay=Oi,exports.DetrendedPriceOscillatorIndicator=zt,exports.DisparityIndexIndicator=an,exports.DonchianChannelIndicator=He,exports.DrawingBase=B,exports.DrawingManager=zn,exports.DrawingRenderer=Bn,exports.EMAIndicator=Fe,exports.EaseOfMovementIndicator=Wt,exports.Easing=go,exports.ElderRayIndicator=Pt,exports.ElliottWaveTool=ar,exports.EllipseTool=er,exports.Emitter=G,exports.EnvelopeIndicator=it,exports.EquivolumeRenderer=k,exports.EventBus=Ln,exports.ExtendedLineTool=qn,exports.FibChannelTool=Yr,exports.FibExtensionTool=Qn,exports.FibRetracementTool=Xn,exports.FibSpeedResistanceFanTool=$r,exports.FibTimeZonesTool=yr,exports.FinanceCrosshair=bo,exports.FisherTransformIndicator=Rt,exports.ForceIndexIndicator=kt,exports.GannBoxTool=hr,exports.GannFanTool=pr,exports.GridRenderer=hn,exports.HLCAreaRenderer=ee,exports.HeadAndShouldersTool=ri,exports.HollowCandleRenderer=C,exports.HorizontalLineTool=Un,exports.HorizontalRayTool=Wn,exports.HullMAIndicator=Je,exports.IchimokuIndicator=Re,exports.IndicatorBase=j,exports.IndicatorEngine=Ne,exports.IndicatorValueMap=M,exports.IndicatorWorkerHost=mn,exports.InfoLineTool=Gr,exports.InteractionManager=yn,exports.KSTIndicator=Nt,exports.KagiRenderer=E,exports.KeltnerChannelIndicator=Ve,exports.KeyboardHandler=kn,exports.KlingerIndicator=Lt,exports.KrakenAdapter=xa,exports.LayerManager=n,exports.LineRenderer=b,exports.LineWithMarkersRenderer=ne,exports.LinearRegressionChannelIndicator=qe,exports.MACDIndicator=ft,exports.MFIIndicator=yt,exports.MTFMovingAverageIndicator=Ze,exports.MarketProfileRenderer=ue,exports.MassIndexIndicator=Vt,exports.MeasureOverlay=so,exports.MeasureTool=cr,exports.MockAdapter=ra,exports.ModifiedSchiffPitchforkTool=rr,exports.OBVIndicator=gt,exports.OrderDraftTool=Bi,exports.OrderRenderer=xi,exports.PanHandler=bn,exports.PaneResizeHandler=wn,exports.PaperExecutionAdapter=Gi,exports.ParabolicSARIndicator=ze,exports.ParallelChannelTool=Jn,exports.PercentagePriceOscillatorIndicator=$t,exports.PeriodLevelsRenderer=he,exports.PinnedTooltip=Nn,exports.PitchforkTool=U,exports.PivotMarkersRenderer=ye,exports.PivotPointsIndicator=We,exports.PointAndFigureRenderer=D,exports.PollingAdapter=aa,exports.PositionRenderer=Di,exports.PrettyGoodOscillatorIndicator=sn,exports.PriceAxis=gn,exports.PriceLabelTool=yi,exports.PriceRangeTool=or,exports.PriceVolumeTrendIndicator=qt,exports.QstickIndicator=on,exports.ROCIndicator=xt,exports.RSIIndicator=dt,exports.RayTool=Kn,exports.ReconnectManager=Ji,exports.RectangleTool=$n,exports.RegressionChannelTool=Yn,exports.RelativeMomentumIndexIndicator=rn,exports.RelativeVigorIndicator=Yt,exports.RenderEngine=p,exports.RenderLoop=r,exports.RenkoRenderer=T,exports.ReplayController=Zi,exports.ReplayManager=Ka,exports.RiskRewardTool=xr,exports.SMAIndicator=Pe,exports.SchaffTrendCycleIndicator=Ft,exports.SchiffPitchforkTool=nr,exports.Screenshot=Oa,exports.SessionBreaks=ja,exports.SessionShading=Ua,exports.SessionVWAPIndicator=Qe,exports.SignalMarkerManager=io,exports.StdDevIndicator=cn,exports.StepLineRenderer=te,exports.StochasticIndicator=pt,exports.StochasticRSIIndicator=Xt,exports.StreamManager=Xi,exports.SupertrendIndicator=Be,exports.TEMAIndicator=ct,exports.TRIXIndicator=Ut,exports.TSIIndicator=St,exports.TextAnnotationTool=ur,exports.TickAggregator=qi,exports.TimeAxis=vn,exports.TradeZoneManager=oo,exports.TradingContextMenu=Ai,exports.TradingDragHandler=ki,exports.TradingManager=Ui,exports.TradingRenderer=Wi,exports.TrendAngleTool=Er,exports.TrendLineTool=Hn,exports.TriangleTool=tr,exports.UltimateOscillatorIndicator=Dt,exports.UndoRedoManager=to,exports.VROCIndicator=dn,exports.VWAPIndicator=Le,exports.VWMAIndicator=nt,exports.VerticalLineTool=Gn,exports.Viewport=m,exports.VolumeCandleRenderer=O,exports.VolumeDeltaIndicator=wt,exports.VolumeProfileIndicator=ln,exports.VolumeProfileRangeTool=_r,exports.VolumeProfileRenderer=ie,exports.VolumeRenderer=re,exports.VortexIndicator=Tt,exports.WMAIndicator=rt,exports.Watermark=ka,exports.WebSocketAdapter=ia,exports.WilliamsADIndicator=Gt,exports.WilliamsRIndicator=_t,exports.XABCDPatternTool=ti,exports.ZigZagIndicator=Ke,exports.ZoomHandler=xn,exports.assignSessionLetters=ce,exports.barIndexToX=a,exports.bracketRiskReward=Mi,exports.classifyPivots=_e,exports.computeBracketDefaults=ji,exports.computeMarketProfile=oe,exports.computePeriodLevels=me,exports.computeSessionProfiles=le,exports.findDominantSwing=Vn,exports.findPivots=ve,exports.getIntParam=P,exports.getNumberParam=N,exports.getVisibleData=h,exports.inferOrderType=Ri,exports.isInWindow=Ba,exports.isRegularSession=Va,exports.isWorkerResponse=pn,exports.layoutSquarifiedTreemap=as,exports.layoutUniformGrid=ts,exports.lttbDownsample=_,exports.lttbVisibleIndices=y,exports.minuteOfDay=za,exports.priceToY=o,exports.registerBuiltInDrawingTools=bi,exports.registerBuiltInIndicators=fn,exports.renderDepthChart=Io,exports.renderEquityCurve=es,exports.renderGauge=qs,exports.renderHeatmap=fs,exports.renderSparkline=xo,exports.renderWaterfall=Ms,exports.resolveBarIndex=u,exports.timeToX=d,exports.timestampToBarIndex=l,exports.toHeikinAshi=Te,exports.toKagi=ke,exports.toLineBreak=Oe,exports.toPointAndFigure=Ae,exports.toRangeBars=je,exports.toRenko=Ee,exports.tpoLetter=se,exports.xToBarIndex=s,exports.xToTime=f,exports.yToPrice=c;
24
+ `,t.addEventListener(`mouseenter`,()=>{t.style.background=`#1f2630`}),t.addEventListener(`mouseleave`,()=>{t.style.background=`transparent`}),t.addEventListener(`click`,()=>{this.onItemSelect?.(e.intent),this.hide()}),o.appendChild(t)}n.appendChild(o),this.menuElement=o;let c=e=>{(e instanceof KeyboardEvent&&e.key===`Escape`||e instanceof MouseEvent&&!o.contains(e.target))&&this.hide()};document.addEventListener(`mousedown`,c),document.addEventListener(`keydown`,c),this.removeHandler=()=>{document.removeEventListener(`mousedown`,c),document.removeEventListener(`keydown`,c)}}hide(){this.menuElement?.remove(),this.menuElement=null,this.removeHandler?.(),this.removeHandler=null}destroy(){this.hide(),this.onItemSelect=null}};function ma(e,t,n={}){let r=Math.max(Math.abs(t)*(n.riskFraction??.01),1e-8),i=r*(n.riskReward??2);return e===`buy`?{side:e,entry:t,stopLoss:t-r,takeProfit:t+i}:{side:e,entry:t,stopLoss:t+r,takeProfit:t-i}}function ha(e){let t=Math.abs(e.entry-e.stopLoss);return t===0?0:Math.abs(e.takeProfit-e.entry)/t}var ga=6,_a=class{draft=null;dragging=null;defaults;constructor(e={}){this.defaults=e}start(e,t){this.draft=ma(e,t,this.defaults),this.dragging=null}cancel(){this.draft=null,this.dragging=null}isActive(){return this.draft!==null}getDraft(){return this.draft?{...this.draft}:null}hitTest(e,t){if(!this.draft)return null;let n=[`entry`,`sl`,`tp`],r=null,i=ga;for(let a of n){let n=o(this.priceOf(a),t),s=Math.abs(n-e.y);s<=i&&(i=s,r=a)}return r}beginDrag(e,t){let n=this.hitTest(e,t);return n?(this.dragging=n,!0):!1}drag(e,t){if(!this.draft||!this.dragging)return!1;let n=u(e.y,t);return this.draft=va(this.draft,this.dragging,n),!0}endDrag(){this.dragging=null}isDragging(){return this.dragging!==null}priceOf(e){let t=this.draft;return e===`entry`?t.entry:e===`sl`?t.stopLoss:t.takeProfit}render(e,t,n,r=2){let i=this.draft;if(!i)return;let{chartRect:a}=t,s=a.x,c=a.x+a.width,l=o(i.entry,t),u=o(i.stopLoss,t),d=o(i.takeProfit,t),f=n.candleUp,p=n.candleDown;e.save(),e.globalAlpha=.12,e.fillStyle=f,e.fillRect(s,Math.min(l,d),a.width,Math.abs(d-l)),e.fillStyle=p,e.fillRect(s,Math.min(l,u),a.width,Math.abs(u-l)),e.globalAlpha=1,ya(e,s,c,l,n.text,[6,3]),ya(e,s,c,d,f,[]),ya(e,s,c,u,p,[]);let m=ha(i),h=i.side===`buy`?`LONG`:`SHORT`;ba(e,s+6,l,`${h} entry ${i.entry.toFixed(r)}`,n.text,n.background),ba(e,s+6,d,`TP ${i.takeProfit.toFixed(r)} ยท ${m.toFixed(2)}R`,f,n.background),ba(e,s+6,u,`SL ${i.stopLoss.toFixed(r)}`,p,n.background);for(let[r,a]of[[i.entry,n.text],[i.takeProfit,f],[i.stopLoss,p]]){let n=o(r,t);e.fillStyle=a,e.beginPath(),e.arc(c-6,n,3.5,0,Math.PI*2),e.fill()}e.restore()}};function va(e,t,n){let r=e.side===`buy`;if(t===`entry`){let t=n-e.entry;return{side:e.side,entry:n,stopLoss:e.stopLoss+t,takeProfit:e.takeProfit+t}}if(t===`sl`){let t=r?Math.min(n,e.entry):Math.max(n,e.entry);return{...e,stopLoss:t}}let i=r?Math.max(n,e.entry):Math.min(n,e.entry);return{...e,takeProfit:i}}function ya(e,t,n,r,i,a){e.strokeStyle=i,e.lineWidth=1,e.setLineDash(a),e.beginPath(),e.moveTo(t,Math.round(r)+.5),e.lineTo(n,Math.round(r)+.5),e.stroke(),e.setLineDash([])}function ba(e,t,n,r,i,a){e.font=`600 10px system-ui, sans-serif`,e.textBaseline=`middle`,e.textAlign=`left`;let o=e.measureText(r).width;e.globalAlpha=.85,e.fillStyle=a,e.fillRect(t-3,n-8,o+6,16),e.globalAlpha=1,e.fillStyle=i,e.fillText(r,t,n+.5)}function xa(e,t,n){return n==null?`limit`:e===`buy`?t<=n?`limit`:`stop`:t>=n?`limit`:`stop`}var Sa=6,Ca=class{draft=null;dragging=!1;start(e,t,n=1){this.draft={side:e,price:t,quantity:n},this.dragging=!1}cancel(){this.draft=null,this.dragging=!1}isActive(){return this.draft!==null}isDragging(){return this.dragging}getDraft(){return this.draft?{...this.draft}:null}setPrice(e){return this.draft?(this.draft={...this.draft,price:e},!0):!1}toIntent(e){return this.draft?{side:this.draft.side,type:xa(this.draft.side,this.draft.price,e),price:this.draft.price,quantity:this.draft.quantity}:null}hitTest(e,t){return this.draft?Math.abs(o(this.draft.price,t)-e.y)<=Sa:!1}beginDrag(e,t){return this.hitTest(e,t)?(this.dragging=!0,!0):!1}drag(e,t){return!this.draft||!this.dragging?!1:this.setPrice(u(e.y,t))}endDrag(){this.dragging=!1}render(e,t,n,r,i=2){let a=this.draft;if(!a)return;let{chartRect:s}=t,c=s.x,l=s.x+s.width,u=o(a.price,t),d=xa(a.side,a.price,r),f=a.side===`buy`?n.candleUp:n.candleDown;e.save(),wa(e,c,l,u,f,[6,3]);let p=a.side===`buy`?`BUY`:`SELL`;Ta(e,c+6,u,`${p} ${d.toUpperCase()} ${a.price.toFixed(i)}`,f,n.background),e.fillStyle=f,e.beginPath(),e.arc(l-6,u,3.5,0,Math.PI*2),e.fill(),e.restore()}};function wa(e,t,n,r,i,a){e.strokeStyle=i,e.lineWidth=1,e.setLineDash(a),e.beginPath(),e.moveTo(t,Math.round(r)+.5),e.lineTo(n,Math.round(r)+.5),e.stroke(),e.setLineDash([])}function Ta(e,t,n,r,i,a){e.font=`600 10px system-ui, sans-serif`,e.textBaseline=`middle`,e.textAlign=`left`;let o=e.measureText(r).width;e.globalAlpha=.85,e.fillStyle=a,e.fillRect(t-3,n-8,o+6,16),e.globalAlpha=1,e.fillStyle=i,e.fillText(r,t,n+.5)}var Ea=class{orders=[];positions=[];depthData=null;currentPrice=null;config;orderRenderer=new ia;positionRenderer=new ua;depthOverlay=new da;dragHandler;contextMenu=new pa;bracket=new _a;orderDraft=new Ca;requestRender=null;eventCallback=null;container=null;constructor(t){this.config={...e.DEFAULT_TRADING_CONFIG,...t},this.dragHandler=new fa(this.config.dragThreshold),this.contextMenu.onItemSelect=e=>{this.eventCallback?.(`orderPlace`,e)}}setContainer(e){this.container=e}setRequestRender(e){this.requestRender=e}setEventCallback(e){this.eventCallback=e}setOrders(e){this.orders=e,this.requestRender?.()}setPositions(e){this.positions=e,this.requestRender?.()}setDepthData(e){this.depthData=e,this.requestRender?.()}setCurrentPrice(e){this.currentPrice=e,this.requestRender?.()}setConfig(e){Object.assign(this.config,e),this.requestRender?.()}startBracket(e,t){this.bracket.start(e,t),this.requestRender?.()}cancelBracket(){this.bracket.isActive()&&(this.bracket.cancel(),this.requestRender?.())}confirmBracket(){let e=this.bracket.getDraft();return e?(this.eventCallback?.(`bracketPlace`,{side:e.side,entry:e.entry,stopLoss:e.stopLoss,takeProfit:e.takeProfit,riskReward:ha(e)}),this.bracket.cancel(),this.requestRender?.(),!0):!1}isBracketActive(){return this.bracket.isActive()}startOrderDraft(e,t){this.orderDraft.start(e,t),this.requestRender?.()}cancelOrderDraft(){this.orderDraft.isActive()&&(this.orderDraft.cancel(),this.requestRender?.())}confirmOrderDraft(){let e=this.orderDraft.toIntent(this.currentPrice);return e?(this.eventCallback?.(`orderPlace`,e),this.orderDraft.cancel(),this.requestRender?.(),!0):!1}isOrderDraftActive(){return this.orderDraft.isActive()}isOverDraggableLine(e,t,n=8){if(!this.config.enabled)return!1;let r=r=>r!==void 0&&Math.abs(e.y-o(r,t))<=n;for(let e of this.orders)if(e.draggable!==!1&&r(e.price))return!0;for(let e of this.positions)if(r(e.stopLoss)||r(e.takeProfit))return!0;return!1}onPointerDown(e,t){return this.config.enabled?this.bracket.isActive()&&this.bracket.beginDrag(e,t)||this.orderDraft.isActive()&&this.orderDraft.beginDrag(e,t)?(this.requestRender?.(),!0):this.dragHandler.onPointerDown(e,this.orders,this.positions,t,8):!1}onPointerMove(e,t){if(this.bracket.isDragging()){let n=this.bracket.drag(e,t);return n&&this.requestRender?.(),n}if(this.orderDraft.isDragging()){let n=this.orderDraft.drag(e,t);return n&&this.requestRender?.(),n}if(!this.dragHandler.isActive())return!1;let n=this.dragHandler.onPointerMove(e,t);return n&&this.requestRender?.(),n}onPointerUp(){if(this.bracket.isDragging())return this.bracket.endDrag(),this.requestRender?.(),!0;if(this.orderDraft.isDragging())return this.orderDraft.endDrag(),this.requestRender?.(),!0;let e=this.dragHandler.onPointerUp();return e?(e.sourceType===`order`?this.eventCallback?.(`orderModify`,{orderId:e.id,newPrice:e.newPrice,previousPrice:e.previousPrice}):this.eventCallback?.(`positionModify`,{positionId:e.id,[e.sourceType]:e.newPrice}),this.requestRender?.(),!0):!1}onContextMenu(e,t){if(!this.config.enabled||!this.config.contextMenu?.enabled||!this.container)return!1;let n=u(e.y,t);return this.contextMenu.show(e,n,this.container,this.config),!0}render(e,t,n){this.config.enabled&&(this.depthData&&this.depthOverlay.render(e,this.depthData,t,this.config),this.positions.length>0&&this.positionRenderer.render(e,this.positions,this.currentPrice,t,n,this.config),this.orders.length>0&&this.orderRenderer.render(e,this.orders,t,n,this.config,this.dragHandler.getDragState()),this.bracket.isActive()&&this.bracket.render(e,t,n,this.config.pricePrecision??2),this.orderDraft.isActive()&&this.orderDraft.render(e,t,n,this.currentPrice,this.config.pricePrecision??2))}renderAxisBadges(e,t,n){this.config.enabled&&(this.positions.length>0&&this.positionRenderer.renderAxisBadges(e,this.positions,t,n,this.config),this.orders.length>0&&this.orderRenderer.renderAxisBadges(e,this.orders,t,n,this.config,this.dragHandler.getDragState()))}destroy(){this.contextMenu.destroy()}},Da=class{constructor(e){this.manager=e}render(e,t,n){this.manager.render(e,t,n)}renderAxisBadges(e,t,n){this.manager.renderAxisBadges(e,t,n)}},Oa=class{name=`paper`;state=`disconnected`;listeners=new Map;orders=[];positions=[];markPrice;seq=0;constructor(e={}){this.markPrice=e.markPrice??0}connect(e){this.state=`connected`,this.emit(`connectionChange`,this.state),this.emit(`orders`,this.orders),this.emit(`positions`,this.positions)}disconnect(){this.state=`disconnected`,this.emit(`connectionChange`,this.state)}getConnectionState(){return this.state}setMarkPrice(e){this.markPrice=e,this.checkPendingOrders(),this.checkStops()}getOrders(){return[...this.orders]}getPositions(){return[...this.positions]}async placeOrder(e){let t={id:this.nextId(`ord`),side:e.side,type:e.type,price:e.price,stopPrice:e.stopPrice,quantity:e.quantity??1,label:e.type===`market`?void 0:ka(e.type),draggable:!0};return e.type===`market`?this.fill(t,this.markPrice||e.price):(this.orders=[...this.orders,t],this.emit(`orders`,this.orders)),t}async modifyOrder(e){this.orders=this.orders.map(t=>t.id===e.orderId?{...t,price:e.newPrice}:t),this.emit(`orders`,this.orders)}async cancelOrder(e){this.orders=this.orders.filter(t=>t.id!==e.orderId),this.emit(`orders`,this.orders)}async modifyPosition(e){this.positions=this.positions.map(t=>t.id===e.positionId?{...t,stopLoss:e.stopLoss??t.stopLoss,takeProfit:e.takeProfit??t.takeProfit}:t),this.emit(`positions`,this.positions)}async closePosition(e){this.positions=this.positions.filter(t=>t.id!==e.positionId),this.emit(`positions`,this.positions)}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}dispose(){this.disconnect(),this.listeners.clear(),this.orders=[],this.positions=[]}fill(e,t){this.orders=this.orders.filter(t=>t.id!==e.id);let n={id:this.nextId(`pos`),side:e.side,entryPrice:t,quantity:e.quantity};this.positions=[...this.positions,n];let r={orderId:e.id,side:e.side,price:t,quantity:e.quantity,time:Date.now()};this.emit(`fill`,r),this.emit(`orders`,this.orders),this.emit(`positions`,this.positions)}checkPendingOrders(){let e=this.orders.filter(e=>this.isTriggered(e));for(let t of e)this.fill(t,t.type===`limit`?t.price:t.stopPrice??t.price)}isTriggered(e){if(e.type===`limit`)return e.side===`buy`?this.markPrice<=e.price:this.markPrice>=e.price;if(e.type===`stop`||e.type===`stopLimit`){let t=e.stopPrice??e.price;return e.side===`buy`?this.markPrice>=t:this.markPrice<=t}return!1}checkStops(){let e=[],t=!1;for(let n of this.positions){let r=n.stopLoss!==void 0&&(n.side===`buy`?this.markPrice<=n.stopLoss:this.markPrice>=n.stopLoss),i=n.takeProfit!==void 0&&(n.side===`buy`?this.markPrice>=n.takeProfit:this.markPrice<=n.takeProfit);if(r||i){t=!0;continue}e.push(n)}t&&(this.positions=e,this.emit(`positions`,this.positions))}nextId(e){return`${e}-${++this.seq}`}emit(e,t){let n=this.listeners.get(e);if(n){let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}}};function ka(e){switch(e){case`stop`:return`STOP`;case`stopLimit`:return`STOP LIMIT`;default:return`LIMIT`}}var K=class{listeners=new Map;on(e,t){let n=this.listeners.get(e);return n||(n=new Set,this.listeners.set(e,n)),n.add(t),()=>n.delete(t)}once(e,t){let n=this.on(e,e=>{n(),t(e)});return n}off(e,t){this.listeners.get(e)?.delete(t)}emit(e,t){let n=this.listeners.get(e);if(n)for(let e of n)e(t)}removeAllListeners(){this.listeners.clear()}},Aa=class extends K{currentBar=null;timeframeMs;tickRing;ringHead=0;ringCount=0;ringCapacity;constructor(t,n=1e3){super(),this.timeframeMs=(0,e.timeframeToMs)(t),this.ringCapacity=n,this.tickRing=Array(n)}setTimeframe(t){this.timeframeMs=(0,e.timeframeToMs)(t),this.currentBar=null,this.ringHead=0,this.ringCount=0}processTick(e){let t=(this.ringHead+this.ringCount)%this.ringCapacity;this.tickRing[t]=e,this.ringCount<this.ringCapacity?this.ringCount++:this.ringHead=(this.ringHead+1)%this.ringCapacity;let n=this.alignToTimeframe(e.time);!this.currentBar||this.currentBar.time!==n?(this.currentBar&&(this.currentBar.closed=!0,this.emit(`barClose`,this.currentBar)),this.currentBar={time:n,open:e.price,high:e.price,low:e.price,close:e.price,volume:e.volume,closed:!1,tickCount:1}):(this.currentBar.high=Math.max(this.currentBar.high,e.price),this.currentBar.low=Math.min(this.currentBar.low,e.price),this.currentBar.close=e.price,this.currentBar.volume+=e.volume,this.currentBar.tickCount++),this.emit(`bar`,this.currentBar)}processBar(e,t){if(t&&this.currentBar&&this.currentBar.time===e.time)this.currentBar={...e,closed:!0,tickCount:this.currentBar.tickCount+1},this.emit(`barClose`,this.currentBar),this.currentBar=null;else if(!t)this.currentBar={...e,closed:!1,tickCount:(this.currentBar?.tickCount??0)+1},this.emit(`bar`,this.currentBar);else{let t={...e,closed:!0,tickCount:1};this.emit(`barClose`,t),this.currentBar=null}}getCurrentBar(){return this.currentBar?{...this.currentBar}:null}getTickBuffer(){let e=Array(this.ringCount);for(let t=0;t<this.ringCount;t++)e[t]=this.tickRing[(this.ringHead+t)%this.ringCapacity];return e}reset(){this.currentBar=null,this.ringHead=0,this.ringCount=0}alignToTimeframe(e){return Math.floor(e/this.timeframeMs)*this.timeframeMs}},ja=class extends K{config;attempt=0;timer=null;active=!1;constructor(t){super(),this.config={...e.DEFAULT_RECONNECT,...t}}schedule(e){if(!this.config.enabled||!this.active)return;if(this.attempt++,this.attempt>this.config.maxRetries){this.emit(`giveUp`,{attempts:this.attempt-1}),this.active=!1;return}let t=this.computeDelay();this.emit(`attempt`,{attempt:this.attempt,delay:t}),this.timer=setTimeout(()=>{this.timer=null,this.active&&e()},t)}onConnected(){this.attempt=0,this.cancel(),this.emit(`success`,void 0)}start(){this.active=!0}stop(){this.active=!1,this.cancel(),this.attempt=0}cancel(){this.timer&&=(clearTimeout(this.timer),null)}getAttempt(){return this.attempt}isActive(){return this.active}computeDelay(){let e=this.config.baseDelay,t=this.config.backoffMultiplier**(this.attempt-1),n=Math.min(e*t,this.config.maxDelay),r=n*.25*(Math.random()*2-1);return Math.max(0,Math.round(n+r))}},Ma=class{price=null;previousClose=null;visible=!0;flashUntil=0;pricePrecision=null;locale=`en-US`;setLocale(e){this.locale=e}setPrice(e,t){this.price!==null&&e!==this.price&&(this.flashUntil=Date.now()+300),this.previousClose=t??this.price??e,this.price=e}setVisible(e){this.visible=e}isVisible(){return this.visible}setPricePrecision(e){this.pricePrecision=e}getPrice(){return this.price}render(t,n,r){if(!this.visible||this.price===null)return;let i=o(this.price,n),{chartRect:a}=n;if(i<a.y||i>a.y+a.height)return;let s=this.previousClose===null||this.price>=this.previousClose?r.candleUp??`#1fa874`:r.candleDown??`#e8505b`,c=Date.now()<this.flashUntil;t.setLineDash([4,3]),t.strokeStyle=s,t.lineWidth=1,t.globalAlpha=c?1:.7,t.beginPath(),t.moveTo(a.x,Math.round(i)+.5),t.lineTo(a.x+a.width,Math.round(i)+.5),t.stroke(),t.setLineDash([]),t.globalAlpha=1;let l=a.x+a.width+1,u=this.pricePrecision??(0,e.autoPricePrecision)(n.priceRange.min,n.priceRange.max),d=(0,e.formatPrice)(this.price,u,this.locale);t.font=`bold 11px ${r.font.family}`;let f=t.measureText(d).width,p=n.priceAxisWidth??e.PRICE_AXIS_WIDTH,m=Math.min(f+12,p-2);t.fillStyle=s,t.fillRect(l,i-10,m,20);let h=l-5;t.beginPath(),t.moveTo(h,i),t.lineTo(h+5,i-5),t.lineTo(h+5,i+5),t.closePath(),t.fill(),t.fillStyle=`#FFFFFF`,t.textBaseline=`middle`,t.textAlign=`left`,t.fillText(d,l+5,i)}},Na=class extends K{config=null;adapter=null;aggregator=null;reconnector;priceLine=new Ma;state=`disconnected`;lastPrice=null;previousClose=null;unsubscribers=[];heartbeatTimer=null;lastMessageTime=0;connectSeq=0;constructor(){super(),this.reconnector=new ja,this.wireReconnector()}async connect(t){this.disconnect(),this.config={...e.DEFAULT_STREAM_CONFIG,...t},this.adapter=t.adapter,this.aggregator=new Aa(t.timeframe),this.reconnector.removeAllListeners(),this.reconnector.stop(),this.reconnector=new ja(t.reconnect??e.DEFAULT_RECONNECT),this.wireReconnector(),this.aggregator.on(`bar`,e=>{this.emit(`barUpdate`,e),this.updatePrice(e.close)}),this.aggregator.on(`barClose`,e=>{this.previousClose=e.close,this.emit(`barClose`,e)}),this.wireAdapter(),this.reconnector.start(),await this.doConnect()}disconnect(){this.connectSeq++,this.reconnector.stop(),this.stopHeartbeat();for(let e of this.unsubscribers)e();this.unsubscribers=[],this.adapter&&=(this.adapter.disconnect(),null),this.aggregator?.reset(),this.aggregator?.removeAllListeners(),this.aggregator=null,this.config=null,this.lastPrice=null,this.previousClose=null,this.setState(`disconnected`)}async switchTo(e,t){!this.config||!this.adapter||(this.reconnector.stop(),this.adapter.disconnect(),this.reconnector.start(),this.aggregator?.reset(),this.aggregator?.setTimeframe(t),this.lastPrice=null,this.previousClose=null,this.config.symbol=e,this.config.timeframe=t,await this.doConnect())}getConnectionState(){return this.state}getConnectionInfo(){return{state:this.state,reconnectAttempt:this.reconnector.getAttempt(),lastMessageTime:this.lastMessageTime}}getLastPrice(){return this.lastPrice}async doConnect(){if(!this.config||!this.adapter)return;let e=++this.connectSeq,{symbol:t,timeframe:n}=this.config;this.setState(`connecting`);try{let r=await this.adapter.fetchHistory(t,n,this.config.historyLimit??500);if(e!==this.connectSeq||!this.adapter)return;r.length>0&&(this.previousClose=r[r.length-1].close,this.updatePrice(r[r.length-1].close)),this.emit(`snapshot`,r),this.adapter.connect({symbol:t,timeframe:n}),this.startHeartbeat()}catch(t){if(e!==this.connectSeq)return;let n=t instanceof Error?t.message:String(t);this.emit(`error`,{message:n,code:`CONNECT_FAILED`}),this.setState(`error`),this.reconnector.schedule(()=>this.doConnect())}}wireReconnector(){this.reconnector.on(`attempt`,({attempt:e,delay:t})=>{this.setState(`reconnecting`),this.emit(`connectionChange`,{state:`reconnecting`,reconnectAttempt:e,lastMessageTime:this.lastMessageTime})}),this.reconnector.on(`giveUp`,({attempts:e})=>{this.setState(`error`),this.emit(`error`,{message:`Reconnection failed after ${e} attempts`,code:`RECONNECT_EXHAUSTED`})})}wireAdapter(){if(!this.adapter)return;let e=this.adapter,t=e=>{let t=e.data;this.lastMessageTime=Date.now(),t===`connected`?(this.reconnector.onConnected(),this.setState(`connected`)):(t===`disconnected`||t===`error`)&&this.reconnector.schedule(()=>this.doConnect())};e.on(`connectionChange`,t),this.unsubscribers.push(()=>e.off(`connectionChange`,t));let n=e=>{this.lastMessageTime=Date.now();let t=e.data;this.emit(`tick`,t),this.config?.aggregateTicks&&this.aggregator?this.aggregator.processTick(t):this.updatePrice(t.price)};e.on(`tick`,n),this.unsubscribers.push(()=>e.off(`tick`,n));let r=e=>{this.lastMessageTime=Date.now();let{bar:t,closed:n}=e.data;this.aggregator&&this.aggregator.processBar(t,n)};e.on(`bar`,r),this.unsubscribers.push(()=>e.off(`bar`,r));let i=e=>{this.emit(`error`,{message:e.data?.message??`Adapter error`})};e.on(`error`,i),this.unsubscribers.push(()=>e.off(`error`,i))}updatePrice(e){e!==this.lastPrice&&(this.lastPrice=e,this.priceLine.setPrice(e,this.previousClose??void 0),this.emit(`priceChange`,{price:e,previousClose:this.previousClose}))}setState(e){this.state!==e&&(this.state=e,this.emit(`connectionChange`,{state:e,reconnectAttempt:this.reconnector.getAttempt(),lastMessageTime:this.lastMessageTime}))}startHeartbeat(){this.stopHeartbeat(),this.heartbeatTimer=setInterval(()=>{Date.now()-this.lastMessageTime>6e4&&this.state===`connected`&&(this.emit(`error`,{message:`Heartbeat timeout`,code:`HEARTBEAT_TIMEOUT`}),this.adapter?.disconnect(),this.reconnector.schedule(()=>this.doConnect()))},3e4)}stopHeartbeat(){this.heartbeatTimer&&=(clearInterval(this.heartbeatTimer),null)}dispose(){this.disconnect(),this.removeAllListeners()}},Pa=class extends K{data;speed;index;status=`idle`;timer=null;constructor(e){if(super(),e.data.length===0)throw Error(`ReplayController requires non-empty data`);this.data=e.data,this.speed=Math.max(.01,e.speed??1),this.index=Math.max(0,Math.min(e.startIndex??0,e.data.length)),e.autoStart&&this.start()}getStatus(){return this.status}getIndex(){return this.index}getTotal(){return this.data.length}getPrefix(){return this.data.slice(0,this.index)}start(){if(this.status!==`playing`){if(this.index>=this.data.length){this.transition(`finished`);return}this.transition(`playing`),this.scheduleNext()}}pause(){this.status===`playing`&&(this.clearTimer(),this.transition(`paused`))}resume(){this.status===`paused`&&this.start()}stop(){this.clearTimer(),this.index=0,this.transition(`idle`)}step(e=1){if(!(e<=0)){this.clearTimer();for(let t=0;t<e;t++)if(!this.emitNext())return;this.status!==`finished`&&this.transition(`paused`)}}seek(e){let t=Math.max(0,Math.min(e,this.data.length));this.clearTimer(),this.index=t;let n=t>=this.data.length?`finished`:`paused`;this.transition(n)}setSpeed(e){this.speed=Math.max(.01,e),this.status===`playing`&&(this.clearTimer(),this.scheduleNext())}destroy(){this.clearTimer(),this.removeAllListeners()}scheduleNext(){let e=1e3/this.speed;this.timer=setTimeout(()=>{this.timer=null,this.status===`playing`&&this.emitNext()&&this.scheduleNext()},e)}emitNext(){if(this.index>=this.data.length)return this.transition(`finished`),this.emit(`finished`,{total:this.data.length}),!1;let e=this.data[this.index],t=this.index;return this.index++,this.emit(`bar`,{bar:e,index:t,total:this.data.length}),this.index>=this.data.length?(this.transition(`finished`),this.emit(`finished`,{total:this.data.length}),!1):!0}clearTimer(){this.timer!==null&&(clearTimeout(this.timer),this.timer=null)}transition(e){this.status!==e&&(this.status=e,this.emit(`stateChange`,{status:e,index:this.index,total:this.data.length}))}};function Fa(e){if(!Array.isArray(e)||e.length<6)return null;let t=e[0];if(typeof t!=`number`||!Number.isFinite(t))return null;let n=q(e[1]),r=q(e[2]),i=q(e[3]),a=q(e[4]),o=q(e[5]);return n===null||r===null||i===null||a===null||o===null?null:{time:t,open:n,high:r,low:i,close:a,volume:o}}function Ia(e){if(!La(e))return null;let t=e.t;if(typeof t!=`number`||!Number.isFinite(t))return null;let n=q(e.o),r=q(e.h),i=q(e.l),a=q(e.c),o=q(e.v);if(n===null||r===null||i===null||a===null||o===null)return null;let s=typeof e.x==`boolean`?e.x:!1;return{bar:{time:t,open:n,high:r,low:i,close:a,volume:o},closed:s}}function q(e){if(typeof e==`number`)return Number.isFinite(e)?e:null;if(typeof e==`string`){let t=parseFloat(e);return Number.isFinite(t)?t:null}return null}function La(e){return typeof e==`object`&&!!e}var Ra={"1s":`1s`,"1m":`1m`,"3m":`3m`,"5m":`5m`,"15m":`15m`,"30m":`30m`,"1h":`1h`,"2h":`2h`,"4h":`4h`,"6h":`6h`,"8h":`8h`,"12h":`12h`,"1d":`1d`,"3d":`3d`,"1w":`1w`,"1M":`1M`},za=class{name=`binance`;ws=null;state=`disconnected`;listeners=new Map;config=null;restBase;wsBase;constructor(e){this.restBase=e?.restBase??`https://api.binance.com/api/v3`,this.wsBase=e?.wsBase??`wss://stream.binance.com:9443/ws`}connect(e){this.config=e,this.connectWs()}disconnect(){if(this.ws){let e=this.ws;e.onopen=null,e.onmessage=null,e.onerror=null,e.onclose=null,e.close(),this.ws=null}this.setState(`disconnected`)}getConnectionState(){return this.state}async fetchHistory(e,t,n=500){let r=Ra[t]??`15m`,i=`${this.restBase}/klines?symbol=${e}&interval=${r}&limit=${n}`,a=await fetch(i);if(!a.ok)throw Error(`Binance REST error: ${a.status}`);let o=await a.json();if(!Array.isArray(o))return[];let s=[];for(let e of o){let t=Fa(e);t&&s.push(t)}return s}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}dispose(){this.disconnect(),this.listeners.clear()}connectWs(){if(!this.config)return;let e=`${this.config.symbol.toLowerCase()}@kline_${Ra[this.config.timeframe]??`15m`}`,t=`${this.wsBase}/${e}`;this.setState(`connecting`);try{this.ws=new WebSocket(t)}catch{this.setState(`error`),this.emitEvent(`error`,{message:`WebSocket creation failed`}),this.emitEvent(`connectionChange`,`error`);return}this.ws.onopen=()=>{this.setState(`connected`),this.emitEvent(`connectionChange`,`connected`)},this.ws.onmessage=e=>{let t;try{t=JSON.parse(typeof e.data==`string`?e.data:``)}catch{return}typeof t==`object`&&t&&t.e===`kline`&&this.handleKline(t.k)},this.ws.onerror=()=>{this.setState(`error`),this.emitEvent(`error`,{message:`WebSocket error`})},this.ws.onclose=()=>{this.setState(`disconnected`),this.emitEvent(`connectionChange`,`disconnected`)}}handleKline(e){let t=Ia(e);if(!t)return;let{bar:n,closed:r}=t;this.emitEvent(`bar`,{bar:n,closed:r}),this.emitEvent(`tick`,{time:Date.now(),price:n.close,volume:n.volume})}setState(e){this.state=e}emitEvent(e,t){let n=this.listeners.get(e);if(n){let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}}},Ba=class{name=`mock`;state=`disconnected`;listeners=new Map;config=null;options;tickTimer=null;currentPrice;constructor(e){this.options={basePrice:100,volatility:1.5,tickInterval:2e3,historySize:500,...e},this.currentPrice=this.options.basePrice}connect(e){this.config=e,this.state=`connected`,this.emitEvent(`connectionChange`,`connected`),this.startTicking()}disconnect(){this.stopTicking(),this.state=`disconnected`,this.emitEvent(`connectionChange`,`disconnected`)}getConnectionState(){return this.state}async fetchHistory(e,t,n){return this.options.historyGenerator?this.options.historyGenerator(e,t,n??this.options.historySize):this.generateHistory(t,n??this.options.historySize)}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}dispose(){this.disconnect(),this.listeners.clear()}generateHistory(t,n){let r=[],i=Date.now(),a=(0,e.timeframeToMs)(t),o=this.options.basePrice,s=this.options.volatility/100;for(let e=n-1;e>=0;e--){let t=i-e*a,n=(Math.random()-.48)*o*s,c=o;o+=n;let l=Math.max(c,o)+Math.random()*o*s*.3,u=Math.min(c,o)-Math.random()*o*s*.3,d=Math.floor(1e4+Math.random()*1e5);r.push({time:t,open:c,high:l,low:u,close:o,volume:d})}return this.currentPrice=o,r}startTicking(){this.stopTicking();let t=this.options.tickInterval??2e3;this.tickTimer=setInterval(()=>{if(this.state!==`connected`||!this.config)return;let t=this.options.volatility/100,n=(Math.random()-.48)*this.currentPrice*t*.3;this.currentPrice+=n;let r=Date.now(),i=(0,e.timeframeToMs)(this.config.timeframe),a={time:Math.floor(r/i)*i,open:this.currentPrice-n,high:Math.max(this.currentPrice,this.currentPrice-n)+Math.abs(n)*.2,low:Math.min(this.currentPrice,this.currentPrice-n)-Math.abs(n)*.2,close:this.currentPrice,volume:Math.floor(100+Math.random()*5e3)};this.emitEvent(`bar`,{bar:a,closed:!1}),this.emitEvent(`tick`,{time:r,price:this.currentPrice,volume:a.volume})},t)}stopTicking(){this.tickTimer&&=(clearInterval(this.tickTimer),null)}emitEvent(e,t){let n=this.listeners.get(e);if(n){let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}}},Va=class{name;ws=null;state=`disconnected`;config=null;listeners=new Map;opts;constructor(e){this.opts=e,this.name=e.name}connect(e){this.config=e,this.openSocket()}disconnect(){let e=this.config;if(this.ws){if(this.opts.unsubscribeMessage&&e)try{this.sendMessage(this.opts.unsubscribeMessage(e))}catch{}let t=this.ws;t.onopen=null,t.onmessage=null,t.onerror=null,t.onclose=null,t.close(),this.ws=null}this.setState(`disconnected`)}getConnectionState(){return this.state}fetchHistory(e,t,n){return this.opts.fetchHistory(e,t,n??this.opts.defaultHistoryLimit??500)}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}dispose(){this.disconnect(),this.listeners.clear()}openSocket(){let e=this.config;if(!e)return;let t=this.opts.wsUrl(e);this.setState(`connecting`);let n;try{n=this.createSocket(t)}catch{this.setState(`error`),this.emitEvent(`error`,{message:`WebSocket creation failed`}),this.emitEvent(`connectionChange`,`error`);return}this.ws=n,n.onopen=()=>{if(this.setState(`connected`),this.emitEvent(`connectionChange`,`connected`),this.opts.subscribeMessage)try{this.sendMessage(this.opts.subscribeMessage(e))}catch{}},n.onmessage=t=>{let n=this.decode(t.data);if(n===void 0)return;let r;try{r=this.opts.parseMessage(n,e)}catch{return}r&&(r.bar&&this.emitEvent(`bar`,{bar:r.bar,closed:r.closed??!1}),r.tick?this.emitEvent(`tick`,r.tick):r.bar&&this.emitEvent(`tick`,{time:Date.now(),price:r.bar.close,volume:r.bar.volume}))},n.onerror=()=>{this.setState(`error`),this.emitEvent(`error`,{message:`WebSocket error`})},n.onclose=()=>{this.setState(`disconnected`),this.emitEvent(`connectionChange`,`disconnected`)}}sendMessage(e){e===void 0||!this.ws||this.ws.send(typeof e==`string`?e:JSON.stringify(e))}decode(e){if(this.opts.decode)try{return this.opts.decode(e)}catch{return}if(typeof e==`string`)try{return JSON.parse(e)}catch{return}return e}createSocket(e){if(this.opts.socketFactory)return this.opts.socketFactory(e);let t=globalThis.WebSocket;if(!t)throw Error(`No WebSocket implementation available`);return new t(e)}setState(e){this.state=e}emitEvent(e,t){let n=this.listeners.get(e);if(n){let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}}},Ha=class{name;state=`disconnected`;listeners=new Map;config=null;timer=null;lastBarTime=0;opts;constructor(e){this.opts=e,this.name=e.name}connect(e){this.config=e,this.lastBarTime=0,this.state=`connected`,this.emitEvent(`connectionChange`,`connected`),this.startPolling()}disconnect(){this.stopPolling(),this.state=`disconnected`,this.emitEvent(`connectionChange`,`disconnected`)}getConnectionState(){return this.state}fetchHistory(e,t,n){return this.opts.fetchBars(e,t,n??this.opts.defaultHistoryLimit??500)}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}dispose(){this.disconnect(),this.listeners.clear()}async poll(){let e=this.config;if(!e||this.state!==`connected`)return;let t;try{t=await this.opts.fetchBars(e.symbol,e.timeframe,this.opts.pollLimit??2)}catch(e){this.emitEvent(`error`,{message:`Poll failed`,cause:e});return}if(t.length===0)return;let n=t[t.length-1];if(this.lastBarTime>0&&n.time>this.lastBarTime){let e=t.find(e=>e.time===this.lastBarTime);e&&this.emitEvent(`bar`,{bar:e,closed:!0})}this.emitEvent(`bar`,{bar:n,closed:!1}),this.emitEvent(`tick`,{time:Date.now(),price:n.close,volume:n.volume}),this.lastBarTime=n.time}startPolling(){this.stopPolling(),this.poll();let e=this.opts.setInterval??((e,t)=>setInterval(e,t));this.timer=e(()=>{this.poll()},this.opts.intervalMs??5e3)}stopPolling(){this.timer!==null&&((this.opts.clearInterval??(e=>clearInterval(e)))(this.timer),this.timer=null)}emitEvent(e,t){let n=this.listeners.get(e);if(n){let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}}};function J(e){if(typeof e==`number`)return Number.isFinite(e)?e:null;if(typeof e==`string`){let t=parseFloat(e);return Number.isFinite(t)?t:null}return null}function Y(e){return typeof e==`object`&&!!e}var Ua={"1m":60,"5m":300,"15m":900,"1h":3600,"6h":21600,"1d":86400};function Wa(e){return Ua[e]??3600}var Ga=class extends Ha{constructor(e={}){let t=e.restBase??`https://api.exchange.coinbase.com`;super({name:`coinbase`,intervalMs:e.intervalMs??5e3,pollLimit:2,fetchBars:(e,n)=>Ka(t,e,n)})}};async function Ka(e,t,n){let r=`${e}/products/${t}/candles?granularity=${Wa(n)}`,i=await fetch(r);if(!i.ok)throw Error(`Coinbase REST error: ${i.status}`);return qa(await i.json())}function qa(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=Ja(n);e&&t.push(e)}return t.sort((e,t)=>e.time-t.time),t}function Ja(e){if(!Array.isArray(e)||e.length<6)return null;let t=J(e[0]),n=J(e[1]),r=J(e[2]),i=J(e[3]),a=J(e[4]),o=J(e[5]);return t===null||n===null||r===null||i===null||a===null||o===null?null:{time:t*1e3,open:i,high:r,low:n,close:a,volume:o}}var Ya={"1m":`1`,"3m":`3`,"5m":`5`,"15m":`15`,"30m":`30`,"1h":`60`,"2h":`120`,"4h":`240`,"6h":`360`,"12h":`720`,"1d":`D`,"1w":`W`,"1M":`M`};function Xa(e){return Ya[e]??`1`}var Za=class extends Va{constructor(e={}){let t=e.restBase??`https://api.bybit.com`,n=e.wsBase??`wss://stream.bybit.com/v5/public/spot`,r=e.category??`spot`;super({name:`bybit`,wsUrl:()=>n,subscribeMessage:e=>({op:`subscribe`,args:[`kline.${Xa(e.timeframe)}.${e.symbol}`]}),unsubscribeMessage:e=>({op:`unsubscribe`,args:[`kline.${Xa(e.timeframe)}.${e.symbol}`]}),parseMessage:Qa,fetchHistory:(e,n,i)=>$a(t,r,e,n,i)})}};function Qa(e){if(!Y(e)||typeof e.topic!=`string`||!e.topic.startsWith(`kline.`))return null;let t=e.data;if(!Array.isArray(t)||t.length===0)return null;let n=t[t.length-1];if(!Y(n))return null;let r=J(n.start),i=J(n.open),a=J(n.high),o=J(n.low),s=J(n.close),c=J(n.volume);if(r===null||i===null||a===null||o===null||s===null||c===null)return null;let l=typeof n.confirm==`boolean`?n.confirm:!1;return{bar:{time:r,open:i,high:a,low:o,close:s,volume:c},closed:l}}async function $a(e,t,n,r,i){let a=`${e}/v5/market/kline?category=${t}&symbol=${n}&interval=${Xa(r)}&limit=${Math.min(Math.max(i,1),1e3)}`,o=await fetch(a);if(!o.ok)throw Error(`Bybit REST error: ${o.status}`);return eo(await o.json())}function eo(e){if(!Y(e)||!Y(e.result))return[];let t=e.result.list;if(!Array.isArray(t))return[];let n=[];for(let e of t){let t=to(e);t&&n.push(t)}return n.sort((e,t)=>e.time-t.time),n}function to(e){if(!Array.isArray(e)||e.length<6)return null;let t=J(e[0]),n=J(e[1]),r=J(e[2]),i=J(e[3]),a=J(e[4]),o=J(e[5]);return t===null||n===null||r===null||i===null||a===null||o===null?null:{time:t,open:n,high:r,low:i,close:a,volume:o}}var no={"1m":1,"5m":5,"15m":15,"30m":30,"1h":60,"4h":240,"1d":1440,"1w":10080};function ro(e){return no[e]??1}var io=class extends Va{constructor(e={}){let t=e.restBase??`https://api.kraken.com`,n=e.wsBase??`wss://ws.kraken.com/v2`;super({name:`kraken`,wsUrl:()=>n,subscribeMessage:e=>({method:`subscribe`,params:{channel:`ohlc`,symbol:[e.symbol],interval:ro(e.timeframe)}}),unsubscribeMessage:e=>({method:`unsubscribe`,params:{channel:`ohlc`,symbol:[e.symbol],interval:ro(e.timeframe)}}),parseMessage:ao,fetchHistory:(e,n)=>oo(t,e,n)})}};function ao(e){if(!Y(e)||e.channel!==`ohlc`)return null;let t=e.data;if(!Array.isArray(t)||t.length===0)return null;let n=t[t.length-1];if(!Y(n))return null;let r=J(n.open),i=J(n.high),a=J(n.low),o=J(n.close),s=J(n.volume),c=typeof n.interval_begin==`string`?Date.parse(n.interval_begin):NaN;return r===null||i===null||a===null||o===null||s===null||!Number.isFinite(c)?null:{bar:{time:c,open:r,high:i,low:a,close:o,volume:s},closed:!1}}async function oo(e,t,n){let r=ro(n),i=t.replace(`/`,``),a=`${e}/0/public/OHLC?pair=${encodeURIComponent(i)}&interval=${r}`,o=await fetch(a);if(!o.ok)throw Error(`Kraken REST error: ${o.status}`);return so(await o.json())}function so(e){if(!Y(e)||!Y(e.result))return[];let t=null;for(let[n,r]of Object.entries(e.result))if(n!==`last`&&Array.isArray(r)){t=r;break}if(!Array.isArray(t))return[];let n=[];for(let e of t){let t=co(e);t&&n.push(t)}return n.sort((e,t)=>e.time-t.time),n}function co(e){if(!Array.isArray(e)||e.length<7)return null;let t=J(e[0]),n=J(e[1]),r=J(e[2]),i=J(e[3]),a=J(e[4]),o=J(e[6]);return t===null||n===null||r===null||i===null||a===null||o===null?null:{time:t*1e3,open:n,high:r,low:i,close:a,volume:o}}var lo={visible:!0,showSymbol:!0,showOHLC:!0,showChange:!0,showVolume:!0,position:`top-left`,fontSize:12},uo=class{config={...lo};symbol=``;timeframe=``;hoverBar=null;indicators=[];statusText=null;locale=`en-US`;pricePrecision=null;setConfig(e){Object.assign(this.config,e)}setPricePrecision(e){this.pricePrecision=e}setLocale(e){this.locale=e}setSymbol(e){this.symbol=e}setTimeframe(e){this.timeframe=e}setChartType(e){}setHoverBar(e){this.hoverBar=e}setIndicatorValues(e){this.indicators=e}setStatusText(e){this.statusText=e}getHeight(){if(!this.config.visible||this.config.position!==`top-left`)return 0;let e=this.config.fontSize,t=6;return this.config.showSymbol?t+=e+6:this.statusText&&(t+=e+4),this.config.showOHLC&&(t+=e+3),this.config.showVolume&&(t+=e+2),t}render(t,n,r,i){if(!this.config.visible||i.length===0)return;let a=this.hoverBar??i[i.length-1],o=i.length>1?i[i.length-2]:a,{chartRect:s}=n,c=this.config.fontSize,l=this.config.position===`top-left`,u=l?s.x+8:s.x+s.width-8,d=s.y+6;if(t.textAlign=l?`left`:`right`,t.textBaseline=`top`,this.config.showSymbol){t.font=`bold ${c+2}px ${r.font.family}`,t.fillStyle=r.text;let e=[this.symbol,this.timeframe].filter(Boolean).join(` ยท `),n=this.statusText?`${e} ${this.statusText}`:e;t.fillText(n,u,d),d+=c+6}else this.statusText&&(t.font=`${c}px ${r.font.family}`,t.fillStyle=r.textSecondary,t.fillText(this.statusText,u,d),d+=c+4);if(this.config.showOHLC){t.font=`${c}px ${r.font.family}`;let i=a.close>=a.open,s=this.pricePrecision??(0,e.autoPricePrecision)(n.priceRange.min,n.priceRange.max),f=t=>(0,e.formatPrice)(t,s,this.locale),p=[{label:`O`,value:f(a.open),color:r.text},{label:`H`,value:f(a.high),color:r.text},{label:`L`,value:f(a.low),color:r.text},{label:`C`,value:f(a.close),color:i?r.candleUp:r.candleDown}];if(this.config.showChange){let t=a.close-o.close,n=o.close===0?0:t/o.close*100,i=t>=0?`+`:``,s=(0,e.formatPrice)(n,2,this.locale);p.push({label:``,value:`${i}${f(t)} (${i}${s}%)`,color:t>=0?r.candleUp:r.candleDown})}let m=u;if(l)for(let e of p)e.label&&(t.fillStyle=r.textSecondary,t.fillText(e.label,m,d),m+=t.measureText(e.label+` `).width),t.fillStyle=e.color,t.fillText(e.value,m,d),m+=t.measureText(e.value+` `).width;else{let e=p.map(e=>`${e.label} ${e.value}`).join(` `);t.fillStyle=r.text,t.fillText(e,u,d)}d+=c+3}if(this.config.showVolume){t.font=`${c-1}px ${r.font.family}`,t.fillStyle=r.textSecondary;let e=a.volume>=1e6?`${(a.volume/1e6).toFixed(2)}M`:a.volume>=1e3?`${(a.volume/1e3).toFixed(2)}K`:a.volume.toFixed(0);t.fillText(`Vol ${e}`,u,d),d+=c+2}if(this.indicators.length>0){t.font=`${c-1}px ${r.font.family}`;let e=u;for(let n of this.indicators){t.fillStyle=n.color;let r=`${n.name} ${n.value}`;t.fillText(r,e,d),e+=t.measureText(r+` `).width}}}},fo=class{static toDataURL(e,t){let n=e.querySelectorAll(`canvas`);if(n.length===0)return``;let r=n[0],i=r.width,a=r.height,o=document.createElement(`canvas`);o.width=i,o.height=a;let s=o.getContext(`2d`);t&&(s.fillStyle=t,s.fillRect(0,0,i,a));let c=Array.from(n).sort((e,t)=>(parseInt(e.style.zIndex)||0)-(parseInt(t.style.zIndex)||0));for(let e of c)s.drawImage(e,0,0);return o.toDataURL(`image/png`)}static async toBlob(e,t){let n=this.toDataURL(e,t);return n?(await fetch(n)).blob():null}static download(e,t=`chart.png`,n){let r=this.toDataURL(e,n);if(!r)return;let i=document.createElement(`a`);i.href=r,i.download=t,document.body.appendChild(i),i.click(),document.body.removeChild(i)}},po=class{config=null;setConfig(e){this.config=e}render(e,t,n){if(!this.config?.text)return;let{chartRect:r}=t,i=this.config.fontSize??48,a=this.config.color??n.textSecondary;e.save(),e.globalAlpha=.07,e.font=`bold ${i}px ${n.font.family}`,e.fillStyle=a,e.textAlign=`center`,e.textBaseline=`middle`,e.fillText(this.config.text,r.x+r.width/2,r.y+r.height/2),e.restore()}},mo=class{visible=!0;timeframeMs=0;setVisible(e){this.visible=e}isVisible(){return this.visible}setTimeframeMs(e){this.timeframeMs=e}render(e,t,n,r){if(!this.visible||this.timeframeMs<=0||r.length===0)return;let i=r[r.length-1],o=(i.time>0xe8d4a51000?i.time:i.time*1e3)+this.timeframeMs-Date.now();if(o<=0)return;let s=this.formatRemaining(o),c=a(r.length-1,t),l=t.chartRect.y+t.chartRect.height-4;c<t.chartRect.x||c>t.chartRect.x+t.chartRect.width||(e.font=`${n.font.sizeSmall}px ${n.font.family}`,e.textBaseline=`bottom`,e.textAlign=`center`,e.fillStyle=n.textSecondary,e.fillText(s,c,l))}formatRemaining(e){let t=Math.ceil(e/1e3),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60;return n>0?`${n}:${String(r).padStart(2,`0`)}:${String(i).padStart(2,`0`)}`:`${r}:${String(i).padStart(2,`0`)}`}},ho=class{config={visible:!1};cachedBreaksTyped=[];cachedMedianStep=0;cacheValid=!1;lastDataLength=0;locale=`en-US`;setConfig(e){Object.assign(this.config,e)}setLocale(e){this.locale=e}isVisible(){return this.config.visible}setVisible(e){this.config.visible=e}computeBreaksTyped(e){if(e.length<2)return[];if(this.cacheValid&&e.length===this.lastDataLength)return this.cachedBreaksTyped;let t=[],n=new Date(this.toMs(e[0].time));for(let r=1;r<e.length;r++){let i=new Date(this.toMs(e[r].time));if(i.getFullYear()!==n.getFullYear())t.push({idx:r,kind:`year`,date:i});else if(i.getMonth()!==n.getMonth())t.push({idx:r,kind:`month`,date:i});else if(i.getDate()!==n.getDate()){let e=i.getDay()===1;t.push({idx:r,kind:e?`week`:`day`,date:i})}n=i}return this.lastDataLength=e.length,this.cachedBreaksTyped=t,this.cachedMedianStep=xo(e),this.cacheValid=!0,t}toMs(e){return e>0xe8d4a51000?e:e*1e3}render(e,t,n,r){if(!this.config.visible||r.length<2)return;let i=this.computeBreaksTyped(r);if(i.length===0||this.cachedMedianStep>=1380*60*1e3)return;let{chartRect:o}=t,s=this.config.color??n.axisLine,c=this.config.lineWidth??1,l=this.config.lineStyle??`dashed`;e.save(),l===`dashed`?e.setLineDash([6,4]):l===`dotted`&&e.setLineDash([2,3]),e.font=`600 11px ${n.font.family}`,e.textBaseline=`top`,e.textAlign=`left`;for(let r of i){let i=a(r.idx,t)-(t.barWidth+t.barSpacing)/2;if(i<o.x-1||i>o.x+o.width+1)continue;let l=Math.round(i)+.5,u=.25,d=c,f=null;r.kind===`day`?u=.22:r.kind===`week`?(u=.34,f=yo(r.date,this.locale)):r.kind===`month`?(u=.5,d=c+.5,f=bo(r.date,this.locale)):(u=.7,d=c+1,f=String(r.date.getFullYear())),e.globalAlpha=u,e.strokeStyle=s,e.lineWidth=d,e.beginPath(),e.moveTo(l,o.y),e.lineTo(l,o.y+o.height),e.stroke(),f&&(e.globalAlpha=Math.min(1,u+.35),e.fillStyle=n.textSecondary,e.fillText(f,l+4,o.y+4))}e.restore()}invalidateCache(){this.lastDataLength=0,this.cachedBreaksTyped=[],this.cachedMedianStep=0,this.cacheValid=!1}},go=new Map,_o=new Map;function vo(e,t,n){let r=e.get(t);return r||(r=new Intl.DateTimeFormat(t,n),e.set(t,r)),r}function yo(e,t){return vo(go,t,{month:`short`,day:`numeric`}).format(e)}function bo(e,t){return vo(_o,t,{month:`short`,year:`numeric`}).format(e)}function xo(e){if(e.length<2)return 0;let t=Math.min(50,e.length-1),n=[];for(let r=1;r<=t;r++){let t=e[r-1].time,i=e[r].time,a=t>0xe8d4a51000?t:t*1e3,o=i>0xe8d4a51000?i:i*1e3;n.push(o-a)}return n.sort((e,t)=>e-t),n[Math.floor(n.length/2)]}var So=864e5;function Co(e,t){let n=((e+t*6e4)%So+So)%So;return Math.floor(n/6e4)}function wo(e,t,n){return t===n?!0:t<n?e>=t&&e<n:e>=t||e<n}function To(e,t){let n=Co(e,t.tzOffsetMinutes);return t.windows&&t.windows.length>0?t.windows.some(e=>wo(n,e.startMinute,e.endMinute)):wo(n,t.startMinute,t.endMinute)}var Eo={startMinute:570,endMinute:960,tzOffsetMinutes:-300},Do=class{visible=!1;config={...Eo};setVisible(e){this.visible=e}isVisible(){return this.visible}setConfig(e){let t={...this.config,...e};t.windows=t.windows?t.windows.map(e=>({...e})):void 0,this.config=t}getConfig(){return{...this.config,windows:this.config.windows?.map(e=>({...e}))}}render(e,t,n,r){if(!this.visible||t.length===0)return;let{chartRect:i}=n,{from:o,to:s}=n.visibleRange,c=Math.max(0,o),l=Math.min(s,t.length-1);if(l<c)return;let u=n.barWidth+n.barSpacing,d=r.name===`light`;e.save(),e.fillStyle=d?`rgba(0,0,0,0.045)`:`rgba(0,0,0,0.28)`;let f=-1,p=(t,r)=>{let o=a(t,n)-u/2,s=a(r,n)+u/2;e.fillRect(o,i.y,s-o,i.height)};for(let e=c;e<=l;e++){let n=!To(t[e].time,this.config);n&&f===-1?f=e:!n&&f!==-1&&(p(f,e-1),f=-1)}f!==-1&&p(f,l),e.restore()}},Oo=1,ko=class extends K{alerts=[];lastValues=new Map;requestRender=null;pricePrecision=2;setRequestRender(e){this.requestRender=e}setPricePrecision(e){this.pricePrecision=e}addAlert(e,t=`crossing`,n,r=!1,i=`price`,a){let o=`tc_alert_${Oo++}`,s={id:o,price:e,condition:t,message:n,triggered:!1,repeating:r,channel:i,label:a};return this.alerts.push(s),this.emit(`added`,s),this.requestRender?.(),o}removeAlert(e){this.alerts=this.alerts.filter(t=>t.id!==e),this.emit(`removed`,e),this.requestRender?.()}getAlerts(){return[...this.alerts]}getAlertAtPoint(e,t,n=6){let{chartRect:r}=t;if(e.y<r.y||e.y>r.y+r.height)return null;let i=null,a=n;for(let n of this.alerts){if(n.channel!==`price`)continue;let r=Math.abs(o(n.price,t)-e.y);r<=a&&(a=r,i=n)}return i}updateAlertPrice(e,t){let n=this.alerts.find(t=>t.id===e);!n||!Number.isFinite(t)||(n.price=t,n.triggered=!1,this.emit(`updated`,{...n}),this.requestRender?.())}clearAlerts(){this.alerts=[],this.requestRender?.()}checkPrice(e){this.checkChannel(`price`,e)}checkChannel(e,t){if(!Number.isFinite(t))return;let n=this.lastValues.get(e);if(n===void 0){this.lastValues.set(e,t);return}for(let r of this.alerts){if(r.channel!==e)continue;let i=!1;switch(r.condition){case`crossingUp`:i=n<r.price&&t>=r.price;break;case`crossingDown`:i=n>r.price&&t<=r.price;break;case`crossing`:i=n<r.price&&t>=r.price||n>r.price&&t<=r.price;break;case`greaterThan`:i=t>r.price;break;case`lessThan`:i=t<r.price;break}i?r.triggered||(r.triggered=!0,this.emit(`triggered`,{...r})):r.repeating&&(r.triggered=!1)}this.lastValues.set(e,t)}clearLastValues(){this.lastValues.clear()}saveToStorage(e){try{let t=this.alerts.map(e=>({id:e.id,price:e.price,condition:e.condition,message:e.message,triggered:e.triggered,repeating:e.repeating,channel:e.channel,label:e.label}));localStorage.setItem(e,JSON.stringify(t))}catch{}}loadFromStorage(e){try{let t=localStorage.getItem(e);if(!t)return;let n=JSON.parse(t);if(!Array.isArray(n))return;for(let e of n)e.price!=null&&Number.isFinite(e.price)&&e.condition&&!e.triggered&&this.addAlert(e.price,e.condition,e.message,e.repeating??!1,e.channel??`price`,e.label)}catch{}}render(e,t,n){let{chartRect:r}=t;for(let i of this.alerts){if(i.channel!==`price`)continue;let a=o(i.price,t);if(a<r.y||a>r.y+r.height)continue;let s=i.triggered?`#f2a93b`:`#4c8dff`;e.setLineDash([2,6]),e.strokeStyle=s,e.lineWidth=1,e.beginPath(),e.moveTo(r.x,Math.round(a)+.5),e.lineTo(r.x+r.width,Math.round(a)+.5),e.stroke(),e.setLineDash([]),e.font=`10px ${n.font.family}`,e.fillStyle=s,e.textBaseline=`bottom`,e.textAlign=`right`;let c=`๐Ÿ”” ${i.price.toFixed(this.pricePrecision)}${i.message?` - ${i.message}`:``}`;e.fillText(c,r.x+r.width-4,a-2)}}},Ao=class extends K{data=[];cursor=-1;timer=null;state=`stopped`;config={speed:1,interval:500};load(e){this.stop(),this.data=e,this.cursor=-1}play(e){if(this.data.length!==0){if(e){let{startIndex:t,paused:n,...r}=e;Object.assign(this.config,r);let i=t===void 0?null:this.clamp(t);if(n){this.clearTimer(),this.seekTo(i??Math.max(0,this.cursor)),this.setState(`paused`);return}i!==null&&(this.cursor=i-1)}if(this.isAtEnd()){this.clearTimer(),this.setState(`paused`);return}this.clearTimer(),this.setState(`playing`),this.timer=setInterval(()=>this.tick(),this.config.interval/this.config.speed)}}pause(){this.clearTimer(),this.setState(`paused`)}resume(){this.state===`paused`&&this.play()}stop(){this.clearTimer(),this.cursor=-1,this.setState(`stopped`)}seekTo(e){this.data.length!==0&&(this.cursor=this.clamp(e),this.emit(`bar`,{bar:this.data[this.cursor],index:this.cursor,total:this.data.length}))}setSpeed(e){this.config.speed=e,this.state===`playing`&&this.play()}getState(){return this.state}isAtEnd(){return this.data.length>0&&this.cursor>=this.data.length-1}getProgress(){let e=this.data.length;return{current:Math.max(0,this.cursor),total:e,percent:e>0?(this.cursor+1)/e*100:0}}dispose(){this.stop(),this.removeAllListeners(),this.data=[]}tick(){if(this.isAtEnd()){this.clearTimer(),this.setState(`paused`),this.emit(`complete`,void 0);return}this.cursor++,this.emit(`bar`,{bar:this.data[this.cursor],index:this.cursor,total:this.data.length}),this.isAtEnd()&&(this.clearTimer(),this.setState(`paused`),this.emit(`complete`,void 0))}clamp(e){return Number.isFinite(e)?Math.max(0,Math.min(Math.floor(e),this.data.length-1)):0}clearTimer(){this.timer&&=(clearInterval(this.timer),null)}setState(e){this.state!==e&&(this.state=e,this.emit(`stateChange`,e))}},jo=2,Mo=2;function X(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Z(e){return Array.isArray(e)?e:[]}function No(e,t){return typeof e==`string`?e:t}function Po(e,t){return typeof e==`number`&&Number.isFinite(e)?e:t}function Fo(e){if(!X(e)||typeof e.id!=`string`||typeof e.type!=`string`||!Array.isArray(e.anchors)||e.anchors.length===0||!X(e.style))return null;let t=[];for(let n of e.anchors){if(!X(n)||typeof n.time!=`number`||typeof n.price!=`number`||!Number.isFinite(n.time)||!Number.isFinite(n.price))return null;t.push({time:n.time,price:n.price})}let n=e.style;return typeof n.color!=`string`||typeof n.lineWidth!=`number`?null:{id:e.id,type:e.type,anchors:t,style:n,visible:typeof e.visible==`boolean`?e.visible:!0,locked:typeof e.locked==`boolean`?e.locked:!1,meta:X(e.meta)?e.meta:void 0}}function Io(e){return!X(e)||typeof e.id!=`string`||typeof e.side!=`string`||typeof e.type!=`string`||typeof e.price!=`number`||typeof e.quantity!=`number`?null:e}function Lo(e){if(!X(e))return;let t={},n=Z(e.colors).filter(e=>typeof e==`string`);n.length>0&&(t.colors=n);let r=Z(e.lineWidths).filter(e=>typeof e==`number`&&Number.isFinite(e)&&e>0);return r.length>0&&(t.lineWidths=r),typeof e.opacity==`number`&&Number.isFinite(e.opacity)&&(t.opacity=Math.min(1,Math.max(0,e.opacity))),Object.keys(t).length>0?t:void 0}var Ro=[`crossingUp`,`crossingDown`,`crossing`,`greaterThan`,`lessThan`];function zo(e){return!X(e)||typeof e.id!=`string`||typeof e.price!=`number`||!Number.isFinite(e.price)?null:{id:e.id,price:e.price,condition:Ro.find(t=>t===e.condition)??`crossing`,message:typeof e.message==`string`?e.message:void 0,triggered:e.triggered===!0,repeating:e.repeating===!0,channel:No(e.channel,`price`),label:typeof e.label==`string`?e.label:void 0}}function Bo(e){return!X(e)||typeof e.id!=`string`||typeof e.side!=`string`||typeof e.entryPrice!=`number`||typeof e.quantity!=`number`?null:e}function Vo(e){if(!X(e))return Ho();typeof e.version==`number`&&e.version>Mo&&console.warn(`Chart state from a newer version (${e.version}); loading what this version understands.`);let t=X(e.viewport)?e.viewport:{},n=[];for(let t of Z(e.indicators))X(t)&&(typeof t.id!=`string`||typeof t.instanceId!=`string`||X(t.params)&&n.push({id:t.id,instanceId:t.instanceId,params:t.params,position:typeof t.position==`string`?t.position:void 0,style:Lo(t.style),visible:typeof t.visible==`boolean`?t.visible:void 0}));let r=[];for(let t of Z(e.drawings)){let e=Fo(t);e&&r.push(e)}let i=[];for(let t of Z(e.orders)){let e=Io(t);e&&i.push(e)}let a=[];for(let t of Z(e.positions)){let e=Bo(t);e&&a.push(e)}let o=[];for(let t of Z(e.alerts)){let e=zo(t);e&&o.push(e)}return{version:typeof e.version==`number`&&Array.isArray(e.indicators)?e.version:1,timestamp:Po(e.timestamp,Date.now()),symbol:typeof e.symbol==`string`?e.symbol:void 0,timeframe:typeof e.timeframe==`string`?e.timeframe:void 0,chartType:No(e.chartType,`candlestick`),viewport:{barWidth:Po(t.barWidth,8),barSpacing:Po(t.barSpacing,2),offset:Po(t.offset,0)},theme:typeof e.theme==`string`?e.theme:void 0,locale:typeof e.locale==`string`?e.locale:void 0,indicators:n,drawings:r,orders:i,positions:a,alerts:o}}function Ho(){return{version:1,timestamp:Date.now(),chartType:`candlestick`,viewport:{barWidth:8,barSpacing:2,offset:0},indicators:[],drawings:[],orders:[],positions:[],alerts:[]}}var Uo=class{static capture(e,t){return{version:e.getIndicators?Mo:1,timestamp:Date.now(),chartType:t?.chartType??`candlestick`,symbol:t?.symbol,timeframe:t?.timeframe,viewport:{barWidth:8,barSpacing:2,offset:0},theme:e.getTheme().name,indicators:e.getIndicators?.()??[],drawings:e.getDrawings(),orders:e.getOrders?.()??[],positions:e.getPositions?.()??[],alerts:e.getAlerts?.()??[]}}static serialize(e){return JSON.stringify(e)}static deserialize(e){return Vo(JSON.parse(e))}static saveToStorage(e,t){localStorage.setItem(e,this.serialize(t))}static loadFromStorage(e){let t=localStorage.getItem(e);return t?this.deserialize(t):null}static downloadFile(e,t=`tc-chart-state.json`){let n=new Blob([this.serialize(e)],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=t,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(r)}static loadFromFile(){return new Promise((e,t)=>{let n=document.createElement(`input`);n.type=`file`,n.accept=`.json`,n.onchange=async()=>{let r=n.files?.[0];if(!r){t(Error(`No file selected`));return}let i=await r.text();e(this.deserialize(i))},n.click()})}},Wo=class{undoStack=[];redoStack=[];maxHistory=50;onChange=null;setOnChange(e){this.onChange=e}push(e){this.undoStack.push(e),this.undoStack.length>this.maxHistory&&this.undoStack.shift(),this.redoStack.length=0,this.onChange?.()}canUndo(){return this.undoStack.length>0}canRedo(){return this.redoStack.length>0}undo(){let e=this.undoStack.pop();return e?(this.redoStack.push(e),this.onChange?.(),e):null}redo(){let e=this.redoStack.pop();return e?(this.undoStack.push(e),this.onChange?.(),e):null}clear(){this.undoStack.length=0,this.redoStack.length=0}getState(){return{canUndo:this.undoStack.length>0,canRedo:this.redoStack.length>0,undoCount:this.undoStack.length,redoCount:this.redoStack.length}}},Go=class{static toCSV(e){return[`Time,Open,High,Low,Close,Volume`,...e.map(e=>`${new Date(e.time).toISOString()},${e.open},${e.high},${e.low},${e.close},${e.volume}`)].join(`
25
+ `)}static toJSON(e){return JSON.stringify(e.map(e=>({time:new Date(e.time).toISOString(),open:e.open,high:e.high,low:e.low,close:e.close,volume:e.volume})),null,2)}static download(e,t,n){let r=new Blob([e],{type:n}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=t,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(i)}},Ko=1,qo=class extends K{markers=[];style={...e.DEFAULT_SIGNAL_STYLE};requestRender=null;dataGetter=null;setRequestRender(e){this.requestRender=e}setDataGetter(e){this.dataGetter=e}setStyle(e){this.style={...this.style,...e},this.requestRender?.()}getStyle(){return{...this.style}}addMarker(e){let t=e.id??`tc_signal_${Ko++}`,n={...e,id:t};return this.markers.push(n),this.emit(`added`,n),this.requestRender?.(),t}removeMarker(e){this.markers=this.markers.filter(t=>t.id!==e),this.emit(`removed`,e),this.requestRender?.()}getMarkers(){return[...this.markers]}clearMarkers(){this.markers=[],this.emit(`cleared`,void 0),this.requestRender?.()}setMarkers(e){this.markers=[...e],this.requestRender?.()}render(e,t,n){let r=this.dataGetter?.();if(!r||r.length===0||this.markers.length===0)return;let{chartRect:i}=t,s=this.style,c=s.arrowSize??12;e.save(),e.beginPath(),e.rect(i.x,i.y,i.width,i.height),e.clip();for(let l of this.markers){let u=a(h(l.time,r),t),d=o(l.price,t);if(u<i.x-c||u>i.x+i.width+c||d<i.y-c||d>i.y+i.height+c)continue;let f=this.resolveColor(l,s),p=c*Math.max(.6,Math.min(1,l.confidence));if(this.renderArrow(e,u,d,l.direction,p,f),s.showLabel&&l.label){e.font=`10px ${n.font.family}`,e.fillStyle=f,e.textAlign=`center`,e.textBaseline=l.direction===`long`?`top`:`bottom`;let t=l.direction===`long`?d+p+3:d-p-3;e.fillText(l.label,u,t)}if(s.showConfidence&&l.confidence<1){e.font=`9px ${n.font.family}`,e.fillStyle=f,e.globalAlpha=.7,e.textAlign=`center`,e.textBaseline=l.direction===`long`?`top`:`bottom`;let t=l.direction===`long`?d+p+(l.label?14:3):d-p-(l.label?14:3);e.fillText(`${Math.round(l.confidence*100)}%`,u,t),e.globalAlpha=1}}e.restore()}resolveColor(e,t){if(e.color)return e.color;if(t.sourceColors?.[e.source])return t.sourceColors[e.source];switch(e.direction){case`long`:return t.longColor??`#1fa874`;case`short`:return t.shortColor??`#e8505b`;default:return t.neutralColor??`#9E9E9E`}}renderArrow(e,t,n,r,i,a){e.fillStyle=a,e.beginPath(),r===`long`?(e.moveTo(t,n-i),e.lineTo(t-i*.6,n),e.lineTo(t-i*.2,n),e.lineTo(t-i*.2,n+i*.4),e.lineTo(t+i*.2,n+i*.4),e.lineTo(t+i*.2,n),e.lineTo(t+i*.6,n)):r===`short`?(e.moveTo(t,n+i),e.lineTo(t-i*.6,n),e.lineTo(t-i*.2,n),e.lineTo(t-i*.2,n-i*.4),e.lineTo(t+i*.2,n-i*.4),e.lineTo(t+i*.2,n),e.lineTo(t+i*.6,n)):e.arc(t,n,i*.4,0,Math.PI*2),e.closePath(),e.fill()}},Jo=1,Yo=class extends K{zones=[];style={...e.DEFAULT_TRADE_ZONE_STYLE};requestRender=null;dataGetter=null;pricePrecision=2;setRequestRender(e){this.requestRender=e}setDataGetter(e){this.dataGetter=e}setPricePrecision(e){this.pricePrecision=e}setStyle(e){this.style={...this.style,...e},this.requestRender?.()}getStyle(){return{...this.style}}addZone(e){let t=e.id??`tc_zone_${Jo++}`,n={...e,id:t};return this.zones.push(n),this.emit(`added`,n),this.requestRender?.(),t}updateZone(e,t){let n=this.zones.findIndex(t=>t.id===e);n!==-1&&(this.zones[n]={...this.zones[n],...t},this.requestRender?.())}removeZone(e){this.zones=this.zones.filter(t=>t.id!==e),this.emit(`removed`,e),this.requestRender?.()}getZones(){return[...this.zones]}clearZones(){this.zones=[],this.emit(`cleared`,void 0),this.requestRender?.()}setZones(e){this.zones=[...e],this.requestRender?.()}render(e,t,n){let r=this.dataGetter?.();if(!r||r.length===0||this.zones.length===0)return;let{chartRect:i}=t,a=this.style;e.save(),e.beginPath(),e.rect(i.x,i.y,i.width,i.height),e.clip();for(let i of this.zones)this.renderZone(e,i,r,t,n,a);e.restore()}renderZone(e,t,n,r,i,s){let{chartRect:c}=r,l=h(t.entryTime,n),u=t.exitTime==null?n.length-1:h(t.exitTime,n),d=a(l,r),f=a(u,r),p=Math.max(c.x,Math.min(d,f)),m=Math.min(c.x+c.width,Math.max(d,f));if(m-p<1)return;let g=o(t.entryPrice,r),_=t.exitPrice==null?o(t.entryPrice,r):o(t.exitPrice,r),v=Math.min(g,_),y=Math.max(Math.max(g,_)-v,2),b=t.exitTime==null,x=t.pnl==null?t.direction===`long`?(t.exitPrice??t.entryPrice)>=t.entryPrice:(t.exitPrice??t.entryPrice)<=t.entryPrice:t.pnl>=0,S=b?s.activeColor??`#4c8dff`:x?s.profitColor??`#1fa874`:s.lossColor??`#e8505b`;e.fillStyle=S,e.globalAlpha=s.fillOpacity??.12,e.fillRect(p,v,m-p,y),e.globalAlpha=1;let C=s.borderWidth??1;e.strokeStyle=S,e.lineWidth=C,e.setLineDash([]),e.beginPath(),e.moveTo(p,Math.round(g)+.5),e.lineTo(m,Math.round(g)+.5),e.stroke(),!b&&t.exitPrice!=null&&(e.setLineDash([3,3]),e.beginPath(),e.moveTo(p,Math.round(_)+.5),e.lineTo(m,Math.round(_)+.5),e.stroke(),e.setLineDash([]));let w=t.direction===`long`?`โ–ฒ`:`โ–ผ`;if(e.font=`bold 10px ${i.font.family}`,e.fillStyle=S,e.textBaseline=`bottom`,e.textAlign=`left`,e.fillText(`${w} ${t.entryPrice.toFixed(this.pricePrecision)}`,p+4,g-3),s.showPnl&&!b&&t.pnl!=null){let n=t.pnl>=0?`+`:``,r=t.pnlPercent==null?`${n}${t.pnl.toFixed(2)}`:`${n}${t.pnl.toFixed(2)} (${n}${t.pnlPercent.toFixed(2)}%)`;e.font=`bold 10px ${i.font.family}`,e.fillStyle=S,e.textBaseline=`top`,e.textAlign=`right`;let a=e.measureText(r).width+8,o=m-a-2,s=v+2;e.globalAlpha=.85,e.fillStyle=i.background,e.fillRect(o,s,a,14),e.globalAlpha=1,e.fillStyle=S,e.fillText(r,m-4,s+1)}s.showLabel&&t.label&&(e.font=`9px ${i.font.family}`,e.fillStyle=S,e.globalAlpha=.8,e.textBaseline=`top`,e.textAlign=`left`,e.fillText(t.label,p+4,g+3),e.globalAlpha=1)}},Xo=class{active=!1;startBar=0;startPrice=0;endBar=0;endPrice=0;startTime=null;endTime=null;isActive(){return this.active}begin(e,t,n){let r=Math.round(l(e.x,t)),i=u(e.y,t);this.startBar=r,this.startPrice=i,this.endBar=r,this.endPrice=i,this.startTime=Zo(r,n),this.endTime=this.startTime,this.active=!0}update(e,t,n){if(!this.active)return;let r=Math.round(l(e.x,t));this.endBar=r,this.endPrice=u(e.y,t),this.endTime=Zo(r,n)}end(){this.active=!1}render(e,t,n){if(!this.active)return;let r=a(this.startBar,t),i=a(this.endBar,t),s=o(this.startPrice,t),c=o(this.endPrice,t),l=Math.min(r,i),u=Math.max(r,i),d=Math.min(s,c),f=Math.max(s,c),p=u-l,m=f-d,h=this.endPrice>=this.startPrice?n.candleUp:n.candleDown,g=rs(h,.14);e.save();let{chartRect:_}=t;e.beginPath(),e.rect(_.x,_.y,_.width,_.height),e.clip(),e.fillStyle=g,e.fillRect(l,d,p,m),e.strokeStyle=h,e.lineWidth=1,e.setLineDash([4,3]),e.strokeRect(l+.5,d+.5,p,m),e.setLineDash([]),e.strokeStyle=h,e.lineWidth=1.5,e.beginPath(),e.moveTo(r,s),e.lineTo(i,c),e.stroke(),es(e,r,s,h),es(e,i,c,h),e.restore();let v=Math.abs(this.endBar-this.startBar),y=this.endPrice-this.startPrice,b=this.startPrice===0?0:y/this.startPrice*100,x=this.startTime!==null&&this.endTime!==null?$o(Math.abs(this.endTime-this.startTime)):null,S=[],C=y>0?`+`:y<0?`โˆ’`:``,w=Math.abs(y);S.push(`${C}${Qo(w)} (${C}${Math.abs(b).toFixed(2)}%)`),S.push(`${v} bars${x?` ยท `+x:``}`),e.save(),ts(e,i,c,S,h,n),e.restore()}};function Zo(e,t){if(e<0||e>=t.length)return null;let n=t[e].time;return n>0xe8d4a51000?n:n*1e3}function Qo(e){return e>=1e3?e.toFixed(2):e>=1?e.toFixed(4):e.toPrecision(4)}function $o(e){let t=e/1e3;if(t<60)return`${t.toFixed(0)}s`;let n=t/60;if(n<60)return`${n.toFixed(1)}m`;let r=n/60;if(r<24)return`${r.toFixed(1)}h`;let i=r/24;if(i<30)return`${i.toFixed(1)}d`;let a=i/30;return a<12?`${a.toFixed(1)}mo`:`${(i/365).toFixed(1)}y`}function es(e,t,n,r){e.fillStyle=r,e.beginPath(),e.arc(t,n,3.5,0,Math.PI*2),e.fill(),e.fillStyle=`#fff`,e.beginPath(),e.arc(t,n,1.5,0,Math.PI*2),e.fill()}function ts(e,t,n,r,i,a){e.font=`600 11px ${a.font.family}`;let o=0;for(let t of r){let n=e.measureText(t).width;n>o&&(o=n)}let s=Math.ceil(o)+16,c=r.length*14+12,l=t+8,u=n+8,d=e.canvas.clientWidth||e.canvas.width;l+s>d-4&&(l=t-s-8),l<4&&(l=4),e.fillStyle=a.background,e.globalAlpha=.96,ns(e,l,u,s,c,6),e.fill(),e.globalAlpha=1,e.strokeStyle=i,e.lineWidth=1,ns(e,l+.5,u+.5,s-1,c-1,6),e.stroke(),e.fillStyle=a.text,e.textBaseline=`top`,e.textAlign=`left`;for(let t=0;t<r.length;t++)e.fillStyle=t===0?i:a.textSecondary,e.fillText(r[t],l+8,u+6+t*14)}function ns(e,t,n,r,i,a){e.beginPath(),e.moveTo(t+a,n),e.arcTo(t+r,n,t+r,n+i,a),e.arcTo(t+r,n+i,t,n+i,a),e.arcTo(t,n+i,t,n,a),e.arcTo(t,n,t+r,n,a),e.closePath()}function rs(e,t){if(e.startsWith(`#`)){let n=0,r=0,i=0;return e.length===4?(n=parseInt(e[1]+e[1],16),r=parseInt(e[2]+e[2],16),i=parseInt(e[3]+e[3],16)):e.length>=7&&(n=parseInt(e.slice(1,3),16),r=parseInt(e.slice(3,5),16),i=parseInt(e.slice(5,7),16)),`rgba(${n},${r},${i},${t})`}if(e.startsWith(`rgb`)){let n=e.match(/[\d.]+/g);if(n&&n.length>=3)return`rgba(${n[0]},${n[1]},${n[2]},${t})`}return e}var is=6,as=class{start=null;current=null;isActive(){return this.start!==null}begin(e){this.start=e,this.current=e}update(e){this.start&&(this.current=e)}end(){let e=this.start,t=this.current;if(this.cancel(),!e||!t)return null;let n=Math.min(e.x,t.x),r=Math.max(e.x,t.x),i=Math.min(e.y,t.y),a=Math.max(e.y,t.y);return{x0:n,y0:i,x1:r,y1:a,isClick:r-n<6&&a-i<6}}cancel(){this.start=null,this.current=null}render(e,t,n){if(!this.start||!this.current)return;let{chartRect:r}=t,i=e=>Math.max(r.x,Math.min(r.x+r.width,e)),a=e=>Math.max(r.y,Math.min(r.y+r.height,e)),o=i(Math.min(this.start.x,this.current.x)),s=i(Math.max(this.start.x,this.current.x)),c=a(Math.min(this.start.y,this.current.y)),l=a(Math.max(this.start.y,this.current.y));e.save(),e.fillStyle=n.crosshair,e.globalAlpha=.1,e.fillRect(o,c,s-o,l-c),e.globalAlpha=.8,e.strokeStyle=n.crosshair,e.lineWidth=1,e.setLineDash([4,3]),e.strokeRect(Math.round(o)+.5,Math.round(c)+.5,Math.round(s-o),Math.round(l-c)),e.restore()}},os={linear:e=>e,easeOutCubic:e=>1-(1-e)**3,easeOutQuart:e=>1-(1-e)**4,easeInOutCubic:e=>e<.5?4*e*e*e:1-(-2*e+2)**3/2,easeOutExpo:e=>e===1?1:1-2**(-10*e),easeOutElastic:e=>e===0||e===1?e:2**(-10*e)*Math.sin((e*10-.75)*(2*Math.PI/3))+1,spring:e=>1-Math.E**(-6*e)*Math.cos(8*e)},ss=class{animations=new Map;frameId=0;running=!1;animate(e,t){this.animations.set(e,{startTime:-1,duration:t.duration,easing:t.easing??os.easeOutCubic,onUpdate:t.onUpdate,onComplete:t.onComplete}),this.running||(this.running=!0,this.tick())}cancel(e){this.animations.delete(e),this.animations.size===0&&this.stop()}cancelAll(){this.animations.clear(),this.stop()}isAnimating(e){return e?this.animations.has(e):this.animations.size>0}tick(){this.frameId=requestAnimationFrame(e=>{let t=[];for(let[n,r]of this.animations){r.startTime<0&&(r.startTime=e);let i=e-r.startTime,a=Math.min(1,i/r.duration),o=r.easing(a);r.onUpdate(o),a>=1&&(r.onComplete?.(),t.push(n))}for(let e of t)this.animations.delete(e);this.animations.size>0?this.tick():this.running=!1})}stop(){this.frameId&&=(cancelAnimationFrame(this.frameId),0),this.running=!1}dispose(){this.cancelAll()}};function cs(t){return!t||t===`dark`?e.DARK_THEME:t===`light`?e.LIGHT_THEME:t}var ls=class{canvas;ctx;container;theme;width=0;height=0;dpr=1;frameId=null;resizeObserver;constructor(e,t){this.container=e,this.theme=cs(t),this.canvas=document.createElement(`canvas`),this.canvas.style.width=`100%`,this.canvas.style.height=`100%`,this.canvas.style.display=`block`,e.appendChild(this.canvas),this.ctx=this.canvas.getContext(`2d`),this.dpr=window.devicePixelRatio||1,this.updateSize(),this.resizeObserver=new ResizeObserver(()=>{this.updateSize(),this.requestRender()}),this.resizeObserver.observe(e)}updateSize(){this.dpr=window.devicePixelRatio||1;let e=this.container.getBoundingClientRect();this.width=e.width||this.container.clientWidth,this.height=e.height||this.container.clientHeight,this.canvas.width=Math.max(1,Math.floor(this.width*this.dpr)),this.canvas.height=Math.max(1,Math.floor(this.height*this.dpr))}requestRender(){this.frameId===null&&(this.frameId=requestAnimationFrame(()=>{this.frameId=null,(this.width===0||this.height===0)&&this.updateSize(),!(this.width===0||this.height===0)&&(this.ctx.save(),this.ctx.scale(this.dpr,this.dpr),this.ctx.clearRect(0,0,this.width,this.height),this.renderChart(this.ctx,this.width,this.height,this.theme),this.ctx.restore())}))}setTheme(e){this.theme=cs(e),this.requestRender()}destroy(){this.frameId!==null&&cancelAnimationFrame(this.frameId),this.resizeObserver.disconnect(),this.canvas.remove()}},us=class{pos=null;canvas;onUpdate;handleMove;handleLeave;constructor(e,t){this.canvas=e,this.onUpdate=t,this.handleMove=t=>{let n=e.getBoundingClientRect();this.pos={x:t.clientX-n.left,y:t.clientY-n.top},this.onUpdate()},this.handleLeave=()=>{this.pos=null,this.onUpdate()},e.addEventListener(`pointermove`,this.handleMove),e.addEventListener(`pointerleave`,this.handleLeave)}getPosition(){return this.pos}isActive(){return this.pos!==null}drawCrosshair(e,t,n,r){this.pos&&(e.save(),e.strokeStyle=r,e.lineWidth=.5,e.setLineDash([4,4]),e.beginPath(),e.moveTo(this.pos.x,0),e.lineTo(this.pos.x,n),e.stroke(),e.beginPath(),e.moveTo(0,this.pos.y),e.lineTo(t,this.pos.y),e.stroke(),e.restore())}destroy(){this.canvas.removeEventListener(`pointermove`,this.handleMove),this.canvas.removeEventListener(`pointerleave`,this.handleLeave)}};function ds(e,t,n,r,i){let{data:a,mode:o=`area`,lineWidth:s=1.5,showLastPoint:c=!1,showMinMax:l=!1}=r;if(a.length<2||t<=0||n<=0)return;let u=r.color??i.lineColor,d=r.fillColor??u,f=t-4,p=n-4,m=1/0,h=-1/0,g=0,_=0;for(let e=0;e<a.length;e++)a[e]<m&&(m=a[e],g=e),a[e]>h&&(h=a[e],_=e);let v=h-m||1,y=e=>2+e/(a.length-1)*f,b=e=>2+p-(e-m)/v*p;if(o===`area`){let t=e.createLinearGradient(0,2,0,n-2);t.addColorStop(0,d+(d.startsWith(`#`)?`40`:``)),t.addColorStop(1,`transparent`),e.beginPath(),e.moveTo(y(0),b(a[0]));for(let t=1;t<a.length;t++)e.lineTo(y(t),b(a[t]));e.lineTo(y(a.length-1),n-2),e.lineTo(y(0),n-2),e.closePath(),e.fillStyle=t,e.fill()}e.beginPath(),e.moveTo(y(0),b(a[0]));for(let t=1;t<a.length;t++)e.lineTo(y(t),b(a[t]));if(e.strokeStyle=u,e.lineWidth=s,e.lineJoin=`round`,e.stroke(),c){let t=r.lastPointColor??u,n=y(a.length-1),i=b(a[a.length-1]);e.beginPath(),e.arc(n,i,3,0,Math.PI*2),e.fillStyle=t,e.fill()}if(l){let t=r.minPointColor??i.candleDown,n=r.maxPointColor??i.candleUp;e.beginPath(),e.arc(y(g),b(m),2.5,0,Math.PI*2),e.fillStyle=t,e.fill(),e.beginPath(),e.arc(y(_),b(h),2.5,0,Math.PI*2),e.fillStyle=n,e.fill()}}var fs=50,ps=60,ms=20,hs=.2;function gs(e){let t=[...e].sort((e,t)=>t.price-e.price),n=[],r=0;for(let e of t)r+=e.volume,n.push({price:e.price,cumulativeVolume:r});return n}function _s(e){let t=[...e].sort((e,t)=>e.price-t.price),n=[],r=0;for(let e of t)r+=e.volume,n.push({price:e.price,cumulativeVolume:r});return n}function vs(e,t){return{left:fs,right:e-ps,top:ms,bottom:t-ms,plotWidth:e-fs-ps,plotHeight:t-ms*2}}function ys(e,t,n,r){e.fillStyle=r,e.fillRect(0,0,t,n)}function bs(t,n,r,i,a,o,s,c){let{left:l,right:u,top:d,bottom:f,plotWidth:p,plotHeight:m}=n;t.save(),t.strokeStyle=o.grid,t.lineWidth=.5,t.fillStyle=o.axisLabel,t.font=`${o.font.sizeSmall}px ${o.font.family}`;let h=(0,e.computeTickStep)(0,a,5);for(let e=0;e<=a;e+=h){let n=f-e/a*m;t.beginPath(),t.moveTo(l,n),t.lineTo(u,n),t.stroke(),t.textAlign=`right`,t.textBaseline=`middle`,t.fillText(c(e),l-4,n)}let g=i-r,_=(0,e.computeTickStep)(r,i,6),v=Math.ceil(r/_)*_;for(let e=v;e<=i;e+=_){let n=l+(e-r)/g*p;t.beginPath(),t.moveTo(n,d),t.lineTo(n,f),t.stroke(),t.textAlign=`center`,t.textBaseline=`top`,t.fillText(s(e),n,f+4)}t.restore()}function xs(e,t,n,r,i,a,o,s,c){if(t.length===0)return;let{left:l,bottom:u,plotWidth:d,plotHeight:f}=n,p=e=>l+(e-r)/i*d,m=e=>u-e/a*f;if(e.beginPath(),c===`bid`){e.moveTo(p(t[0].price),u);for(let n=0;n<t.length;n++){let r=p(t[n].price),i=m(t[n].cumulativeVolume);e.lineTo(r,i),n<t.length-1&&e.lineTo(p(t[n+1].price),i)}e.lineTo(p(t[t.length-1].price),u)}else{e.moveTo(p(t[0].price),u);for(let n=0;n<t.length;n++){let r=p(t[n].price),i=m(t[n].cumulativeVolume);e.lineTo(r,i),n<t.length-1&&e.lineTo(p(t[n+1].price),i)}e.lineTo(p(t[t.length-1].price),u)}if(e.closePath(),e.fillStyle=o,e.fill(),e.beginPath(),c===`bid`){e.moveTo(p(t[0].price),m(t[0].cumulativeVolume));for(let n=0;n<t.length;n++){let r=p(t[n].price),i=m(t[n].cumulativeVolume);n>0&&e.lineTo(r,m(t[n-1].cumulativeVolume)),e.lineTo(r,i)}}else{e.moveTo(p(t[0].price),m(t[0].cumulativeVolume));for(let n=1;n<t.length;n++){let r=m(t[n-1].cumulativeVolume),i=p(t[n].price),a=m(t[n].cumulativeVolume);e.lineTo(i,r),e.lineTo(i,a)}}e.strokeStyle=s,e.lineWidth=1.5,e.stroke()}function Ss(e,t,n,r,i,a,o,s,c){let{left:l,top:u,bottom:d,plotWidth:f}=r,p=l+(t-i)/a*f;if(e.save(),e.strokeStyle=o.textSecondary,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(p,u),e.lineTo(p,d),e.stroke(),e.restore(),s){let t=`Spread: ${c(n)}`;e.save(),e.font=`${o.font.sizeSmall}px ${o.font.family}`,e.fillStyle=o.textSecondary,e.textAlign=`center`,e.textBaseline=`bottom`,e.fillText(t,p,u-2),e.restore()}}function Cs(e,t,n,r,i,a,o,s,c,l,u){let{left:d,top:f,bottom:p,plotWidth:m,plotHeight:h}=i,g=t.x;if(g<d||g>i.right)return;let _=a+(g-d)/m*o,v=0,y=``;if(n.length>0&&_<=n[0].price){y=`Bid`;for(let e of n)if(_<=e.price)v=e.cumulativeVolume;else break}if(r.length>0&&_>=r[0].price){y=`Ask`;for(let e of r)if(_>=e.price)v=e.cumulativeVolume;else break}if(e.save(),e.strokeStyle=c.crosshair,e.lineWidth=.5,e.setLineDash([4,4]),e.beginPath(),e.moveTo(g,f),e.lineTo(g,p),e.stroke(),v>0){let t=p-v/s*h;e.beginPath(),e.moveTo(d,t),e.lineTo(i.right,t),e.stroke()}e.restore();let b=[`Price: ${l(_)}`,y?`${y} Vol: ${u(v)}`:``].filter(Boolean);e.save(),e.font=`${c.font.sizeSmall}px ${c.font.family}`;let x=Math.max(...b.map(t=>e.measureText(t).width))+16,S=b.length*(c.font.sizeSmall+4)+12,C=g+10,w=t.y-S/2;C+x>i.right&&(C=g-x-10),w<f&&(w=f),w+S>p&&(w=p-S),e.fillStyle=c.axisLabelBackground,e.globalAlpha=.9,e.fillRect(C,w,x,S),e.globalAlpha=1,e.fillStyle=c.text,e.textBaseline=`top`,e.textAlign=`left`;for(let t=0;t<b.length;t++)e.fillText(b[t],C+8,w+6+t*(c.font.sizeSmall+4));e.restore()}function ws(e){return e.toFixed(2)}function Ts(e){return e>=1e6?(e/1e6).toFixed(2)+`M`:e>=1e3?(e/1e3).toFixed(1)+`K`:e.toFixed(0)}function Es(e,t,n,r,i,a){let{data:o}=r;if(o.bids.length===0&&o.asks.length===0||t<=0||n<=0)return;let s=r.bidColor??i.candleUp,c=r.askColor??i.candleDown,l=r.bidFillColor??s+`40`,u=r.askFillColor??c+`40`,d=r.midPriceLine!==!1,f=r.spreadLabel!==!1,p=r.priceFormat??ws,m=r.volumeFormat??Ts,h=gs(o.bids),g=_s(o.asks),_=h.length>0?h[0].price:0,v=g.length>0?g[0].price:0,y=h.length>0&&g.length>0?(_+v)/2:_||v,b=g.length>0&&h.length>0?v-_:0,x=h.length>0?h[h.length-1].price:y,S=g.length>0?g[g.length-1].price:y,C=Math.max(y-x,S-y)*(1+hs),w=y-C,T=y+C,E=T-w,D=h.length>0?h[h.length-1].cumulativeVolume:0,O=g.length>0?g[g.length-1].cumulativeVolume:0,k=Math.max(D,O)||1,A=vs(t,n);ys(e,t,n,i.background),bs(e,A,w,T,k,i,p,m),xs(e,h,A,w,E,k,l,s,`bid`),xs(e,g,A,w,E,k,u,c,`ask`),d&&Ss(e,y,b,A,w,E,i,f,p),a&&Cs(e,a,h,g,A,w,E,k,i,p,m)}var Ds=70,Os=30,ks=20,As=20,js=.05;function Ms(e,t){return{left:Ds,right:e-ks,top:As,bottom:t-Os,plotWidth:e-Ds-ks,plotHeight:t-As-Os}}function Ns(e,t){let n=1/0,r=-1/0;for(let t of e)t.value<n&&(n=t.value),t.value>r&&(r=t.value);if(t)for(let e of t)e.value<n&&(n=e.value),e.value>r&&(r=e.value);let i=(r-n)*js;return{valMin:n-i,valMax:r+i}}function Ps(e){let t=[],n=-1/0;for(let r of e)r.value>n&&(n=r.value),t.push(n);return t}function Fs(e){let t=864e5;if(365.25*t,e<7*t){let e=new Intl.DateTimeFormat(void 0,{hour:`2-digit`,minute:`2-digit`});return t=>e.format(new Date(t))}if(e<315576e5){let e=new Intl.DateTimeFormat(void 0,{month:`short`,day:`numeric`});return t=>e.format(new Date(t))}let n=new Intl.DateTimeFormat(void 0,{month:`short`,year:`numeric`});return e=>n.format(new Date(e))}function Is(e){return Math.abs(e)>=1e6?(e/1e6).toFixed(2)+`M`:Math.abs(e)>=1e3?(e/1e3).toFixed(1)+`K`:e.toFixed(2)}function Ls(e,t,n,r){e.fillStyle=r,e.fillRect(0,0,t,n)}function Rs(t,n,r,i,a,o,s,c,l){let{left:u,right:d,top:f,bottom:p,plotWidth:m,plotHeight:h}=n;t.save(),t.strokeStyle=s.grid,t.lineWidth=.5,t.fillStyle=s.axisLabel,t.font=`${s.font.sizeSmall}px ${s.font.family}`;let g=(0,e.computeTickStep)(r,i,6),_=Math.ceil(r/g)*g;for(let e=_;e<=i;e+=g){let n=p-(e-r)/(i-r)*h;t.beginPath(),t.moveTo(u,n),t.lineTo(d,n),t.stroke(),t.textAlign=`right`,t.textBaseline=`middle`,t.fillText(c(e),u-6,n)}let v=o-a,y=(0,e.computeTickStep)(a,o,6),b=Math.ceil(a/y)*y;for(let e=b;e<=o;e+=y){let n=u+(e-a)/v*m;t.beginPath(),t.moveTo(n,f),t.lineTo(n,p),t.stroke(),t.textAlign=`center`,t.textBaseline=`top`,t.fillText(l(e),n,p+4)}t.restore()}function zs(e,t,n,r,i,a,o,s,c){if(t.length<2)return;let{left:l,bottom:u,plotWidth:d,plotHeight:f}=n,p=e=>l+(e-r)/i*d,m=e=>u-(e-a)/o*f;e.save(),e.beginPath(),e.moveTo(p(t[0].time),m(t[0].value));for(let n=1;n<t.length;n++)e.lineTo(p(t[n].time),m(t[n].value));e.strokeStyle=s,e.lineWidth=c,e.lineJoin=`round`,e.stroke(),e.restore()}function Bs(e,t,n,r,i,a,o,s){if(t.length<2)return;let{left:c,bottom:l,plotWidth:u,plotHeight:d}=n,f=e=>c+(e-r)/i*u,p=e=>l-(e-a)/o*d,m=e.createLinearGradient(0,n.top,0,l);m.addColorStop(0,s+`40`),m.addColorStop(1,`transparent`),e.save(),e.beginPath(),e.moveTo(f(t[0].time),p(t[0].value));for(let n=1;n<t.length;n++)e.lineTo(f(t[n].time),p(t[n].value));e.lineTo(f(t[t.length-1].time),l),e.lineTo(f(t[0].time),l),e.closePath(),e.fillStyle=m,e.fill(),e.restore()}function Vs(e,t,n,r,i,a,o,s,c){if(t.length<2)return;let{left:l,bottom:u,plotWidth:d,plotHeight:f}=r,p=e=>l+(e-i)/a*d,m=e=>u-(e-o)/s*f;e.save(),e.fillStyle=c,e.beginPath(),e.moveTo(p(t[0].time),m(n[0]));for(let r=1;r<t.length;r++)e.lineTo(p(t[r].time),m(n[r]));for(let n=t.length-1;n>=0;n--)e.lineTo(p(t[n].time),m(t[n].value));e.closePath(),e.fill(),e.restore()}function Hs(e,t,n,r,i,a,o,s,c,l){if(t.length===0)return;let{left:u,bottom:d,plotWidth:f,plotHeight:p}=n,m=t[t.length-1],h=u+(m.time-r)/i*f,g=d-(m.value-a)/o*p;e.save(),e.font=`${l.font.sizeSmall}px ${l.font.family}`,e.fillStyle=c,e.textAlign=`left`,e.textBaseline=`middle`,e.fillText(s,h+4,g),e.restore()}function Us(e,t,n,r,i,a,o,s,c,l,u,d){let{left:f,top:p,bottom:m,plotWidth:h,plotHeight:g}=i,_=t.x;if(_<f||_>i.right)return;e.save(),e.strokeStyle=l.crosshair,e.lineWidth=.5,e.setLineDash([4,4]),e.beginPath(),e.moveTo(_,p),e.lineTo(_,m),e.stroke(),e.restore();let v=a+(_-f)/h*o,y=0,b=1/0;for(let e=0;e<n.length;e++){let t=Math.abs(n[e].time-v);t<b&&(b=t,y=e)}let x=n[y],S=[u(x.time),`Value: ${d(x.value)}`];r&&r.length>y&&S.push(`Benchmark: ${d(r[y].value)}`);let C=f+(x.time-a)/o*h,w=m-(x.value-s)/c*g;e.beginPath(),e.arc(C,w,3,0,Math.PI*2),e.fillStyle=l.lineColor,e.fill(),e.save(),e.font=`${l.font.sizeSmall}px ${l.font.family}`;let T=Math.max(...S.map(t=>e.measureText(t).width))+16,E=S.length*(l.font.sizeSmall+4)+12,D=_+10,O=t.y-E/2;D+T>i.right&&(D=_-T-10),O<p&&(O=p),O+E>m&&(O=m-E),e.fillStyle=l.axisLabelBackground,e.globalAlpha=.9,e.fillRect(D,O,T,E),e.globalAlpha=1,e.fillStyle=l.text,e.textBaseline=`top`,e.textAlign=`left`;for(let t=0;t<S.length;t++)e.fillText(S[t],D+8,O+6+t*(l.font.sizeSmall+4));e.restore()}function Ws(e,t,n,r,i,a){let{data:o}=r;if(o.length<2||t<=0||n<=0)return;let s=r.lineColor??i.lineColor,c=r.lineWidth??1.5,l=r.drawdown===!0,u=r.drawdownColor??i.candleDown+`30`,d=r.fillArea===!0,f=r.benchmark,p=r.benchmarkColor??i.textSecondary,m=r.benchmarkLabel??`Benchmark`,h=r.valueFormat??Is,{valMin:g,valMax:_}=Ns(o,f),v=_-g||1,y=o[0].time,b=o[o.length-1].time,x=b-y||1,S=r.timeFormat??Fs(x),C=Ms(t,n);Ls(e,t,n,i.background),Rs(e,C,g,_,y,b,i,h,S),l&&Vs(e,o,Ps(o),C,y,x,g,v,u),d&&Bs(e,o,C,y,x,g,v,s),zs(e,o,C,y,x,g,v,s,c),f&&f.length>=2&&(zs(e,f,C,y,x,g,v,p,1),Hs(e,f,C,y,x,g,v,m,p,i)),a&&Us(e,a,o,f,C,y,x,g,v,i,S,h)}function Gs(e,t,n){if(e.length===0)return[];let r=e.length,i=Math.ceil(Math.sqrt(r)),a=Math.ceil(r/i),o=t.width/i,s=t.height/a,c=[];for(let a=0;a<r;a++){let r=a%i,l=Math.floor(a/i);c.push({id:e[a].id,rect:{x:t.x+r*o+n,y:t.y+l*s+n,width:Math.max(0,o-n*2),height:Math.max(0,s-n*2)}})}return c}function Ks(e,t){let n=e.reduce((e,t)=>e+t,0);if(n===0||t===0)return 1/0;let r=0;for(let i of e){let e=n/t,a=i/e,o=e>a?e/a:a/e;o>r&&(r=o)}return r}function qs(e,t,n,r,i,a){let o=r?n.height:n.width,s=e.reduce((e,t)=>e+t,0),c=o>0?s/o:0,l=0;for(let o=0;o<e.length;o++){let s=c>0?e[o]/c:0,u;u=r?{x:n.x+i,y:n.y+l+i,width:Math.max(0,c-i*2),height:Math.max(0,s-i*2)}:{x:n.x+l+i,y:n.y+i,width:Math.max(0,s-i*2),height:Math.max(0,c-i*2)},a.push({id:t[o],rect:u}),l+=s}}function Js(e,t,n,r,i){if(e.length===0)return;let a=n.width>=n.height,o=a?n.height:n.width;if(e.length===1){qs(e,t,n,a,r,i);return}let s=[],c=[],l=0;for(;l<e.length;){let u=[...s,e[l]];if(s.length===0||Ks(u,o)<=Ks(s,o))s.push(e[l]),c.push(t[l]),l++;else{qs(s,c,n,a,r,i);let u=s.reduce((e,t)=>e+t,0),d=o>0?u/o:0;n=a?{x:n.x+d,y:n.y,width:n.width-d,height:n.height}:{x:n.x,y:n.y+d,width:n.width,height:n.height-d},Js(e.slice(l),t.slice(l),n,r,i);return}}s.length>0&&qs(s,c,n,a,r,i)}function Ys(e,t,n){if(e.length===0)return[];let r=[...e].sort((e,t)=>t.weight-e.weight),i=r.reduce((e,t)=>e+Math.max(0,t.weight),0);if(i===0)return[];let a=t.width*t.height,o=r.map(e=>Math.max(0,e.weight)/i*a),s=r.map(e=>e.id),c=[];return Js(o,s,{...t},n,c),c}function Xs(e){return(e>=0?`+`:``)+e.toFixed(2)+`%`}function Zs(e){return e.label}function Qs(t,n){let r=n.min??-5,i=n.max??5;if(t<=r)return n.negative;if(t>=i)return n.positive;if(t<0){let i=1-t/r;return(0,e.lerpColor)(n.negative,n.zero,i)}let a=t/i;return(0,e.lerpColor)(n.zero,n.positive,a)}function $s(e,t,n,r,i,a){let o=Math.min(a,r/2,i/2);e.beginPath(),e.moveTo(t+o,n),e.lineTo(t+r-o,n),e.arcTo(t+r,n,t+r,n+o,o),e.lineTo(t+r,n+i-o),e.arcTo(t+r,n+i,t+r-o,n+i,o),e.lineTo(t+o,n+i),e.arcTo(t,n+i,t,n+i-o,o),e.lineTo(t,n+o),e.arcTo(t,n,t+o,n,o),e.closePath()}function ec(e,t,n,r,i,a,o,s,c,l,u){if(i<40||a<30)return;let d=n+i/2,f=r+a/2;if(e.save(),e.shadowColor=`rgba(0,0,0,0.6)`,e.shadowBlur=2,e.fillStyle=`#FFFFFF`,e.textAlign=`center`,s){let n=l(t),r=Math.min(o.font.sizeMedium,i/n.length*1.5,a/4);e.font=`bold `+Math.max(8,r)+`px `+o.font.family,e.textBaseline=c?`bottom`:`middle`,e.fillText(n,d,c?f-1:f,i-8)}if(c){let n=u(t.value),r=Math.min(o.font.sizeSmall,i/n.length*1.5,a/4);e.font=Math.max(7,r)+`px `+o.font.family,e.textBaseline=s?`top`:`middle`,e.fillText(n,d,s?f+1:f,i-8)}e.restore()}function tc(e,t,n,r,i,a,o,s){let c=[o(t),s(t.value)];if(t.meta)for(let[e,n]of Object.entries(t.meta))c.push(e+`: `+String(n));e.save(),e.font=a.font.sizeSmall+`px `+a.font.family;let l=Math.max(...c.map(t=>e.measureText(t).width))+16,u=a.font.sizeSmall+4,d=c.length*u+12,f=n.x+14,p=n.y-d/2;f+l>r&&(f=n.x-l-14),p<0&&(p=0),p+d>i&&(p=i-d),e.fillStyle=a.axisLabelBackground,e.globalAlpha=.92,$s(e,f,p,l,d,4),e.fill(),e.globalAlpha=1,e.fillStyle=a.text,e.textBaseline=`top`,e.textAlign=`left`;for(let t=0;t<c.length;t++)e.fillText(c[t],f+8,p+6+t*u);e.restore()}function nc(e,t,n,r,i,a,o,s){if(r.length===0||i.length===0||t<=0||n<=0)return null;let c=a.colorScale??{negative:`#e8505b`,zero:`#424242`,positive:`#1fa874`},l=a.cellRadius??4,u=a.showLabels!==!1,d=a.showValues!==!1,f=a.valueFormat??Xs,p=a.labelFormat??Zs,m=new Map;for(let e of r)m.set(e.id,e);let h=null,g=null;if(s)for(let e of i){let{x:t,y:n,width:r,height:i}=e.rect;if(s.x>=t&&s.x<=t+r&&s.y>=n&&s.y<=n+i){h=e.id;let t=m.get(e.id);t&&(g={cell:t,rect:e});break}}e.fillStyle=o.background,e.fillRect(0,0,t,n);for(let t of i){let n=m.get(t.id);if(!n)continue;let{x:r,y:i,width:a,height:s}=t.rect;if(a<=0||s<=0)continue;let g=Qs(n.value,c);$s(e,r,i,a,s,l),e.fillStyle=g,e.fill(),ec(e,n,r,i,a,s,o,u,d,p,f),t.id===h&&($s(e,r,i,a,s,l),e.strokeStyle=`#FFFFFF`,e.lineWidth=1.5,e.stroke())}return g&&s&&tc(e,g.cell,s,t,n,o,p,f),g}var rc=60,ic=12,ac=24,oc=40,sc=.7,cc=1;function lc(e){return e.type?e.type:e.value>0?`positive`:e.value<0?`negative`:`subtotal`}function uc(e){let t=Math.abs(e);return t>=1e6?(e/1e6).toFixed(2)+`M`:t>=1e3?(e/1e3).toFixed(1)+`K`:e.toFixed(2)}function dc(e,t){return{left:rc,right:e-ic,top:ac,bottom:t-oc,plotWidth:e-rc-ic,plotHeight:t-ac-oc}}function fc(e,t,n,r,i){let a=Array(e.length),o=Array(e.length),s=t.plotWidth/e.length,c=s*n,l=(s-c)/2,{left:u,bottom:d,plotHeight:f}=t,p=0;for(let t=0;t<e.length;t++){let n=e[t],m=lc(n),h,g;m===`total`||m===`subtotal`?(h=0,g=n.value,p=n.value):(h=p,g=p+n.value,p=g);let _=Math.min(h,g),v=Math.max(h,g),y=d-(_-r)/i*f,b=d-(v-r)/i*f,x=Math.min(y,b),S=Math.max(Math.abs(b-y),cc),C=u+t*s,w=C+l;a[t]={label:n.label,value:n.value,start:h,end:g,type:m,rectX:w,rectY:x,rectW:c,rectH:S,slotX:C,slotW:s},o[t]=p}return{bars:a,cumulatives:o}}function pc(e){if(e.length===0)return{valMin:0,valMax:1};let t=0,n=0,r=0;for(let i=0;i<e.length;i++){let a=e[i],o=lc(a),s,c;o===`total`||o===`subtotal`?(s=0,c=a.value,r=a.value):(s=r,c=r+a.value,r=c),s<t&&(t=s),c<t&&(t=c),s>n&&(n=s),c>n&&(n=c)}let i=(n-t||1)*.1;return{valMin:t-i,valMax:n+i}}function mc(e,t,n,r){e.fillStyle=r,e.fillRect(0,0,t,n)}function hc(t,n,r,i,a,o){let{left:s,right:c,top:l,bottom:u,plotHeight:d}=n,f=i-r||1;t.strokeStyle=a.grid,t.lineWidth=.5,t.fillStyle=a.axisLabel,t.font=`${a.font.sizeSmall}px ${a.font.family}`,t.textAlign=`right`,t.textBaseline=`middle`;let p=(0,e.computeTickStep)(r,i,5),m=Math.ceil(r/p)*p;t.beginPath();for(let e=m;e<=i;e+=p){let n=Math.round(u-(e-r)/f*d)+.5;n<l||n>u||(t.moveTo(s,n),t.lineTo(c,n))}t.stroke();for(let e=m;e<=i;e+=p){let n=u-(e-r)/f*d;n<l-1||n>u+1||t.fillText(o(e),s-6,n)}if(r<0&&i>0){let e=Math.round(u-(0-r)/f*d)+.5;t.strokeStyle=a.axisLine,t.lineWidth=1,t.beginPath(),t.moveTo(s,e),t.lineTo(c,e),t.stroke()}}function gc(e,t,n){let r=[`positive`,`negative`,`total`,`subtotal`];for(let i=0;i<r.length;i++){let a=r[i],o=n[a],s=!1;e.beginPath();for(let n=0;n<t.length;n++){let r=t[n];if(r.type!==a)continue;let i=Math.round(r.rectX),o=Math.round(r.rectY),c=Math.round(r.rectW),l=Math.round(r.rectH);e.rect(i,o,c,l),s=!0}s&&(e.fillStyle=o,e.fill())}}function _c(e,t,n,r,i,a,o){if(o===`none`||t.length<2)return;let{bottom:s,plotHeight:c}=n;e.strokeStyle=a,e.lineWidth=1,o===`dashed`?e.setLineDash([4,4]):e.setLineDash([]),e.beginPath();for(let n=0;n<t.length-1;n++){let a=t[n],o=t[n+1],l=a.end,u=Math.round(s-(l-r)/i*c)+.5,d=Math.round(a.rectX+a.rectW),f=Math.round(o.rectX);f<=d||(e.moveTo(d,u),e.lineTo(f,u))}e.stroke(),e.setLineDash([])}function vc(e,t,n,r,i,a){e.fillStyle=r.text,e.font=`${r.font.sizeSmall}px ${r.font.family}`,e.textAlign=`center`;for(let r=0;r<t.length;r++){let o=t[r],s;s=o.type===`total`||o.type===`subtotal`?i(o.value):a?`${o.value>=0?`+`:``}${i(o.value)}`:i(n[r]);let c=o.rectX+o.rectW/2;o.end<o.start?(e.textBaseline=`top`,e.fillText(s,c,o.rectY+o.rectH+4)):(e.textBaseline=`bottom`,e.fillText(s,c,o.rectY-4))}}function yc(e,t,n,r,i){e.fillStyle=r.axisLabel,e.font=`${r.font.sizeSmall}px ${r.font.family}`,e.textAlign=`center`,e.textBaseline=`top`;let a=n.bottom+6,o=t.length>0?t[0].slotW-4:0,s=!1;for(let n=0;n<t.length;n++)if(e.measureText(i(t[n].label)).width>o){s=!0;break}if(!s){for(let n=0;n<t.length;n++){let r=t[n],o=r.slotX+r.slotW/2;e.fillText(i(r.label),o,a)}return}e.save(),e.textAlign=`right`,e.textBaseline=`middle`;for(let n=0;n<t.length;n++){let r=t[n],o=r.slotX+r.slotW/2;e.setTransform(1,0,0,1,o,a+4),e.rotate(-Math.PI/4),e.fillText(i(r.label),0,0)}e.setTransform(1,0,0,1,0,0),e.restore()}function bc(e,t,n){if(t<n.left||t>n.right)return null;for(let n=0;n<e.length;n++){let r=e[n];if(t>=r.slotX&&t<=r.slotX+r.slotW)return n}return null}function xc(e,t,n,r,i,a,o,s){let c=t[r],l=n[r],u=Math.round(c.slotX+c.slotW/2)+.5;e.strokeStyle=o.crosshair,e.lineWidth=.5,e.setLineDash([4,4]),e.beginPath(),e.moveTo(u,a.top),e.lineTo(u,a.bottom),e.stroke(),e.setLineDash([]);let d=[c.label,`Value: ${c.value>=0&&(c.type===`positive`||c.type===`negative`)?`+`:``}${s(c.value)}`,`Total: ${s(l)}`];e.font=`${o.font.sizeSmall}px ${o.font.family}`;let f=0;for(let t=0;t<d.length;t++){let n=e.measureText(d[t]).width;n>f&&(f=n)}let p=f+16,m=d.length*(o.font.sizeSmall+4)+12,h=i.x+10,g=i.y-m/2;h+p>a.right&&(h=i.x-p-10),g<a.top&&(g=a.top),g+m>a.bottom&&(g=a.bottom-m),e.fillStyle=o.axisLabelBackground,e.globalAlpha=.9,e.fillRect(h,g,p,m),e.globalAlpha=1,e.fillStyle=o.text,e.textAlign=`left`,e.textBaseline=`top`;let _=o.font.sizeSmall+4;for(let t=0;t<d.length;t++)e.fillText(d[t],h+8,g+6+t*_)}function Sc(e,t,n,r,i,a){let{data:o}=r;if(!o||o.length===0||t<=0||n<=0)return{hitBar:null};let s=r.positiveColor??i.candleUp,c=r.negativeColor??i.candleDown,l=r.totalColor??i.lineColor,u=r.subtotalColor??i.textSecondary,d=r.connectorColor??i.textSecondary,f=r.connectorStyle??`dashed`,p=r.barWidth??sc,m=r.showValues!==!1,h=r.showDelta!==!1,g=r.valueFormat??uc,_=r.labelFormat??(e=>e),{valMin:v,valMax:y}=pc(o),b=y-v||1,x=dc(t,n),{bars:S,cumulatives:C}=fc(o,x,p,v,b);mc(e,t,n,i.background),hc(e,x,v,y,i,g),_c(e,S,x,v,b,d,f),gc(e,S,{positive:s,negative:c,total:l,subtotal:u}),m&&vc(e,S,C,i,g,h),yc(e,S,x,i,_);let w=a?bc(S,a.x,x):null;return a&&w!==null&&xc(e,S,C,w,a,x,i,g),{hitBar:w}}var Cc=Math.PI/180,wc=150,Tc=240,Ec=90,Dc=.14,Oc=1.6*Cc,kc=.22,Ac=8,jc=18,Mc=16,Nc=6.5,Pc=20,Fc=5,Ic=28;function Q(e,t,n){return e<t?t:e>n?n:e}function Lc(e){let t=Math.abs(e);return t>=1e6?(e/1e6).toFixed(2)+`M`:t>=1e3?(e/1e3).toFixed(1)+`K`:Number.isInteger(e)?e.toFixed(0):e.toFixed(1)}function Rc(e){let t=Number.isFinite(e.startAngle)?e.startAngle:wc,n=(Number.isFinite(e.endAngle)?e.endAngle:t+Tc)-t;return n<=0&&(n=(n%360+360)%360||360),n=Q(n,Ec,360),{start:(t%360+360)%360*Cc,sweep:n*Cc}}function zc(e,t){let n=Math.min(Math.cos(e),Math.cos(t)),r=Math.max(Math.cos(e),Math.cos(t)),i=Math.min(Math.sin(e),Math.sin(t)),a=Math.max(Math.sin(e),Math.sin(t));for(let o=Math.ceil(e/(Math.PI/2));Math.PI/2*o<=t;o++){let e=Math.PI/2*o;n=Math.min(n,Math.cos(e)),r=Math.max(r,Math.cos(e)),i=Math.min(i,Math.sin(e)),a=Math.max(a,Math.sin(e))}return{minX:n,maxX:r,minY:i,maxY:a}}function Bc(e){if(e.showZoneLabels!==!0||!e.zones)return 0;let t=e.zones.reduce((e,t)=>Math.max(e,t.label?.length??0),0);return t>0?t*Nc+12:0}function Vc(e,t,n){let r=Number.isFinite(n.min)?n.min:0,i=Number.isFinite(n.max)?n.max:100;i-r>Math.abs(r)*1e-9||(i=r+Math.max(1,Math.abs(r)*1e-6));let{start:a,sweep:o}=Rc(n),s=a,c=a+o,l=Q(n.thickness??Dc,.04,.5),u=zc(s,c),d=Math.max(u.maxY,.18),f=Bc(n),p=f>0?Mc:0,m=Math.max(1,e-2*Ac-2*f),h=Math.max(1,t-2*Ac-jc-p),g=1+l/2,_=Math.max(8,Math.min(m/((u.maxX-u.minX)*g),h/((d-u.minY)*g))),v=_*l,y=(d-u.minY)*_*g+jc+p,b=e/2-(u.maxX+u.minX)/2*_,x=(t-y)/2+p-u.minY*_*g,S=_-v/2,C=Math.max(11,Math.round(S*.46)),w=u.maxY>.3?x-C*.12:x-C*.55,T=Math.max(Math.sin(s),Math.sin(c)),E=T>.2?x+T*_+v/2+2:1/0,D=Math.min(t-Ac,E);return{cx:b,cy:x,radius:_,thickness:v,startAngle:s,endAngle:c,min:r,max:i,valueY:w,valueSize:C,textBottom:D}}function Hc(e,t){let n=Number.isFinite(e)?Q((e-t.min)/(t.max-t.min),0,1):0;return t.startAngle+(t.endAngle-t.startAngle)*n}function Uc(e,t){if(!t||!Number.isFinite(e))return;let n;for(let r of t)e>=r.from&&e<=r.to&&(n=r);return n}function Wc(e,t,n){let r=(t??[]).map(t=>({a0:Hc(t.from,e),a1:Hc(t.to,e),color:t.color,track:!1})).filter(e=>e.a1>e.a0).sort((e,t)=>e.a0-t.a0),i=[],a=e.startAngle;for(let e of r)e.a1<=a||(e.a0>a+1e-9&&i.push({a0:a,a1:e.a0,color:n,track:!0}),i.push({...e,a0:Math.max(e.a0,a)}),a=e.a1);return a<e.endAngle-1e-9&&i.push({a0:a,a1:e.endAngle,color:n,track:!0}),i}function $(e,t,n,r,i){r<=n||(e.beginPath(),e.arc(t.cx,t.cy,t.radius,n,r,!1),e.lineWidth=t.thickness,e.lineCap=`butt`,e.strokeStyle=i,e.stroke())}function Gc(e,t,n,r,i,a){let o=t.cx+Math.cos(n)*t.radius,s=t.cy+Math.sin(n)*t.radius,c=a===`start`?n-Math.PI:n;e.globalAlpha=i,e.beginPath(),e.arc(o,s,t.thickness/2,c,c+(i>=1?Math.PI*2:Math.PI),!1),e.closePath(),e.fillStyle=r,e.fill(),e.globalAlpha=1}function Kc(e,t,n,r,i,a){let o=Wc(t,n,i),s=o.some(e=>!e.track);o.forEach((n,i)=>{let a=i>0&&!n.track&&!o[i-1].track?Oc/2:0,s=i<o.length-1&&!n.track&&!o[i+1].track?Oc/2:0,c=n.a0+a,l=n.a1-s;if(n.track){$(e,t,c,l,n.color);return}e.globalAlpha=kc,$(e,t,c,l,n.color),e.globalAlpha=1,$(e,t,c,Math.min(l,r),n.color)}),s||$(e,t,t.startAngle,r,a);let c=r>t.startAngle+1e-9,l=r>=t.endAngle-1e-9,u=(e,t)=>e.track?[!s&&t?a:i,1]:[e.color,t?1:kc],[d,f]=u(o[0],c),[p,m]=u(o[o.length-1],l);Gc(e,t,t.startAngle,d,f,`start`),Gc(e,t,t.endAngle,p,m,`end`)}function qc(e,t,n){let r=t.radius-t.thickness/2;if(r<Ic)return;let i=Math.max(4,t.thickness*.45);e.strokeStyle=n,e.lineCap=`butt`;for(let n=0;n<=Pc;n++){let a=n%Fc===0,o=t.startAngle+(t.endAngle-t.startAngle)*n/Pc,s=r-i,c=s-(a?Math.max(6,t.thickness*.55):Math.max(3,t.thickness*.3));e.globalAlpha=a?.55:.3,e.lineWidth=a?1.5:1,e.beginPath(),e.moveTo(t.cx+Math.cos(o)*s,t.cy+Math.sin(o)*s),e.lineTo(t.cx+Math.cos(o)*c,t.cy+Math.sin(o)*c),e.stroke()}e.globalAlpha=1}function Jc(e,t,n,r,i){let a=t.cx+Math.cos(n)*t.radius,o=t.cy+Math.sin(n)*t.radius;e.beginPath(),e.arc(a,o,t.thickness*.78,0,Math.PI*2),e.fillStyle=r,e.fill(),e.lineWidth=Math.max(2,t.thickness*.32),e.strokeStyle=i,e.stroke()}function Yc(e,t,n,r,i){let a=Math.cos(n),o=Math.sin(n),s=t.radius-t.thickness*.9,c=Math.max(6,t.thickness*.6),l=Math.max(1.5,t.thickness*.14);e.beginPath(),e.moveTo(t.cx+a*s,t.cy+o*s),e.lineTo(t.cx-o*l-a*c,t.cy+a*l-o*c),e.lineTo(t.cx+o*l-a*c,t.cy-a*l-o*c),e.closePath(),e.fillStyle=r,e.fill(),e.beginPath(),e.arc(t.cx,t.cy,Math.max(4,t.thickness*.42),0,Math.PI*2),e.fill(),e.lineWidth=2,e.strokeStyle=i,e.stroke()}function Xc(e,t,n,r,i,a,o){e.font=`${n} ${r}px ${i}`;let s=e.measureText(t).width;if(s<=a)return r;let c=Math.floor(r*a/s);return c<o?0:(e.font=`${n} ${c}px ${i}`,c)}function Zc(e,t,n,r,i,a,o){let s=a.font.family,c=(t.radius-t.thickness/2)*1.3,l=a.font.sizeSmall;e.textAlign=`center`,e.textBaseline=`middle`;let u=Xc(e,n,`600`,t.valueSize,s,c,l);if(u===0)return;let d=o?Math.min(t.cy+u*.8,t.textBottom-u/2):t.valueY;e.fillStyle=a.text,e.fillText(n,t.cx,d);let f=Math.max(l,Math.round(u*.26));if(i?.label&&!o){let n=i.label.toUpperCase();Xc(e,n,`600`,f,s,c*.9,l)>0&&(e.fillStyle=i.color,e.fillText(n,t.cx,d-u*.78))}if(r){let n=d+u*.72;n+f/2<=t.textBottom&&Xc(e,r,`400`,f,s,c,l)>0&&(e.fillStyle=a.textSecondary,e.fillText(r,t.cx,n))}}function Qc(e,t,n,r){e.fillStyle=r.textSecondary,e.font=`${r.font.sizeSmall+1}px ${r.font.family}`;let i=t.thickness/2+6;for(let[r,a]of[[t.startAngle,t.min],[t.endAngle,t.max]]){let o=Math.cos(r),s=Math.sin(r),c=t.cx+o*t.radius,l=t.cy+s*t.radius;s>.2?(e.textAlign=`center`,e.textBaseline=`top`,e.fillText(n(a),c,l+i)):(e.textAlign=o<-.2?`right`:o>.2?`left`:`center`,e.textBaseline=s<-.2?`bottom`:`middle`,e.fillText(n(a),c+o*i,l+s*i))}}function $c(e,t,n,r){e.fillStyle=r.textSecondary,e.font=`${r.font.sizeSmall}px ${r.font.family}`,e.textBaseline=`middle`;let i=t.radius+t.thickness/2+8;for(let r of n){if(!r.label)continue;let n=Hc((Q(r.from,t.min,t.max)+Q(r.to,t.min,t.max))/2,t),a=Math.cos(n);e.textAlign=a<-.2?`right`:a>.2?`left`:`center`,e.fillText(r.label,t.cx+a*i,t.cy+Math.sin(n)*i)}}function el(e,t,n,r,i,a){if(t<=0||n<=0)return;let o=Vc(t,n,r),s=Number.isFinite(a),c=s?Q(a,o.min,o.max):o.min,l=Hc(c,o),u=s?Uc(c,r.zones):void 0,d=r.pointer===`needle`,f=r.valueFormat??Lc,p=u?.color??r.needleColor??i.lineColor;e.save(),e.fillStyle=i.background,e.fillRect(0,0,t,n),Kc(e,o,r.zones,l,r.trackColor??i.grid,p),qc(e,o,i.textSecondary),s&&(d?Yc(e,o,l,r.needleColor??i.text,i.background):Jc(e,o,l,p,i.background)),r.showValue!==!1&&Zc(e,o,s?f(c):`โ€”`,r.label,u,i,d),Qc(e,o,f,i),r.showZoneLabels===!0&&r.zones?.length&&$c(e,o,r.zones,i),e.restore()}exports.ABCDPatternTool=zi,exports.ADXIndicator=At,exports.ATRIndicator=kt,exports.AcceleratorOscillatorIndicator=bn,exports.AccumulationDistributionIndicator=On,exports.AlertDragHandler=Jn,exports.AlertManager=ko,exports.AlligatorIndicator=ht,exports.AnchoredVWAPIndicator=ot,exports.AnchoredVWAPTool=ei,exports.Animator=ss,exports.AreaRenderer=ae,exports.AroonIndicator=Ft,exports.ArrowTool=Yr,exports.AwesomeOscillatorIndicator=wt,exports.AxisDragHandler=qn,exports.BalanceOfPowerIndicator=nn,exports.BarCountdown=mo,exports.BarRenderer=oe,exports.BaseFinanceChart=ls,exports.BaselineRenderer=ce,exports.BinanceAdapter=za,exports.BollingerBandsIndicator=Ze,exports.BracketTool=_a,exports.BybitAdapter=Za,exports.CCIIndicator=Nt,exports.CMFIndicator=Rt,exports.CandlestickRenderer=ee,exports.CanvasLayer=t,exports.ChaikinOscillatorIndicator=Tt,exports.ChaikinVolatilityIndicator=pn,exports.ChandeMomentumIndicator=an,exports.ChandelierExitIndicator=mt,exports.ChartLegend=uo,exports.ChartStateManager=Uo,exports.ChoppinessIndexIndicator=Vt,exports.CircleTool=Vi,exports.CoinbaseAdapter=Ga,exports.CompareRenderer=ze,exports.ConnorsRSIIndicator=Gt,exports.CoppockIndicator=qt,exports.CrossLineTool=ai,exports.CrosshairHandler=Zn,exports.CrosshairTooltip=dr,exports.CurrentPriceLine=Ma,exports.CyclicLinesTool=Zi,exports.DEFAULT_LEGEND_CONFIG=lo,exports.DEFAULT_SESSION_HOURS=Eo,exports.DPRManager=i,exports.DataExporter=Go,exports.DateAndPriceRangeTool=qi,exports.DateRangeTool=Gr,exports.DepthHeatmapBuffer=Ie,exports.DepthHeatmapRenderer=Le,exports.DepthOverlay=da,exports.DetrendedPriceOscillatorIndicator=tn,exports.DisparityIndexIndicator=Cn,exports.DonchianChannelIndicator=rt,exports.DrawingBase=z,exports.DrawingManager=Cr,exports.DrawingRenderer=wr,exports.EMAIndicator=Xe,exports.EaseOfMovementIndicator=cn,exports.Easing=os,exports.ElderRayIndicator=Xt,exports.ElliottWaveTool=Ur,exports.EllipseTool=Rr,exports.Emitter=K,exports.EnvelopeIndicator=yt,exports.EquivolumeRenderer=pe,exports.EventBus=yr,exports.ExtendedLineTool=jr,exports.FibChannelTool=Mi,exports.FibExtensionTool=Ir,exports.FibRetracementTool=Pr,exports.FibSpeedResistanceFanTool=Ii,exports.FibTimeZonesTool=ri,exports.FinanceCrosshair=us,exports.FisherTransformIndicator=en,exports.ForceIndexIndicator=Wt,exports.GannBoxTool=$r,exports.GannFanTool=Zr,exports.GridRenderer=Nn,exports.HLCAreaRenderer=he,exports.HeadAndShouldersTool=Bi,exports.HollowCandleRenderer=se,exports.HorizontalLineTool=Dr,exports.HorizontalRayTool=Or,exports.HullMAIndicator=lt,exports.IchimokuIndicator=$e,exports.IndicatorBase=j,exports.IndicatorEngine=Je,exports.IndicatorValueMap=M,exports.IndicatorWorkerHost=Mn,exports.InfoLineTool=Oi,exports.InteractionManager=zn,exports.KSTIndicator=Jt,exports.KagiRenderer=ue,exports.KeltnerChannelIndicator=nt,exports.KeyboardHandler=nr,exports.KlingerIndicator=$t,exports.KrakenAdapter=io,exports.LayerManager=n,exports.LineRenderer=ie,exports.LineWithMarkersRenderer=_e,exports.LinearRegressionChannelIndicator=ct,exports.MACDIndicator=Dt,exports.MFIIndicator=Pt,exports.MTFMovingAverageIndicator=ft,exports.MarketProfileRenderer=Te,exports.MassIndexIndicator=rn,exports.MeasureOverlay=Xo,exports.MeasureTool=Kr,exports.MockAdapter=Ba,exports.ModifiedSchiffPitchforkTool=Vr,exports.OBVIndicator=jt,exports.OrderDraftTool=Ca,exports.OrderRenderer=ia,exports.PanHandler=Gn,exports.PaneResizeHandler=Yn,exports.PaperExecutionAdapter=Oa,exports.ParabolicSARIndicator=et,exports.ParallelChannelTool=Mr,exports.PercentagePriceOscillatorIndicator=vn,exports.PeriodLevelsRenderer=Ae,exports.PinnedTooltip=hr,exports.PitchforkTool=U,exports.PivotMarkersRenderer=Pe,exports.PivotPointsIndicator=at,exports.PointAndFigureRenderer=de,exports.PollingAdapter=Ha,exports.PositionRenderer=ua,exports.PrettyGoodOscillatorIndicator=Tn,exports.PriceAxis=Fn,exports.PriceLabelTool=na,exports.PriceRangeTool=Wr,exports.PriceVolumeTrendIndicator=fn,exports.QstickIndicator=wn,exports.RANGE_PRESETS=w,exports.ROCIndicator=It,exports.RSIIndicator=Et,exports.RayTool=Ar,exports.ReconnectManager=ja,exports.RectangleTool=Lr,exports.RegressionChannelTool=Nr,exports.RelativeMomentumIndexIndicator=Sn,exports.RelativeVigorIndicator=mn,exports.RenderEngine=x,exports.RenderLoop=r,exports.RenkoRenderer=le,exports.ReplayController=Pa,exports.ReplayManager=Ao,exports.RiskRewardTool=ii,exports.SELECTION_BOX_MIN_SIZE=is,exports.SMAIndicator=Ye,exports.SNAPSHOT_VERSION=jo,exports.SchaffTrendCycleIndicator=Zt,exports.SchiffPitchforkTool=Br,exports.Screenshot=fo,exports.SelectionBoxOverlay=as,exports.SessionBreaks=ho,exports.SessionShading=Do,exports.SessionVWAPIndicator=pt,exports.SignalMarkerManager=qo,exports.StdDevIndicator=En,exports.StepLineRenderer=ge,exports.StochasticIndicator=Ot,exports.StochasticRSIIndicator=hn,exports.StreamManager=Na,exports.SupertrendIndicator=tt,exports.TEMAIndicator=Ct,exports.TRIXIndicator=on,exports.TSIIndicator=Lt,exports.TextAnnotationTool=Jr,exports.TickAggregator=Aa,exports.TimeAxis=Ln,exports.TradeZoneManager=Yo,exports.TradingContextMenu=pa,exports.TradingDragHandler=fa,exports.TradingManager=Ea,exports.TradingRenderer=Da,exports.TrendAngleTool=li,exports.TrendLineTool=Er,exports.TriangleTool=zr,exports.UltimateOscillatorIndicator=Ht,exports.UndoRedoManager=Wo,exports.VROCIndicator=kn,exports.VWAPIndicator=Qe,exports.VWMAIndicator=_t,exports.VerticalLineTool=kr,exports.Viewport=S,exports.VolumeCandleRenderer=fe,exports.VolumeDeltaIndicator=zt,exports.VolumeProfileIndicator=Dn,exports.VolumeProfileRangeTool=ti,exports.VolumeProfileRenderer=ye,exports.VolumeRenderer=ve,exports.VortexIndicator=Bt,exports.WMAIndicator=vt,exports.Watermark=po,exports.WebSocketAdapter=Va,exports.WilliamsADIndicator=un,exports.WilliamsRIndicator=Mt,exports.XABCDPatternTool=Ri,exports.ZigZagIndicator=st,exports.ZoomHandler=Kn,exports.assignSessionLetters=Ce,exports.barIndexToTime=m,exports.barIndexToX=a,exports.barTimeStep=f,exports.barTimeStepMs=p,exports.bracketRiskReward=ha,exports.classifyPivots=Me,exports.computeBracketDefaults=ma,exports.computeMarketProfile=xe,exports.computePeriodLevels=ke,exports.computeSessionProfiles=we,exports.findDominantSwing=Tr,exports.findPivots=Ne,exports.formatTooltipTime=lr,exports.getIntParam=P,exports.getNumberParam=N,exports.getVisibleData=C,exports.inferOrderType=xa,exports.isInWindow=wo,exports.isRegularSession=To,exports.isWorkerResponse=jn,exports.layoutSquarifiedTreemap=Ys,exports.layoutUniformGrid=Gs,exports.lttbDownsample=te,exports.lttbVisibleIndices=re,exports.minuteOfDay=Co,exports.priceBucketRow=c,exports.priceToY=o,exports.priceToYMapper=s,exports.rangePresetStart=A,exports.registerBuiltInDrawingTools=ra,exports.registerBuiltInIndicators=An,exports.renderDepthChart=Es,exports.renderEquityCurve=Ws,exports.renderGauge=el,exports.renderHeatmap=nc,exports.renderSparkline=ds,exports.renderWaterfall=Sc,exports.resolveBarIndex=g,exports.timeToX=_,exports.timestampToBarIndex=h,exports.toHeikinAshi=Be,exports.toKagi=We,exports.toLineBreak=Ue,exports.toPointAndFigure=Ge,exports.toRangeBars=Ke,exports.toRenko=Ve,exports.tpoLetter=Se,exports.xToBarIndex=l,exports.xToTime=v,exports.yToPrice=u;
26
26
  //# sourceMappingURL=index.cjs.map