@acorex/charts 21.0.1-next.7 → 21.0.1-next.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/acorex-charts-bar-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-chart-legend.mjs +2 -2
- package/fesm2022/acorex-charts-chart-legend.mjs.map +1 -1
- package/fesm2022/acorex-charts-chart-tooltip.mjs.map +1 -1
- package/fesm2022/acorex-charts-donut-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-gauge-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-hierarchy-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-line-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-charts-donut-chart.mjs","sources":["../../../../packages/charts/donut-chart/src/lib/donut-chart.config.ts","../../../../packages/charts/donut-chart/src/lib/donut-chart.component.ts","../../../../packages/charts/donut-chart/src/lib/donut-chart.component.html","../../../../packages/charts/donut-chart/src/acorex-charts-donut-chart.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { AXDonutChartOption } from './donut-chart.type';\n\nexport const AXDonutChartDefaultConfig: AXDonutChartOption = {\n showTooltip: true,\n showDataLabels: true,\n donutWidth: 35,\n cornerRadius: 4,\n animationDuration: 800,\n animationEasing: 'cubic-out',\n messages: {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All segments are hidden',\n allHiddenHelp: 'Please toggle visibility of at least one segment',\n noDataIcon: 'fa-light fa-chart-pie',\n allHiddenIcon: 'fa-light fa-eye-slash',\n },\n};\n\nexport const AX_DONUT_CHART_CONFIG = new InjectionToken<AXDonutChartOption>('AX_DONUT_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXDonutChartDefaultConfig,\n});\n\nexport type PartialDonutChartConfig = Partial<AXDonutChartOption>;\n\nexport function donutChartConfig(config: PartialDonutChartConfig = {}): AXDonutChartOption {\n const result = {\n ...AXDonutChartDefaultConfig,\n ...config,\n };\n return result;\n}\n","import {\n AX_CHART_COLOR_PALETTE,\n AXChartComponent,\n AXChartComponentBase,\n computeTooltipPosition,\n getChartColor,\n getEasingFunction,\n} from '@acorex/charts';\nimport { AXChartLegendCompatible, AXChartLegendItem } from '@acorex/charts/chart-legend';\nimport { AXChartTooltipComponent, AXChartTooltipData } from '@acorex/charts/chart-tooltip';\n\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n output,\n signal,\n untracked,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AX_DONUT_CHART_CONFIG } from './donut-chart.config';\nimport { AXDonutChartData, AXDonutChartOption, AXDonutChartValue } from './donut-chart.type';\n\n/**\n * Donut Chart Component\n * Displays data in a circular donut chart with interactive segments\n */\n@Component({\n selector: 'ax-donut-chart',\n templateUrl: './donut-chart.component.html',\n styleUrls: ['./donut-chart.component.scss'],\n encapsulation: ViewEncapsulation.None,\n imports: [AXChartTooltipComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXDonutChartComponent\n extends AXChartComponent\n implements OnDestroy, AXChartLegendCompatible, AXChartComponentBase\n{\n // Dependency Injection\n private cdr = inject(ChangeDetectorRef);\n\n // Inputs\n /** Chart data input */\n data = input<AXDonutChartValue>([]);\n\n /** Chart options input */\n options = input<AXDonutChartOption>({});\n\n // Outputs\n /** Emitted when a segment is clicked */\n segmentClick = output<AXDonutChartData>();\n\n /** Emitted when a segment has mouse hover\n * Can be used by external elements to highlight this segment\n */\n segmentHover = output<AXDonutChartData | null>();\n\n // Chart container reference\n private readonly chartContainerEl = viewChild.required<ElementRef<HTMLDivElement>>('chartContainer');\n\n // D3 reference - loaded asynchronously\n protected d3!: typeof import('d3');\n\n // Chart SVG reference (using 'any' since D3 is loaded dynamically at runtime)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private svg: any = null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private pieData: any[] = [];\n\n // State management\n private hiddenSegments = new Set<string>();\n private _initialized = signal(false);\n private _rendered = signal(false);\n private _isInitialAnimating = signal(false);\n private _currentlyHighlightedSegment = signal<string | null>(null);\n\n // Tooltip state\n private _tooltipVisible = signal(false);\n private _tooltipPosition = signal({ x: 0, y: 0 });\n private _tooltipData = signal<AXChartTooltipData>({\n title: '',\n value: 0,\n percentage: '0%',\n color: '',\n });\n\n // Public computed properties for the template\n protected tooltipVisible = this._tooltipVisible.asReadonly();\n protected tooltipPosition = this._tooltipPosition.asReadonly();\n protected tooltipData = this._tooltipData.asReadonly();\n\n // Inject configuration\n private configToken = inject(AX_DONUT_CHART_CONFIG);\n\n // Inject the chart colors\n private chartColors = inject(AX_CHART_COLOR_PALETTE);\n\n // Computed configuration options\n protected effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n });\n\n // Constants\n private readonly TOOLTIP_GAP = 10;\n private readonly HIGHLIGHT_TRANSITION_DURATION = 150;\n private readonly HIGHLIGHT_TRANSITION_NAME = 'highlight';\n private readonly SEGMENT_ANIMATION_DELAY = 50;\n private readonly LABEL_ANIMATION_DELAY = 200;\n private readonly MIN_CHART_DIMENSION = 200;\n private readonly MIN_CHART_FOR_LABELS = 260;\n private readonly DIMMED_OPACITY = 0.5;\n private readonly VISIBLE_OPACITY = 1;\n\n // Messages with defaults\n protected effectiveMessages = computed(() => {\n const defaultMessages = {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All segments are hidden',\n allHiddenHelp: 'Please toggle visibility of at least one segment',\n noDataIcon: 'fa-light fa-chart-pie',\n allHiddenIcon: 'fa-light fa-eye-slash',\n };\n return {\n ...defaultMessages,\n ...this.effectiveOptions().messages,\n };\n });\n\n // Data accessor for handling different incoming data formats\n protected chartDataArray = computed((): AXDonutChartData[] => {\n return this.data() || [];\n });\n\n // Color accessor method\n protected getColor(index: number): string {\n return getChartColor(index, this.chartColors);\n }\n\n // Segment visibility check\n protected isSegmentHidden(id: string): boolean {\n return this.hiddenSegments.has(id);\n }\n\n constructor() {\n super();\n // Dynamically load D3 and initialize the chart when the component is ready\n afterNextRender(() => {\n this._initialized.set(true);\n this.loadD3();\n });\n }\n\n private readonly dataChangeEffect = effect(() => {\n // Track data and options changes\n this.data();\n this.effectiveOptions();\n\n // Only update if already rendered\n untracked(() => {\n if (this._rendered()) {\n this.updateChart();\n }\n });\n });\n\n /**\n * Highlights a specific segment by ID\n * @param id The segment ID to highlight, or null to clear highlight\n */\n highlightSegment(id: string | null): void {\n if (this._isInitialAnimating() || !this.svg) return;\n\n if (this._currentlyHighlightedSegment() === id) return;\n\n this._currentlyHighlightedSegment.set(id);\n\n // Only interrupt ongoing HIGHLIGHT transitions (not initial animations)\n this.svg.selectAll('path').interrupt(this.HIGHLIGHT_TRANSITION_NAME);\n\n if (id === null) {\n this.clearAllHighlights();\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const targetSegment = this.svg.selectAll('path').filter((d: any) => d?.data?.id === id);\n\n if (targetSegment.empty()) {\n this._currentlyHighlightedSegment.set(null);\n this.highlightSegment(null);\n return;\n }\n\n this.dimNonTargetSegments(id);\n this.highlightTargetSegment(targetSegment);\n this.segmentHover.emit(this.getSegmentDataById(id));\n }\n\n private clearAllHighlights(): void {\n if (!this.svg) return;\n\n this.svg\n .selectAll('path')\n .classed('ax-donut-chart-highlighted', false)\n .classed('ax-donut-chart-dimmed', false)\n .transition(this.HIGHLIGHT_TRANSITION_NAME)\n .duration(this.HIGHLIGHT_TRANSITION_DURATION)\n .attr('transform', null)\n .style('filter', null)\n .style('opacity', this.VISIBLE_OPACITY);\n\n this.segmentHover.emit(null);\n }\n\n private dimNonTargetSegments(targetId: string): void {\n if (!this.svg) return;\n\n this.svg\n .selectAll('path')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .filter((d: any) => d?.data?.id !== targetId)\n .classed('ax-donut-chart-highlighted', false)\n .classed('ax-donut-chart-dimmed', true)\n .transition(this.HIGHLIGHT_TRANSITION_NAME)\n .duration(this.HIGHLIGHT_TRANSITION_DURATION)\n .attr('transform', null)\n .style('filter', null)\n .style('opacity', this.DIMMED_OPACITY);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private highlightTargetSegment(targetSegment: any): void {\n targetSegment\n .classed('ax-donut-chart-dimmed', false)\n .classed('ax-donut-chart-highlighted', true)\n .transition(this.HIGHLIGHT_TRANSITION_NAME)\n .duration(this.HIGHLIGHT_TRANSITION_DURATION)\n .style('filter', 'url(#ax-donut-chart-segment-shadow)')\n .style('opacity', this.VISIBLE_OPACITY);\n }\n\n private getSegmentDataById(segmentId: string): AXDonutChartData | null {\n return untracked(() => this.chartDataArray()).find((d) => d.id === segmentId) || null;\n }\n\n /**\n * Toggles visibility of a segment by ID\n * @param id Segment ID to toggle\n * @returns New visibility state (true = visible, false = hidden)\n */\n toggleSegment(id: string): boolean {\n const chartData = this.chartDataArray();\n const wasAllHidden = chartData.length > 0 && chartData.every((d) => this.isSegmentHidden(d.id));\n\n if (this.hiddenSegments.has(id)) {\n // Making a segment visible\n this.hiddenSegments.delete(id);\n\n // If all segments were previously hidden, we need to ensure the message is cleared\n if (wasAllHidden) {\n // Force complete DOM cleanup and redraw\n if (this.chartContainerEl()?.nativeElement) {\n // Clear only chart SVG and message containers (preserve tooltip component)\n this.d3\n ?.select(this.chartContainerEl().nativeElement)\n .selectAll('svg, .ax-chart-message-container, .ax-donut-chart-no-data-message')\n .remove();\n\n // Force full redraw\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n } else {\n this.updateChart();\n }\n } else {\n // Hiding a segment\n this.hiddenSegments.add(id);\n this.updateChart();\n }\n\n return !this.isSegmentHidden(id);\n }\n\n ngOnDestroy(): void {\n this.cleanupChart();\n }\n\n /**\n * Loads D3.js dynamically\n */\n protected async loadD3(): Promise<void> {\n try {\n this.d3 = await import('d3');\n // If container is ready, create chart\n if (this._initialized() && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n } catch (error) {\n console.error('Failed to load D3.js:', error);\n }\n }\n\n protected onSegmentClick(item: AXDonutChartData): void {\n this.segmentClick.emit(item);\n }\n\n /**\n * Creates the donut chart from current data\n */\n public createChart(): void {\n if (!this.d3 || !this.chartContainerEl()?.nativeElement) return;\n\n try {\n const containerElement = this.chartContainerEl().nativeElement;\n this.clearChart(containerElement);\n\n const data = this.chartDataArray();\n if (!data || data.length === 0) {\n this.showNoDataMessage();\n return;\n }\n\n const visibleData = data.filter((item) => !this.hiddenSegments.has(item.id));\n if (visibleData.length === 0) {\n this.showAllSegmentsHiddenMessage();\n return;\n }\n\n const options = this.effectiveOptions();\n const { width, height } = this.setupDimensions(containerElement, options);\n this.renderDonutChart(containerElement, width, height, visibleData);\n } catch (error) {\n console.error('Error creating donut chart:', error);\n this.handleChartError();\n }\n }\n\n /**\n * Updates the chart with new data\n */\n public updateChart(): void {\n // Reset highlighted segment state when updating\n this._currentlyHighlightedSegment.set(null);\n this.createChart(); // Recreate the chart with updated data\n }\n\n /**\n * Clears the chart container\n */\n private clearChart(container: HTMLElement): void {\n this.d3.select(container).selectAll('svg, .ax-chart-message-container, .ax-donut-chart-no-data-message').remove();\n this._tooltipVisible.set(false);\n }\n\n /**\n * Shows a message when no data is available\n */\n private showNoDataMessage(): void {\n if (!this.chartContainerEl()?.nativeElement) return;\n const container = this.chartContainerEl().nativeElement;\n this.renderMessage(\n container,\n this.effectiveMessages().noDataIcon,\n this.effectiveMessages().noData,\n this.effectiveMessages().noDataHelp,\n 'ax-donut-chart-no-data-message',\n );\n }\n\n /**\n * Shows a message when all segments are hidden\n */\n private showAllSegmentsHiddenMessage(): void {\n if (!this.chartContainerEl()?.nativeElement) return;\n const container = this.chartContainerEl().nativeElement;\n this.renderMessage(\n container,\n this.effectiveMessages().allHiddenIcon,\n this.effectiveMessages().allHidden,\n this.effectiveMessages().allHiddenHelp,\n 'ax-donut-chart-no-data-message',\n );\n }\n\n /**\n * Setups chart dimensions based on container and options\n */\n private setupDimensions(container: HTMLElement, options: AXDonutChartOption): { width: number; height: number } {\n const containerWidth = container.clientWidth || 400;\n const containerHeight = container.clientHeight || 400;\n\n const width = Math.max(options?.width || containerWidth, this.MIN_CHART_DIMENSION);\n const height = Math.max(options?.height || containerHeight, this.MIN_CHART_DIMENSION);\n\n return { width, height };\n }\n\n /**\n * Renders the donut chart with visible data\n */\n private renderDonutChart(\n container: HTMLElement,\n width: number,\n height: number,\n visibleData: AXDonutChartData[],\n ): void {\n const total = visibleData.reduce((sum, item) => sum + item.value, 0);\n\n // Create SVG container with filters\n const svg = this.createSvgWithFilters(container, width, height);\n\n // Create main chart group\n this.svg = svg.append('g').attr('transform', `translate(${width / 2}, ${height / 2})`);\n\n // Create donut segments\n this.createDonutSegments(width, height, visibleData, total);\n\n // Add total in center\n this.addCenterDisplay(total);\n }\n\n /**\n * Create SVG element with filter definitions for shadows\n * @returns D3 SVG selection (any type due to dynamic D3 loading)\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private createSvgWithFilters(container: HTMLElement, width: number, height: number): any {\n const svg = this.d3\n .select(container)\n .append('svg')\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${width} ${height}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n\n // Add drop shadow filter\n const defs = svg.append('defs');\n const filter = defs.append('filter').attr('id', 'ax-donut-chart-segment-shadow').attr('height', '130%');\n\n filter.append('feGaussianBlur').attr('in', 'SourceAlpha').attr('stdDeviation', 2).attr('result', 'blur');\n filter.append('feOffset').attr('in', 'blur').attr('dx', 1).attr('dy', 1).attr('result', 'offsetBlur');\n\n const feComponentTransfer = filter\n .append('feComponentTransfer')\n .attr('in', 'offsetBlur')\n .attr('result', 'offsetBlur');\n\n feComponentTransfer.append('feFuncA').attr('type', 'linear').attr('slope', 0.3);\n\n const feMerge = filter.append('feMerge');\n feMerge.append('feMergeNode').attr('in', 'offsetBlur');\n feMerge.append('feMergeNode').attr('in', 'SourceGraphic');\n\n return svg;\n }\n\n /**\n * Create and render the donut segments with animations\n */\n private createDonutSegments(chartWidth: number, chartHeight: number, data: AXDonutChartData[], total: number): void {\n this._isInitialAnimating.set(true);\n\n // Create pie layout\n const pie = this.d3\n .pie<AXDonutChartData>()\n .value((d) => d.value)\n .sort(null)\n .padAngle(0.02);\n\n // Calculate the radius of the donut chart\n const radius = (Math.min(chartWidth, chartHeight) / 2) * 0.85;\n\n // Calculate inner radius based on donutWidth percentage\n const donutWidthPercent = this.effectiveOptions().donutWidth / 100;\n const innerRadius = radius * (1 - donutWidthPercent);\n\n // Create arc generator with the configured radius and corner radius\n const arc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(radius * 0.95)\n .cornerRadius(this.effectiveOptions().cornerRadius);\n\n // Create label arc generator for placing labels (middle of the donut ring)\n const labelArc = this.d3\n .arc()\n .innerRadius(innerRadius + (radius * 0.95 - innerRadius) / 2)\n .outerRadius(innerRadius + (radius * 0.95 - innerRadius) / 2);\n\n // Get animation options\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n\n // Generate pie data\n this.pieData = pie(data);\n\n // Add segments with animation\n const segments = this.svg\n .selectAll('path')\n .data(this.pieData)\n .enter()\n .append('path')\n .attr('class', 'ax-donut-chart-segment')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .attr('fill', (d: any) => this.getSegmentColor(d.data))\n .style('opacity', 0)\n .style('cursor', 'pointer')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('mouseenter', (event: MouseEvent, d: any) => {\n if (this.effectiveOptions().showTooltip) {\n this.handleSliceHover(event, d.data);\n }\n })\n .on('mouseleave', () => this.handleSegmentLeave())\n .on('mousemove', (event: MouseEvent) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('click', (_event: MouseEvent, d: any) => {\n this.onSegmentClick(d.data);\n });\n\n // Animate segments\n const numSegments = this.pieData.length;\n let completed = 0;\n segments\n .transition()\n .duration(animationDuration)\n .ease(animationEasing)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .delay((_d: any, i: number) => i * this.SEGMENT_ANIMATION_DELAY)\n .style('opacity', this.VISIBLE_OPACITY)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .attrTween('d', (d: any) => {\n const interpolate = this.d3.interpolate({ startAngle: d.startAngle, endAngle: d.startAngle }, d);\n return (t: number) => arc(interpolate(t)) as string;\n })\n .on('end', () => {\n completed++;\n if (completed >= numSegments) {\n this._isInitialAnimating.set(false);\n this.cdr.detectChanges();\n }\n })\n .on('interrupt', () => {\n // Treat interrupts as completion to avoid getting stuck in animating state\n completed++;\n if (completed >= numSegments) {\n this._isInitialAnimating.set(false);\n this.cdr.detectChanges();\n }\n });\n\n // Add data labels if enabled and chart size is sufficient\n if (this.effectiveOptions().showDataLabels && this.isChartLargeEnoughForLabels(chartWidth, chartHeight)) {\n this.addDataLabels(labelArc, radius, innerRadius, total, animationDuration);\n }\n\n // Determine when all segment animations are complete (handle empty case)\n if (numSegments === 0) {\n this._isInitialAnimating.set(false);\n this.cdr.detectChanges();\n }\n }\n\n private isChartLargeEnoughForLabels(width: number, height: number): boolean {\n return Math.min(width, height) >= this.MIN_CHART_FOR_LABELS;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private addDataLabels(\n labelArc: any,\n radius: number,\n innerRadius: number,\n total: number,\n animationDuration: number\n ): void {\n if (!this.svg) return;\n\n const labelRadius = innerRadius + (radius * 0.95 - innerRadius) / 2;\n \n // Show labels for all segments with valid font size\n const dataWithLabels = this.pieData.filter((d) => {\n const fontSize = this.calculateLabelFontSize(d, radius, total, labelRadius);\n return fontSize > 0; // Only show if font size is valid\n });\n\n const labels = this.svg\n .selectAll('.ax-donut-chart-data-label')\n .data(dataWithLabels)\n .enter()\n .append('text')\n .attr('class', 'ax-donut-chart-data-label')\n .style('opacity', 0)\n .style('pointer-events', 'none')\n .style('fill', 'rgb(var(--ax-comp-donut-chart-data-labels-color))')\n .attr('transform', (d) => {\n const centroid = labelArc.centroid(d);\n return `translate(${centroid[0]}, ${centroid[1]})`;\n })\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .style('font-size', (d) => `${this.calculateLabelFontSize(d, radius, total, labelRadius)}px`)\n .style('font-weight', (d) => ((d.data.value / total) * 100 >= 15 ? '600' : '500'))\n .text((d) => this.getTruncatedLabelText(d, radius, labelRadius, total));\n\n labels\n .transition()\n .duration(animationDuration)\n .delay((_d, i: number) => i * this.SEGMENT_ANIMATION_DELAY + this.LABEL_ANIMATION_DELAY)\n .style('opacity', this.VISIBLE_OPACITY);\n }\n\n /**\n * Calculates optimal font size for label based on segment size\n * Uses smart dynamic sizing with readability constraints\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private calculateLabelFontSize(d: any, radius: number, total: number, labelRadius: number): number {\n const angle = d.endAngle - d.startAngle;\n const segmentPercentage = (d.data.value / total) * 100;\n\n // Don't show labels for very small segments (< 1%)\n if (segmentPercentage < 1) return 0;\n\n // Calculate chord length (available horizontal space)\n const chordLength = 2 * labelRadius * Math.sin(angle / 2);\n \n // Constants for font sizing\n const MIN_FONT_SIZE = 9; // Minimum readable size\n const MAX_FONT_SIZE = 14; // Maximum for aesthetics\n const MIN_CHORD_FOR_LABEL = 20; // Minimum space needed for any text\n \n // Don't show labels if space is too small\n if (chordLength < MIN_CHORD_FOR_LABEL) return 0;\n \n // Calculate font size based on multiple factors\n \n // 1. Based on arc angle (larger segments = larger font)\n const angleBasedSize = (angle * radius) / 8;\n \n // 2. Based on chord length (available horizontal space)\n const chordBasedSize = chordLength / 8;\n \n // 3. Based on segment percentage (proportional to data importance)\n const percentageBasedSize = 9 + (segmentPercentage / 100) * 5; // 9-14px range\n \n // Take the minimum of all calculations to ensure fit\n const calculatedSize = Math.min(angleBasedSize, chordBasedSize, percentageBasedSize);\n \n // Apply min/max constraints\n const finalSize = Math.max(MIN_FONT_SIZE, Math.min(calculatedSize, MAX_FONT_SIZE));\n \n // Round to .5 for crisp rendering\n return Math.round(finalSize * 2) / 2;\n }\n\n private formatPercentage(value: number): string {\n if (value < 1) return '<1%';\n if (value < 10) return `${value.toFixed(1)}%`;\n return `${Math.round(value)}%`;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private buildLabelText(d: any, total: number): string {\n const percentage = (d.data.value / total) * 100;\n if (percentage < 1) return '';\n \n const label = d.data.label || '';\n const percentageText = this.formatPercentage(percentage);\n \n return label ? `${label} (${percentageText})` : percentageText;\n }\n\n /**\n * Truncates label text to fit within the arc segment\n * Uses smart truncation: tries full label, then label only, then percentage only, then truncated percentage\n * Calculates chord length (straight line) since text is rendered horizontally, not along the arc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private getTruncatedLabelText(d: any, radius: number, labelRadius: number, total: number): string {\n const fontSize = this.calculateLabelFontSize(d, radius, total, labelRadius);\n \n // If font size is 0, segment is too small for labels\n if (fontSize === 0) return '';\n \n // Calculate chord length (straight line distance) instead of arc length\n // Formula: chord = 2 * radius * sin(angle/2)\n const angle = d.endAngle - d.startAngle;\n const chordLength = 2 * labelRadius * Math.sin(angle / 2);\n \n // Use chord length as available width with dynamic safety margin\n // Smaller segments need larger safety margins (percentage-based)\n const safetyMarginPercent = Math.max(0.15, Math.min(0.3, 1 / angle)); // 15-30% margin\n const availableWidth = chordLength * (1 - safetyMarginPercent);\n \n const percentage = (d.data.value / total) * 100;\n if (percentage < 1) return '';\n\n const label = d.data.label || '';\n const percentageText = this.formatPercentage(percentage);\n\n // Try different label formats in order of preference\n const fullText = label ? `${label} (${percentageText})` : percentageText;\n const labelOnly = label;\n const percentageOnly = percentageText;\n\n // 1. Try full text (label + percentage)\n if (this.doesTextFit(fullText, fontSize, availableWidth)) {\n return fullText;\n }\n\n // 2. Try label only (if exists)\n if (label && this.doesTextFit(labelOnly, fontSize, availableWidth)) {\n return labelOnly;\n }\n\n // 3. Try percentage only\n if (this.doesTextFit(percentageOnly, fontSize, availableWidth)) {\n return percentageOnly;\n }\n\n // 4. Truncate the label with ellipsis\n if (label) {\n return this.truncateTextToFit(label, fontSize, availableWidth);\n }\n\n // 5. Last resort: truncate percentage (very small segments)\n return this.truncateTextToFit(percentageText, fontSize, availableWidth);\n }\n\n /**\n * Checks if text fits within available width using conservative estimation\n * Uses 0.65em per character to account for font variations\n */\n private doesTextFit(text: string, fontSize: number, availableWidth: number): boolean {\n if (!text) return false;\n \n // Use conservative character width (0.65em for safety)\n // Wider fonts like bold text need more space\n const estimatedWidth = text.length * fontSize * 0.65;\n return estimatedWidth <= availableWidth;\n }\n\n /**\n * Truncates text to fit within available width with ellipsis\n * Uses conservative character width to prevent overflow\n * Adapts character width estimation based on font size\n */\n private truncateTextToFit(text: string, fontSize: number, availableWidth: number): string {\n if (!text) return '';\n \n // Adaptive character width: smaller fonts are relatively wider\n // Larger fonts: ~0.6em, Smaller fonts: ~0.7em\n const charWidthRatio = fontSize <= 10 ? 0.7 : 0.65;\n const charWidth = fontSize * charWidthRatio;\n \n // Reserve space for ellipsis\n const ellipsisWidth = fontSize * 0.7;\n const availableForText = availableWidth - ellipsisWidth;\n \n if (availableForText <= 0) return '';\n \n const maxChars = Math.floor(availableForText / charWidth);\n \n if (maxChars <= 0) return '';\n if (text.length <= maxChars) return text;\n \n // Ensure at least 1 character before ellipsis\n return text.substring(0, Math.max(1, maxChars)) + '…';\n }\n\n private getSegmentColor(data: AXDonutChartData): string {\n if (data.color) return data.color;\n\n const originalFullData = untracked(() => this.chartDataArray());\n const originalIndex = originalFullData.findIndex((item) => item.id === data.id);\n \n return this.getColor(originalIndex !== -1 ? originalIndex : 0);\n }\n\n /**\n * Handle hover effects on a segment\n */\n private handleSliceHover(event: MouseEvent, datum: AXDonutChartData): void {\n if (this._isInitialAnimating()) return;\n\n if (this.effectiveOptions().showTooltip !== false) {\n this.showTooltip(event, datum);\n }\n \n this.highlightSegment(datum.id);\n }\n\n private showTooltip(event: MouseEvent, datum: AXDonutChartData): void {\n const total = untracked(() => this.data()).reduce((sum, item) => sum + item.value, 0);\n const percentage = total > 0 ? ((datum.value / total) * 100).toFixed(1) : '0';\n const color = this.getSegmentColor(datum);\n\n this._tooltipData.set({\n title: datum.tooltipLabel || datum.label,\n value: datum.value.toString(),\n percentage: `${percentage}%`,\n color,\n });\n\n this.updateTooltipPosition(event);\n this._tooltipVisible.set(true);\n }\n\n /**\n * Handles mouse leave from segments\n */\n private handleSegmentLeave(): void {\n if (this._isInitialAnimating()) return;\n\n // Hide tooltip\n this._tooltipVisible.set(false);\n this.cdr.detectChanges();\n\n // Clear all highlights to ensure segments return to normal state\n this.highlightSegment(null);\n }\n\n /**\n * Updates tooltip position\n * Ensures the tooltip is visible by adjusting position when near edges\n */\n private updateTooltipPosition(event: MouseEvent): void {\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl) return;\n const containerRect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip') as HTMLElement | null;\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = computeTooltipPosition(containerRect, tooltipRect, event.clientX, event.clientY, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n }\n\n /**\n * Adds center display with total value\n */\n private addCenterDisplay(total: number): void {\n if (!this.svg) return;\n\n const chartContainerWidth = this.chartContainerEl().nativeElement.clientWidth;\n // Improved font scaling: better minimum for small sizes, better ratio for scaling\n const baseFontSize = Math.max(1.8, Math.min(3.2, chartContainerWidth / 150));\n const subTextFontSize = baseFontSize * 0.5;\n\n // Create group for the total display\n const totalDisplay = this.svg\n .append('g')\n .attr('class', 'ax-donut-chart-total-display')\n .attr('text-anchor', 'middle');\n\n // Add total value\n totalDisplay\n .append('text')\n .attr('class', 'ax-donut-chart-total-value')\n .style('font-size', `${baseFontSize}rem`)\n .style('font-weight', '600')\n .style('fill', 'rgb(var(--ax-comp-donut-chart-value-color))')\n .text(total.toLocaleString());\n\n // Add label\n totalDisplay\n .append('text')\n .attr('class', 'ax-donut-chart-total-label')\n .attr('dy', '1.4em')\n .style('font-size', `${subTextFontSize}rem`)\n .style('fill', 'rgb(var(--ax-comp-donut-chart-value-color))')\n .style('opacity', '0.8')\n .text(this.effectiveOptions().totalLabel || 'Total');\n }\n\n /**\n * Handles chart rendering errors\n */\n private handleChartError(): void {\n const container = this.chartContainerEl()?.nativeElement;\n if (container) {\n this.showNoDataMessage();\n }\n }\n\n /**\n * Cleans up chart resources\n */\n public cleanupChart(): void {\n if (!this.svg) return;\n\n this.d3.select(this.chartContainerEl()?.nativeElement).selectAll('svg').remove();\n this.svg = null;\n this.pieData = [];\n this.hiddenSegments.clear();\n this._tooltipVisible.set(false);\n this._currentlyHighlightedSegment.set(null);\n }\n\n // ===== Helper utilities for modularity and maintainability =====\n\n private renderMessage(\n container: HTMLElement,\n iconClass: string,\n messageText: string,\n helpText: string,\n specificClass: string,\n ): void {\n // Clear container area first (preserve tooltip component)\n this.d3.select(container).selectAll('svg, .ax-chart-message-container, .ax-donut-chart-no-data-message').remove();\n\n const messageContainer = this.d3\n .select(container)\n .append('div')\n .attr('class', `ax-chart-message-container ax-donut-chart-message-background ${specificClass}`);\n\n messageContainer\n .append('div')\n .attr('class', 'ax-chart-message-icon ax-donut-chart-no-data-icon')\n .html(`<i class=\"${iconClass} fa-2x\"></i>`);\n\n messageContainer.append('div').attr('class', 'ax-chart-message-text ax-donut-chart-no-data-text').text(messageText);\n\n messageContainer.append('div').attr('class', 'ax-chart-message-help ax-donut-chart-no-data-help').text(helpText);\n }\n\n // computeTooltipPosition moved to shared chart utils\n\n /**\n * Gets an accessibility label describing the donut chart for screen readers\n * @returns Descriptive string for screen readers\n */\n protected getAccessibilityLabel(): string {\n const data = this.chartDataArray();\n\n if (!data || data.length === 0) {\n return 'Empty donut chart. No data available.';\n }\n\n const total = data.reduce((sum, item) => sum + item.value, 0);\n const segmentDescriptions = data\n .map((segment) => {\n const percentage = total > 0 ? ((segment.value / total) * 100).toFixed(1) : '0';\n return `${segment.label}: ${segment.value} (${percentage}%)`;\n })\n .join('; ');\n\n return `Donut chart with ${data.length} segments. Total value: ${total}. ${segmentDescriptions}`;\n }\n\n /**\n * Returns the data items for the legend\n * @implements AXChartLegendCompatible\n */\n getLegendItems(): AXChartLegendItem[] {\n const total = this.data().reduce((sum, item) => sum + item.value, 0);\n \n return this.chartDataArray().map((item, index) => ({\n id: item.id,\n name: item.label || `Segment ${index + 1}`,\n value: item.value,\n color: this.getSegmentColor(item),\n percentage: total > 0 ? (item.value / total) * 100 : 0,\n hidden: this.isSegmentHidden(item.id),\n }));\n }\n}\n","<div class=\"ax-donut-chart\" #chartContainer role=\"img\" [attr.aria-label]=\"getAccessibilityLabel()\">\n <!-- Tooltip component -->\n <ax-chart-tooltip\n [visible]=\"tooltipVisible()\"\n [position]=\"tooltipPosition()\"\n [data]=\"tooltipData()\"\n [showPercentage]=\"true\"\n ></ax-chart-tooltip>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-charts-donut-chart.mjs","sources":["../tmp-esm2022/donut-chart/lib/donut-chart.config.js","../tmp-esm2022/donut-chart/lib/donut-chart.component.js","../tmp-esm2022/donut-chart/acorex-charts-donut-chart.js"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nexport const AXDonutChartDefaultConfig = {\n showTooltip: true,\n showDataLabels: true,\n donutWidth: 35,\n cornerRadius: 4,\n animationDuration: 800,\n animationEasing: 'cubic-out',\n messages: {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All segments are hidden',\n allHiddenHelp: 'Please toggle visibility of at least one segment',\n noDataIcon: 'fa-light fa-chart-pie',\n allHiddenIcon: 'fa-light fa-eye-slash',\n },\n};\nexport const AX_DONUT_CHART_CONFIG = new InjectionToken('AX_DONUT_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXDonutChartDefaultConfig,\n});\nexport function donutChartConfig(config = {}) {\n const result = {\n ...AXDonutChartDefaultConfig,\n ...config,\n };\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9udXQtY2hhcnQuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2RvbnV0LWNoYXJ0L3NyYy9saWIvZG9udXQtY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQXVCO0lBQzNELFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGNBQWMsRUFBRSxJQUFJO0lBQ3BCLFVBQVUsRUFBRSxFQUFFO0lBQ2QsWUFBWSxFQUFFLENBQUM7SUFDZixpQkFBaUIsRUFBRSxHQUFHO0lBQ3RCLGVBQWUsRUFBRSxXQUFXO0lBQzVCLFFBQVEsRUFBRTtRQUNSLE1BQU0sRUFBRSxtQkFBbUI7UUFDM0IsVUFBVSxFQUFFLDBDQUEwQztRQUN0RCxTQUFTLEVBQUUseUJBQXlCO1FBQ3BDLGFBQWEsRUFBRSxrREFBa0Q7UUFDakUsVUFBVSxFQUFFLHVCQUF1QjtRQUNuQyxhQUFhLEVBQUUsdUJBQXVCO0tBQ3ZDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLElBQUksY0FBYyxDQUFxQix1QkFBdUIsRUFBRTtJQUNuRyxVQUFVLEVBQUUsTUFBTTtJQUNsQixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMseUJBQXlCO0NBQ3pDLENBQUMsQ0FBQztBQUlILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxTQUFrQyxFQUFFO0lBQ25FLE1BQU0sTUFBTSxHQUFHO1FBQ2IsR0FBRyx5QkFBeUI7UUFDNUIsR0FBRyxNQUFNO0tBQ1YsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhEb251dENoYXJ0T3B0aW9uIH0gZnJvbSAnLi9kb251dC1jaGFydC50eXBlJztcblxuZXhwb3J0IGNvbnN0IEFYRG9udXRDaGFydERlZmF1bHRDb25maWc6IEFYRG9udXRDaGFydE9wdGlvbiA9IHtcbiAgc2hvd1Rvb2x0aXA6IHRydWUsXG4gIHNob3dEYXRhTGFiZWxzOiB0cnVlLFxuICBkb251dFdpZHRoOiAzNSxcbiAgY29ybmVyUmFkaXVzOiA0LFxuICBhbmltYXRpb25EdXJhdGlvbjogODAwLFxuICBhbmltYXRpb25FYXNpbmc6ICdjdWJpYy1vdXQnLFxuICBtZXNzYWdlczoge1xuICAgIG5vRGF0YTogJ05vIGRhdGEgYXZhaWxhYmxlJyxcbiAgICBub0RhdGFIZWxwOiAnUGxlYXNlIHByb3ZpZGUgZGF0YSB0byBkaXNwbGF5IHRoZSBjaGFydCcsXG4gICAgYWxsSGlkZGVuOiAnQWxsIHNlZ21lbnRzIGFyZSBoaWRkZW4nLFxuICAgIGFsbEhpZGRlbkhlbHA6ICdQbGVhc2UgdG9nZ2xlIHZpc2liaWxpdHkgb2YgYXQgbGVhc3Qgb25lIHNlZ21lbnQnLFxuICAgIG5vRGF0YUljb246ICdmYS1saWdodCBmYS1jaGFydC1waWUnLFxuICAgIGFsbEhpZGRlbkljb246ICdmYS1saWdodCBmYS1leWUtc2xhc2gnLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEFYX0RPTlVUX0NIQVJUX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxBWERvbnV0Q2hhcnRPcHRpb24+KCdBWF9ET05VVF9DSEFSVF9DT05GSUcnLCB7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgZmFjdG9yeTogKCkgPT4gQVhEb251dENoYXJ0RGVmYXVsdENvbmZpZyxcbn0pO1xuXG5leHBvcnQgdHlwZSBQYXJ0aWFsRG9udXRDaGFydENvbmZpZyA9IFBhcnRpYWw8QVhEb251dENoYXJ0T3B0aW9uPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGRvbnV0Q2hhcnRDb25maWcoY29uZmlnOiBQYXJ0aWFsRG9udXRDaGFydENvbmZpZyA9IHt9KTogQVhEb251dENoYXJ0T3B0aW9uIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIC4uLkFYRG9udXRDaGFydERlZmF1bHRDb25maWcsXG4gICAgLi4uY29uZmlnLFxuICB9O1xuICByZXR1cm4gcmVzdWx0O1xufVxuIl19","import { AX_CHART_COLOR_PALETTE, AXChartComponent, computeTooltipPosition, getChartColor, getEasingFunction, } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { afterNextRender, ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, effect, inject, input, output, signal, untracked, viewChild, ViewEncapsulation, } from '@angular/core';\nimport { AX_DONUT_CHART_CONFIG } from './donut-chart.config';\nimport * as i0 from \"@angular/core\";\n/**\n * Donut Chart Component\n * Displays data in a circular donut chart with interactive segments\n */\nexport class AXDonutChartComponent extends AXChartComponent {\n // Dependency Injection\n cdr = inject(ChangeDetectorRef);\n // Inputs\n /** Chart data input */\n data = input([], ...(ngDevMode ? [{ debugName: \"data\" }] : []));\n /** Chart options input */\n options = input({}, ...(ngDevMode ? [{ debugName: \"options\" }] : []));\n // Outputs\n /** Emitted when a segment is clicked */\n segmentClick = output();\n /** Emitted when a segment has mouse hover\n * Can be used by external elements to highlight this segment\n */\n segmentHover = output();\n // Chart container reference\n chartContainerEl = viewChild.required('chartContainer');\n // D3 reference - loaded asynchronously\n d3;\n // Chart SVG reference (using 'any' since D3 is loaded dynamically at runtime)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n svg = null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pieData = [];\n // State management\n hiddenSegments = new Set();\n _initialized = signal(false, ...(ngDevMode ? [{ debugName: \"_initialized\" }] : []));\n _rendered = signal(false, ...(ngDevMode ? [{ debugName: \"_rendered\" }] : []));\n _isInitialAnimating = signal(false, ...(ngDevMode ? [{ debugName: \"_isInitialAnimating\" }] : []));\n _currentlyHighlightedSegment = signal(null, ...(ngDevMode ? [{ debugName: \"_currentlyHighlightedSegment\" }] : []));\n // Tooltip state\n _tooltipVisible = signal(false, ...(ngDevMode ? [{ debugName: \"_tooltipVisible\" }] : []));\n _tooltipPosition = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: \"_tooltipPosition\" }] : []));\n _tooltipData = signal({\n title: '',\n value: 0,\n percentage: '0%',\n color: '',\n }, ...(ngDevMode ? [{ debugName: \"_tooltipData\" }] : []));\n // Public computed properties for the template\n tooltipVisible = this._tooltipVisible.asReadonly();\n tooltipPosition = this._tooltipPosition.asReadonly();\n tooltipData = this._tooltipData.asReadonly();\n // Inject configuration\n configToken = inject(AX_DONUT_CHART_CONFIG);\n // Inject the chart colors\n chartColors = inject(AX_CHART_COLOR_PALETTE);\n // Computed configuration options\n effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\n // Constants\n TOOLTIP_GAP = 10;\n HIGHLIGHT_TRANSITION_DURATION = 150;\n HIGHLIGHT_TRANSITION_NAME = 'highlight';\n SEGMENT_ANIMATION_DELAY = 50;\n LABEL_ANIMATION_DELAY = 200;\n MIN_CHART_DIMENSION = 200;\n MIN_CHART_FOR_LABELS = 260;\n DIMMED_OPACITY = 0.5;\n VISIBLE_OPACITY = 1;\n // Messages with defaults\n effectiveMessages = computed(() => {\n const defaultMessages = {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All segments are hidden',\n allHiddenHelp: 'Please toggle visibility of at least one segment',\n noDataIcon: 'fa-light fa-chart-pie',\n allHiddenIcon: 'fa-light fa-eye-slash',\n };\n return {\n ...defaultMessages,\n ...this.effectiveOptions().messages,\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveMessages\" }] : []));\n // Data accessor for handling different incoming data formats\n chartDataArray = computed(() => {\n return this.data() || [];\n }, ...(ngDevMode ? [{ debugName: \"chartDataArray\" }] : []));\n // Color accessor method\n getColor(index) {\n return getChartColor(index, this.chartColors);\n }\n // Segment visibility check\n isSegmentHidden(id) {\n return this.hiddenSegments.has(id);\n }\n constructor() {\n super();\n // Dynamically load D3 and initialize the chart when the component is ready\n afterNextRender(() => {\n this._initialized.set(true);\n this.loadD3();\n });\n }\n dataChangeEffect = effect(() => {\n // Track data and options changes\n this.data();\n this.effectiveOptions();\n // Only update if already rendered\n untracked(() => {\n if (this._rendered()) {\n this.updateChart();\n }\n });\n }, ...(ngDevMode ? [{ debugName: \"dataChangeEffect\" }] : []));\n /**\n * Highlights a specific segment by ID\n * @param id The segment ID to highlight, or null to clear highlight\n */\n highlightSegment(id) {\n if (this._isInitialAnimating() || !this.svg)\n return;\n if (this._currentlyHighlightedSegment() === id)\n return;\n this._currentlyHighlightedSegment.set(id);\n // Only interrupt ongoing HIGHLIGHT transitions (not initial animations)\n this.svg.selectAll('path').interrupt(this.HIGHLIGHT_TRANSITION_NAME);\n if (id === null) {\n this.clearAllHighlights();\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const targetSegment = this.svg.selectAll('path').filter((d) => d?.data?.id === id);\n if (targetSegment.empty()) {\n this._currentlyHighlightedSegment.set(null);\n this.highlightSegment(null);\n return;\n }\n this.dimNonTargetSegments(id);\n this.highlightTargetSegment(targetSegment);\n this.segmentHover.emit(this.getSegmentDataById(id));\n }\n clearAllHighlights() {\n if (!this.svg)\n return;\n this.svg\n .selectAll('path')\n .classed('ax-donut-chart-highlighted', false)\n .classed('ax-donut-chart-dimmed', false)\n .transition(this.HIGHLIGHT_TRANSITION_NAME)\n .duration(this.HIGHLIGHT_TRANSITION_DURATION)\n .attr('transform', null)\n .style('filter', null)\n .style('opacity', this.VISIBLE_OPACITY);\n this.segmentHover.emit(null);\n }\n dimNonTargetSegments(targetId) {\n if (!this.svg)\n return;\n this.svg\n .selectAll('path')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .filter((d) => d?.data?.id !== targetId)\n .classed('ax-donut-chart-highlighted', false)\n .classed('ax-donut-chart-dimmed', true)\n .transition(this.HIGHLIGHT_TRANSITION_NAME)\n .duration(this.HIGHLIGHT_TRANSITION_DURATION)\n .attr('transform', null)\n .style('filter', null)\n .style('opacity', this.DIMMED_OPACITY);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n highlightTargetSegment(targetSegment) {\n targetSegment\n .classed('ax-donut-chart-dimmed', false)\n .classed('ax-donut-chart-highlighted', true)\n .transition(this.HIGHLIGHT_TRANSITION_NAME)\n .duration(this.HIGHLIGHT_TRANSITION_DURATION)\n .style('filter', 'url(#ax-donut-chart-segment-shadow)')\n .style('opacity', this.VISIBLE_OPACITY);\n }\n getSegmentDataById(segmentId) {\n return untracked(() => this.chartDataArray()).find((d) => d.id === segmentId) || null;\n }\n /**\n * Toggles visibility of a segment by ID\n * @param id Segment ID to toggle\n * @returns New visibility state (true = visible, false = hidden)\n */\n toggleSegment(id) {\n const chartData = this.chartDataArray();\n const wasAllHidden = chartData.length > 0 && chartData.every((d) => this.isSegmentHidden(d.id));\n if (this.hiddenSegments.has(id)) {\n // Making a segment visible\n this.hiddenSegments.delete(id);\n // If all segments were previously hidden, we need to ensure the message is cleared\n if (wasAllHidden) {\n // Force complete DOM cleanup and redraw\n if (this.chartContainerEl()?.nativeElement) {\n // Clear only chart SVG and message containers (preserve tooltip component)\n this.d3\n ?.select(this.chartContainerEl().nativeElement)\n .selectAll('svg, .ax-chart-message-container, .ax-donut-chart-no-data-message')\n .remove();\n // Force full redraw\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n }\n else {\n this.updateChart();\n }\n }\n else {\n // Hiding a segment\n this.hiddenSegments.add(id);\n this.updateChart();\n }\n return !this.isSegmentHidden(id);\n }\n ngOnDestroy() {\n this.cleanupChart();\n }\n /**\n * Loads D3.js dynamically\n */\n async loadD3() {\n try {\n this.d3 = await import('d3');\n // If container is ready, create chart\n if (this._initialized() && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n }\n catch (error) {\n console.error('Failed to load D3.js:', error);\n }\n }\n onSegmentClick(item) {\n this.segmentClick.emit(item);\n }\n /**\n * Creates the donut chart from current data\n */\n createChart() {\n if (!this.d3 || !this.chartContainerEl()?.nativeElement)\n return;\n try {\n const containerElement = this.chartContainerEl().nativeElement;\n this.clearChart(containerElement);\n const data = this.chartDataArray();\n if (!data || data.length === 0) {\n this.showNoDataMessage();\n return;\n }\n const visibleData = data.filter((item) => !this.hiddenSegments.has(item.id));\n if (visibleData.length === 0) {\n this.showAllSegmentsHiddenMessage();\n return;\n }\n const options = this.effectiveOptions();\n const { width, height } = this.setupDimensions(containerElement, options);\n this.renderDonutChart(containerElement, width, height, visibleData);\n }\n catch (error) {\n console.error('Error creating donut chart:', error);\n this.handleChartError();\n }\n }\n /**\n * Updates the chart with new data\n */\n updateChart() {\n // Reset highlighted segment state when updating\n this._currentlyHighlightedSegment.set(null);\n this.createChart(); // Recreate the chart with updated data\n }\n /**\n * Clears the chart container\n */\n clearChart(container) {\n this.d3.select(container).selectAll('svg, .ax-chart-message-container, .ax-donut-chart-no-data-message').remove();\n this._tooltipVisible.set(false);\n }\n /**\n * Shows a message when no data is available\n */\n showNoDataMessage() {\n if (!this.chartContainerEl()?.nativeElement)\n return;\n const container = this.chartContainerEl().nativeElement;\n this.renderMessage(container, this.effectiveMessages().noDataIcon, this.effectiveMessages().noData, this.effectiveMessages().noDataHelp, 'ax-donut-chart-no-data-message');\n }\n /**\n * Shows a message when all segments are hidden\n */\n showAllSegmentsHiddenMessage() {\n if (!this.chartContainerEl()?.nativeElement)\n return;\n const container = this.chartContainerEl().nativeElement;\n this.renderMessage(container, this.effectiveMessages().allHiddenIcon, this.effectiveMessages().allHidden, this.effectiveMessages().allHiddenHelp, 'ax-donut-chart-no-data-message');\n }\n /**\n * Setups chart dimensions based on container and options\n */\n setupDimensions(container, options) {\n const containerWidth = container.clientWidth || 400;\n const containerHeight = container.clientHeight || 400;\n const width = Math.max(options?.width || containerWidth, this.MIN_CHART_DIMENSION);\n const height = Math.max(options?.height || containerHeight, this.MIN_CHART_DIMENSION);\n return { width, height };\n }\n /**\n * Renders the donut chart with visible data\n */\n renderDonutChart(container, width, height, visibleData) {\n const total = visibleData.reduce((sum, item) => sum + item.value, 0);\n // Create SVG container with filters\n const svg = this.createSvgWithFilters(container, width, height);\n // Create main chart group\n this.svg = svg.append('g').attr('transform', `translate(${width / 2}, ${height / 2})`);\n // Create donut segments\n this.createDonutSegments(width, height, visibleData, total);\n // Add total in center\n this.addCenterDisplay(total);\n }\n /**\n * Create SVG element with filter definitions for shadows\n * @returns D3 SVG selection (any type due to dynamic D3 loading)\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n createSvgWithFilters(container, width, height) {\n const svg = this.d3\n .select(container)\n .append('svg')\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${width} ${height}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n // Add drop shadow filter\n const defs = svg.append('defs');\n const filter = defs.append('filter').attr('id', 'ax-donut-chart-segment-shadow').attr('height', '130%');\n filter.append('feGaussianBlur').attr('in', 'SourceAlpha').attr('stdDeviation', 2).attr('result', 'blur');\n filter.append('feOffset').attr('in', 'blur').attr('dx', 1).attr('dy', 1).attr('result', 'offsetBlur');\n const feComponentTransfer = filter\n .append('feComponentTransfer')\n .attr('in', 'offsetBlur')\n .attr('result', 'offsetBlur');\n feComponentTransfer.append('feFuncA').attr('type', 'linear').attr('slope', 0.3);\n const feMerge = filter.append('feMerge');\n feMerge.append('feMergeNode').attr('in', 'offsetBlur');\n feMerge.append('feMergeNode').attr('in', 'SourceGraphic');\n return svg;\n }\n /**\n * Create and render the donut segments with animations\n */\n createDonutSegments(chartWidth, chartHeight, data, total) {\n this._isInitialAnimating.set(true);\n // Create pie layout\n const pie = this.d3\n .pie()\n .value((d) => d.value)\n .sort(null)\n .padAngle(0.02);\n // Calculate the radius of the donut chart\n const radius = (Math.min(chartWidth, chartHeight) / 2) * 0.85;\n // Calculate inner radius based on donutWidth percentage\n const donutWidthPercent = this.effectiveOptions().donutWidth / 100;\n const innerRadius = radius * (1 - donutWidthPercent);\n // Create arc generator with the configured radius and corner radius\n const arc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(radius * 0.95)\n .cornerRadius(this.effectiveOptions().cornerRadius);\n // Create label arc generator for placing labels (middle of the donut ring)\n const labelArc = this.d3\n .arc()\n .innerRadius(innerRadius + (radius * 0.95 - innerRadius) / 2)\n .outerRadius(innerRadius + (radius * 0.95 - innerRadius) / 2);\n // Get animation options\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n // Generate pie data\n this.pieData = pie(data);\n // Add segments with animation\n const segments = this.svg\n .selectAll('path')\n .data(this.pieData)\n .enter()\n .append('path')\n .attr('class', 'ax-donut-chart-segment')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .attr('fill', (d) => this.getSegmentColor(d.data))\n .style('opacity', 0)\n .style('cursor', 'pointer')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('mouseenter', (event, d) => {\n if (this.effectiveOptions().showTooltip) {\n this.handleSliceHover(event, d.data);\n }\n })\n .on('mouseleave', () => this.handleSegmentLeave())\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('click', (_event, d) => {\n this.onSegmentClick(d.data);\n });\n // Animate segments\n const numSegments = this.pieData.length;\n let completed = 0;\n segments\n .transition()\n .duration(animationDuration)\n .ease(animationEasing)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .delay((_d, i) => i * this.SEGMENT_ANIMATION_DELAY)\n .style('opacity', this.VISIBLE_OPACITY)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .attrTween('d', (d) => {\n const interpolate = this.d3.interpolate({ startAngle: d.startAngle, endAngle: d.startAngle }, d);\n return (t) => arc(interpolate(t));\n })\n .on('end', () => {\n completed++;\n if (completed >= numSegments) {\n this._isInitialAnimating.set(false);\n this.cdr.detectChanges();\n }\n })\n .on('interrupt', () => {\n // Treat interrupts as completion to avoid getting stuck in animating state\n completed++;\n if (completed >= numSegments) {\n this._isInitialAnimating.set(false);\n this.cdr.detectChanges();\n }\n });\n // Add data labels if enabled and chart size is sufficient\n if (this.effectiveOptions().showDataLabels && this.isChartLargeEnoughForLabels(chartWidth, chartHeight)) {\n this.addDataLabels(labelArc, radius, innerRadius, total, animationDuration);\n }\n // Determine when all segment animations are complete (handle empty case)\n if (numSegments === 0) {\n this._isInitialAnimating.set(false);\n this.cdr.detectChanges();\n }\n }\n isChartLargeEnoughForLabels(width, height) {\n return Math.min(width, height) >= this.MIN_CHART_FOR_LABELS;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n addDataLabels(labelArc, radius, innerRadius, total, animationDuration) {\n if (!this.svg)\n return;\n const labelRadius = innerRadius + (radius * 0.95 - innerRadius) / 2;\n // Show labels for all segments with valid font size\n const dataWithLabels = this.pieData.filter((d) => {\n const fontSize = this.calculateLabelFontSize(d, radius, total, labelRadius);\n return fontSize > 0; // Only show if font size is valid\n });\n const labels = this.svg\n .selectAll('.ax-donut-chart-data-label')\n .data(dataWithLabels)\n .enter()\n .append('text')\n .attr('class', 'ax-donut-chart-data-label')\n .style('opacity', 0)\n .style('pointer-events', 'none')\n .style('fill', 'rgb(var(--ax-comp-donut-chart-data-labels-color))')\n .attr('transform', (d) => {\n const centroid = labelArc.centroid(d);\n return `translate(${centroid[0]}, ${centroid[1]})`;\n })\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .style('font-size', (d) => `${this.calculateLabelFontSize(d, radius, total, labelRadius)}px`)\n .style('font-weight', (d) => ((d.data.value / total) * 100 >= 15 ? '600' : '500'))\n .text((d) => this.getTruncatedLabelText(d, radius, labelRadius, total));\n labels\n .transition()\n .duration(animationDuration)\n .delay((_d, i) => i * this.SEGMENT_ANIMATION_DELAY + this.LABEL_ANIMATION_DELAY)\n .style('opacity', this.VISIBLE_OPACITY);\n }\n /**\n * Calculates optimal font size for label based on segment size\n * Uses smart dynamic sizing with readability constraints\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n calculateLabelFontSize(d, radius, total, labelRadius) {\n const angle = d.endAngle - d.startAngle;\n const segmentPercentage = (d.data.value / total) * 100;\n // Don't show labels for very small segments (< 1%)\n if (segmentPercentage < 1)\n return 0;\n // Calculate chord length (available horizontal space)\n const chordLength = 2 * labelRadius * Math.sin(angle / 2);\n // Constants for font sizing\n const MIN_FONT_SIZE = 9; // Minimum readable size\n const MAX_FONT_SIZE = 14; // Maximum for aesthetics\n const MIN_CHORD_FOR_LABEL = 20; // Minimum space needed for any text\n // Don't show labels if space is too small\n if (chordLength < MIN_CHORD_FOR_LABEL)\n return 0;\n // Calculate font size based on multiple factors\n // 1. Based on arc angle (larger segments = larger font)\n const angleBasedSize = (angle * radius) / 8;\n // 2. Based on chord length (available horizontal space)\n const chordBasedSize = chordLength / 8;\n // 3. Based on segment percentage (proportional to data importance)\n const percentageBasedSize = 9 + (segmentPercentage / 100) * 5; // 9-14px range\n // Take the minimum of all calculations to ensure fit\n const calculatedSize = Math.min(angleBasedSize, chordBasedSize, percentageBasedSize);\n // Apply min/max constraints\n const finalSize = Math.max(MIN_FONT_SIZE, Math.min(calculatedSize, MAX_FONT_SIZE));\n // Round to .5 for crisp rendering\n return Math.round(finalSize * 2) / 2;\n }\n formatPercentage(value) {\n if (value < 1)\n return '<1%';\n if (value < 10)\n return `${value.toFixed(1)}%`;\n return `${Math.round(value)}%`;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n buildLabelText(d, total) {\n const percentage = (d.data.value / total) * 100;\n if (percentage < 1)\n return '';\n const label = d.data.label || '';\n const percentageText = this.formatPercentage(percentage);\n return label ? `${label} (${percentageText})` : percentageText;\n }\n /**\n * Truncates label text to fit within the arc segment\n * Uses smart truncation: tries full label, then label only, then percentage only, then truncated percentage\n * Calculates chord length (straight line) since text is rendered horizontally, not along the arc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getTruncatedLabelText(d, radius, labelRadius, total) {\n const fontSize = this.calculateLabelFontSize(d, radius, total, labelRadius);\n // If font size is 0, segment is too small for labels\n if (fontSize === 0)\n return '';\n // Calculate chord length (straight line distance) instead of arc length\n // Formula: chord = 2 * radius * sin(angle/2)\n const angle = d.endAngle - d.startAngle;\n const chordLength = 2 * labelRadius * Math.sin(angle / 2);\n // Use chord length as available width with dynamic safety margin\n // Smaller segments need larger safety margins (percentage-based)\n const safetyMarginPercent = Math.max(0.15, Math.min(0.3, 1 / angle)); // 15-30% margin\n const availableWidth = chordLength * (1 - safetyMarginPercent);\n const percentage = (d.data.value / total) * 100;\n if (percentage < 1)\n return '';\n const label = d.data.label || '';\n const percentageText = this.formatPercentage(percentage);\n // Try different label formats in order of preference\n const fullText = label ? `${label} (${percentageText})` : percentageText;\n const labelOnly = label;\n const percentageOnly = percentageText;\n // 1. Try full text (label + percentage)\n if (this.doesTextFit(fullText, fontSize, availableWidth)) {\n return fullText;\n }\n // 2. Try label only (if exists)\n if (label && this.doesTextFit(labelOnly, fontSize, availableWidth)) {\n return labelOnly;\n }\n // 3. Try percentage only\n if (this.doesTextFit(percentageOnly, fontSize, availableWidth)) {\n return percentageOnly;\n }\n // 4. Truncate the label with ellipsis\n if (label) {\n return this.truncateTextToFit(label, fontSize, availableWidth);\n }\n // 5. Last resort: truncate percentage (very small segments)\n return this.truncateTextToFit(percentageText, fontSize, availableWidth);\n }\n /**\n * Checks if text fits within available width using conservative estimation\n * Uses 0.65em per character to account for font variations\n */\n doesTextFit(text, fontSize, availableWidth) {\n if (!text)\n return false;\n // Use conservative character width (0.65em for safety)\n // Wider fonts like bold text need more space\n const estimatedWidth = text.length * fontSize * 0.65;\n return estimatedWidth <= availableWidth;\n }\n /**\n * Truncates text to fit within available width with ellipsis\n * Uses conservative character width to prevent overflow\n * Adapts character width estimation based on font size\n */\n truncateTextToFit(text, fontSize, availableWidth) {\n if (!text)\n return '';\n // Adaptive character width: smaller fonts are relatively wider\n // Larger fonts: ~0.6em, Smaller fonts: ~0.7em\n const charWidthRatio = fontSize <= 10 ? 0.7 : 0.65;\n const charWidth = fontSize * charWidthRatio;\n // Reserve space for ellipsis\n const ellipsisWidth = fontSize * 0.7;\n const availableForText = availableWidth - ellipsisWidth;\n if (availableForText <= 0)\n return '';\n const maxChars = Math.floor(availableForText / charWidth);\n if (maxChars <= 0)\n return '';\n if (text.length <= maxChars)\n return text;\n // Ensure at least 1 character before ellipsis\n return text.substring(0, Math.max(1, maxChars)) + '…';\n }\n getSegmentColor(data) {\n if (data.color)\n return data.color;\n const originalFullData = untracked(() => this.chartDataArray());\n const originalIndex = originalFullData.findIndex((item) => item.id === data.id);\n return this.getColor(originalIndex !== -1 ? originalIndex : 0);\n }\n /**\n * Handle hover effects on a segment\n */\n handleSliceHover(event, datum) {\n if (this._isInitialAnimating())\n return;\n if (this.effectiveOptions().showTooltip !== false) {\n this.showTooltip(event, datum);\n }\n this.highlightSegment(datum.id);\n }\n showTooltip(event, datum) {\n const total = untracked(() => this.data()).reduce((sum, item) => sum + item.value, 0);\n const percentage = total > 0 ? ((datum.value / total) * 100).toFixed(1) : '0';\n const color = this.getSegmentColor(datum);\n this._tooltipData.set({\n title: datum.tooltipLabel || datum.label,\n value: datum.value.toString(),\n percentage: `${percentage}%`,\n color,\n });\n this.updateTooltipPosition(event);\n this._tooltipVisible.set(true);\n }\n /**\n * Handles mouse leave from segments\n */\n handleSegmentLeave() {\n if (this._isInitialAnimating())\n return;\n // Hide tooltip\n this._tooltipVisible.set(false);\n this.cdr.detectChanges();\n // Clear all highlights to ensure segments return to normal state\n this.highlightSegment(null);\n }\n /**\n * Updates tooltip position\n * Ensures the tooltip is visible by adjusting position when near edges\n */\n updateTooltipPosition(event) {\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl)\n return;\n const containerRect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip');\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = computeTooltipPosition(containerRect, tooltipRect, event.clientX, event.clientY, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n }\n /**\n * Adds center display with total value\n */\n addCenterDisplay(total) {\n if (!this.svg)\n return;\n const chartContainerWidth = this.chartContainerEl().nativeElement.clientWidth;\n // Improved font scaling: better minimum for small sizes, better ratio for scaling\n const baseFontSize = Math.max(1.8, Math.min(3.2, chartContainerWidth / 150));\n const subTextFontSize = baseFontSize * 0.5;\n // Create group for the total display\n const totalDisplay = this.svg\n .append('g')\n .attr('class', 'ax-donut-chart-total-display')\n .attr('text-anchor', 'middle');\n // Add total value\n totalDisplay\n .append('text')\n .attr('class', 'ax-donut-chart-total-value')\n .style('font-size', `${baseFontSize}rem`)\n .style('font-weight', '600')\n .style('fill', 'rgb(var(--ax-comp-donut-chart-value-color))')\n .text(total.toLocaleString());\n // Add label\n totalDisplay\n .append('text')\n .attr('class', 'ax-donut-chart-total-label')\n .attr('dy', '1.4em')\n .style('font-size', `${subTextFontSize}rem`)\n .style('fill', 'rgb(var(--ax-comp-donut-chart-value-color))')\n .style('opacity', '0.8')\n .text(this.effectiveOptions().totalLabel || 'Total');\n }\n /**\n * Handles chart rendering errors\n */\n handleChartError() {\n const container = this.chartContainerEl()?.nativeElement;\n if (container) {\n this.showNoDataMessage();\n }\n }\n /**\n * Cleans up chart resources\n */\n cleanupChart() {\n if (!this.svg)\n return;\n this.d3.select(this.chartContainerEl()?.nativeElement).selectAll('svg').remove();\n this.svg = null;\n this.pieData = [];\n this.hiddenSegments.clear();\n this._tooltipVisible.set(false);\n this._currentlyHighlightedSegment.set(null);\n }\n // ===== Helper utilities for modularity and maintainability =====\n renderMessage(container, iconClass, messageText, helpText, specificClass) {\n // Clear container area first (preserve tooltip component)\n this.d3.select(container).selectAll('svg, .ax-chart-message-container, .ax-donut-chart-no-data-message').remove();\n const messageContainer = this.d3\n .select(container)\n .append('div')\n .attr('class', `ax-chart-message-container ax-donut-chart-message-background ${specificClass}`);\n messageContainer\n .append('div')\n .attr('class', 'ax-chart-message-icon ax-donut-chart-no-data-icon')\n .html(`<i class=\"${iconClass} fa-2x\"></i>`);\n messageContainer.append('div').attr('class', 'ax-chart-message-text ax-donut-chart-no-data-text').text(messageText);\n messageContainer.append('div').attr('class', 'ax-chart-message-help ax-donut-chart-no-data-help').text(helpText);\n }\n // computeTooltipPosition moved to shared chart utils\n /**\n * Gets an accessibility label describing the donut chart for screen readers\n * @returns Descriptive string for screen readers\n */\n getAccessibilityLabel() {\n const data = this.chartDataArray();\n if (!data || data.length === 0) {\n return 'Empty donut chart. No data available.';\n }\n const total = data.reduce((sum, item) => sum + item.value, 0);\n const segmentDescriptions = data\n .map((segment) => {\n const percentage = total > 0 ? ((segment.value / total) * 100).toFixed(1) : '0';\n return `${segment.label}: ${segment.value} (${percentage}%)`;\n })\n .join('; ');\n return `Donut chart with ${data.length} segments. Total value: ${total}. ${segmentDescriptions}`;\n }\n /**\n * Returns the data items for the legend\n * @implements AXChartLegendCompatible\n */\n getLegendItems() {\n const total = this.data().reduce((sum, item) => sum + item.value, 0);\n return this.chartDataArray().map((item, index) => ({\n id: item.id,\n name: item.label || `Segment ${index + 1}`,\n value: item.value,\n color: this.getSegmentColor(item),\n percentage: total > 0 ? (item.value / total) * 100 : 0,\n hidden: this.isSegmentHidden(item.id),\n }));\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.15\", ngImport: i0, type: AXDonutChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.3.15\", type: AXDonutChartComponent, isStandalone: true, selector: \"ax-donut-chart\", inputs: { data: { classPropertyName: \"data\", publicName: \"data\", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: \"options\", publicName: \"options\", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { segmentClick: \"segmentClick\", segmentHover: \"segmentHover\" }, viewQueries: [{ propertyName: \"chartContainerEl\", first: true, predicate: [\"chartContainer\"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: \"<div class=\\\"ax-donut-chart\\\" #chartContainer role=\\\"img\\\" [attr.aria-label]=\\\"getAccessibilityLabel()\\\">\\n <!-- Tooltip component -->\\n <ax-chart-tooltip\\n [visible]=\\\"tooltipVisible()\\\"\\n [position]=\\\"tooltipPosition()\\\"\\n [data]=\\\"tooltipData()\\\"\\n [showPercentage]=\\\"true\\\"\\n ></ax-chart-tooltip>\\n</div>\\n\", styles: [\"ax-donut-chart{display:block;width:100%;height:100%;--ax-comp-donut-chart-bg-color: 0, 0, 0, 0;--ax-comp-donut-chart-value-color: var(--ax-sys-color-on-lightest-surface)}ax-donut-chart .ax-donut-chart{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;border-radius:.5rem;background-color:rgba(var(--ax-comp-donut-chart-bg-color))}ax-donut-chart .ax-donut-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}ax-donut-chart .ax-donut-chart svg g:has(text){font-family:inherit}ax-donut-chart .ax-donut-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-donut-chart-bg-color));border:1px solid rgba(var(--ax-sys-color-surface));padding:1.5rem;border-radius:.5rem;width:80%;max-width:300px}ax-donut-chart .ax-donut-chart-no-data-message .ax-donut-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-donut-chart .ax-donut-chart-no-data-message .ax-donut-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-donut-chart .ax-donut-chart-no-data-message .ax-donut-chart-no-data-help{font-size:.8rem;opacity:.6}\\n\"], dependencies: [{ kind: \"component\", type: AXChartTooltipComponent, selector: \"ax-chart-tooltip\", inputs: [\"data\", \"position\", \"visible\", \"showPercentage\", \"style\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.15\", ngImport: i0, type: AXDonutChartComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-donut-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"ax-donut-chart\\\" #chartContainer role=\\\"img\\\" [attr.aria-label]=\\\"getAccessibilityLabel()\\\">\\n <!-- Tooltip component -->\\n <ax-chart-tooltip\\n [visible]=\\\"tooltipVisible()\\\"\\n [position]=\\\"tooltipPosition()\\\"\\n [data]=\\\"tooltipData()\\\"\\n [showPercentage]=\\\"true\\\"\\n ></ax-chart-tooltip>\\n</div>\\n\", styles: [\"ax-donut-chart{display:block;width:100%;height:100%;--ax-comp-donut-chart-bg-color: 0, 0, 0, 0;--ax-comp-donut-chart-value-color: var(--ax-sys-color-on-lightest-surface)}ax-donut-chart .ax-donut-chart{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;border-radius:.5rem;background-color:rgba(var(--ax-comp-donut-chart-bg-color))}ax-donut-chart .ax-donut-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}ax-donut-chart .ax-donut-chart svg g:has(text){font-family:inherit}ax-donut-chart .ax-donut-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-donut-chart-bg-color));border:1px solid rgba(var(--ax-sys-color-surface));padding:1.5rem;border-radius:.5rem;width:80%;max-width:300px}ax-donut-chart .ax-donut-chart-no-data-message .ax-donut-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-donut-chart .ax-donut-chart-no-data-message .ax-donut-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-donut-chart .ax-donut-chart-no-data-message .ax-donut-chart-no-data-help{font-size:.8rem;opacity:.6}\\n\"] }]\n }], ctorParameters: () => [], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: \"data\", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: \"options\", required: false }] }], segmentClick: [{ type: i0.Output, args: [\"segmentClick\"] }], segmentHover: [{ type: i0.Output, args: [\"segmentHover\"] }], chartContainerEl: [{ type: i0.ViewChild, args: ['chartContainer', { isSignal: true }] }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9udXQtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2RvbnV0LWNoYXJ0L3NyYy9saWIvZG9udXQtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2RvbnV0LWNoYXJ0L3NyYy9saWIvZG9udXQtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFFaEIsc0JBQXNCLEVBQ3RCLGFBQWEsRUFDYixpQkFBaUIsR0FDbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsdUJBQXVCLEVBQXNCLE1BQU0sOEJBQThCLENBQUM7QUFFM0YsT0FBTyxFQUNMLGVBQWUsRUFDZix1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsTUFBTSxFQUVOLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFHN0Q7OztHQUdHO0FBU0gsTUFBTSxPQUFPLHFCQUNYLFNBQVEsZ0JBQWdCO0lBR3hCLHVCQUF1QjtJQUNmLEdBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUV4QyxTQUFTO0lBQ1QsdUJBQXVCO0lBQ3ZCLElBQUksR0FBRyxLQUFLLENBQW9CLEVBQUUsZ0RBQUMsQ0FBQztJQUVwQywwQkFBMEI7SUFDMUIsT0FBTyxHQUFHLEtBQUssQ0FBcUIsRUFBRSxtREFBQyxDQUFDO0lBRXhDLFVBQVU7SUFDVix3Q0FBd0M7SUFDeEMsWUFBWSxHQUFHLE1BQU0sRUFBb0IsQ0FBQztJQUUx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LEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXJFLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDakQsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ1gsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLElBQUksV0FBVyxLQUFLLEdBQUcsQ0FBQyxFQUFFO1lBQzFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixLQUFLLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7WUFDakMsVUFBVSxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEQsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztTQUN0QyxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7d0dBNTZCVSxxQkFBcUI7NEZBQXJCLHFCQUFxQiw2aUJDM0NsQyx1VUFTQSw4cENEK0JZLHVCQUF1Qjs7NEZBR3RCLHFCQUFxQjtrQkFSakMsU0FBUzsrQkFDRSxnQkFBZ0IsaUJBR1gsaUJBQWlCLENBQUMsSUFBSSxXQUM1QixDQUFDLHVCQUF1QixDQUFDLG1CQUNqQix1QkFBdUIsQ0FBQyxNQUFNO3daQTBCb0MsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQVhfQ0hBUlRfQ09MT1JfUEFMRVRURSxcbiAgQVhDaGFydENvbXBvbmVudCxcbiAgQVhDaGFydENvbXBvbmVudEJhc2UsXG4gIGNvbXB1dGVUb29sdGlwUG9zaXRpb24sXG4gIGdldENoYXJ0Q29sb3IsXG4gIGdldEVhc2luZ0Z1bmN0aW9uLFxufSBmcm9tICdAYWNvcmV4L2NoYXJ0cyc7XG5pbXBvcnQgeyBBWENoYXJ0TGVnZW5kQ29tcGF0aWJsZSwgQVhDaGFydExlZ2VuZEl0ZW0gfSBmcm9tICdAYWNvcmV4L2NoYXJ0cy9jaGFydC1sZWdlbmQnO1xuaW1wb3J0IHsgQVhDaGFydFRvb2x0aXBDb21wb25lbnQsIEFYQ2hhcnRUb29sdGlwRGF0YSB9IGZyb20gJ0BhY29yZXgvY2hhcnRzL2NoYXJ0LXRvb2x0aXAnO1xuXG5pbXBvcnQge1xuICBhZnRlck5leHRSZW5kZXIsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBFbGVtZW50UmVmLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBPbkRlc3Ryb3ksXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxuICB1bnRyYWNrZWQsXG4gIHZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhfRE9OVVRfQ0hBUlRfQ09ORklHIH0gZnJvbSAnLi9kb251dC1jaGFydC5jb25maWcnO1xuaW1wb3J0IHsgQVhEb251dENoYXJ0RGF0YSwgQVhEb251dENoYXJ0T3B0aW9uLCBBWERvbnV0Q2hhcnRWYWx1ZSB9IGZyb20gJy4vZG9udXQtY2hhcnQudHlwZSc7XG5cbi8qKlxuICogRG9udXQgQ2hhcnQgQ29tcG9uZW50XG4gKiBEaXNwbGF5cyBkYXRhIGluIGEgY2lyY3VsYXIgZG9udXQgY2hhcnQgd2l0aCBpbnRlcmFjdGl2ZSBzZWdtZW50c1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdheC1kb251dC1jaGFydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9kb251dC1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RvbnV0LWNoYXJ0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGltcG9ydHM6IFtBWENoYXJ0VG9vbHRpcENvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBWERvbnV0Q2hhcnRDb21wb25lbnRcbiAgZXh0ZW5kcyBBWENoYXJ0Q29tcG9uZW50XG4gIGltcGxlbWVudHMgT25EZXN0cm95LCBBWENoYXJ0TGVnZW5kQ29tcGF0aWJsZSwgQVhDaGFydENvbXBvbmVudEJhc2VcbntcbiAgLy8gRGVwZW5kZW5jeSBJbmplY3Rpb25cbiAgcHJpdmF0ZSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIC8vIElucHV0c1xuICAvKiogQ2hhcnQgZGF0YSBpbnB1dCAqL1xuICBkYXRhID0gaW5wdXQ8QVhEb251dENoYXJ0VmFsdWU+KFtdKTtcblxuICAvKiogQ2hhcnQgb3B0aW9ucyBpbnB1dCAqL1xuICBvcHRpb25zID0gaW5wdXQ8QVhEb251dENoYXJ0T3B0aW9uPih7fSk7XG5cbiAgLy8gT3V0cHV0c1xuICAvKiogRW1pdHRlZCB3aGVuIGEgc2VnbWVudCBpcyBjbGlja2VkICovXG4gIHNlZ21lbnRDbGljayA9IG91dHB1dDxBWERvbnV0Q2hhcnREYXRhPigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBzZWdtZW50IGhhcyBtb3VzZSBob3ZlclxuICAgKiBDYW4gYmUgdXNlZCBieSBleHRlcm5hbCBlbGVtZW50cyB0byBoaWdobGlnaHQgdGhpcyBzZWdtZW50XG4gICAqL1xuICBzZWdtZW50SG92ZXIgPSBvdXRwdXQ8QVhEb251dENoYXJ0RGF0YSB8IG51bGw+KCk7XG5cbiAgLy8gQ2hhcnQgY29udGFpbmVyIHJlZmVyZW5jZVxuICBwcml2YXRlIHJlYWRvbmx5IGNoYXJ0Q29udGFpbmVyRWwgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjaGFydENvbnRhaW5lcicpO1xuXG4gIC8vIEQzIHJlZmVyZW5jZSAtIGxvYWRlZCBhc3luY2hyb25vdXNseVxuICBwcm90ZWN0ZWQgZDMhOiB0eXBlb2YgaW1wb3J0KCdkMycpO1xuXG4gIC8vIENoYXJ0IFNWRyByZWZlcmVuY2UgKHVzaW5nICdhbnknIHNpbmNlIEQzIGlzIGxvYWRlZCBkeW5hbWljYWxseSBhdCBydW50aW1lKVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHN2ZzogYW55ID0gbnVsbDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBwaWVEYXRhOiBhbnlbXSA9IFtdO1xuXG4gIC8vIFN0YXRlIG1hbmFnZW1lbnRcbiAgcHJpdmF0ZSBoaWRkZW5TZWdtZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIF9pbml0aWFsaXplZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX3JlbmRlcmVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfaXNJbml0aWFsQW5pbWF0aW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfY3VycmVudGx5SGlnaGxpZ2h0ZWRTZWdtZW50ID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFRvb2x0aXAgc3RhdGVcbiAgcHJpdmF0ZSBfdG9vbHRpcFZpc2libGUgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF90b29sdGlwUG9zaXRpb24gPSBzaWduYWwoeyB4OiAwLCB5OiAwIH0pO1xuICBwcml2YXRlIF90b29sdGlwRGF0YSA9IHNpZ25hbDxBWENoYXJ0VG9vbHRpcERhdGE+KHtcbiAgICB0aXRsZTogJycsXG4gICAgdmFsdWU6IDAsXG4gICAgcGVyY2VudGFnZTogJzAlJyxcbiAgICBjb2xvcjogJycsXG4gIH0pO1xuXG4gIC8vIFB1YmxpYyBjb21wdXRlZCBwcm9wZXJ0aWVzIGZvciB0aGUgdGVtcGxhdGVcbiAgcHJvdGVjdGVkIHRvb2x0aXBWaXNpYmxlID0gdGhpcy5fdG9vbHRpcFZpc2libGUuYXNSZWFkb25seSgpO1xuICBwcm90ZWN0ZWQgdG9vbHRpcFBvc2l0aW9uID0gdGhpcy5fdG9vbHRpcFBvc2l0aW9uLmFzUmVhZG9ubHkoKTtcbiAgcHJvdGVjdGVkIHRvb2x0aXBEYXRhID0gdGhpcy5fdG9vbHRpcERhdGEuYXNSZWFkb25seSgpO1xuXG4gIC8vIEluamVjdCBjb25maWd1cmF0aW9uXG4gIHByaXZhdGUgY29uZmlnVG9rZW4gPSBpbmplY3QoQVhfRE9OVVRfQ0hBUlRfQ09ORklHKTtcblxuICAvLyBJbmplY3QgdGhlIGNoYXJ0IGNvbG9yc1xuICBwcml2YXRlIGNoYXJ0Q29sb3JzID0gaW5qZWN0KEFYX0NIQVJUX0NPTE9SX1BBTEVUVEUpO1xuXG4gIC8vIENvbXB1dGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICBwcm90ZWN0ZWQgZWZmZWN0aXZlT3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25maWdUb2tlbixcbiAgICAgIC4uLnRoaXMub3B0aW9ucygpLFxuICAgIH07XG4gIH0pO1xuXG4gIC8vIENvbnN0YW50c1xuICBwcml2YXRlIHJlYWRvbmx5IFRPT0xUSVBfR0FQID0gMTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgSElHSExJR0hUX1RSQU5TSVRJT05fRFVSQVRJT04gPSAxNTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgSElHSExJR0hUX1RSQU5TSVRJT05fTkFNRSA9ICdoaWdobGlnaHQnO1xuICBwcml2YXRlIHJlYWRvbmx5IFNFR01FTlRfQU5JTUFUSU9OX0RFTEFZID0gNTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgTEFCRUxfQU5JTUFUSU9OX0RFTEFZID0gMjAwO1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9DSEFSVF9ESU1FTlNJT04gPSAyMDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX0NIQVJUX0ZPUl9MQUJFTFMgPSAyNjA7XG4gIHByaXZhdGUgcmVhZG9ubHkgRElNTUVEX09QQUNJVFkgPSAwLjU7XG4gIHByaXZhdGUgcmVhZG9ubHkgVklTSUJMRV9PUEFDSVRZID0gMTtcblxuICAvLyBNZXNzYWdlcyB3aXRoIGRlZmF1bHRzXG4gIHByb3RlY3RlZCBlZmZlY3RpdmVNZXNzYWdlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0TWVzc2FnZXMgPSB7XG4gICAgICBub0RhdGE6ICdObyBkYXRhIGF2YWlsYWJsZScsXG4gICAgICBub0RhdGFIZWxwOiAnUGxlYXNlIHByb3ZpZGUgZGF0YSB0byBkaXNwbGF5IHRoZSBjaGFydCcsXG4gICAgICBhbGxIaWRkZW46ICdBbGwgc2VnbWVudHMgYXJlIGhpZGRlbicsXG4gICAgICBhbGxIaWRkZW5IZWxwOiAnUGxlYXNlIHRvZ2dsZSB2aXNpYmlsaXR5IG9mIGF0IGxlYXN0IG9uZSBzZWdtZW50JyxcbiAgICAgIG5vRGF0YUljb246ICdmYS1saWdodCBmYS1jaGFydC1waWUnLFxuICAgICAgYWxsSGlkZGVuSWNvbjogJ2ZhLWxpZ2h0IGZhLWV5ZS1zbGFzaCcsXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmYXVsdE1lc3NhZ2VzLFxuICAgICAgLi4udGhpcy5lZmZlY3RpdmVPcHRpb25zKCkubWVzc2FnZXMsXG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gRGF0YSBhY2Nlc3NvciBmb3IgaGFuZGxpbmcgZGlmZmVyZW50IGluY29taW5nIGRhdGEgZm9ybWF0c1xuICBwcm90ZWN0ZWQgY2hhcnREYXRhQXJyYXkgPSBjb21wdXRlZCgoKTogQVhEb251dENoYXJ0RGF0YVtdID0+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhKCkgfHwgW107XG4gIH0pO1xuXG4gIC8vIENvbG9yIGFjY2Vzc29yIG1ldGhvZFxuICBwcm90ZWN0ZWQgZ2V0Q29sb3IoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdldENoYXJ0Q29sb3IoaW5kZXgsIHRoaXMuY2hhcnRDb2xvcnMpO1xuICB9XG5cbiAgLy8gU2VnbWVudCB2aXNpYmlsaXR5IGNoZWNrXG4gIHByb3RlY3RlZCBpc1NlZ21lbnRIaWRkZW4oaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhpZGRlblNlZ21lbnRzLmhhcyhpZCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIC8vIER5bmFtaWNhbGx5IGxvYWQgRDMgYW5kIGluaXRpYWxpemUgdGhlIGNoYXJ0IHdoZW4gdGhlIGNvbXBvbmVudCBpcyByZWFkeVxuICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG4gICAgICB0aGlzLl9pbml0aWFsaXplZC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLmxvYWREMygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhQ2hhbmdlRWZmZWN0ID0gZWZmZWN0KCgpID0+IHtcbiAgICAvLyBUcmFjayBkYXRhIGFuZCBvcHRpb25zIGNoYW5nZXNcbiAgICB0aGlzLmRhdGEoKTtcbiAgICB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKTtcblxuICAgIC8vIE9ubHkgdXBkYXRlIGlmIGFscmVhZHkgcmVuZGVyZWRcbiAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX3JlbmRlcmVkKCkpIHtcbiAgICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICAvKipcbiAgICogSGlnaGxpZ2h0cyBhIHNwZWNpZmljIHNlZ21lbnQgYnkgSURcbiAgICogQHBhcmFtIGlkIFRoZSBzZWdtZW50IElEIHRvIGhpZ2hsaWdodCwgb3IgbnVsbCB0byBjbGVhciBoaWdobGlnaHRcbiAgICovXG4gIGhpZ2hsaWdodFNlZ21lbnQoaWQ6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faXNJbml0aWFsQW5pbWF0aW5nKCkgfHwgIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5fY3VycmVudGx5SGlnaGxpZ2h0ZWRTZWdtZW50KCkgPT09IGlkKSByZXR1cm47XG5cbiAgICB0aGlzLl9jdXJyZW50bHlIaWdobGlnaHRlZFNlZ21lbnQuc2V0KGlkKTtcblxuICAgIC8vIE9ubHkgaW50ZXJydXB0IG9uZ29pbmcgSElHSExJR0hUIHRyYW5zaXRpb25zIChub3QgaW5pdGlhbCBhbmltYXRpb25zKVxuICAgIHRoaXMuc3ZnLnNlbGVjdEFsbCgncGF0aCcpLmludGVycnVwdCh0aGlzLkhJR0hMSUdIVF9UUkFOU0lUSU9OX05BTUUpO1xuXG4gICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICB0aGlzLmNsZWFyQWxsSGlnaGxpZ2h0cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgdGFyZ2V0U2VnbWVudCA9IHRoaXMuc3ZnLnNlbGVjdEFsbCgncGF0aCcpLmZpbHRlcigoZDogYW55KSA9PiBkPy5kYXRhPy5pZCA9PT0gaWQpO1xuXG4gICAgaWYgKHRhcmdldFNlZ21lbnQuZW1wdHkoKSkge1xuICAgICAgdGhpcy5fY3VycmVudGx5SGlnaGxpZ2h0ZWRTZWdtZW50LnNldChudWxsKTtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0U2VnbWVudChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpbU5vblRhcmdldFNlZ21lbnRzKGlkKTtcbiAgICB0aGlzLmhpZ2hsaWdodFRhcmdldFNlZ21lbnQodGFyZ2V0U2VnbWVudCk7XG4gICAgdGhpcy5zZWdtZW50SG92ZXIuZW1pdCh0aGlzLmdldFNlZ21lbnREYXRhQnlJZChpZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckFsbEhpZ2hsaWdodHMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN2ZykgcmV0dXJuO1xuXG4gICAgdGhpcy5zdmdcbiAgICAgIC5zZWxlY3RBbGwoJ3BhdGgnKVxuICAgICAgLmNsYXNzZWQoJ2F4LWRvbnV0LWNoYXJ0LWhpZ2hsaWdodGVkJywgZmFsc2UpXG4gICAgICAuY2xhc3NlZCgnYXgtZG9udXQtY2hhcnQtZGltbWVkJywgZmFsc2UpXG4gICAgICAudHJhbnNpdGlvbih0aGlzLkhJR0hMSUdIVF9UUkFOU0lUSU9OX05BTUUpXG4gICAgICAuZHVyYXRpb24odGhpcy5ISUdITElHSFRfVFJBTlNJVElPTl9EVVJBVElPTilcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBudWxsKVxuICAgICAgLnN0eWxlKCdmaWx0ZXInLCBudWxsKVxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgdGhpcy5WSVNJQkxFX09QQUNJVFkpO1xuXG4gICAgdGhpcy5zZWdtZW50SG92ZXIuZW1pdChudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgZGltTm9uVGFyZ2V0U2VnbWVudHModGFyZ2V0SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdmcpIHJldHVybjtcblxuICAgIHRoaXMuc3ZnXG4gICAgICAuc2VsZWN0QWxsKCdwYXRoJylcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAuZmlsdGVyKChkOiBhbnkpID0+IGQ/LmRhdGE/LmlkICE9PSB0YXJnZXRJZClcbiAgICAgIC5jbGFzc2VkKCdheC1kb251dC1jaGFydC1oaWdobGlnaHRlZCcsIGZhbHNlKVxuICAgICAgLmNsYXNzZWQoJ2F4LWRvbnV0LWNoYXJ0LWRpbW1lZCcsIHRydWUpXG4gICAgICAudHJhbnNpdGlvbih0aGlzLkhJR0hMSUdIVF9UUkFOU0lUSU9OX05BTUUpXG4gICAgICAuZHVyYXRpb24odGhpcy5ISUdITElHSFRfVFJBTlNJVElPTl9EVVJBVElPTilcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBudWxsKVxuICAgICAgLnN0eWxlKCdmaWx0ZXInLCBudWxsKVxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgdGhpcy5ESU1NRURfT1BBQ0lUWSk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIGhpZ2hsaWdodFRhcmdldFNlZ21lbnQodGFyZ2V0U2VnbWVudDogYW55KTogdm9pZCB7XG4gICAgdGFyZ2V0U2VnbWVudFxuICAgICAgLmNsYXNzZWQoJ2F4LWRvbnV0LWNoYXJ0LWRpbW1lZCcsIGZhbHNlKVxuICAgICAgLmNsYXNzZWQoJ2F4LWRvbnV0LWNoYXJ0LWhpZ2hsaWdodGVkJywgdHJ1ZSlcbiAgICAgIC50cmFuc2l0aW9uKHRoaXMuSElHSExJR0hUX1RSQU5TSVRJT05fTkFNRSlcbiAgICAgIC5kdXJhdGlvbih0aGlzLkhJR0hMSUdIVF9UUkFOU0lUSU9OX0RVUkFUSU9OKVxuICAgICAgLnN0eWxlKCdmaWx0ZXInLCAndXJsKCNheC1kb251dC1jaGFydC1zZWdtZW50LXNoYWRvdyknKVxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgdGhpcy5WSVNJQkxFX09QQUNJVFkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWdtZW50RGF0YUJ5SWQoc2VnbWVudElkOiBzdHJpbmcpOiBBWERvbnV0Q2hhcnREYXRhIHwgbnVsbCB7XG4gICAgcmV0dXJuIHVudHJhY2tlZCgoKSA9PiB0aGlzLmNoYXJ0RGF0YUFycmF5KCkpLmZpbmQoKGQpID0+IGQuaWQgPT09IHNlZ21lbnRJZCkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHZpc2liaWxpdHkgb2YgYSBzZWdtZW50IGJ5IElEXG4gICAqIEBwYXJhbSBpZCBTZWdtZW50IElEIHRvIHRvZ2dsZVxuICAgKiBAcmV0dXJucyBOZXcgdmlzaWJpbGl0eSBzdGF0ZSAodHJ1ZSA9IHZpc2libGUsIGZhbHNlID0gaGlkZGVuKVxuICAgKi9cbiAgdG9nZ2xlU2VnbWVudChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2hhcnREYXRhID0gdGhpcy5jaGFydERhdGFBcnJheSgpO1xuICAgIGNvbnN0IHdhc0FsbEhpZGRlbiA9IGNoYXJ0RGF0YS5sZW5ndGggPiAwICYmIGNoYXJ0RGF0YS5ldmVyeSgoZCkgPT4gdGhpcy5pc1NlZ21lbnRIaWRkZW4oZC5pZCkpO1xuXG4gICAgaWYgKHRoaXMuaGlkZGVuU2VnbWVudHMuaGFzKGlkKSkge1xuICAgICAgLy8gTWFraW5nIGEgc2VnbWVudCB2aXNpYmxlXG4gICAgICB0aGlzLmhpZGRlblNlZ21lbnRzLmRlbGV0ZShpZCk7XG5cbiAgICAgIC8vIElmIGFsbCBzZWdtZW50cyB3ZXJlIHByZXZpb3VzbHkgaGlkZGVuLCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGUgbWVzc2FnZSBpcyBjbGVhcmVkXG4gICAgICBpZiAod2FzQWxsSGlkZGVuKSB7XG4gICAgICAgIC8vIEZvcmNlIGNvbXBsZXRlIERPTSBjbGVhbnVwIGFuZCByZWRyYXdcbiAgICAgICAgaWYgKHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgLy8gQ2xlYXIgb25seSBjaGFydCBTVkcgYW5kIG1lc3NhZ2UgY29udGFpbmVycyAocHJlc2VydmUgdG9vbHRpcCBjb21wb25lbnQpXG4gICAgICAgICAgdGhpcy5kM1xuICAgICAgICAgICAgPy5zZWxlY3QodGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAgIC5zZWxlY3RBbGwoJ3N2ZywgLmF4LWNoYXJ0LW1lc3NhZ2UtY29udGFpbmVyLCAuYXgtZG9udXQtY2hhcnQtbm8tZGF0YS1tZXNzYWdlJylcbiAgICAgICAgICAgIC5yZW1vdmUoKTtcblxuICAgICAgICAgIC8vIEZvcmNlIGZ1bGwgcmVkcmF3XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGlkaW5nIGEgc2VnbWVudFxuICAgICAgdGhpcy5oaWRkZW5TZWdtZW50cy5hZGQoaWQpO1xuICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgIH1cblxuICAgIHJldHVybiAhdGhpcy5pc1NlZ21lbnRIaWRkZW4oaWQpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhbnVwQ2hhcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBEMy5qcyBkeW5hbWljYWxseVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGxvYWREMygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5kMyA9IGF3YWl0IGltcG9ydCgnZDMnKTtcbiAgICAgIC8vIElmIGNvbnRhaW5lciBpcyByZWFkeSwgY3JlYXRlIGNoYXJ0XG4gICAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQoKSAmJiB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKSkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkLnNldCh0cnVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgRDMuanM6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvblNlZ21lbnRDbGljayhpdGVtOiBBWERvbnV0Q2hhcnREYXRhKTogdm9pZCB7XG4gICAgdGhpcy5zZWdtZW50Q2xpY2suZW1pdChpdGVtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBkb251dCBjaGFydCBmcm9tIGN1cnJlbnQgZGF0YVxuICAgKi9cbiAgcHVibGljIGNyZWF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kMyB8fCAhdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudDtcbiAgICAgIHRoaXMuY2xlYXJDaGFydChjb250YWluZXJFbGVtZW50KTtcblxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuY2hhcnREYXRhQXJyYXkoKTtcbiAgICAgIGlmICghZGF0YSB8fCBkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnNob3dOb0RhdGFNZXNzYWdlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmlzaWJsZURhdGEgPSBkYXRhLmZpbHRlcigoaXRlbSkgPT4gIXRoaXMuaGlkZGVuU2VnbWVudHMuaGFzKGl0ZW0uaWQpKTtcbiAgICAgIGlmICh2aXNpYmxlRGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zaG93QWxsU2VnbWVudHNIaWRkZW5NZXNzYWdlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0aGlzLnNldHVwRGltZW5zaW9ucyhjb250YWluZXJFbGVtZW50LCBvcHRpb25zKTtcbiAgICAgIHRoaXMucmVuZGVyRG9udXRDaGFydChjb250YWluZXJFbGVtZW50LCB3aWR0aCwgaGVpZ2h0LCB2aXNpYmxlRGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNyZWF0aW5nIGRvbnV0IGNoYXJ0OicsIGVycm9yKTtcbiAgICAgIHRoaXMuaGFuZGxlQ2hhcnRFcnJvcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBjaGFydCB3aXRoIG5ldyBkYXRhXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgLy8gUmVzZXQgaGlnaGxpZ2h0ZWQgc2VnbWVudCBzdGF0ZSB3aGVuIHVwZGF0aW5nXG4gICAgdGhpcy5fY3VycmVudGx5SGlnaGxpZ2h0ZWRTZWdtZW50LnNldChudWxsKTtcbiAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7IC8vIFJlY3JlYXRlIHRoZSBjaGFydCB3aXRoIHVwZGF0ZWQgZGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgY2hhcnQgY29udGFpbmVyXG4gICAqL1xuICBwcml2YXRlIGNsZWFyQ2hhcnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMuZDMuc2VsZWN0KGNvbnRhaW5lcikuc2VsZWN0QWxsKCdzdmcsIC5heC1jaGFydC1tZXNzYWdlLWNvbnRhaW5lciwgLmF4LWRvbnV0LWNoYXJ0LW5vLWRhdGEtbWVzc2FnZScpLnJlbW92ZSgpO1xuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSBtZXNzYWdlIHdoZW4gbm8gZGF0YSBpcyBhdmFpbGFibGVcbiAgICovXG4gIHByaXZhdGUgc2hvd05vRGF0YU1lc3NhZ2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5yZW5kZXJNZXNzYWdlKFxuICAgICAgY29udGFpbmVyLFxuICAgICAgdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLm5vRGF0YUljb24sXG4gICAgICB0aGlzLmVmZmVjdGl2ZU1lc3NhZ2VzKCkubm9EYXRhLFxuICAgICAgdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLm5vRGF0YUhlbHAsXG4gICAgICAnYXgtZG9udXQtY2hhcnQtbm8tZGF0YS1tZXNzYWdlJyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGEgbWVzc2FnZSB3aGVuIGFsbCBzZWdtZW50cyBhcmUgaGlkZGVuXG4gICAqL1xuICBwcml2YXRlIHNob3dBbGxTZWdtZW50c0hpZGRlbk1lc3NhZ2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5yZW5kZXJNZXNzYWdlKFxuICAgICAgY29udGFpbmVyLFxuICAgICAgdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLmFsbEhpZGRlbkljb24sXG4gICAgICB0aGlzLmVmZmVjdGl2ZU1lc3NhZ2VzKCkuYWxsSGlkZGVuLFxuICAgICAgdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLmFsbEhpZGRlbkhlbHAsXG4gICAgICAnYXgtZG9udXQtY2hhcnQtbm8tZGF0YS1tZXNzYWdlJyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwcyBjaGFydCBkaW1lbnNpb25zIGJhc2VkIG9uIGNvbnRhaW5lciBhbmQgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cERpbWVuc2lvbnMoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9uczogQVhEb251dENoYXJ0T3B0aW9uKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IGNvbnRhaW5lci5jbGllbnRXaWR0aCB8fCA0MDA7XG4gICAgY29uc3QgY29udGFpbmVySGVpZ2h0ID0gY29udGFpbmVyLmNsaWVudEhlaWdodCB8fCA0MDA7XG5cbiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KG9wdGlvbnM/LndpZHRoIHx8IGNvbnRhaW5lcldpZHRoLCB0aGlzLk1JTl9DSEFSVF9ESU1FTlNJT04pO1xuICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KG9wdGlvbnM/LmhlaWdodCB8fCBjb250YWluZXJIZWlnaHQsIHRoaXMuTUlOX0NIQVJUX0RJTUVOU0lPTik7XG5cbiAgICByZXR1cm4geyB3aWR0aCwgaGVpZ2h0IH07XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgZG9udXQgY2hhcnQgd2l0aCB2aXNpYmxlIGRhdGFcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyRG9udXRDaGFydChcbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgdmlzaWJsZURhdGE6IEFYRG9udXRDaGFydERhdGFbXSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgdG90YWwgPSB2aXNpYmxlRGF0YS5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4gc3VtICsgaXRlbS52YWx1ZSwgMCk7XG5cbiAgICAvLyBDcmVhdGUgU1ZHIGNvbnRhaW5lciB3aXRoIGZpbHRlcnNcbiAgICBjb25zdCBzdmcgPSB0aGlzLmNyZWF0ZVN2Z1dpdGhGaWx0ZXJzKGNvbnRhaW5lciwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICAvLyBDcmVhdGUgbWFpbiBjaGFydCBncm91cFxuICAgIHRoaXMuc3ZnID0gc3ZnLmFwcGVuZCgnZycpLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHt3aWR0aCAvIDJ9LCAke2hlaWdodCAvIDJ9KWApO1xuXG4gICAgLy8gQ3JlYXRlIGRvbnV0IHNlZ21lbnRzXG4gICAgdGhpcy5jcmVhdGVEb251dFNlZ21lbnRzKHdpZHRoLCBoZWlnaHQsIHZpc2libGVEYXRhLCB0b3RhbCk7XG5cbiAgICAvLyBBZGQgdG90YWwgaW4gY2VudGVyXG4gICAgdGhpcy5hZGRDZW50ZXJEaXNwbGF5KHRvdGFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgU1ZHIGVsZW1lbnQgd2l0aCBmaWx0ZXIgZGVmaW5pdGlvbnMgZm9yIHNoYWRvd3NcbiAgICogQHJldHVybnMgRDMgU1ZHIHNlbGVjdGlvbiAoYW55IHR5cGUgZHVlIHRvIGR5bmFtaWMgRDMgbG9hZGluZylcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgY3JlYXRlU3ZnV2l0aEZpbHRlcnMoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBhbnkge1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuZDNcbiAgICAgIC5zZWxlY3QoY29udGFpbmVyKVxuICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgIC5hdHRyKCd3aWR0aCcsICcxMDAlJylcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCAnMTAwJScpXG4gICAgICAuYXR0cigndmlld0JveCcsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YClcbiAgICAgIC5hdHRyKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJywgJ3hNaWRZTWlkIG1lZXQnKTtcblxuICAgIC8vIEFkZCBkcm9wIHNoYWRvdyBmaWx0ZXJcbiAgICBjb25zdCBkZWZzID0gc3ZnLmFwcGVuZCgnZGVmcycpO1xuICAgIGNvbnN0IGZpbHRlciA9IGRlZnMuYXBwZW5kKCdmaWx0ZXInKS5hdHRyKCdpZCcsICdheC1kb251dC1jaGFydC1zZWdtZW50LXNoYWRvdycpLmF0dHIoJ2hlaWdodCcsICcxMzAlJyk7XG5cbiAgICBmaWx0ZXIuYXBwZW5kKCdmZUdhdXNzaWFuQmx1cicpLmF0dHIoJ2luJywgJ1NvdXJjZUFscGhhJykuYXR0cignc3RkRGV2aWF0aW9uJywgMikuYXR0cigncmVzdWx0JywgJ2JsdXInKTtcbiAgICBmaWx0ZXIuYXBwZW5kKCdmZU9mZnNldCcpLmF0dHIoJ2luJywgJ2JsdXInKS5hdHRyKCdkeCcsIDEpLmF0dHIoJ2R5JywgMSkuYXR0cigncmVzdWx0JywgJ29mZnNldEJsdXInKTtcblxuICAgIGNvbnN0IGZlQ29tcG9uZW50VHJhbnNmZXIgPSBmaWx0ZXJcbiAgICAgIC5hcHBlbmQoJ2ZlQ29tcG9uZW50VHJhbnNmZXInKVxuICAgICAgLmF0dHIoJ2luJywgJ29mZnNldEJsdXInKVxuICAgICAgLmF0dHIoJ3Jlc3VsdCcsICdvZmZzZXRCbHVyJyk7XG5cbiAgICBmZUNvbXBvbmVudFRyYW5zZmVyLmFwcGVuZCgnZmVGdW5jQScpLmF0dHIoJ3R5cGUnLCAnbGluZWFyJykuYXR0cignc2xvcGUnLCAwLjMpO1xuXG4gICAgY29uc3QgZmVNZXJnZSA9IGZpbHRlci5hcHBlbmQoJ2ZlTWVyZ2UnKTtcbiAgICBmZU1lcmdlLmFwcGVuZCgnZmVNZXJnZU5vZGUnKS5hdHRyKCdpbicsICdvZmZzZXRCbHVyJyk7XG4gICAgZmVNZXJnZS5hcHBlbmQoJ2ZlTWVyZ2VOb2RlJykuYXR0cignaW4nLCAnU291cmNlR3JhcGhpYycpO1xuXG4gICAgcmV0dXJuIHN2ZztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW5kIHJlbmRlciB0aGUgZG9udXQgc2VnbWVudHMgd2l0aCBhbmltYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZURvbnV0U2VnbWVudHMoY2hhcnRXaWR0aDogbnVtYmVyLCBjaGFydEhlaWdodDogbnVtYmVyLCBkYXRhOiBBWERvbnV0Q2hhcnREYXRhW10sIHRvdGFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcuc2V0KHRydWUpO1xuXG4gICAgLy8gQ3JlYXRlIHBpZSBsYXlvdXRcbiAgICBjb25zdCBwaWUgPSB0aGlzLmQzXG4gICAgICAucGllPEFYRG9udXRDaGFydERhdGE+KClcbiAgICAgIC52YWx1ZSgoZCkgPT4gZC52YWx1ZSlcbiAgICAgIC5zb3J0KG51bGwpXG4gICAgICAucGFkQW5nbGUoMC4wMik7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIHJhZGl1cyBvZiB0aGUgZG9udXQgY2hhcnRcbiAgICBjb25zdCByYWRpdXMgPSAoTWF0aC5taW4oY2hhcnRXaWR0aCwgY2hhcnRIZWlnaHQpIC8gMikgKiAwLjg1O1xuXG4gICAgLy8gQ2FsY3VsYXRlIGlubmVyIHJhZGl1cyBiYXNlZCBvbiBkb251dFdpZHRoIHBlcmNlbnRhZ2VcbiAgICBjb25zdCBkb251dFdpZHRoUGVyY2VudCA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmRvbnV0V2lkdGggLyAxMDA7XG4gICAgY29uc3QgaW5uZXJSYWRpdXMgPSByYWRpdXMgKiAoMSAtIGRvbnV0V2lkdGhQZXJjZW50KTtcblxuICAgIC8vIENyZWF0ZSBhcmMgZ2VuZXJhdG9yIHdpdGggdGhlIGNvbmZpZ3VyZWQgcmFkaXVzIGFuZCBjb3JuZXIgcmFkaXVzXG4gICAgY29uc3QgYXJjID0gdGhpcy5kM1xuICAgICAgLmFyYygpXG4gICAgICAuaW5uZXJSYWRpdXMoaW5uZXJSYWRpdXMpXG4gICAgICAub3V0ZXJSYWRpdXMocmFkaXVzICogMC45NSlcbiAgICAgIC5jb3JuZXJSYWRpdXModGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuY29ybmVyUmFkaXVzKTtcblxuICAgIC8vIENyZWF0ZSBsYWJlbCBhcmMgZ2VuZXJhdG9yIGZvciBwbGFjaW5nIGxhYmVscyAobWlkZGxlIG9mIHRoZSBkb251dCByaW5nKVxuICAgIGNvbnN0IGxhYmVsQXJjID0gdGhpcy5kM1xuICAgICAgLmFyYygpXG4gICAgICAuaW5uZXJSYWRpdXMoaW5uZXJSYWRpdXMgKyAocmFkaXVzICogMC45NSAtIGlubmVyUmFkaXVzKSAvIDIpXG4gICAgICAub3V0ZXJSYWRpdXMoaW5uZXJSYWRpdXMgKyAocmFkaXVzICogMC45NSAtIGlubmVyUmFkaXVzKSAvIDIpO1xuXG4gICAgLy8gR2V0IGFuaW1hdGlvbiBvcHRpb25zXG4gICAgY29uc3QgYW5pbWF0aW9uRHVyYXRpb24gPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5hbmltYXRpb25EdXJhdGlvbjtcbiAgICBjb25zdCBhbmltYXRpb25FYXNpbmcgPSBnZXRFYXNpbmdGdW5jdGlvbih0aGlzLmQzLCB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5hbmltYXRpb25FYXNpbmcpO1xuXG4gICAgLy8gR2VuZXJhdGUgcGllIGRhdGFcbiAgICB0aGlzLnBpZURhdGEgPSBwaWUoZGF0YSk7XG5cbiAgICAvLyBBZGQgc2VnbWVudHMgd2l0aCBhbmltYXRpb25cbiAgICBjb25zdCBzZWdtZW50cyA9IHRoaXMuc3ZnXG4gICAgICAuc2VsZWN0QWxsKCdwYXRoJylcbiAgICAgIC5kYXRhKHRoaXMucGllRGF0YSlcbiAgICAgIC5lbnRlcigpXG4gICAgICAuYXBwZW5kKCdwYXRoJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1kb251dC1jaGFydC1zZWdtZW50JylcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAuYXR0cignZmlsbCcsIChkOiBhbnkpID0+IHRoaXMuZ2V0U2VnbWVudENvbG9yKGQuZGF0YSkpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgICAgLnN0eWxlKCdjdXJzb3InLCAncG9pbnRlcicpXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgLm9uKCdtb3VzZWVudGVyJywgKGV2ZW50OiBNb3VzZUV2ZW50LCBkOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dUb29sdGlwKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVTbGljZUhvdmVyKGV2ZW50LCBkLmRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKCkgPT4gdGhpcy5oYW5kbGVTZWdtZW50TGVhdmUoKSlcbiAgICAgIC5vbignbW91c2Vtb3ZlJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl90b29sdGlwVmlzaWJsZSgpKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIC5vbignY2xpY2snLCAoX2V2ZW50OiBNb3VzZUV2ZW50LCBkOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vblNlZ21lbnRDbGljayhkLmRhdGEpO1xuICAgICAgfSk7XG5cbiAgICAvLyBBbmltYXRlIHNlZ21lbnRzXG4gICAgY29uc3QgbnVtU2VnbWVudHMgPSB0aGlzLnBpZURhdGEubGVuZ3RoO1xuICAgIGxldCBjb21wbGV0ZWQgPSAwO1xuICAgIHNlZ21lbnRzXG4gICAgICAudHJhbnNpdGlvbigpXG4gICAgICAuZHVyYXRpb24oYW5pbWF0aW9uRHVyYXRpb24pXG4gICAgICAuZWFzZShhbmltYXRpb25FYXNpbmcpXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgLmRlbGF5KChfZDogYW55LCBpOiBudW1iZXIpID0+IGkgKiB0aGlzLlNFR01FTlRfQU5JTUFUSU9OX0RFTEFZKVxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgdGhpcy5WSVNJQkxFX09QQUNJVFkpXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgLmF0dHJUd2VlbignZCcsIChkOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGUgPSB0aGlzLmQzLmludGVycG9sYXRlKHsgc3RhcnRBbmdsZTogZC5zdGFydEFuZ2xlLCBlbmRBbmdsZTogZC5zdGFydEFuZ2xlIH0sIGQpO1xuICAgICAgICByZXR1cm4gKHQ6IG51bWJlcikgPT4gYXJjKGludGVycG9sYXRlKHQpKSBhcyBzdHJpbmc7XG4gICAgICB9KVxuICAgICAgLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgIGNvbXBsZXRlZCsrO1xuICAgICAgICBpZiAoY29tcGxldGVkID49IG51bVNlZ21lbnRzKSB7XG4gICAgICAgICAgdGhpcy5faXNJbml0aWFsQW5pbWF0aW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLm9uKCdpbnRlcnJ1cHQnLCAoKSA9PiB7XG4gICAgICAgIC8vIFRyZWF0IGludGVycnVwdHMgYXMgY29tcGxldGlvbiB0byBhdm9pZCBnZXR0aW5nIHN0dWNrIGluIGFuaW1hdGluZyBzdGF0ZVxuICAgICAgICBjb21wbGV0ZWQrKztcbiAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBudW1TZWdtZW50cykge1xuICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbEFuaW1hdGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAvLyBBZGQgZGF0YSBsYWJlbHMgaWYgZW5hYmxlZCBhbmQgY2hhcnQgc2l6ZSBpcyBzdWZmaWNpZW50XG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dEYXRhTGFiZWxzICYmIHRoaXMuaXNDaGFydExhcmdlRW5vdWdoRm9yTGFiZWxzKGNoYXJ0V2lkdGgsIGNoYXJ0SGVpZ2h0KSkge1xuICAgICAgdGhpcy5hZGREYXRhTGFiZWxzKGxhYmVsQXJjLCByYWRpdXMsIGlubmVyUmFkaXVzLCB0b3RhbCwgYW5pbWF0aW9uRHVyYXRpb24pO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSB3aGVuIGFsbCBzZWdtZW50IGFuaW1hdGlvbnMgYXJlIGNvbXBsZXRlIChoYW5kbGUgZW1wdHkgY2FzZSlcbiAgICBpZiAobnVtU2VnbWVudHMgPT09IDApIHtcbiAgICAgIHRoaXMuX2lzSW5pdGlhbEFuaW1hdGluZy5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNDaGFydExhcmdlRW5vdWdoRm9yTGFiZWxzKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE1hdGgubWluKHdpZHRoLCBoZWlnaHQpID49IHRoaXMuTUlOX0NIQVJUX0ZPUl9MQUJFTFM7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIGFkZERhdGFMYWJlbHMoXG4gICAgbGFiZWxBcmM6IGFueSxcbiAgICByYWRpdXM6IG51bWJlcixcbiAgICBpbm5lclJhZGl1czogbnVtYmVyLFxuICAgIHRvdGFsOiBudW1iZXIsXG4gICAgYW5pbWF0aW9uRHVyYXRpb246IG51bWJlclxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICBjb25zdCBsYWJlbFJhZGl1cyA9IGlubmVyUmFkaXVzICsgKHJhZGl1cyAqIDAuOTUgLSBpbm5lclJhZGl1cykgLyAyO1xuICAgIFxuICAgIC8vIFNob3cgbGFiZWxzIGZvciBhbGwgc2VnbWVudHMgd2l0aCB2YWxpZCBmb250IHNpemVcbiAgICBjb25zdCBkYXRhV2l0aExhYmVscyA9IHRoaXMucGllRGF0YS5maWx0ZXIoKGQpID0+IHtcbiAgICAgIGNvbnN0IGZvbnRTaXplID0gdGhpcy5jYWxjdWxhdGVMYWJlbEZvbnRTaXplKGQsIHJhZGl1cywgdG90YWwsIGxhYmVsUmFkaXVzKTtcbiAgICAgIHJldHVybiBmb250U2l6ZSA+IDA7IC8vIE9ubHkgc2hvdyBpZiBmb250IHNpemUgaXMgdmFsaWRcbiAgICB9KTtcblxuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuc3ZnXG4gICAgICAuc2VsZWN0QWxsKCcuYXgtZG9udXQtY2hhcnQtZGF0YS1sYWJlbCcpXG4gICAgICAuZGF0YShkYXRhV2l0aExhYmVscylcbiAgICAgIC5lbnRlcigpXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1kb251dC1jaGFydC1kYXRhLWxhYmVsJylcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApXG4gICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWRvbnV0LWNoYXJ0LWRhdGEtbGFiZWxzLWNvbG9yKSknKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIChkKSA9PiB7XG4gICAgICAgIGNvbnN0IGNlbnRyb2lkID0gbGFiZWxBcmMuY2VudHJvaWQoZCk7XG4gICAgICAgIHJldHVybiBgdHJhbnNsYXRlKCR7Y2VudHJvaWRbMF19LCAke2NlbnRyb2lkWzFdfSlgO1xuICAgICAgfSlcbiAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ21pZGRsZScpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIChkKSA9PiBgJHt0aGlzLmNhbGN1bGF0ZUxhYmVsRm9udFNpemUoZCwgcmFkaXVzLCB0b3RhbCwgbGFiZWxSYWRpdXMpfXB4YClcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAoZCkgPT4gKChkLmRhdGEudmFsdWUgLyB0b3RhbCkgKiAxMDAgPj0gMTUgPyAnNjAwJyA6ICc1MDAnKSlcbiAgICAgIC50ZXh0KChkKSA9PiB0aGlzLmdldFRydW5jYXRlZExhYmVsVGV4dChkLCByYWRpdXMsIGxhYmVsUmFkaXVzLCB0b3RhbCkpO1xuXG4gICAgbGFiZWxzXG4gICAgICAudHJhbnNpdGlvbigpXG4gICAgICAuZHVyYXRpb24oYW5pbWF0aW9uRHVyYXRpb24pXG4gICAgICAuZGVsYXkoKF9kLCBpOiBudW1iZXIpID0+IGkgKiB0aGlzLlNFR01FTlRfQU5JTUFUSU9OX0RFTEFZICsgdGhpcy5MQUJFTF9BTklNQVRJT05fREVMQVkpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCB0aGlzLlZJU0lCTEVfT1BBQ0lUWSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyBvcHRpbWFsIGZvbnQgc2l6ZSBmb3IgbGFiZWwgYmFzZWQgb24gc2VnbWVudCBzaXplXG4gICAqIFVzZXMgc21hcnQgZHluYW1pYyBzaXppbmcgd2l0aCByZWFkYWJpbGl0eSBjb25zdHJhaW50c1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBjYWxjdWxhdGVMYWJlbEZvbnRTaXplKGQ6IGFueSwgcmFkaXVzOiBudW1iZXIsIHRvdGFsOiBudW1iZXIsIGxhYmVsUmFkaXVzOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGFuZ2xlID0gZC5lbmRBbmdsZSAtIGQuc3RhcnRBbmdsZTtcbiAgICBjb25zdCBzZWdtZW50UGVyY2VudGFnZSA9IChkLmRhdGEudmFsdWUgLyB0b3RhbCkgKiAxMDA7XG5cbiAgICAvLyBEb24ndCBzaG93IGxhYmVscyBmb3IgdmVyeSBzbWFsbCBzZWdtZW50cyAoPCAxJSlcbiAgICBpZiAoc2VnbWVudFBlcmNlbnRhZ2UgPCAxKSByZXR1cm4gMDtcblxuICAgIC8vIENhbGN1bGF0ZSBjaG9yZCBsZW5ndGggKGF2YWlsYWJsZSBob3Jpem9udGFsIHNwYWNlKVxuICAgIGNvbnN0IGNob3JkTGVuZ3RoID0gMiAqIGxhYmVsUmFkaXVzICogTWF0aC5zaW4oYW5nbGUgLyAyKTtcbiAgICBcbiAgICAvLyBDb25zdGFudHMgZm9yIGZvbnQgc2l6aW5nXG4gICAgY29uc3QgTUlOX0ZPTlRfU0laRSA9IDk7ICAvLyBNaW5pbXVtIHJlYWRhYmxlIHNpemVcbiAgICBjb25zdCBNQVhfRk9OVF9TSVpFID0gMTQ7IC8vIE1heGltdW0gZm9yIGFlc3RoZXRpY3NcbiAgICBjb25zdCBNSU5fQ0hPUkRfRk9SX0xBQkVMID0gMjA7IC8vIE1pbmltdW0gc3BhY2UgbmVlZGVkIGZvciBhbnkgdGV4dFxuICAgIFxuICAgIC8vIERvbid0IHNob3cgbGFiZWxzIGlmIHNwYWNlIGlzIHRvbyBzbWFsbFxuICAgIGlmIChjaG9yZExlbmd0aCA8IE1JTl9DSE9SRF9GT1JfTEFCRUwpIHJldHVybiAwO1xuICAgIFxuICAgIC8vIENhbGN1bGF0ZSBmb250IHNpemUgYmFzZWQgb24gbXVsdGlwbGUgZmFjdG9yc1xuICAgIFxuICAgIC8vIDEuIEJhc2VkIG9uIGFyYyBhbmdsZSAobGFyZ2VyIHNlZ21lbnRzID0gbGFyZ2VyIGZvbnQpXG4gICAgY29uc3QgYW5nbGVCYXNlZFNpemUgPSAoYW5nbGUgKiByYWRpdXMpIC8gODtcbiAgICBcbiAgICAvLyAyLiBCYXNlZCBvbiBjaG9yZCBsZW5ndGggKGF2YWlsYWJsZSBob3Jpem9udGFsIHNwYWNlKVxuICAgIGNvbnN0IGNob3JkQmFzZWRTaXplID0gY2hvcmRMZW5ndGggLyA4O1xuICAgIFxuICAgIC8vIDMuIEJhc2VkIG9uIHNlZ21lbnQgcGVyY2VudGFnZSAocHJvcG9ydGlvbmFsIHRvIGRhdGEgaW1wb3J0YW5jZSlcbiAgICBjb25zdCBwZXJjZW50YWdlQmFzZWRTaXplID0gOSArIChzZWdtZW50UGVyY2VudGFnZSAvIDEwMCkgKiA1OyAvLyA5LTE0cHggcmFuZ2VcbiAgICBcbiAgICAvLyBUYWtlIHRoZSBtaW5pbXVtIG9mIGFsbCBjYWxjdWxhdGlvbnMgdG8gZW5zdXJlIGZpdFxuICAgIGNvbnN0IGNhbGN1bGF0ZWRTaXplID0gTWF0aC5taW4oYW5nbGVCYXNlZFNpemUsIGNob3JkQmFzZWRTaXplLCBwZXJjZW50YWdlQmFzZWRTaXplKTtcbiAgICBcbiAgICAvLyBBcHBseSBtaW4vbWF4IGNvbnN0cmFpbnRzXG4gICAgY29uc3QgZmluYWxTaXplID0gTWF0aC5tYXgoTUlOX0ZPTlRfU0laRSwgTWF0aC5taW4oY2FsY3VsYXRlZFNpemUsIE1BWF9GT05UX1NJWkUpKTtcbiAgICBcbiAgICAvLyBSb3VuZCB0byAuNSBmb3IgY3Jpc3AgcmVuZGVyaW5nXG4gICAgcmV0dXJuIE1hdGgucm91bmQoZmluYWxTaXplICogMikgLyAyO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRQZXJjZW50YWdlKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICh2YWx1ZSA8IDEpIHJldHVybiAnPDElJztcbiAgICBpZiAodmFsdWUgPCAxMCkgcmV0dXJuIGAke3ZhbHVlLnRvRml4ZWQoMSl9JWA7XG4gICAgcmV0dXJuIGAke01hdGgucm91bmQodmFsdWUpfSVgO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBidWlsZExhYmVsVGV4dChkOiBhbnksIHRvdGFsOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSAoZC5kYXRhLnZhbHVlIC8gdG90YWwpICogMTAwO1xuICAgIGlmIChwZXJjZW50YWdlIDwgMSkgcmV0dXJuICcnO1xuICAgIFxuICAgIGNvbnN0IGxhYmVsID0gZC5kYXRhLmxhYmVsIHx8ICcnO1xuICAgIGNvbnN0IHBlcmNlbnRhZ2VUZXh0ID0gdGhpcy5mb3JtYXRQZXJjZW50YWdlKHBlcmNlbnRhZ2UpO1xuICAgIFxuICAgIHJldHVybiBsYWJlbCA/IGAke2xhYmVsfSAoJHtwZXJjZW50YWdlVGV4dH0pYCA6IHBlcmNlbnRhZ2VUZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRydW5jYXRlcyBsYWJlbCB0ZXh0IHRvIGZpdCB3aXRoaW4gdGhlIGFyYyBzZWdtZW50XG4gICAqIFVzZXMgc21hcnQgdHJ1bmNhdGlvbjogdHJpZXMgZnVsbCBsYWJlbCwgdGhlbiBsYWJlbCBvbmx5LCB0aGVuIHBlcmNlbnRhZ2Ugb25seSwgdGhlbiB0cnVuY2F0ZWQgcGVyY2VudGFnZVxuICAgKiBDYWxjdWxhdGVzIGNob3JkIGxlbmd0aCAoc3RyYWlnaHQgbGluZSkgc2luY2UgdGV4dCBpcyByZW5kZXJlZCBob3Jpem9udGFsbHksIG5vdCBhbG9uZyB0aGUgYXJjXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIGdldFRydW5jYXRlZExhYmVsVGV4dChkOiBhbnksIHJhZGl1czogbnVtYmVyLCBsYWJlbFJhZGl1czogbnVtYmVyLCB0b3RhbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBmb250U2l6ZSA9IHRoaXMuY2FsY3VsYXRlTGFiZWxGb250U2l6ZShkLCByYWRpdXMsIHRvdGFsLCBsYWJlbFJhZGl1cyk7XG4gICAgXG4gICAgLy8gSWYgZm9udCBzaXplIGlzIDAsIHNlZ21lbnQgaXMgdG9vIHNtYWxsIGZvciBsYWJlbHNcbiAgICBpZiAoZm9udFNpemUgPT09IDApIHJldHVybiAnJztcbiAgICBcbiAgICAvLyBDYWxjdWxhdGUgY2hvcmQgbGVuZ3RoIChzdHJhaWdodCBsaW5lIGRpc3RhbmNlKSBpbnN0ZWFkIG9mIGFyYyBsZW5ndGhcbiAgICAvLyBGb3JtdWxhOiBjaG9yZCA9IDIgKiByYWRpdXMgKiBzaW4oYW5nbGUvMilcbiAgICBjb25zdCBhbmdsZSA9IGQuZW5kQW5nbGUgLSBkLnN0YXJ0QW5nbGU7XG4gICAgY29uc3QgY2hvcmRMZW5ndGggPSAyICogbGFiZWxSYWRpdXMgKiBNYXRoLnNpbihhbmdsZSAvIDIpO1xuICAgIFxuICAgIC8vIFVzZSBjaG9yZCBsZW5ndGggYXMgYXZhaWxhYmxlIHdpZHRoIHdpdGggZHluYW1pYyBzYWZldHkgbWFyZ2luXG4gICAgLy8gU21hbGxlciBzZWdtZW50cyBuZWVkIGxhcmdlciBzYWZldHkgbWFyZ2lucyAocGVyY2VudGFnZS1iYXNlZClcbiAgICBjb25zdCBzYWZldHlNYXJnaW5QZXJjZW50ID0gTWF0aC5tYXgoMC4xNSwgTWF0aC5taW4oMC4zLCAxIC8gYW5nbGUpKTsgLy8gMTUtMzAlIG1hcmdpblxuICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoID0gY2hvcmRMZW5ndGggKiAoMSAtIHNhZmV0eU1hcmdpblBlcmNlbnQpO1xuICAgIFxuICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSAoZC5kYXRhLnZhbHVlIC8gdG90YWwpICogMTAwO1xuICAgIGlmIChwZXJjZW50YWdlIDwgMSkgcmV0dXJuICcnO1xuXG4gICAgY29uc3QgbGFiZWwgPSBkLmRhdGEubGFiZWwgfHwgJyc7XG4gICAgY29uc3QgcGVyY2VudGFnZVRleHQgPSB0aGlzLmZvcm1hdFBlcmNlbnRhZ2UocGVyY2VudGFnZSk7XG5cbiAgICAvLyBUcnkgZGlmZmVyZW50IGxhYmVsIGZvcm1hdHMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZVxuICAgIGNvbnN0IGZ1bGxUZXh0ID0gbGFiZWwgPyBgJHtsYWJlbH0gKCR7cGVyY2VudGFnZVRleHR9KWAgOiBwZXJjZW50YWdlVGV4dDtcbiAgICBjb25zdCBsYWJlbE9ubHkgPSBsYWJlbDtcbiAgICBjb25zdCBwZXJjZW50YWdlT25seSA9IHBlcmNlbnRhZ2VUZXh0O1xuXG4gICAgLy8gMS4gVHJ5IGZ1bGwgdGV4dCAobGFiZWwgKyBwZXJjZW50YWdlKVxuICAgIGlmICh0aGlzLmRvZXNUZXh0Rml0KGZ1bGxUZXh0LCBmb250U2l6ZSwgYXZhaWxhYmxlV2lkdGgpKSB7XG4gICAgICByZXR1cm4gZnVsbFRleHQ7XG4gICAgfVxuXG4gICAgLy8gMi4gVHJ5IGxhYmVsIG9ubHkgKGlmIGV4aXN0cylcbiAgICBpZiAobGFiZWwgJiYgdGhpcy5kb2VzVGV4dEZpdChsYWJlbE9ubHksIGZvbnRTaXplLCBhdmFpbGFibGVXaWR0aCkpIHtcbiAgICAgIHJldHVybiBsYWJlbE9ubHk7XG4gICAgfVxuXG4gICAgLy8gMy4gVHJ5IHBlcmNlbnRhZ2Ugb25seVxuICAgIGlmICh0aGlzLmRvZXNUZXh0Rml0KHBlcmNlbnRhZ2VPbmx5LCBmb250U2l6ZSwgYXZhaWxhYmxlV2lkdGgpKSB7XG4gICAgICByZXR1cm4gcGVyY2VudGFnZU9ubHk7XG4gICAgfVxuXG4gICAgLy8gNC4gVHJ1bmNhdGUgdGhlIGxhYmVsIHdpdGggZWxsaXBzaXNcbiAgICBpZiAobGFiZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnRydW5jYXRlVGV4dFRvRml0KGxhYmVsLCBmb250U2l6ZSwgYXZhaWxhYmxlV2lkdGgpO1xuICAgIH1cblxuICAgIC8vIDUuIExhc3QgcmVzb3J0OiB0cnVuY2F0ZSBwZXJjZW50YWdlICh2ZXJ5IHNtYWxsIHNlZ21lbnRzKVxuICAgIHJldHVybiB0aGlzLnRydW5jYXRlVGV4dFRvRml0KHBlcmNlbnRhZ2VUZXh0LCBmb250U2l6ZSwgYXZhaWxhYmxlV2lkdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0ZXh0IGZpdHMgd2l0aGluIGF2YWlsYWJsZSB3aWR0aCB1c2luZyBjb25zZXJ2YXRpdmUgZXN0aW1hdGlvblxuICAgKiBVc2VzIDAuNjVlbSBwZXIgY2hhcmFjdGVyIHRvIGFjY291bnQgZm9yIGZvbnQgdmFyaWF0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBkb2VzVGV4dEZpdCh0ZXh0OiBzdHJpbmcsIGZvbnRTaXplOiBudW1iZXIsIGF2YWlsYWJsZVdpZHRoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIXRleHQpIHJldHVybiBmYWxzZTtcbiAgICBcbiAgICAvLyBVc2UgY29uc2VydmF0aXZlIGNoYXJhY3RlciB3aWR0aCAoMC42NWVtIGZvciBzYWZldHkpXG4gICAgLy8gV2lkZXIgZm9udHMgbGlrZSBib2xkIHRleHQgbmVlZCBtb3JlIHNwYWNlXG4gICAgY29uc3QgZXN0aW1hdGVkV2lkdGggPSB0ZXh0Lmxlbmd0aCAqIGZvbnRTaXplICogMC42NTtcbiAgICByZXR1cm4gZXN0aW1hdGVkV2lkdGggPD0gYXZhaWxhYmxlV2lkdGg7XG4gIH1cblxuICAvKipcbiAgICogVHJ1bmNhdGVzIHRleHQgdG8gZml0IHdpdGhpbiBhdmFpbGFibGUgd2lkdGggd2l0aCBlbGxpcHNpc1xuICAgKiBVc2VzIGNvbnNlcnZhdGl2ZSBjaGFyYWN0ZXIgd2lkdGggdG8gcHJldmVudCBvdmVyZmxvd1xuICAgKiBBZGFwdHMgY2hhcmFjdGVyIHdpZHRoIGVzdGltYXRpb24gYmFzZWQgb24gZm9udCBzaXplXG4gICAqL1xuICBwcml2YXRlIHRydW5jYXRlVGV4dFRvRml0KHRleHQ6IHN0cmluZywgZm9udFNpemU6IG51bWJlciwgYXZhaWxhYmxlV2lkdGg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gJyc7XG4gICAgXG4gICAgLy8gQWRhcHRpdmUgY2hhcmFjdGVyIHdpZHRoOiBzbWFsbGVyIGZvbnRzIGFyZSByZWxhdGl2ZWx5IHdpZGVyXG4gICAgLy8gTGFyZ2VyIGZvbnRzOiB+MC42ZW0sIFNtYWxsZXIgZm9udHM6IH4wLjdlbVxuICAgIGNvbnN0IGNoYXJXaWR0aFJhdGlvID0gZm9udFNpemUgPD0gMTAgPyAwLjcgOiAwLjY1O1xuICAgIGNvbnN0IGNoYXJXaWR0aCA9IGZvbnRTaXplICogY2hhcldpZHRoUmF0aW87XG4gICAgXG4gICAgLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgZWxsaXBzaXNcbiAgICBjb25zdCBlbGxpcHNpc1dpZHRoID0gZm9udFNpemUgKiAwLjc7XG4gICAgY29uc3QgYXZhaWxhYmxlRm9yVGV4dCA9IGF2YWlsYWJsZVdpZHRoIC0gZWxsaXBzaXNXaWR0aDtcbiAgICBcbiAgICBpZiAoYXZhaWxhYmxlRm9yVGV4dCA8PSAwKSByZXR1cm4gJyc7XG4gICAgXG4gICAgY29uc3QgbWF4Q2hhcnMgPSBNYXRoLmZsb29yKGF2YWlsYWJsZUZvclRleHQgLyBjaGFyV2lkdGgpO1xuICAgIFxuICAgIGlmIChtYXhDaGFycyA8PSAwKSByZXR1cm4gJyc7XG4gICAgaWYgKHRleHQubGVuZ3RoIDw9IG1heENoYXJzKSByZXR1cm4gdGV4dDtcbiAgICBcbiAgICAvLyBFbnN1cmUgYXQgbGVhc3QgMSBjaGFyYWN0ZXIgYmVmb3JlIGVsbGlwc2lzXG4gICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIE1hdGgubWF4KDEsIG1heENoYXJzKSkgKyAn4oCmJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VnbWVudENvbG9yKGRhdGE6IEFYRG9udXRDaGFydERhdGEpOiBzdHJpbmcge1xuICAgIGlmIChkYXRhLmNvbG9yKSByZXR1cm4gZGF0YS5jb2xvcjtcblxuICAgIGNvbnN0IG9yaWdpbmFsRnVsbERhdGEgPSB1bnRyYWNrZWQoKCkgPT4gdGhpcy5jaGFydERhdGFBcnJheSgpKTtcbiAgICBjb25zdCBvcmlnaW5hbEluZGV4ID0gb3JpZ2luYWxGdWxsRGF0YS5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGRhdGEuaWQpO1xuICAgIFxuICAgIHJldHVybiB0aGlzLmdldENvbG9yKG9yaWdpbmFsSW5kZXggIT09IC0xID8gb3JpZ2luYWxJbmRleCA6IDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBob3ZlciBlZmZlY3RzIG9uIGEgc2VnbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVTbGljZUhvdmVyKGV2ZW50OiBNb3VzZUV2ZW50LCBkYXR1bTogQVhEb251dENoYXJ0RGF0YSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcoKSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dUb29sdGlwICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5zaG93VG9vbHRpcChldmVudCwgZGF0dW0pO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmhpZ2hsaWdodFNlZ21lbnQoZGF0dW0uaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93VG9vbHRpcChldmVudDogTW91c2VFdmVudCwgZGF0dW06IEFYRG9udXRDaGFydERhdGEpOiB2b2lkIHtcbiAgICBjb25zdCB0b3RhbCA9IHVudHJhY2tlZCgoKSA9PiB0aGlzLmRhdGEoKSkucmVkdWNlKChzdW0sIGl0ZW0pID0+IHN1bSArIGl0ZW0udmFsdWUsIDApO1xuICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSB0b3RhbCA+IDAgPyAoKGRhdHVtLnZhbHVlIC8gdG90YWwpICogMTAwKS50b0ZpeGVkKDEpIDogJzAnO1xuICAgIGNvbnN0IGNvbG9yID0gdGhpcy5nZXRTZWdtZW50Q29sb3IoZGF0dW0pO1xuXG4gICAgdGhpcy5fdG9vbHRpcERhdGEuc2V0KHtcbiAgICAgIHRpdGxlOiBkYXR1bS50b29sdGlwTGFiZWwgfHwgZGF0dW0ubGFiZWwsXG4gICAgICB2YWx1ZTogZGF0dW0udmFsdWUudG9TdHJpbmcoKSxcbiAgICAgIHBlcmNlbnRhZ2U6IGAke3BlcmNlbnRhZ2V9JWAsXG4gICAgICBjb2xvcixcbiAgICB9KTtcblxuICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBtb3VzZSBsZWF2ZSBmcm9tIHNlZ21lbnRzXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVNlZ21lbnRMZWF2ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faXNJbml0aWFsQW5pbWF0aW5nKCkpIHJldHVybjtcblxuICAgIC8vIEhpZGUgdG9vbHRpcFxuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldChmYWxzZSk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgLy8gQ2xlYXIgYWxsIGhpZ2hsaWdodHMgdG8gZW5zdXJlIHNlZ21lbnRzIHJldHVybiB0byBub3JtYWwgc3RhdGVcbiAgICB0aGlzLmhpZ2hsaWdodFNlZ21lbnQobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0b29sdGlwIHBvc2l0aW9uXG4gICAqIEVuc3VyZXMgdGhlIHRvb2x0aXAgaXMgdmlzaWJsZSBieSBhZGp1c3RpbmcgcG9zaXRpb24gd2hlbiBuZWFyIGVkZ2VzXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lckVsID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFjb250YWluZXJFbCkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSBjb250YWluZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB0b29sdGlwRWwgPSBjb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCcuY2hhcnQtdG9vbHRpcCcpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBjb25zdCB0b29sdGlwUmVjdCA9IHRvb2x0aXBFbCA/IHRvb2x0aXBFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IG51bGw7XG4gICAgY29uc3QgcG9zID0gY29tcHV0ZVRvb2x0aXBQb3NpdGlvbihjb250YWluZXJSZWN0LCB0b29sdGlwUmVjdCwgZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgdGhpcy5UT09MVElQX0dBUCk7XG4gICAgdGhpcy5fdG9vbHRpcFBvc2l0aW9uLnNldChwb3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgY2VudGVyIGRpc3BsYXkgd2l0aCB0b3RhbCB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBhZGRDZW50ZXJEaXNwbGF5KHRvdGFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICBjb25zdCBjaGFydENvbnRhaW5lcldpZHRoID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAvLyBJbXByb3ZlZCBmb250IHNjYWxpbmc6IGJldHRlciBtaW5pbXVtIGZvciBzbWFsbCBzaXplcywgYmV0dGVyIHJhdGlvIGZvciBzY2FsaW5nXG4gICAgY29uc3QgYmFzZUZvbnRTaXplID0gTWF0aC5tYXgoMS44LCBNYXRoLm1pbigzLjIsIGNoYXJ0Q29udGFpbmVyV2lkdGggLyAxNTApKTtcbiAgICBjb25zdCBzdWJUZXh0Rm9udFNpemUgPSBiYXNlRm9udFNpemUgKiAwLjU7XG5cbiAgICAvLyBDcmVhdGUgZ3JvdXAgZm9yIHRoZSB0b3RhbCBkaXNwbGF5XG4gICAgY29uc3QgdG90YWxEaXNwbGF5ID0gdGhpcy5zdmdcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWRvbnV0LWNoYXJ0LXRvdGFsLWRpc3BsYXknKVxuICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpO1xuXG4gICAgLy8gQWRkIHRvdGFsIHZhbHVlXG4gICAgdG90YWxEaXNwbGF5XG4gICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1kb251dC1jaGFydC10b3RhbC12YWx1ZScpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGAke2Jhc2VGb250U2l6ZX1yZW1gKVxuICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc2MDAnKVxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWRvbnV0LWNoYXJ0LXZhbHVlLWNvbG9yKSknKVxuICAgICAgLnRleHQodG90YWwudG9Mb2NhbGVTdHJpbmcoKSk7XG5cbiAgICAvLyBBZGQgbGFiZWxcbiAgICB0b3RhbERpc3BsYXlcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWRvbnV0LWNoYXJ0LXRvdGFsLWxhYmVsJylcbiAgICAgIC5hdHRyKCdkeScsICcxLjRlbScpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGAke3N1YlRleHRGb250U2l6ZX1yZW1gKVxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWRvbnV0LWNoYXJ0LXZhbHVlLWNvbG9yKSknKVxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgJzAuOCcpXG4gICAgICAudGV4dCh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS50b3RhbExhYmVsIHx8ICdUb3RhbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgY2hhcnQgcmVuZGVyaW5nIGVycm9yc1xuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVDaGFydEVycm9yKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIHRoaXMuc2hvd05vRGF0YU1lc3NhZ2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW5zIHVwIGNoYXJ0IHJlc291cmNlc1xuICAgKi9cbiAgcHVibGljIGNsZWFudXBDaGFydCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICB0aGlzLmQzLnNlbGVjdCh0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkuc2VsZWN0QWxsKCdzdmcnKS5yZW1vdmUoKTtcbiAgICB0aGlzLnN2ZyA9IG51bGw7XG4gICAgdGhpcy5waWVEYXRhID0gW107XG4gICAgdGhpcy5oaWRkZW5TZWdtZW50cy5jbGVhcigpO1xuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldChmYWxzZSk7XG4gICAgdGhpcy5fY3VycmVudGx5SGlnaGxpZ2h0ZWRTZWdtZW50LnNldChudWxsKTtcbiAgfVxuXG4gIC8vID09PT09IEhlbHBlciB1dGlsaXRpZXMgZm9yIG1vZHVsYXJpdHkgYW5kIG1haW50YWluYWJpbGl0eSA9PT09PVxuXG4gIHByaXZhdGUgcmVuZGVyTWVzc2FnZShcbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgIGljb25DbGFzczogc3RyaW5nLFxuICAgIG1lc3NhZ2VUZXh0OiBzdHJpbmcsXG4gICAgaGVscFRleHQ6IHN0cmluZyxcbiAgICBzcGVjaWZpY0NsYXNzOiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIC8vIENsZWFyIGNvbnRhaW5lciBhcmVhIGZpcnN0IChwcmVzZXJ2ZSB0b29sdGlwIGNvbXBvbmVudClcbiAgICB0aGlzLmQzLnNlbGVjdChjb250YWluZXIpLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtbWVzc2FnZS1jb250YWluZXIsIC5heC1kb251dC1jaGFydC1uby1kYXRhLW1lc3NhZ2UnKS5yZW1vdmUoKTtcblxuICAgIGNvbnN0IG1lc3NhZ2VDb250YWluZXIgPSB0aGlzLmQzXG4gICAgICAuc2VsZWN0KGNvbnRhaW5lcilcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAuYXR0cignY2xhc3MnLCBgYXgtY2hhcnQtbWVzc2FnZS1jb250YWluZXIgYXgtZG9udXQtY2hhcnQtbWVzc2FnZS1iYWNrZ3JvdW5kICR7c3BlY2lmaWNDbGFzc31gKTtcblxuICAgIG1lc3NhZ2VDb250YWluZXJcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtY2hhcnQtbWVzc2FnZS1pY29uIGF4LWRvbnV0LWNoYXJ0LW5vLWRhdGEtaWNvbicpXG4gICAgICAuaHRtbChgPGkgY2xhc3M9XCIke2ljb25DbGFzc30gZmEtMnhcIj48L2k+YCk7XG5cbiAgICBtZXNzYWdlQ29udGFpbmVyLmFwcGVuZCgnZGl2JykuYXR0cignY2xhc3MnLCAnYXgtY2hhcnQtbWVzc2FnZS10ZXh0IGF4LWRvbnV0LWNoYXJ0LW5vLWRhdGEtdGV4dCcpLnRleHQobWVzc2FnZVRleHQpO1xuXG4gICAgbWVzc2FnZUNvbnRhaW5lci5hcHBlbmQoJ2RpdicpLmF0dHIoJ2NsYXNzJywgJ2F4LWNoYXJ0LW1lc3NhZ2UtaGVscCBheC1kb251dC1jaGFydC1uby1kYXRhLWhlbHAnKS50ZXh0KGhlbHBUZXh0KTtcbiAgfVxuXG4gIC8vIGNvbXB1dGVUb29sdGlwUG9zaXRpb24gbW92ZWQgdG8gc2hhcmVkIGNoYXJ0IHV0aWxzXG5cbiAgLyoqXG4gICAqIEdldHMgYW4gYWNjZXNzaWJpbGl0eSBsYWJlbCBkZXNjcmliaW5nIHRoZSBkb251dCBjaGFydCBmb3Igc2NyZWVuIHJlYWRlcnNcbiAgICogQHJldHVybnMgRGVzY3JpcHRpdmUgc3RyaW5nIGZvciBzY3JlZW4gcmVhZGVyc1xuICAgKi9cbiAgcHJvdGVjdGVkIGdldEFjY2Vzc2liaWxpdHlMYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNoYXJ0RGF0YUFycmF5KCk7XG5cbiAgICBpZiAoIWRhdGEgfHwgZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnRW1wdHkgZG9udXQgY2hhcnQuIE5vIGRhdGEgYXZhaWxhYmxlLic7XG4gICAgfVxuXG4gICAgY29uc3QgdG90YWwgPSBkYXRhLnJlZHVjZSgoc3VtLCBpdGVtKSA9PiBzdW0gKyBpdGVtLnZhbHVlLCAwKTtcbiAgICBjb25zdCBzZWdtZW50RGVzY3JpcHRpb25zID0gZGF0YVxuICAgICAgLm1hcCgoc2VnbWVudCkgPT4ge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gdG90YWwgPiAwID8gKChzZWdtZW50LnZhbHVlIC8gdG90YWwpICogMTAwKS50b0ZpeGVkKDEpIDogJzAnO1xuICAgICAgICByZXR1cm4gYCR7c2VnbWVudC5sYWJlbH06ICR7c2VnbWVudC52YWx1ZX0gKCR7cGVyY2VudGFnZX0lKWA7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJzsgJyk7XG5cbiAgICByZXR1cm4gYERvbnV0IGNoYXJ0IHdpdGggJHtkYXRhLmxlbmd0aH0gc2VnbWVudHMuIFRvdGFsIHZhbHVlOiAke3RvdGFsfS4gJHtzZWdtZW50RGVzY3JpcHRpb25zfWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGF0YSBpdGVtcyBmb3IgdGhlIGxlZ2VuZFxuICAgKiBAaW1wbGVtZW50cyBBWENoYXJ0TGVnZW5kQ29tcGF0aWJsZVxuICAgKi9cbiAgZ2V0TGVnZW5kSXRlbXMoKTogQVhDaGFydExlZ2VuZEl0ZW1bXSB7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLmRhdGEoKS5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4gc3VtICsgaXRlbS52YWx1ZSwgMCk7XG4gICAgXG4gICAgcmV0dXJuIHRoaXMuY2hhcnREYXRhQXJyYXkoKS5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoe1xuICAgICAgaWQ6IGl0ZW0uaWQsXG4gICAgICBuYW1lOiBpdGVtLmxhYmVsIHx8IGBTZWdtZW50ICR7aW5kZXggKyAxfWAsXG4gICAgICB2YWx1ZTogaXRlbS52YWx1ZSxcbiAgICAgIGNvbG9yOiB0aGlzLmdldFNlZ21lbnRDb2xvcihpdGVtKSxcbiAgICAgIHBlcmNlbnRhZ2U6IHRvdGFsID4gMCA/IChpdGVtLnZhbHVlIC8gdG90YWwpICogMTAwIDogMCxcbiAgICAgIGhpZGRlbjogdGhpcy5pc1NlZ21lbnRIaWRkZW4oaXRlbS5pZCksXG4gICAgfSkpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYXgtZG9udXQtY2hhcnRcIiAjY2hhcnRDb250YWluZXIgcm9sZT1cImltZ1wiIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0QWNjZXNzaWJpbGl0eUxhYmVsKClcIj5cbiAgPCEtLSBUb29sdGlwIGNvbXBvbmVudCAtLT5cbiAgPGF4LWNoYXJ0LXRvb2x0aXBcbiAgICBbdmlzaWJsZV09XCJ0b29sdGlwVmlzaWJsZSgpXCJcbiAgICBbcG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uKClcIlxuICAgIFtkYXRhXT1cInRvb2x0aXBEYXRhKClcIlxuICAgIFtzaG93UGVyY2VudGFnZV09XCJ0cnVlXCJcbiAgPjwvYXgtY2hhcnQtdG9vbHRpcD5cbjwvZGl2PlxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1kb251dC1jaGFydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9kb251dC1jaGFydC9zcmMvYWNvcmV4LWNoYXJ0cy1kb251dC1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
|