@acorex/charts 21.0.0-next.4 → 21.0.0-next.40

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.
@@ -1 +1 @@
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 { AX_GLOBAL_CONFIG } from '@acorex/core/config';\nimport { InjectionToken, inject } from '@angular/core';\nimport { set } from 'lodash-es';\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: () => {\n const global = inject(AX_GLOBAL_CONFIG);\n set(global, 'chart.donutChart', AXDonutChartDefaultConfig);\n return AXDonutChartDefaultConfig;\n },\n});\nexport function donutChartConfig(config = {}) {\n const result = {\n ...AXDonutChartDefaultConfig,\n ...config,\n };\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9udXQtY2hhcnQuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2RvbnV0LWNoYXJ0L3NyYy9saWIvZG9udXQtY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHaEMsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQXVCO0lBQzNELFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGNBQWMsRUFBRSxJQUFJO0lBQ3BCLFVBQVUsRUFBRSxFQUFFO0lBQ2QsWUFBWSxFQUFFLENBQUM7SUFDZixpQkFBaUIsRUFBRSxHQUFHO0lBQ3RCLGVBQWUsRUFBRSxXQUFXO0lBQzVCLFFBQVEsRUFBRTtRQUNSLE1BQU0sRUFBRSxtQkFBbUI7UUFDM0IsVUFBVSxFQUFFLDBDQUEwQztRQUN0RCxTQUFTLEVBQUUseUJBQXlCO1FBQ3BDLGFBQWEsRUFBRSxrREFBa0Q7UUFDakUsVUFBVSxFQUFFLHVCQUF1QjtRQUNuQyxhQUFhLEVBQUUsdUJBQXVCO0tBQ3ZDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLElBQUksY0FBYyxDQUFxQix1QkFBdUIsRUFBRTtJQUNuRyxVQUFVLEVBQUUsTUFBTTtJQUNsQixPQUFPLEVBQUUsR0FBRyxFQUFFO1FBQ1osTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDeEMsR0FBRyxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1FBQzNELE9BQU8seUJBQXlCLENBQUM7SUFDbkMsQ0FBQztDQUNGLENBQUMsQ0FBQztBQUlILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxTQUFrQyxFQUFFO0lBQ25FLE1BQU0sTUFBTSxHQUFHO1FBQ2IsR0FBRyx5QkFBeUI7UUFDNUIsR0FBRyxNQUFNO0tBQ1YsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWF9HTE9CQUxfQ09ORklHIH0gZnJvbSAnQGFjb3JleC9jb3JlL2NvbmZpZyc7XG5pbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQVhEb251dENoYXJ0T3B0aW9uIH0gZnJvbSAnLi9kb251dC1jaGFydC50eXBlJztcblxuZXhwb3J0IGNvbnN0IEFYRG9udXRDaGFydERlZmF1bHRDb25maWc6IEFYRG9udXRDaGFydE9wdGlvbiA9IHtcbiAgc2hvd1Rvb2x0aXA6IHRydWUsXG4gIHNob3dEYXRhTGFiZWxzOiB0cnVlLFxuICBkb251dFdpZHRoOiAzNSxcbiAgY29ybmVyUmFkaXVzOiA0LFxuICBhbmltYXRpb25EdXJhdGlvbjogODAwLFxuICBhbmltYXRpb25FYXNpbmc6ICdjdWJpYy1vdXQnLFxuICBtZXNzYWdlczoge1xuICAgIG5vRGF0YTogJ05vIGRhdGEgYXZhaWxhYmxlJyxcbiAgICBub0RhdGFIZWxwOiAnUGxlYXNlIHByb3ZpZGUgZGF0YSB0byBkaXNwbGF5IHRoZSBjaGFydCcsXG4gICAgYWxsSGlkZGVuOiAnQWxsIHNlZ21lbnRzIGFyZSBoaWRkZW4nLFxuICAgIGFsbEhpZGRlbkhlbHA6ICdQbGVhc2UgdG9nZ2xlIHZpc2liaWxpdHkgb2YgYXQgbGVhc3Qgb25lIHNlZ21lbnQnLFxuICAgIG5vRGF0YUljb246ICdmYS1saWdodCBmYS1jaGFydC1waWUnLFxuICAgIGFsbEhpZGRlbkljb246ICdmYS1saWdodCBmYS1leWUtc2xhc2gnLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEFYX0RPTlVUX0NIQVJUX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxBWERvbnV0Q2hhcnRPcHRpb24+KCdBWF9ET05VVF9DSEFSVF9DT05GSUcnLCB7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgZmFjdG9yeTogKCkgPT4ge1xuICAgIGNvbnN0IGdsb2JhbCA9IGluamVjdChBWF9HTE9CQUxfQ09ORklHKTtcbiAgICBzZXQoZ2xvYmFsLCAnY2hhcnQuZG9udXRDaGFydCcsIEFYRG9udXRDaGFydERlZmF1bHRDb25maWcpO1xuICAgIHJldHVybiBBWERvbnV0Q2hhcnREZWZhdWx0Q29uZmlnO1xuICB9LFxufSk7XG5cbmV4cG9ydCB0eXBlIFBhcnRpYWxEb251dENoYXJ0Q29uZmlnID0gUGFydGlhbDxBWERvbnV0Q2hhcnRPcHRpb24+O1xuXG5leHBvcnQgZnVuY3Rpb24gZG9udXRDaGFydENvbmZpZyhjb25maWc6IFBhcnRpYWxEb251dENoYXJ0Q29uZmlnID0ge30pOiBBWERvbnV0Q2hhcnRPcHRpb24ge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgLi4uQVhEb251dENoYXJ0RGVmYXVsdENvbmZpZyxcbiAgICAuLi5jb25maWcsXG4gIH07XG4gIHJldHVybiByZXN1bHQ7XG59XG4iXX0=","import { AX_CHART_COLOR_PALETTE, computeTooltipPosition, getChartColor, getEasingFunction, } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, ViewEncapsulation, afterNextRender, computed, effect, inject, input, output, signal, untracked, viewChild, } 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 {\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\n svg;\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 // Tooltip positioning gap in pixels\n TOOLTIP_GAP = 10;\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 // 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 #eff = effect(() => {\n // Access inputs to track them\n this.data();\n // Track options changes to trigger re-render on updates\n this.effectiveOptions();\n // Only update if already rendered\n untracked(() => {\n if (this._rendered()) {\n this.updateChart();\n }\n });\n }, ...(ngDevMode ? [{ debugName: \"#eff\" }] : []));\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())\n return;\n if (!this.svg)\n return;\n const currentlyHighlighted = this._currentlyHighlightedSegment();\n // If the same segment is already highlighted, do nothing\n if (currentlyHighlighted === id) {\n return;\n }\n // Update the currently highlighted segment state\n this._currentlyHighlightedSegment.set(id);\n const transitionDuration = 150;\n // Helper to get full data for the segment ID\n const getSegmentDataById = (segmentId) => {\n return untracked(() => this.chartDataArray()).find((d) => d.id === segmentId) || null;\n };\n // Always interrupt any ongoing transitions first\n this.svg.selectAll('path').interrupt();\n if (id === null) {\n // Clear all highlights\n this.svg\n .selectAll('path')\n .classed('ax-donut-chart-highlighted', false)\n .classed('ax-donut-chart-dimmed', false)\n .transition()\n .duration(transitionDuration)\n .attr('transform', null)\n .style('filter', null)\n .style('opacity', 1);\n this.segmentHover.emit(null);\n return;\n }\n const targetSegment = this.svg.selectAll('path').filter((d) => d?.data?.id === id);\n if (targetSegment.empty()) {\n // Target not found, clear highlights\n this._currentlyHighlightedSegment.set(null);\n this.highlightSegment(null);\n return;\n }\n // Dim all segments that are NOT the target\n this.svg\n .selectAll('path')\n .filter((d) => d?.data?.id !== id)\n .classed('ax-donut-chart-highlighted', false)\n .classed('ax-donut-chart-dimmed', true)\n .transition()\n .duration(transitionDuration)\n .attr('transform', null)\n .style('filter', null)\n .style('opacity', 0.5);\n // Highlight the target segment\n targetSegment\n .classed('ax-donut-chart-dimmed', false)\n .classed('ax-donut-chart-highlighted', true)\n .transition()\n .duration(transitionDuration)\n .style('filter', 'url(#ax-donut-chart-segment-shadow)')\n .style('opacity', 1);\n this.segmentHover.emit(getSegmentDataById(id));\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 wasAllHidden = this.chartDataArray().length > 0 && this.chartDataArray().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.toggleSegmentVisibility(item.id);\n this.segmentClick.emit(item);\n }\n /**\n * Creates the donut chart\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 // Filter out hidden segments\n const visibleData = data.filter((item) => !this.hiddenSegments.has(item.id));\n // If all segments are hidden, show message\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 // Get container dimensions or use defaults\n const containerWidth = container.clientWidth || 400;\n const containerHeight = container.clientHeight || 400;\n // Ensure minimum dimensions for the chart\n const minDim = 200;\n const width = Math.max(options?.width || containerWidth, minDim);\n const height = Math.max(options?.height || containerHeight, minDim);\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 */\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 .attr('fill', (d /* d is PieArcDatum<AXDonutChartData> */) => {\n const chartItem = d.data; // AXDonutChartData from visibleData\n if (chartItem.color) {\n // Prioritize explicit color on the item\n return chartItem.color;\n }\n // Fallback: find original index for consistent palette color\n const originalFullData = untracked(() => this.chartDataArray());\n const originalIndex = originalFullData.findIndex((item) => item.id === chartItem.id);\n return this.getColor(originalIndex !== -1 ? originalIndex : 0); // Ensure valid index\n })\n .style('opacity', 0)\n .style('cursor', 'pointer') // Add cursor pointer to segments\n .on('mouseenter', (event, d) => {\n if (!this.effectiveOptions().showTooltip)\n return;\n this.handleSliceHover(event, d.data);\n })\n .on('mouseleave', () => {\n this.handleSegmentLeave();\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\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 .delay((d, i) => i * 50)\n .style('opacity', 1)\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) {\n const minChartDimension = Math.min(chartWidth, chartHeight);\n const isTooSmallChartForLabels = minChartDimension < 260; // Hide labels entirely on small charts\n if (!isTooSmallChartForLabels) {\n // Calculate optimal font size based on segment size and chart dimensions\n const calculateFontSize = (d) => {\n const angleSize = d.endAngle - d.startAngle; // radians\n const segmentPercentage = (d.data.value / total) * 100;\n // Drop labels for very small segments\n if (segmentPercentage < 2)\n return 0;\n // Minimum readable font size; avoid tiny unreadable text\n const minReadable = segmentPercentage < 8 ? 0 : 9;\n // Base size scaled by arc angle and radius, capped\n const scaled = (angleSize * radius) / 9;\n return Math.min(Math.max(minReadable, scaled), 13);\n };\n const 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 const labelRadius = innerRadius + (radius * 0.95 - innerRadius) / 2;\n const approximateTextWidth = (text, fontSize) => {\n // Approximate width: 0.55em per char\n return text.length * fontSize * 0.55;\n };\n const arcLength = (d) => (d.endAngle - d.startAngle) * labelRadius;\n const buildLabelText = (d) => {\n const percentage = (d.data.value / total) * 100;\n if (percentage < 1)\n return '';\n const label = d.data.label || '';\n const percentageText = formatPercentage(percentage);\n return label ? `${label} (${percentageText})` : percentageText;\n };\n const dataThatFits = this.pieData.filter((d) => {\n const fontSize = calculateFontSize(d);\n if (!fontSize)\n return false;\n const text = buildLabelText(d);\n if (!text)\n return false;\n const available = arcLength(d);\n const needed = approximateTextWidth(text, fontSize) + 6; // small padding\n return needed <= available;\n });\n const labels = this.svg\n .selectAll('.ax-donut-chart-data-label')\n .data(dataThatFits)\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) => `${calculateFontSize(d)}px`)\n .style('font-weight', (d) => ((d.data.value / total) * 100 >= 15 ? '600' : '500'))\n .text((d) => buildLabelText(d));\n labels\n .transition()\n .duration(animationDuration)\n .delay((d, i) => i * 50 + 200)\n .style('opacity', 1);\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 * Gets the appropriate D3 easing function based on the option string\n */\n // getEasingFunction moved to shared chart utils\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 const index = this.data().findIndex((item) => item.id === datum.id);\n const color = datum.color || getChartColor(index, this.chartColors);\n // Calculate percentage of total\n // Ensure data() is accessed within a tracking context if it's a signal, or use untracked if appropriate\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 this._tooltipData.set({\n title: datum.tooltipLabel || datum.label,\n value: datum.value.toString(),\n percentage: `${percentage}%`,\n color: color,\n });\n this.updateTooltipPosition(event);\n this._tooltipVisible.set(true);\n }\n this.highlightSegment(datum.id); // This will now also handle emitting segmentHover\n // No direct segmentHover.emit(datum) here anymore\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 // Calculate appropriate font sizes based on chart dimensions\n const chartContainerWidth = this.chartContainerEl().nativeElement.clientWidth;\n const baseFontSize = Math.max(1.4, Math.min(2.4, chartContainerWidth / 200)); // Scale between 1.4rem and 2.4rem\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 this.d3.select(this.chartContainerEl()?.nativeElement).selectAll('svg').remove();\n this.svg = null;\n this.pieData = [];\n }\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 */\n getAccessibilityLabel() {\n const data = this.chartDataArray();\n if (!data || data.length === 0) {\n return 'Empty donut chart. No data available.';\n }\n // Calculate total\n const total = data.reduce((sum, item) => sum + item.value, 0);\n // Generate a description of the chart with percentages\n const segmentDescriptions = data\n .map((segment) => {\n const percentage = ((segment.value / total) * 100).toFixed(1);\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 return this.chartDataArray().map((item, index) => {\n return {\n id: item.id,\n name: item.label || `Segment ${index + 1}`,\n value: item.value,\n color: item.color || this.getColor(index),\n percentage: (item.value / this.data().reduce((sum, item) => sum + item.value, 0)) * 100,\n hidden: this.isSegmentHidden(item.id),\n };\n });\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXDonutChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.3.3\", 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 }], 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;overflow:hidden;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.3\", 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;overflow:hidden;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: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9udXQtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2RvbnV0LWNoYXJ0L3NyYy9saWIvZG9udXQtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2RvbnV0LWNoYXJ0L3NyYy9saWIvZG9udXQtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsYUFBYSxFQUNiLGlCQUFpQixHQUNsQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSx1QkFBdUIsRUFBc0IsTUFBTSw4QkFBOEIsQ0FBQztBQUUzRixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBR1QsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDOztBQUc3RDs7O0dBR0c7QUFTSCxNQUFNLE9BQU8scUJBQXFCO0lBQ2hDLHVCQUF1QjtJQUNmLEdBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUV4QyxTQUFTO0lBQ1QsdUJBQXVCO0lBQ3ZCLElBQUksR0FBRyxLQUFLLENBQW9CLEVBQUUsZ0RBQUMsQ0FBQztJQUVwQywwQkFBMEI7SUFDMUIsT0FBTyxHQUFHLEtBQUssQ0FBcUIsRUFBRSxtREFBQyxDQUFDO0lBRXhDLFVBQVU7SUFDVix3Q0FBd0M7SUFDeEMsWUFBWSxHQUFHLE1BQU0sRUFBb0IsQ0FBQztJQUUxQzs7T0FFRztJQUNILFlBQVksR0FBRyxN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QkFBaUIsQ0FBQyxJQUFJLFdBQzVCLENBQUMsdUJBQXVCLENBQUMsbUJBQ2pCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBWENoYXJ0Q29tcG9uZW50QmFzZSxcbiAgQVhfQ0hBUlRfQ09MT1JfUEFMRVRURSxcbiAgY29tcHV0ZVRvb2x0aXBQb3NpdGlvbixcbiAgZ2V0Q2hhcnRDb2xvcixcbiAgZ2V0RWFzaW5nRnVuY3Rpb24sXG59IGZyb20gJ0BhY29yZXgvY2hhcnRzJztcbmltcG9ydCB7IEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlLCBBWENoYXJ0TGVnZW5kSXRlbSB9IGZyb20gJ0BhY29yZXgvY2hhcnRzL2NoYXJ0LWxlZ2VuZCc7XG5pbXBvcnQgeyBBWENoYXJ0VG9vbHRpcENvbXBvbmVudCwgQVhDaGFydFRvb2x0aXBEYXRhIH0gZnJvbSAnQGFjb3JleC9jaGFydHMvY2hhcnQtdG9vbHRpcCc7XG5cbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBPbkRlc3Ryb3ksXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBhZnRlck5leHRSZW5kZXIsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxuICB1bnRyYWNrZWQsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBWF9ET05VVF9DSEFSVF9DT05GSUcgfSBmcm9tICcuL2RvbnV0LWNoYXJ0LmNvbmZpZyc7XG5pbXBvcnQgeyBBWERvbnV0Q2hhcnREYXRhLCBBWERvbnV0Q2hhcnRPcHRpb24sIEFYRG9udXRDaGFydFZhbHVlIH0gZnJvbSAnLi9kb251dC1jaGFydC50eXBlJztcblxuLyoqXG4gKiBEb251dCBDaGFydCBDb21wb25lbnRcbiAqIERpc3BsYXlzIGRhdGEgaW4gYSBjaXJjdWxhciBkb251dCBjaGFydCB3aXRoIGludGVyYWN0aXZlIHNlZ21lbnRzXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2F4LWRvbnV0LWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RvbnV0LWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZG9udXQtY2hhcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW0FYQ2hhcnRUb29sdGlwQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFYRG9udXRDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQVhDaGFydExlZ2VuZENvbXBhdGlibGUsIEFYQ2hhcnRDb21wb25lbnRCYXNlIHtcbiAgLy8gRGVwZW5kZW5jeSBJbmplY3Rpb25cbiAgcHJpdmF0ZSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIC8vIElucHV0c1xuICAvKiogQ2hhcnQgZGF0YSBpbnB1dCAqL1xuICBkYXRhID0gaW5wdXQ8QVhEb251dENoYXJ0VmFsdWU+KFtdKTtcblxuICAvKiogQ2hhcnQgb3B0aW9ucyBpbnB1dCAqL1xuICBvcHRpb25zID0gaW5wdXQ8QVhEb251dENoYXJ0T3B0aW9uPih7fSk7XG5cbiAgLy8gT3V0cHV0c1xuICAvKiogRW1pdHRlZCB3aGVuIGEgc2VnbWVudCBpcyBjbGlja2VkICovXG4gIHNlZ21lbnRDbGljayA9IG91dHB1dDxBWERvbnV0Q2hhcnREYXRhPigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBzZWdtZW50IGhhcyBtb3VzZSBob3ZlclxuICAgKiBDYW4gYmUgdXNlZCBieSBleHRlcm5hbCBlbGVtZW50cyB0byBoaWdobGlnaHQgdGhpcyBzZWdtZW50XG4gICAqL1xuICBzZWdtZW50SG92ZXIgPSBvdXRwdXQ8QVhEb251dENoYXJ0RGF0YSB8IG51bGw+KCk7XG5cbiAgLy8gQ2hhcnQgY29udGFpbmVyIHJlZmVyZW5jZVxuICBwcml2YXRlIHJlYWRvbmx5IGNoYXJ0Q29udGFpbmVyRWwgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjaGFydENvbnRhaW5lcicpO1xuXG4gIC8vIEQzIHJlZmVyZW5jZSAtIGxvYWRlZCBhc3luY2hyb25vdXNseVxuICBwcm90ZWN0ZWQgZDMhOiB0eXBlb2YgaW1wb3J0KCdkMycpO1xuXG4gIC8vIENoYXJ0IFNWRyByZWZlcmVuY2VcbiAgcHJpdmF0ZSBzdmchOiBhbnk7XG4gIHByaXZhdGUgcGllRGF0YTogYW55W10gPSBbXTtcblxuICAvLyBTdGF0ZSBtYW5hZ2VtZW50XG4gIHByaXZhdGUgaGlkZGVuU2VnbWVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9yZW5kZXJlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX2lzSW5pdGlhbEFuaW1hdGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX2N1cnJlbnRseUhpZ2hsaWdodGVkU2VnbWVudCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvLyBUb29sdGlwIHN0YXRlXG4gIHByaXZhdGUgX3Rvb2x0aXBWaXNpYmxlID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfdG9vbHRpcFBvc2l0aW9uID0gc2lnbmFsKHsgeDogMCwgeTogMCB9KTtcbiAgcHJpdmF0ZSBfdG9vbHRpcERhdGEgPSBzaWduYWw8QVhDaGFydFRvb2x0aXBEYXRhPih7XG4gICAgdGl0bGU6ICcnLFxuICAgIHZhbHVlOiAwLFxuICAgIHBlcmNlbnRhZ2U6ICcwJScsXG4gICAgY29sb3I6ICcnLFxuICB9KTtcblxuICAvLyBQdWJsaWMgY29tcHV0ZWQgcHJvcGVydGllcyBmb3IgdGhlIHRlbXBsYXRlXG4gIHByb3RlY3RlZCB0b29sdGlwVmlzaWJsZSA9IHRoaXMuX3Rvb2x0aXBWaXNpYmxlLmFzUmVhZG9ubHkoKTtcbiAgcHJvdGVjdGVkIHRvb2x0aXBQb3NpdGlvbiA9IHRoaXMuX3Rvb2x0aXBQb3NpdGlvbi5hc1JlYWRvbmx5KCk7XG4gIHByb3RlY3RlZCB0b29sdGlwRGF0YSA9IHRoaXMuX3Rvb2x0aXBEYXRhLmFzUmVhZG9ubHkoKTtcblxuICAvLyBJbmplY3QgY29uZmlndXJhdGlvblxuICBwcml2YXRlIGNvbmZpZ1Rva2VuID0gaW5qZWN0KEFYX0RPTlVUX0NIQVJUX0NPTkZJRyk7XG5cbiAgLy8gSW5qZWN0IHRoZSBjaGFydCBjb2xvcnNcbiAgcHJpdmF0ZSBjaGFydENvbG9ycyA9IGluamVjdChBWF9DSEFSVF9DT0xPUl9QQUxFVFRFKTtcblxuICAvLyBDb21wdXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgcHJvdGVjdGVkIGVmZmVjdGl2ZU9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uZmlnVG9rZW4sXG4gICAgICAuLi50aGlzLm9wdGlvbnMoKSxcbiAgICB9O1xuICB9KTtcblxuICAvLyBUb29sdGlwIHBvc2l0aW9uaW5nIGdhcCBpbiBwaXhlbHNcbiAgcHJpdmF0ZSByZWFkb25seSBUT09MVElQX0dBUCA9IDEwO1xuXG4gIC8vIE1lc3NhZ2VzIHdpdGggZGVmYXVsdHNcbiAgcHJvdGVjdGVkIGVmZmVjdGl2ZU1lc3NhZ2VzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHRNZXNzYWdlcyA9IHtcbiAgICAgIG5vRGF0YTogJ05vIGRhdGEgYXZhaWxhYmxlJyxcbiAgICAgIG5vRGF0YUhlbHA6ICdQbGVhc2UgcHJvdmlkZSBkYXRhIHRvIGRpc3BsYXkgdGhlIGNoYXJ0JyxcbiAgICAgIGFsbEhpZGRlbjogJ0FsbCBzZWdtZW50cyBhcmUgaGlkZGVuJyxcbiAgICAgIGFsbEhpZGRlbkhlbHA6ICdQbGVhc2UgdG9nZ2xlIHZpc2liaWxpdHkgb2YgYXQgbGVhc3Qgb25lIHNlZ21lbnQnLFxuICAgICAgbm9EYXRhSWNvbjogJ2ZhLWxpZ2h0IGZhLWNoYXJ0LXBpZScsXG4gICAgICBhbGxIaWRkZW5JY29uOiAnZmEtbGlnaHQgZmEtZXllLXNsYXNoJyxcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWZhdWx0TWVzc2FnZXMsXG4gICAgICAuLi50aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5tZXNzYWdlcyxcbiAgICB9O1xuICB9KTtcblxuICAvLyBEYXRhIGFjY2Vzc29yIGZvciBoYW5kbGluZyBkaWZmZXJlbnQgaW5jb21pbmcgZGF0YSBmb3JtYXRzXG4gIHByb3RlY3RlZCBjaGFydERhdGFBcnJheSA9IGNvbXB1dGVkKCgpOiBBWERvbnV0Q2hhcnREYXRhW10gPT4ge1xuICAgIHJldHVybiB0aGlzLmRhdGEoKSB8fCBbXTtcbiAgfSk7XG5cbiAgLy8gQ29sb3IgYWNjZXNzb3IgbWV0aG9kXG4gIHByb3RlY3RlZCBnZXRDb2xvcihpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0Q2hhcnRDb2xvcihpbmRleCwgdGhpcy5jaGFydENvbG9ycyk7XG4gIH1cblxuICAvLyBTZWdtZW50IHZpc2liaWxpdHkgY2hlY2tcbiAgcHJvdGVjdGVkIGlzU2VnbWVudEhpZGRlbihpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGlkZGVuU2VnbWVudHMuaGFzKGlkKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIER5bmFtaWNhbGx5IGxvYWQgRDMgYW5kIGluaXRpYWxpemUgdGhlIGNoYXJ0IHdoZW4gdGhlIGNvbXBvbmVudCBpcyByZWFkeVxuICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG4gICAgICB0aGlzLl9pbml0aWFsaXplZC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLmxvYWREMygpO1xuICAgIH0pO1xuICB9XG5cbiAgI2VmZiA9IGVmZmVjdCgoKSA9PiB7XG4gICAgLy8gQWNjZXNzIGlucHV0cyB0byB0cmFjayB0aGVtXG4gICAgdGhpcy5kYXRhKCk7XG4gICAgLy8gVHJhY2sgb3B0aW9ucyBjaGFuZ2VzIHRvIHRyaWdnZXIgcmUtcmVuZGVyIG9uIHVwZGF0ZXNcbiAgICB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKTtcblxuICAgIC8vIE9ubHkgdXBkYXRlIGlmIGFscmVhZHkgcmVuZGVyZWRcbiAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX3JlbmRlcmVkKCkpIHtcbiAgICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICAvKipcbiAgICogSGlnaGxpZ2h0cyBhIHNwZWNpZmljIHNlZ21lbnQgYnkgSURcbiAgICogQHBhcmFtIGlkIFRoZSBzZWdtZW50IElEIHRvIGhpZ2hsaWdodCwgb3IgbnVsbCB0byBjbGVhciBoaWdobGlnaHRcbiAgICovXG4gIGhpZ2hsaWdodFNlZ21lbnQoaWQ6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faXNJbml0aWFsQW5pbWF0aW5nKCkpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICBjb25zdCBjdXJyZW50bHlIaWdobGlnaHRlZCA9IHRoaXMuX2N1cnJlbnRseUhpZ2hsaWdodGVkU2VnbWVudCgpO1xuXG4gICAgLy8gSWYgdGhlIHNhbWUgc2VnbWVudCBpcyBhbHJlYWR5IGhpZ2hsaWdodGVkLCBkbyBub3RoaW5nXG4gICAgaWYgKGN1cnJlbnRseUhpZ2hsaWdodGVkID09PSBpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgY3VycmVudGx5IGhpZ2hsaWdodGVkIHNlZ21lbnQgc3RhdGVcbiAgICB0aGlzLl9jdXJyZW50bHlIaWdobGlnaHRlZFNlZ21lbnQuc2V0KGlkKTtcblxuICAgIGNvbnN0IHRyYW5zaXRpb25EdXJhdGlvbiA9IDE1MDtcblxuICAgIC8vIEhlbHBlciB0byBnZXQgZnVsbCBkYXRhIGZvciB0aGUgc2VnbWVudCBJRFxuICAgIGNvbnN0IGdldFNlZ21lbnREYXRhQnlJZCA9IChzZWdtZW50SWQ6IHN0cmluZyk6IEFYRG9udXRDaGFydERhdGEgfCBudWxsID0+IHtcbiAgICAgIHJldHVybiB1bnRyYWNrZWQoKCkgPT4gdGhpcy5jaGFydERhdGFBcnJheSgpKS5maW5kKChkKSA9PiBkLmlkID09PSBzZWdtZW50SWQpIHx8IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEFsd2F5cyBpbnRlcnJ1cHQgYW55IG9uZ29pbmcgdHJhbnNpdGlvbnMgZmlyc3RcbiAgICB0aGlzLnN2Zy5zZWxlY3RBbGwoJ3BhdGgnKS5pbnRlcnJ1cHQoKTtcblxuICAgIGlmIChpZCA9PT0gbnVsbCkge1xuICAgICAgLy8gQ2xlYXIgYWxsIGhpZ2hsaWdodHNcbiAgICAgIHRoaXMuc3ZnXG4gICAgICAgIC5zZWxlY3RBbGwoJ3BhdGgnKVxuICAgICAgICAuY2xhc3NlZCgnYXgtZG9udXQtY2hhcnQtaGlnaGxpZ2h0ZWQnLCBmYWxzZSlcbiAgICAgICAgLmNsYXNzZWQoJ2F4LWRvbnV0LWNoYXJ0LWRpbW1lZCcsIGZhbHNlKVxuICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgIC5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBudWxsKVxuICAgICAgICAuc3R5bGUoJ2ZpbHRlcicsIG51bGwpXG4gICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDEpO1xuXG4gICAgICB0aGlzLnNlZ21lbnRIb3Zlci5lbWl0KG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldFNlZ21lbnQgPSB0aGlzLnN2Zy5zZWxlY3RBbGwoJ3BhdGgnKS5maWx0ZXIoKGQ6IGFueSkgPT4gZD8uZGF0YT8uaWQgPT09IGlkKTtcblxuICAgIGlmICh0YXJnZXRTZWdtZW50LmVtcHR5KCkpIHtcbiAgICAgIC8vIFRhcmdldCBub3QgZm91bmQsIGNsZWFyIGhpZ2hsaWdodHNcbiAgICAgIHRoaXMuX2N1cnJlbnRseUhpZ2hsaWdodGVkU2VnbWVudC5zZXQobnVsbCk7XG4gICAgICB0aGlzLmhpZ2hsaWdodFNlZ21lbnQobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRGltIGFsbCBzZWdtZW50cyB0aGF0IGFyZSBOT1QgdGhlIHRhcmdldFxuICAgIHRoaXMuc3ZnXG4gICAgICAuc2VsZWN0QWxsKCdwYXRoJylcbiAgICAgIC5maWx0ZXIoKGQ6IGFueSkgPT4gZD8uZGF0YT8uaWQgIT09IGlkKVxuICAgICAgLmNsYXNzZWQoJ2F4LWRvbnV0LWNoYXJ0LWhpZ2hsaWdodGVkJywgZmFsc2UpXG4gICAgICAuY2xhc3NlZCgnYXgtZG9udXQtY2hhcnQtZGltbWVkJywgdHJ1ZSlcbiAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgIC5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgbnVsbClcbiAgICAgIC5zdHlsZSgnZmlsdGVyJywgbnVsbClcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDAuNSk7XG5cbiAgICAvLyBIaWdobGlnaHQgdGhlIHRhcmdldCBzZWdtZW50XG4gICAgdGFyZ2V0U2VnbWVudFxuICAgICAgLmNsYXNzZWQoJ2F4LWRvbnV0LWNoYXJ0LWRpbW1lZCcsIGZhbHNlKVxuICAgICAgLmNsYXNzZWQoJ2F4LWRvbnV0LWNoYXJ0LWhpZ2hsaWdodGVkJywgdHJ1ZSlcbiAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgIC5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pXG4gICAgICAuc3R5bGUoJ2ZpbHRlcicsICd1cmwoI2F4LWRvbnV0LWNoYXJ0LXNlZ21lbnQtc2hhZG93KScpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCAxKTtcblxuICAgIHRoaXMuc2VnbWVudEhvdmVyLmVtaXQoZ2V0U2VnbWVudERhdGFCeUlkKGlkKSk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB2aXNpYmlsaXR5IG9mIGEgc2VnbWVudCBieSBJRFxuICAgKiBAcGFyYW0gaWQgU2VnbWVudCBJRCB0byB0b2dnbGVcbiAgICogQHJldHVybnMgTmV3IHZpc2liaWxpdHkgc3RhdGUgKHRydWUgPSB2aXNpYmxlLCBmYWxzZSA9IGhpZGRlbilcbiAgICovXG4gIHRvZ2dsZVNlZ21lbnQoaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHdhc0FsbEhpZGRlbiA9XG4gICAgICB0aGlzLmNoYXJ0RGF0YUFycmF5KCkubGVuZ3RoID4gMCAmJiB0aGlzLmNoYXJ0RGF0YUFycmF5KCkuZXZlcnkoKGQpID0+IHRoaXMuaXNTZWdtZW50SGlkZGVuKGQuaWQpKTtcblxuICAgIGlmICh0aGlzLmhpZGRlblNlZ21lbnRzLmhhcyhpZCkpIHtcbiAgICAgIC8vIE1ha2luZyBhIHNlZ21lbnQgdmlzaWJsZVxuICAgICAgdGhpcy5oaWRkZW5TZWdtZW50cy5kZWxldGUoaWQpO1xuXG4gICAgICAvLyBJZiBhbGwgc2VnbWVudHMgd2VyZSBwcmV2aW91c2x5IGhpZGRlbiwgd2UgbmVlZCB0byBlbnN1cmUgdGhlIG1lc3NhZ2UgaXMgY2xlYXJlZFxuICAgICAgaWYgKHdhc0FsbEhpZGRlbikge1xuICAgICAgICAvLyBGb3JjZSBjb21wbGV0ZSBET00gY2xlYW51cCBhbmQgcmVkcmF3XG4gICAgICAgIGlmICh0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIC8vIENsZWFyIG9ubHkgY2hhcnQgU1ZHIGFuZCBtZXNzYWdlIGNvbnRhaW5lcnMgKHByZXNlcnZlIHRvb2x0aXAgY29tcG9uZW50KVxuICAgICAgICAgIHRoaXMuZDNcbiAgICAgICAgICAgID8uc2VsZWN0KHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgICAuc2VsZWN0QWxsKCdzdmcsIC5heC1jaGFydC1tZXNzYWdlLWNvbnRhaW5lciwgLmF4LWRvbnV0LWNoYXJ0LW5vLWRhdGEtbWVzc2FnZScpXG4gICAgICAgICAgICAucmVtb3ZlKCk7XG5cbiAgICAgICAgICAvLyBGb3JjZSBmdWxsIHJlZHJhd1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhpZGluZyBhIHNlZ21lbnRcbiAgICAgIHRoaXMuaGlkZGVuU2VnbWVudHMuYWRkKGlkKTtcbiAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gIXRoaXMuaXNTZWdtZW50SGlkZGVuKGlkKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cENoYXJ0KCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgRDMuanMgZHluYW1pY2FsbHlcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBsb2FkRDMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZDMgPSBhd2FpdCBpbXBvcnQoJ2QzJyk7XG4gICAgICAvLyBJZiBjb250YWluZXIgaXMgcmVhZHksIGNyZWF0ZSBjaGFydFxuICAgICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKCkgJiYgdGhpcy5jaGFydENvbnRhaW5lckVsKCkpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICAgICAgICB0aGlzLl9yZW5kZXJlZC5zZXQodHJ1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIEQzLmpzOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TZWdtZW50Q2xpY2soaXRlbTogQVhEb251dENoYXJ0RGF0YSk6IHZvaWQge1xuICAgIC8vIHRoaXMudG9nZ2xlU2VnbWVudFZpc2liaWxpdHkoaXRlbS5pZCk7XG4gICAgdGhpcy5zZWdtZW50Q2xpY2suZW1pdChpdGVtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBkb251dCBjaGFydFxuICAgKi9cbiAgcHVibGljIGNyZWF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kMyB8fCAhdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudDtcblxuICAgICAgdGhpcy5jbGVhckNoYXJ0KGNvbnRhaW5lckVsZW1lbnQpO1xuXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5jaGFydERhdGFBcnJheSgpO1xuXG4gICAgICBpZiAoIWRhdGEgfHwgZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zaG93Tm9EYXRhTWVzc2FnZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEZpbHRlciBvdXQgaGlkZGVuIHNlZ21lbnRzXG4gICAgICBjb25zdCB2aXNpYmxlRGF0YSA9IGRhdGEuZmlsdGVyKChpdGVtKSA9PiAhdGhpcy5oaWRkZW5TZWdtZW50cy5oYXMoaXRlbS5pZCkpO1xuXG4gICAgICAvLyBJZiBhbGwgc2VnbWVudHMgYXJlIGhpZGRlbiwgc2hvdyBtZXNzYWdlXG4gICAgICBpZiAodmlzaWJsZURhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuc2hvd0FsbFNlZ21lbnRzSGlkZGVuTWVzc2FnZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKTtcbiAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5zZXR1cERpbWVuc2lvbnMoY29udGFpbmVyRWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICB0aGlzLnJlbmRlckRvbnV0Q2hhcnQoY29udGFpbmVyRWxlbWVudCwgd2lkdGgsIGhlaWdodCwgdmlzaWJsZURhdGEpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBjcmVhdGluZyBkb251dCBjaGFydDonLCBlcnJvcik7XG4gICAgICB0aGlzLmhhbmRsZUNoYXJ0RXJyb3IoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY2hhcnQgd2l0aCBuZXcgZGF0YVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIC8vIFJlc2V0IGhpZ2hsaWdodGVkIHNlZ21lbnQgc3RhdGUgd2hlbiB1cGRhdGluZ1xuICAgIHRoaXMuX2N1cnJlbnRseUhpZ2hsaWdodGVkU2VnbWVudC5zZXQobnVsbCk7XG4gICAgdGhpcy5jcmVhdGVDaGFydCgpOyAvLyBSZWNyZWF0ZSB0aGUgY2hhcnQgd2l0aCB1cGRhdGVkIGRhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGNoYXJ0IGNvbnRhaW5lclxuICAgKi9cbiAgcHJpdmF0ZSBjbGVhckNoYXJ0KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLmQzLnNlbGVjdChjb250YWluZXIpLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtbWVzc2FnZS1jb250YWluZXIsIC5heC1kb251dC1jaGFydC1uby1kYXRhLW1lc3NhZ2UnKS5yZW1vdmUoKTtcbiAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGEgbWVzc2FnZSB3aGVuIG5vIGRhdGEgaXMgYXZhaWxhYmxlXG4gICAqL1xuICBwcml2YXRlIHNob3dOb0RhdGFNZXNzYWdlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMucmVuZGVyTWVzc2FnZShcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIHRoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKS5ub0RhdGFJY29uLFxuICAgICAgdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLm5vRGF0YSxcbiAgICAgIHRoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKS5ub0RhdGFIZWxwLFxuICAgICAgJ2F4LWRvbnV0LWNoYXJ0LW5vLWRhdGEtbWVzc2FnZScsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG1lc3NhZ2Ugd2hlbiBhbGwgc2VnbWVudHMgYXJlIGhpZGRlblxuICAgKi9cbiAgcHJpdmF0ZSBzaG93QWxsU2VnbWVudHNIaWRkZW5NZXNzYWdlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMucmVuZGVyTWVzc2FnZShcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIHRoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKS5hbGxIaWRkZW5JY29uLFxuICAgICAgdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLmFsbEhpZGRlbixcbiAgICAgIHRoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKS5hbGxIaWRkZW5IZWxwLFxuICAgICAgJ2F4LWRvbnV0LWNoYXJ0LW5vLWRhdGEtbWVzc2FnZScsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR1cHMgY2hhcnQgZGltZW5zaW9ucyBiYXNlZCBvbiBjb250YWluZXIgYW5kIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgc2V0dXBEaW1lbnNpb25zKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM6IEFYRG9udXRDaGFydE9wdGlvbik6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgLy8gR2V0IGNvbnRhaW5lciBkaW1lbnNpb25zIG9yIHVzZSBkZWZhdWx0c1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gY29udGFpbmVyLmNsaWVudFdpZHRoIHx8IDQwMDtcbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSBjb250YWluZXIuY2xpZW50SGVpZ2h0IHx8IDQwMDtcblxuICAgIC8vIEVuc3VyZSBtaW5pbXVtIGRpbWVuc2lvbnMgZm9yIHRoZSBjaGFydFxuICAgIGNvbnN0IG1pbkRpbSA9IDIwMDtcbiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KG9wdGlvbnM/LndpZHRoIHx8IGNvbnRhaW5lcldpZHRoLCBtaW5EaW0pO1xuICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KG9wdGlvbnM/LmhlaWdodCB8fCBjb250YWluZXJIZWlnaHQsIG1pbkRpbSk7XG5cbiAgICByZXR1cm4geyB3aWR0aCwgaGVpZ2h0IH07XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgZG9udXQgY2hhcnQgd2l0aCB2aXNpYmxlIGRhdGFcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyRG9udXRDaGFydChcbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgdmlzaWJsZURhdGE6IEFYRG9udXRDaGFydERhdGFbXSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgdG90YWwgPSB2aXNpYmxlRGF0YS5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4gc3VtICsgaXRlbS52YWx1ZSwgMCk7XG5cbiAgICAvLyBDcmVhdGUgU1ZHIGNvbnRhaW5lciB3aXRoIGZpbHRlcnNcbiAgICBjb25zdCBzdmcgPSB0aGlzLmNyZWF0ZVN2Z1dpdGhGaWx0ZXJzKGNvbnRhaW5lciwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICAvLyBDcmVhdGUgbWFpbiBjaGFydCBncm91cFxuICAgIHRoaXMuc3ZnID0gc3ZnLmFwcGVuZCgnZycpLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHt3aWR0aCAvIDJ9LCAke2hlaWdodCAvIDJ9KWApO1xuXG4gICAgLy8gQ3JlYXRlIGRvbnV0IHNlZ21lbnRzXG4gICAgdGhpcy5jcmVhdGVEb251dFNlZ21lbnRzKHdpZHRoLCBoZWlnaHQsIHZpc2libGVEYXRhLCB0b3RhbCk7XG5cbiAgICAvLyBBZGQgdG90YWwgaW4gY2VudGVyXG4gICAgdGhpcy5hZGRDZW50ZXJEaXNwbGF5KHRvdGFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgU1ZHIGVsZW1lbnQgd2l0aCBmaWx0ZXIgZGVmaW5pdGlvbnMgZm9yIHNoYWRvd3NcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlU3ZnV2l0aEZpbHRlcnMoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBhbnkge1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuZDNcbiAgICAgIC5zZWxlY3QoY29udGFpbmVyKVxuICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgIC5hdHRyKCd3aWR0aCcsICcxMDAlJylcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCAnMTAwJScpXG4gICAgICAuYXR0cigndmlld0JveCcsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YClcbiAgICAgIC5hdHRyKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJywgJ3hNaWRZTWlkIG1lZXQnKTtcblxuICAgIC8vIEFkZCBkcm9wIHNoYWRvdyBmaWx0ZXJcbiAgICBjb25zdCBkZWZzID0gc3ZnLmFwcGVuZCgnZGVmcycpO1xuICAgIGNvbnN0IGZpbHRlciA9IGRlZnMuYXBwZW5kKCdmaWx0ZXInKS5hdHRyKCdpZCcsICdheC1kb251dC1jaGFydC1zZWdtZW50LXNoYWRvdycpLmF0dHIoJ2hlaWdodCcsICcxMzAlJyk7XG5cbiAgICBmaWx0ZXIuYXBwZW5kKCdmZUdhdXNzaWFuQmx1cicpLmF0dHIoJ2luJywgJ1NvdXJjZUFscGhhJykuYXR0cignc3RkRGV2aWF0aW9uJywgMikuYXR0cigncmVzdWx0JywgJ2JsdXInKTtcbiAgICBmaWx0ZXIuYXBwZW5kKCdmZU9mZnNldCcpLmF0dHIoJ2luJywgJ2JsdXInKS5hdHRyKCdkeCcsIDEpLmF0dHIoJ2R5JywgMSkuYXR0cigncmVzdWx0JywgJ29mZnNldEJsdXInKTtcblxuICAgIGNvbnN0IGZlQ29tcG9uZW50VHJhbnNmZXIgPSBmaWx0ZXJcbiAgICAgIC5hcHBlbmQoJ2ZlQ29tcG9uZW50VHJhbnNmZXInKVxuICAgICAgLmF0dHIoJ2luJywgJ29mZnNldEJsdXInKVxuICAgICAgLmF0dHIoJ3Jlc3VsdCcsICdvZmZzZXRCbHVyJyk7XG5cbiAgICBmZUNvbXBvbmVudFRyYW5zZmVyLmFwcGVuZCgnZmVGdW5jQScpLmF0dHIoJ3R5cGUnLCAnbGluZWFyJykuYXR0cignc2xvcGUnLCAwLjMpO1xuXG4gICAgY29uc3QgZmVNZXJnZSA9IGZpbHRlci5hcHBlbmQoJ2ZlTWVyZ2UnKTtcbiAgICBmZU1lcmdlLmFwcGVuZCgnZmVNZXJnZU5vZGUnKS5hdHRyKCdpbicsICdvZmZzZXRCbHVyJyk7XG4gICAgZmVNZXJnZS5hcHBlbmQoJ2ZlTWVyZ2VOb2RlJykuYXR0cignaW4nLCAnU291cmNlR3JhcGhpYycpO1xuXG4gICAgcmV0dXJuIHN2ZztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW5kIHJlbmRlciB0aGUgZG9udXQgc2VnbWVudHMgd2l0aCBhbmltYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZURvbnV0U2VnbWVudHMoY2hhcnRXaWR0aDogbnVtYmVyLCBjaGFydEhlaWdodDogbnVtYmVyLCBkYXRhOiBBWERvbnV0Q2hhcnREYXRhW10sIHRvdGFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcuc2V0KHRydWUpO1xuXG4gICAgLy8gQ3JlYXRlIHBpZSBsYXlvdXRcbiAgICBjb25zdCBwaWUgPSB0aGlzLmQzXG4gICAgICAucGllPEFYRG9udXRDaGFydERhdGE+KClcbiAgICAgIC52YWx1ZSgoZCkgPT4gZC52YWx1ZSlcbiAgICAgIC5zb3J0KG51bGwpXG4gICAgICAucGFkQW5nbGUoMC4wMik7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIHJhZGl1cyBvZiB0aGUgZG9udXQgY2hhcnRcbiAgICBjb25zdCByYWRpdXMgPSAoTWF0aC5taW4oY2hhcnRXaWR0aCwgY2hhcnRIZWlnaHQpIC8gMikgKiAwLjg1O1xuXG4gICAgLy8gQ2FsY3VsYXRlIGlubmVyIHJhZGl1cyBiYXNlZCBvbiBkb251dFdpZHRoIHBlcmNlbnRhZ2VcbiAgICBjb25zdCBkb251dFdpZHRoUGVyY2VudCA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmRvbnV0V2lkdGggLyAxMDA7XG4gICAgY29uc3QgaW5uZXJSYWRpdXMgPSByYWRpdXMgKiAoMSAtIGRvbnV0V2lkdGhQZXJjZW50KTtcblxuICAgIC8vIENyZWF0ZSBhcmMgZ2VuZXJhdG9yIHdpdGggdGhlIGNvbmZpZ3VyZWQgcmFkaXVzIGFuZCBjb3JuZXIgcmFkaXVzXG4gICAgY29uc3QgYXJjID0gdGhpcy5kM1xuICAgICAgLmFyYygpXG4gICAgICAuaW5uZXJSYWRpdXMoaW5uZXJSYWRpdXMpXG4gICAgICAub3V0ZXJSYWRpdXMocmFkaXVzICogMC45NSlcbiAgICAgIC5jb3JuZXJSYWRpdXModGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuY29ybmVyUmFkaXVzKTtcblxuICAgIC8vIENyZWF0ZSBsYWJlbCBhcmMgZ2VuZXJhdG9yIGZvciBwbGFjaW5nIGxhYmVscyAobWlkZGxlIG9mIHRoZSBkb251dCByaW5nKVxuICAgIGNvbnN0IGxhYmVsQXJjID0gdGhpcy5kM1xuICAgICAgLmFyYygpXG4gICAgICAuaW5uZXJSYWRpdXMoaW5uZXJSYWRpdXMgKyAocmFkaXVzICogMC45NSAtIGlubmVyUmFkaXVzKSAvIDIpXG4gICAgICAub3V0ZXJSYWRpdXMoaW5uZXJSYWRpdXMgKyAocmFkaXVzICogMC45NSAtIGlubmVyUmFkaXVzKSAvIDIpO1xuXG4gICAgLy8gR2V0IGFuaW1hdGlvbiBvcHRpb25zXG4gICAgY29uc3QgYW5pbWF0aW9uRHVyYXRpb24gPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5hbmltYXRpb25EdXJhdGlvbjtcbiAgICBjb25zdCBhbmltYXRpb25FYXNpbmcgPSBnZXRFYXNpbmdGdW5jdGlvbih0aGlzLmQzLCB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5hbmltYXRpb25FYXNpbmcpO1xuXG4gICAgLy8gR2VuZXJhdGUgcGllIGRhdGFcbiAgICB0aGlzLnBpZURhdGEgPSBwaWUoZGF0YSk7XG5cbiAgICAvLyBBZGQgc2VnbWVudHMgd2l0aCBhbmltYXRpb25cbiAgICBjb25zdCBzZWdtZW50cyA9IHRoaXMuc3ZnXG4gICAgICAuc2VsZWN0QWxsKCdwYXRoJylcbiAgICAgIC5kYXRhKHRoaXMucGllRGF0YSlcbiAgICAgIC5lbnRlcigpXG4gICAgICAuYXBwZW5kKCdwYXRoJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1kb251dC1jaGFydC1zZWdtZW50JylcbiAgICAgIC5hdHRyKCdmaWxsJywgKGQ6IGFueSAvKiBkIGlzIFBpZUFyY0RhdHVtPEFYRG9udXRDaGFydERhdGE+ICovKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoYXJ0SXRlbSA9IGQuZGF0YSBhcyBBWERvbnV0Q2hhcnREYXRhOyAvLyBBWERvbnV0Q2hhcnREYXRhIGZyb20gdmlzaWJsZURhdGFcbiAgICAgICAgaWYgKGNoYXJ0SXRlbS5jb2xvcikge1xuICAgICAgICAgIC8vIFByaW9yaXRpemUgZXhwbGljaXQgY29sb3Igb24gdGhlIGl0ZW1cbiAgICAgICAgICByZXR1cm4gY2hhcnRJdGVtLmNvbG9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZhbGxiYWNrOiBmaW5kIG9yaWdpbmFsIGluZGV4IGZvciBjb25zaXN0ZW50IHBhbGV0dGUgY29sb3JcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxGdWxsRGF0YSA9IHVudHJhY2tlZCgoKSA9PiB0aGlzLmNoYXJ0RGF0YUFycmF5KCkpO1xuICAgICAgICBjb25zdCBvcmlnaW5hbEluZGV4ID0gb3JpZ2luYWxGdWxsRGF0YS5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGNoYXJ0SXRlbS5pZCk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENvbG9yKG9yaWdpbmFsSW5kZXggIT09IC0xID8gb3JpZ2luYWxJbmRleCA6IDApOyAvLyBFbnN1cmUgdmFsaWQgaW5kZXhcbiAgICAgIH0pXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgICAgLnN0eWxlKCdjdXJzb3InLCAncG9pbnRlcicpIC8vIEFkZCBjdXJzb3IgcG9pbnRlciB0byBzZWdtZW50c1xuICAgICAgLm9uKCdtb3VzZWVudGVyJywgKGV2ZW50OiBNb3VzZUV2ZW50LCBkOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93VG9vbHRpcCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmhhbmRsZVNsaWNlSG92ZXIoZXZlbnQsIGQuZGF0YSk7XG4gICAgICB9KVxuICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZVNlZ21lbnRMZWF2ZSgpO1xuICAgICAgfSlcbiAgICAgIC5vbignbW91c2Vtb3ZlJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl90b29sdGlwVmlzaWJsZSgpKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLm9uKCdjbGljaycsIChldmVudDogTW91c2VFdmVudCwgZDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25TZWdtZW50Q2xpY2soZC5kYXRhKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gQW5pbWF0ZSBzZWdtZW50c1xuICAgIGNvbnN0IG51bVNlZ21lbnRzID0gdGhpcy5waWVEYXRhLmxlbmd0aDtcbiAgICBsZXQgY29tcGxldGVkID0gMDtcbiAgICBzZWdtZW50c1xuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgLmVhc2UoYW5pbWF0aW9uRWFzaW5nKVxuICAgICAgLmRlbGF5KChkOiBhbnksIGk6IG51bWJlcikgPT4gaSAqIDUwKVxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICAgIC5hdHRyVHdlZW4oJ2QnLCAoZDogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGludGVycG9sYXRlID0gdGhpcy5kMy5pbnRlcnBvbGF0ZSh7IHN0YXJ0QW5nbGU6IGQuc3RhcnRBbmdsZSwgZW5kQW5nbGU6IGQuc3RhcnRBbmdsZSB9LCBkKTtcbiAgICAgICAgcmV0dXJuICh0OiBudW1iZXIpID0+IGFyYyhpbnRlcnBvbGF0ZSh0KSkgYXMgc3RyaW5nO1xuICAgICAgfSlcbiAgICAgIC5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICBjb21wbGV0ZWQrKztcbiAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBudW1TZWdtZW50cykge1xuICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbEFuaW1hdGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5vbignaW50ZXJydXB0JywgKCkgPT4ge1xuICAgICAgICAvLyBUcmVhdCBpbnRlcnJ1cHRzIGFzIGNvbXBsZXRpb24gdG8gYXZvaWQgZ2V0dGluZyBzdHVjayBpbiBhbmltYXRpbmcgc3RhdGVcbiAgICAgICAgY29tcGxldGVkKys7XG4gICAgICAgIGlmIChjb21wbGV0ZWQgPj0gbnVtU2VnbWVudHMpIHtcbiAgICAgICAgICB0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgLy8gQWRkIGRhdGEgbGFiZWxzIGlmIGVuYWJsZWQgYW5kIGNoYXJ0IHNpemUgaXMgc3VmZmljaWVudFxuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93RGF0YUxhYmVscykge1xuICAgICAgY29uc3QgbWluQ2hhcnREaW1lbnNpb24gPSBNYXRoLm1pbihjaGFydFdpZHRoLCBjaGFydEhlaWdodCk7XG4gICAgICBjb25zdCBpc1Rvb1NtYWxsQ2hhcnRGb3JMYWJlbHMgPSBtaW5DaGFydERpbWVuc2lvbiA8IDI2MDsgLy8gSGlkZSBsYWJlbHMgZW50aXJlbHkgb24gc21hbGwgY2hhcnRzXG4gICAgICBpZiAoIWlzVG9vU21hbGxDaGFydEZvckxhYmVscykge1xuICAgICAgICAvLyBDYWxjdWxhdGUgb3B0aW1hbCBmb250IHNpemUgYmFzZWQgb24gc2VnbWVudCBzaXplIGFuZCBjaGFydCBkaW1lbnNpb25zXG4gICAgICAgIGNvbnN0IGNhbGN1bGF0ZUZvbnRTaXplID0gKGQ6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFuZ2xlU2l6ZSA9IGQuZW5kQW5nbGUgLSBkLnN0YXJ0QW5nbGU7IC8vIHJhZGlhbnNcbiAgICAgICAgICBjb25zdCBzZWdtZW50UGVyY2VudGFnZSA9IChkLmRhdGEudmFsdWUgLyB0b3RhbCkgKiAxMDA7XG5cbiAgICAgICAgICAvLyBEcm9wIGxhYmVscyBmb3IgdmVyeSBzbWFsbCBzZWdtZW50c1xuICAgICAgICAgIGlmIChzZWdtZW50UGVyY2VudGFnZSA8IDIpIHJldHVybiAwO1xuXG4gICAgICAgICAgLy8gTWluaW11bSByZWFkYWJsZSBmb250IHNpemU7IGF2b2lkIHRpbnkgdW5yZWFkYWJsZSB0ZXh0XG4gICAgICAgICAgY29uc3QgbWluUmVhZGFibGUgPSBzZWdtZW50UGVyY2VudGFnZSA8IDggPyAwIDogOTtcblxuICAgICAgICAgIC8vIEJhc2Ugc2l6ZSBzY2FsZWQgYnkgYXJjIGFuZ2xlIGFuZCByYWRpdXMsIGNhcHBlZFxuICAgICAgICAgIGNvbnN0IHNjYWxlZCA9IChhbmdsZVNpemUgKiByYWRpdXMpIC8gOTtcbiAgICAgICAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobWluUmVhZGFibGUsIHNjYWxlZCksIDEzKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBmb3JtYXRQZXJjZW50YWdlID0gKHZhbHVlOiBudW1iZXIpID0+IHtcbiAgICAgICAgICBpZiAodmFsdWUgPCAxKSByZXR1cm4gJzwxJSc7XG4gICAgICAgICAgaWYgKHZhbHVlIDwgMTApIHJldHVybiBgJHt2YWx1ZS50b0ZpeGVkKDEpfSVgO1xuICAgICAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKHZhbHVlKX0lYDtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBsYWJlbFJhZGl1cyA9IGlubmVyUmFkaXVzICsgKHJhZGl1cyAqIDAuOTUgLSBpbm5lclJhZGl1cykgLyAyO1xuICAgICAgICBjb25zdCBhcHByb3hpbWF0ZVRleHRXaWR0aCA9ICh0ZXh0OiBzdHJpbmcsIGZvbnRTaXplOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAvLyBBcHByb3hpbWF0ZSB3aWR0aDogMC41NWVtIHBlciBjaGFyXG4gICAgICAgICAgcmV0dXJuIHRleHQubGVuZ3RoICogZm9udFNpemUgKiAwLjU1O1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBhcmNMZW5ndGggPSAoZDogYW55KSA9PiAoZC5lbmRBbmdsZSAtIGQuc3RhcnRBbmdsZSkgKiBsYWJlbFJhZGl1cztcblxuICAgICAgICBjb25zdCBidWlsZExhYmVsVGV4dCA9IChkOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKGQuZGF0YS52YWx1ZSAvIHRvdGFsKSAqIDEwMDtcbiAgICAgICAgICBpZiAocGVyY2VudGFnZSA8IDEpIHJldHVybiAnJztcbiAgICAgICAgICBjb25zdCBsYWJlbCA9IGQuZGF0YS5sYWJlbCB8fCAnJztcbiAgICAgICAgICBjb25zdCBwZXJjZW50YWdlVGV4dCA9IGZvcm1hdFBlcmNlbnRhZ2UocGVyY2VudGFnZSk7XG4gICAgICAgICAgcmV0dXJuIGxhYmVsID8gYCR7bGFiZWx9ICgke3BlcmNlbnRhZ2VUZXh0fSlgIDogcGVyY2VudGFnZVRleHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGF0YVRoYXRGaXRzID0gdGhpcy5waWVEYXRhLmZpbHRlcigoZDogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgZm9udFNpemUgPSBjYWxjdWxhdGVGb250U2l6ZShkKTtcbiAgICAgICAgICBpZiAoIWZvbnRTaXplKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgY29uc3QgdGV4dCA9IGJ1aWxkTGFiZWxUZXh0KGQpO1xuICAgICAgICAgIGlmICghdGV4dCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZSA9IGFyY0xlbmd0aChkKTtcbiAgICAgICAgICBjb25zdCBuZWVkZWQgPSBhcHByb3hpbWF0ZVRleHRXaWR0aCh0ZXh0LCBmb250U2l6ZSkgKyA2OyAvLyBzbWFsbCBwYWRkaW5nXG4gICAgICAgICAgcmV0dXJuIG5lZWRlZCA8PSBhdmFpbGFibGU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuc3ZnXG4gICAgICAgICAgLnNlbGVjdEFsbCgnLmF4LWRvbnV0LWNoYXJ0LWRhdGEtbGFiZWwnKVxuICAgICAgICAgIC5kYXRhKGRhdGFUaGF0Rml0cylcbiAgICAgICAgICAuZW50ZXIoKVxuICAgICAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1kb251dC1jaGFydC1kYXRhLWxhYmVsJylcbiAgICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgICAgICAgIC5zdHlsZSgncG9pbnRlci1ldmVudHMnLCAnbm9uZScpXG4gICAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWRvbnV0LWNoYXJ0LWRhdGEtbGFiZWxzLWNvbG9yKSknKVxuICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2VudHJvaWQgPSBsYWJlbEFyYy5jZW50cm9pZChkKTtcbiAgICAgICAgICAgIHJldHVybiBgdHJhbnNsYXRlKCR7Y2VudHJvaWRbMF19LCAke2NlbnRyb2lkWzFdfSlgO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAgICAgLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ21pZGRsZScpXG4gICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAoZCkgPT4gYCR7Y2FsY3VsYXRlRm9udFNpemUoZCl9cHhgKVxuICAgICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAoZCkgPT4gKChkLmRhdGEudmFsdWUgLyB0b3RhbCkgKiAxMDAgPj0gMTUgPyAnNjAwJyA6ICc1MDAnKSlcbiAgICAgICAgICAudGV4dCgoZCkgPT4gYnVpbGRMYWJlbFRleHQoZCkpO1xuXG4gICAgICAgIGxhYmVsc1xuICAgICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgICAuZHVyYXRpb24oYW5pbWF0aW9uRHVyYXRpb24pXG4gICAgICAgICAgLmRlbGF5KChkOiBhbnksIGk6IG51bWJlcikgPT4gaSAqIDUwICsgMjAwKVxuICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERldGVybWluZSB3aGVuIGFsbCBzZWdtZW50IGFuaW1hdGlvbnMgYXJlIGNvbXBsZXRlIChoYW5kbGUgZW1wdHkgY2FzZSlcbiAgICBpZiAobnVtU2VnbWVudHMgPT09IDApIHtcbiAgICAgIHRoaXMuX2lzSW5pdGlhbEFuaW1hdGluZy5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBhcHByb3ByaWF0ZSBEMyBlYXNpbmcgZnVuY3Rpb24gYmFzZWQgb24gdGhlIG9wdGlvbiBzdHJpbmdcbiAgICovXG4gIC8vIGdldEVhc2luZ0Z1bmN0aW9uIG1vdmVkIHRvIHNoYXJlZCBjaGFydCB1dGlsc1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgaG92ZXIgZWZmZWN0cyBvbiBhIHNlZ21lbnRcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlU2xpY2VIb3ZlcihldmVudDogTW91c2VFdmVudCwgZGF0dW06IEFYRG9udXRDaGFydERhdGEpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faXNJbml0aWFsQW5pbWF0aW5nKCkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93VG9vbHRpcCAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5kYXRhKCkuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09PSBkYXR1bS5pZCk7XG4gICAgICBjb25zdCBjb2xvciA9IGRhdHVtLmNvbG9yIHx8IGdldENoYXJ0Q29sb3IoaW5kZXgsIHRoaXMuY2hhcnRDb2xvcnMpO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgcGVyY2VudGFnZSBvZiB0b3RhbFxuICAgICAgLy8gRW5zdXJlIGRhdGEoKSBpcyBhY2Nlc3NlZCB3aXRoaW4gYSB0cmFja2luZyBjb250ZXh0IGlmIGl0J3MgYSBzaWduYWwsIG9yIHVzZSB1bnRyYWNrZWQgaWYgYXBwcm9wcmlhdGVcbiAgICAgIGNvbnN0IHRvdGFsID0gdW50cmFja2VkKCgpID0+IHRoaXMuZGF0YSgpKS5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4gc3VtICsgaXRlbS52YWx1ZSwgMCk7XG4gICAgICBjb25zdCBwZXJjZW50YWdlID0gdG90YWwgPiAwID8gKChkYXR1bS52YWx1ZSAvIHRvdGFsKSAqIDEwMCkudG9GaXhlZCgxKSA6ICcwJztcblxuICAgICAgdGhpcy5fdG9vbHRpcERhdGEuc2V0KHtcbiAgICAgICAgdGl0bGU6IGRhdHVtLnRvb2x0aXBMYWJlbCB8fCBkYXR1bS5sYWJlbCxcbiAgICAgICAgdmFsdWU6IGRhdHVtLnZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgIHBlcmNlbnRhZ2U6IGAke3BlcmNlbnRhZ2V9JWAsXG4gICAgICAgIGNvbG9yOiBjb2xvcixcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gICAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQodHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMuaGlnaGxpZ2h0U2VnbWVudChkYXR1bS5pZCk7IC8vIFRoaXMgd2lsbCBub3cgYWxzbyBoYW5kbGUgZW1pdHRpbmcgc2VnbWVudEhvdmVyXG4gICAgLy8gTm8gZGlyZWN0IHNlZ21lbnRIb3Zlci5lbWl0KGRhdHVtKSBoZXJlIGFueW1vcmVcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIG1vdXNlIGxlYXZlIGZyb20gc2VnbWVudHNcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlU2VnbWVudExlYXZlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcoKSkgcmV0dXJuO1xuXG4gICAgLy8gSGlkZSB0b29sdGlwXG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAvLyBDbGVhciBhbGwgaGlnaGxpZ2h0cyB0byBlbnN1cmUgc2VnbWVudHMgcmV0dXJuIHRvIG5vcm1hbCBzdGF0ZVxuICAgIHRoaXMuaGlnaGxpZ2h0U2VnbWVudChudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRvb2x0aXAgcG9zaXRpb25cbiAgICogRW5zdXJlcyB0aGUgdG9vbHRpcCBpcyB2aXNpYmxlIGJ5IGFkanVzdGluZyBwb3NpdGlvbiB3aGVuIG5lYXIgZWRnZXNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyRWwgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWNvbnRhaW5lckVsKSByZXR1cm47XG4gICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHRvb2x0aXBFbCA9IGNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoJy5jaGFydC10b29sdGlwJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGNvbnN0IHRvb2x0aXBSZWN0ID0gdG9vbHRpcEVsID8gdG9vbHRpcEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogbnVsbDtcbiAgICBjb25zdCBwb3MgPSBjb21wdXRlVG9vbHRpcFBvc2l0aW9uKGNvbnRhaW5lclJlY3QsIHRvb2x0aXBSZWN0LCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCB0aGlzLlRPT0xUSVBfR0FQKTtcbiAgICB0aGlzLl90b29sdGlwUG9zaXRpb24uc2V0KHBvcyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBjZW50ZXIgZGlzcGxheSB3aXRoIHRvdGFsIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGFkZENlbnRlckRpc3BsYXkodG90YWw6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdmcpIHJldHVybjtcblxuICAgIC8vIENhbGN1bGF0ZSBhcHByb3ByaWF0ZSBmb250IHNpemVzIGJhc2VkIG9uIGNoYXJ0IGRpbWVuc2lvbnNcbiAgICBjb25zdCBjaGFydENvbnRhaW5lcldpZHRoID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICBjb25zdCBiYXNlRm9udFNpemUgPSBNYXRoLm1heCgxLjQsIE1hdGgubWluKDIuNCwgY2hhcnRDb250YWluZXJXaWR0aCAvIDIwMCkpOyAvLyBTY2FsZSBiZXR3ZWVuIDEuNHJlbSBhbmQgMi40cmVtXG4gICAgY29uc3Qgc3ViVGV4dEZvbnRTaXplID0gYmFzZUZvbnRTaXplICogMC41O1xuXG4gICAgLy8gQ3JlYXRlIGdyb3VwIGZvciB0aGUgdG90YWwgZGlzcGxheVxuICAgIGNvbnN0IHRvdGFsRGlzcGxheSA9IHRoaXMuc3ZnXG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1kb251dC1jaGFydC10b3RhbC1kaXNwbGF5JylcbiAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKTtcblxuICAgIC8vIEFkZCB0b3RhbCB2YWx1ZVxuICAgIHRvdGFsRGlzcGxheVxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtZG9udXQtY2hhcnQtdG90YWwtdmFsdWUnKVxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBgJHtiYXNlRm9udFNpemV9cmVtYClcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNjAwJylcbiAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1kb251dC1jaGFydC12YWx1ZS1jb2xvcikpJylcbiAgICAgIC50ZXh0KHRvdGFsLnRvTG9jYWxlU3RyaW5nKCkpO1xuXG4gICAgLy8gQWRkIGxhYmVsXG4gICAgdG90YWxEaXNwbGF5XG4gICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1kb251dC1jaGFydC10b3RhbC1sYWJlbCcpXG4gICAgICAuYXR0cignZHknLCAnMS40ZW0nKVxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBgJHtzdWJUZXh0Rm9udFNpemV9cmVtYClcbiAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1kb251dC1jaGFydC12YWx1ZS1jb2xvcikpJylcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsICcwLjgnKVxuICAgICAgLnRleHQodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkudG90YWxMYWJlbCB8fCAnVG90YWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGNoYXJ0IHJlbmRlcmluZyBlcnJvcnNcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlQ2hhcnRFcnJvcigpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICB0aGlzLnNob3dOb0RhdGFNZXNzYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyB1cCBjaGFydCByZXNvdXJjZXNcbiAgICovXG4gIHB1YmxpYyBjbGVhbnVwQ2hhcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3ZnKSB7XG4gICAgICB0aGlzLmQzLnNlbGVjdCh0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkuc2VsZWN0QWxsKCdzdmcnKS5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc3ZnID0gbnVsbDtcbiAgICAgIHRoaXMucGllRGF0YSA9IFtdO1xuICAgIH1cbiAgICB0aGlzLmhpZGRlblNlZ21lbnRzLmNsZWFyKCk7XG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgICB0aGlzLl9jdXJyZW50bHlIaWdobGlnaHRlZFNlZ21lbnQuc2V0KG51bGwpO1xuICB9XG5cbiAgLy8gPT09PT0gSGVscGVyIHV0aWxpdGllcyBmb3IgbW9kdWxhcml0eSBhbmQgbWFpbnRhaW5hYmlsaXR5ID09PT09XG5cbiAgcHJpdmF0ZSByZW5kZXJNZXNzYWdlKFxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgaWNvbkNsYXNzOiBzdHJpbmcsXG4gICAgbWVzc2FnZVRleHQ6IHN0cmluZyxcbiAgICBoZWxwVGV4dDogc3RyaW5nLFxuICAgIHNwZWNpZmljQ2xhc3M6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgY29udGFpbmVyIGFyZWEgZmlyc3QgKHByZXNlcnZlIHRvb2x0aXAgY29tcG9uZW50KVxuICAgIHRoaXMuZDMuc2VsZWN0KGNvbnRhaW5lcikuc2VsZWN0QWxsKCdzdmcsIC5heC1jaGFydC1tZXNzYWdlLWNvbnRhaW5lciwgLmF4LWRvbnV0LWNoYXJ0LW5vLWRhdGEtbWVzc2FnZScpLnJlbW92ZSgpO1xuXG4gICAgY29uc3QgbWVzc2FnZUNvbnRhaW5lciA9IHRoaXMuZDNcbiAgICAgIC5zZWxlY3QoY29udGFpbmVyKVxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC5hdHRyKCdjbGFzcycsIGBheC1jaGFydC1tZXNzYWdlLWNvbnRhaW5lciBheC1kb251dC1jaGFydC1tZXNzYWdlLWJhY2tncm91bmQgJHtzcGVjaWZpY0NsYXNzfWApO1xuXG4gICAgbWVzc2FnZUNvbnRhaW5lclxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1jaGFydC1tZXNzYWdlLWljb24gYXgtZG9udXQtY2hhcnQtbm8tZGF0YS1pY29uJylcbiAgICAgIC5odG1sKGA8aSBjbGFzcz1cIiR7aWNvbkNsYXNzfSBmYS0yeFwiPjwvaT5gKTtcblxuICAgIG1lc3NhZ2VDb250YWluZXIuYXBwZW5kKCdkaXYnKS5hdHRyKCdjbGFzcycsICdheC1jaGFydC1tZXNzYWdlLXRleHQgYXgtZG9udXQtY2hhcnQtbm8tZGF0YS10ZXh0JykudGV4dChtZXNzYWdlVGV4dCk7XG5cbiAgICBtZXNzYWdlQ29udGFpbmVyLmFwcGVuZCgnZGl2JykuYXR0cignY2xhc3MnLCAnYXgtY2hhcnQtbWVzc2FnZS1oZWxwIGF4LWRvbnV0LWNoYXJ0LW5vLWRhdGEtaGVscCcpLnRleHQoaGVscFRleHQpO1xuICB9XG5cbiAgLy8gY29tcHV0ZVRvb2x0aXBQb3NpdGlvbiBtb3ZlZCB0byBzaGFyZWQgY2hhcnQgdXRpbHNcblxuICAvKipcbiAgICogR2V0cyBhbiBhY2Nlc3NpYmlsaXR5IGxhYmVsIGRlc2NyaWJpbmcgdGhlIGRvbnV0IGNoYXJ0IGZvciBzY3JlZW4gcmVhZGVyc1xuICAgKi9cbiAgcHJvdGVjdGVkIGdldEFjY2Vzc2liaWxpdHlMYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNoYXJ0RGF0YUFycmF5KCk7XG5cbiAgICBpZiAoIWRhdGEgfHwgZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnRW1wdHkgZG9udXQgY2hhcnQuIE5vIGRhdGEgYXZhaWxhYmxlLic7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIHRvdGFsXG4gICAgY29uc3QgdG90YWwgPSBkYXRhLnJlZHVjZSgoc3VtLCBpdGVtKSA9PiBzdW0gKyBpdGVtLnZhbHVlLCAwKTtcblxuICAgIC8vIEdlbmVyYXRlIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNoYXJ0IHdpdGggcGVyY2VudGFnZXNcbiAgICBjb25zdCBzZWdtZW50RGVzY3JpcHRpb25zID0gZGF0YVxuICAgICAgLm1hcCgoc2VnbWVudCkgPT4ge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKChzZWdtZW50LnZhbHVlIC8gdG90YWwpICogMTAwKS50b0ZpeGVkKDEpO1xuICAgICAgICByZXR1cm4gYCR7c2VnbWVudC5sYWJlbH06ICR7c2VnbWVudC52YWx1ZX0gKCR7cGVyY2VudGFnZX0lKWA7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJzsgJyk7XG5cbiAgICByZXR1cm4gYERvbnV0IGNoYXJ0IHdpdGggJHtkYXRhLmxlbmd0aH0gc2VnbWVudHMuIFRvdGFsIHZhbHVlOiAke3RvdGFsfS4gJHtzZWdtZW50RGVzY3JpcHRpb25zfWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGF0YSBpdGVtcyBmb3IgdGhlIGxlZ2VuZFxuICAgKiBAaW1wbGVtZW50cyBBWENoYXJ0TGVnZW5kQ29tcGF0aWJsZVxuICAgKi9cbiAgZ2V0TGVnZW5kSXRlbXMoKTogQVhDaGFydExlZ2VuZEl0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhcnREYXRhQXJyYXkoKS5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogaXRlbS5pZCxcbiAgICAgICAgbmFtZTogaXRlbS5sYWJlbCB8fCBgU2VnbWVudCAke2luZGV4ICsgMX1gLFxuICAgICAgICB2YWx1ZTogaXRlbS52YWx1ZSxcbiAgICAgICAgY29sb3I6IGl0ZW0uY29sb3IgfHwgdGhpcy5nZXRDb2xvcihpbmRleCksXG4gICAgICAgIHBlcmNlbnRhZ2U6IChpdGVtLnZhbHVlIC8gdGhpcy5kYXRhKCkucmVkdWNlKChzdW0sIGl0ZW0pID0+IHN1bSArIGl0ZW0udmFsdWUsIDApKSAqIDEwMCxcbiAgICAgICAgaGlkZGVuOiB0aGlzLmlzU2VnbWVudEhpZGRlbihpdGVtLmlkKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJheC1kb251dC1jaGFydFwiICNjaGFydENvbnRhaW5lciByb2xlPVwiaW1nXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJnZXRBY2Nlc3NpYmlsaXR5TGFiZWwoKVwiPlxuICA8IS0tIFRvb2x0aXAgY29tcG9uZW50IC0tPlxuICA8YXgtY2hhcnQtdG9vbHRpcFxuICAgIFt2aXNpYmxlXT1cInRvb2x0aXBWaXNpYmxlKClcIlxuICAgIFtwb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24oKVwiXG4gICAgW2RhdGFdPVwidG9vbHRpcERhdGEoKVwiXG4gICAgW3Nob3dQZXJjZW50YWdlXT1cInRydWVcIlxuICA+PC9heC1jaGFydC10b29sdGlwPlxuPC9kaXY+XG4iXX0=","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1kb251dC1jaGFydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9kb251dC1jaGFydC9zcmMvYWNvcmV4LWNoYXJ0cy1kb251dC1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
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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"}