@acorex/charts 0.0.1

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.
@@ -0,0 +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};\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9udXQtY2hhcnQuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2RvbnV0LWNoYXJ0L3NyYy9saWIvZG9udXQtY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHaEMsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQXVCO0lBQzNELFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGNBQWMsRUFBRSxJQUFJO0lBQ3BCLFVBQVUsRUFBRSxFQUFFO0lBQ2QsWUFBWSxFQUFFLENBQUM7SUFDZixpQkFBaUIsRUFBRSxHQUFHO0lBQ3RCLGVBQWUsRUFBRSxXQUFXO0NBQzdCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLGNBQWMsQ0FBcUIsdUJBQXVCLEVBQUU7SUFDbkcsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRTtRQUNaLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3hDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUseUJBQXlCLENBQUMsQ0FBQztRQUMzRCxPQUFPLHlCQUF5QixDQUFDO0lBQ25DLENBQUM7Q0FDRixDQUFDLENBQUM7QUFJSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsU0FBa0MsRUFBRTtJQUNuRSxNQUFNLE1BQU0sR0FBRztRQUNiLEdBQUcseUJBQXlCO1FBQzVCLEdBQUcsTUFBTTtLQUNWLENBQUM7SUFDRixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVhfR0xPQkFMX0NPTkZJRyB9IGZyb20gJ0BhY29yZXgvY29yZS9jb25maWcnO1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4sIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEFYRG9udXRDaGFydE9wdGlvbiB9IGZyb20gJy4vZG9udXQtY2hhcnQudHlwZSc7XG5cbmV4cG9ydCBjb25zdCBBWERvbnV0Q2hhcnREZWZhdWx0Q29uZmlnOiBBWERvbnV0Q2hhcnRPcHRpb24gPSB7XG4gIHNob3dUb29sdGlwOiB0cnVlLFxuICBzaG93RGF0YUxhYmVsczogdHJ1ZSxcbiAgZG9udXRXaWR0aDogMzUsXG4gIGNvcm5lclJhZGl1czogNCxcbiAgYW5pbWF0aW9uRHVyYXRpb246IDgwMCxcbiAgYW5pbWF0aW9uRWFzaW5nOiAnY3ViaWMtb3V0Jyxcbn07XG5cbmV4cG9ydCBjb25zdCBBWF9ET05VVF9DSEFSVF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48QVhEb251dENoYXJ0T3B0aW9uPignQVhfRE9OVVRfQ0hBUlRfQ09ORklHJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6ICgpID0+IHtcbiAgICBjb25zdCBnbG9iYWwgPSBpbmplY3QoQVhfR0xPQkFMX0NPTkZJRyk7XG4gICAgc2V0KGdsb2JhbCwgJ2NoYXJ0LmRvbnV0Q2hhcnQnLCBBWERvbnV0Q2hhcnREZWZhdWx0Q29uZmlnKTtcbiAgICByZXR1cm4gQVhEb251dENoYXJ0RGVmYXVsdENvbmZpZztcbiAgfSxcbn0pO1xuXG5leHBvcnQgdHlwZSBQYXJ0aWFsRG9udXRDaGFydENvbmZpZyA9IFBhcnRpYWw8QVhEb251dENoYXJ0T3B0aW9uPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGRvbnV0Q2hhcnRDb25maWcoY29uZmlnOiBQYXJ0aWFsRG9udXRDaGFydENvbmZpZyA9IHt9KTogQVhEb251dENoYXJ0T3B0aW9uIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIC4uLkFYRG9udXRDaGFydERlZmF1bHRDb25maWcsXG4gICAgLi4uY29uZmlnLFxuICB9O1xuICByZXR1cm4gcmVzdWx0O1xufVxuIl19","import { AX_CHART_COLOR_PALETTE, getChartColor } 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([]);\n /** Chart options input */\n options = input({});\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);\n _rendered = signal(false);\n _isInitialAnimating = signal(false);\n // Tooltip state\n _tooltipVisible = signal(false);\n _tooltipPosition = signal({ x: 0, y: 0 });\n _tooltipData = signal({\n title: '',\n value: 0,\n percentage: '0%',\n color: '',\n });\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 });\n // Data accessor for handling different incoming data formats\n chartDataArray = computed(() => {\n return this.data() || [];\n });\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 // this.effectiveOptions();\n // Only update if already rendered\n untracked(() => {\n if (this._rendered()) {\n this.updateChart();\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) {\n if (this._isInitialAnimating())\n return;\n if (!this.svg)\n return;\n const transitionDuration = 150;\n // Helper to unhighlight all segments and reset them to their normal state\n const unhighlightAllSegments = () => {\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', 'scale(1)')\n .style('filter', null)\n .style('opacity', 1);\n this.segmentHover.emit(null);\n };\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 if (id === null) {\n unhighlightAllSegments();\n return;\n }\n const targetSegment = this.svg.selectAll('path').filter((d) => d?.data?.id === id);\n if (targetSegment.empty()) {\n unhighlightAllSegments(); // Target not found, so unhighlight all\n return;\n }\n const isCurrentlyHighlighted = targetSegment.classed('ax-donut-chart-highlighted');\n if (isCurrentlyHighlighted) {\n unhighlightAllSegments(); // Toggle off if already highlighted\n }\n else {\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) // Ensure not highlighted\n .classed('ax-donut-chart-dimmed', true)\n .transition()\n .duration(transitionDuration)\n .attr('transform', 'scale(1)') // Reset scale if it was previously highlighted\n .style('filter', null) // Remove filter if it had one\n .style('opacity', 0.5); // Dim opacity\n // Highlight the target segment\n targetSegment\n .classed('ax-donut-chart-dimmed', false) // Ensure not dimmed\n .classed('ax-donut-chart-highlighted', true)\n .transition()\n .duration(transitionDuration)\n .attr('transform', 'scale(1.02)')\n .style('filter', 'url(#ax-donut-chart-segment-shadow)') // Apply shadow\n .style('opacity', 1); // Ensure full opacity\n this.segmentHover.emit(getSegmentDataById(id));\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) {\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 everything in the container\n this.d3?.select(this.chartContainerEl().nativeElement).selectAll('*').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 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').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.d3.select(container).selectAll('*').remove();\n const messageContainer = this.d3\n .select(container)\n .append('div')\n // Apply generic container class and specific background class\n .attr('class', 'ax-donut-chart-no-data-message');\n messageContainer\n .append('div')\n // Apply generic icon class and specific donut chart icon class\n .attr('class', 'ax-chart-message-icon ax-donut-chart-no-data-icon')\n .html('<i class=\"fa-light fa-chart-pie fa-2x\"></i>'); // Donut chart icon\n messageContainer\n .append('div')\n // Apply generic text class and specific donut chart text class\n .attr('class', 'ax-chart-message-text ax-donut-chart-no-data-text')\n .text('No data available');\n messageContainer\n .append('div')\n // Apply generic help class and specific donut chart help class\n .attr('class', 'ax-chart-message-help ax-donut-chart-no-data-help')\n .text('Please provide data to display the chart');\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.d3.select(container).selectAll('*').remove();\n const messageContainer = this.d3\n .select(container)\n .append('div')\n // Apply generic container class and specific background class\n .attr('class', 'ax-donut-chart-no-data-message');\n messageContainer\n .append('div')\n // Apply generic icon class and specific donut chart icon class if any distinction is needed later\n .attr('class', 'ax-chart-message-icon ax-donut-chart-no-data-icon')\n .html('<i class=\"fa-light fa-eye-slash fa-2x\"></i>');\n messageContainer\n .append('div')\n // Apply generic text class and specific donut chart text class if needed\n .attr('class', 'ax-chart-message-text ax-donut-chart-no-data-text')\n .text('All segments are hidden');\n messageContainer\n .append('div')\n // Apply generic help class and specific donut chart help class if needed\n .attr('class', 'ax-chart-message-help ax-donut-chart-no-data-help')\n .text('Please toggle visibility of at least one segment');\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 hover arc for animation\n const hoverArc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(radius + 10)\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 = this.getEasingFunction(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', (event, d) => {\n this.handleSegmentLeave(event, d, arc);\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 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 // Add data labels if enabled\n if (this.effectiveOptions().showDataLabels) {\n // Calculate optimal font size based on segment size and chart dimensions\n const calculateFontSize = (d) => {\n // Calculate angle size in radians for the segment\n const angleSize = d.endAngle - d.startAngle;\n // Calculate the segment's percentage of the whole\n const segmentPercentage = (d.data.value / total) * 100;\n // Base minimum font size on segment size\n const minFontSize = segmentPercentage < 5\n ? 0 // Hide very small segments\n : segmentPercentage < 10\n ? 7 // Smaller font for small segments\n : segmentPercentage < 15\n ? 8 // Medium font for medium segments\n : 9; // Regular font for large segments\n // Adjust font size based on chart size\n return Math.min(Math.max(minFontSize, (angleSize * radius) / 10), 12);\n };\n // Format percentage value with appropriate precision\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 labels = this.svg\n .selectAll('.ax-donut-chart-data-label')\n .data(this.pieData)\n .enter()\n .append('text')\n .attr('class', 'ax-donut-chart-data-label')\n .style('opacity', 0)\n .style('fill', 'rgb(var(--ax-comp-donut-chart-data-labels-color))')\n .attr('transform', (d) => {\n // Calculate the centroid position for the label\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) => {\n // Calculate percentage for labels\n const percentage = (d.data.value / total) * 100;\n // Only show if segment is large enough to display text\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 // Animate labels\n labels\n .transition()\n .duration(animationDuration)\n .delay((d, i) => i * 50 + 200)\n .style('opacity', 1);\n }\n // Determine when all animations are complete\n const numSegments = this.pieData.length;\n let maxIndividualDelay = 0;\n if (numSegments > 0) {\n // Base delay for segments\n maxIndividualDelay = (numSegments - 1) * 50;\n if (this.effectiveOptions().showDataLabels) {\n // Labels have an additional fixed delay\n maxIndividualDelay = Math.max(maxIndividualDelay, (numSegments - 1) * 50 + 200);\n }\n }\n const totalAnimationCycleTime = maxIndividualDelay + animationDuration;\n setTimeout(() => {\n this._isInitialAnimating.set(false);\n this.cdr.detectChanges();\n }, totalAnimationCycleTime);\n }\n /**\n * Gets the appropriate D3 easing function based on the option string\n */\n getEasingFunction(easing) {\n switch (easing) {\n case 'linear':\n return this.d3.easeLinear;\n case 'ease':\n return this.d3.easePolyInOut;\n case 'ease-in':\n return this.d3.easePolyIn;\n case 'ease-out':\n return this.d3.easePolyOut;\n case 'ease-in-out':\n return this.d3.easePolyInOut;\n case 'cubic':\n return this.d3.easeCubic;\n case 'cubic-in':\n return this.d3.easeCubicIn;\n case 'cubic-out':\n return this.d3.easeCubicOut;\n case 'cubic-in-out':\n return this.d3.easeCubicInOut;\n default:\n return this.d3.easeCubicOut; // Default easing\n }\n }\n /**\n * Handle hover effects on a segment\n */\n handleSliceHover(event, datum) {\n if (this._isInitialAnimating())\n return;\n if (this.effectiveOptions().showTooltip !== false) {\n 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(event, d, normalArc) {\n if (this._isInitialAnimating())\n return;\n // Hide tooltip\n this._tooltipVisible.set(false);\n this.cdr.detectChanges();\n // Emit null to indicate no segment is hovered - highlightSegment will handle this.\n // this.segmentHover.emit(null); // Removed\n // Remove hover effect (visual style related to classes and scale)\n // Calling highlightSegment with the ID of the segment being left.\n // If it was highlighted, this will toggle it off and emit null for segmentHover.\n this.highlightSegment(d.data.id);\n // Animate the arc back to normal for the specific segment being left.\n this.d3\n .select(event.currentTarget)\n .transition()\n .duration(200)\n .attr('d', (arcData) => normalArc(arcData)); // Ensure arcData is used if 'd' is shadowed\n }\n /**\n * Updates tooltip position\n * Ensures the tooltip is visible by adjusting position when near edges\n */\n updateTooltipPosition(event) {\n const container = this.chartContainerEl().nativeElement.getBoundingClientRect();\n const tooltipEl = this.chartContainerEl().nativeElement.querySelector('.chart-tooltip');\n if (!tooltipEl) {\n const x = event.clientX - container.left;\n const y = event.clientY - container.top;\n this._tooltipPosition.set({ x, y });\n return;\n }\n const tooltipRect = tooltipEl.getBoundingClientRect();\n const cursorX = event.clientX - container.left;\n const cursorY = event.clientY - container.top;\n const gap = 20; // Gap between cursor and tooltip\n // Position tooltip to the right by default\n let x = cursorX + gap / 3;\n // If tooltip would go off the right edge, position it to the left\n if (x + tooltipRect.width > container.width) {\n x = cursorX - tooltipRect.width - gap;\n }\n // Keep tooltip within container bounds\n x = Math.max(gap, Math.min(x, container.width - tooltipRect.width - gap));\n const y = Math.max(gap, Math.min(cursorY, container.height - tooltipRect.height - gap));\n this._tooltipPosition.set({ x, y });\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 }\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.0.4\", ngImport: i0, type: AXDonutChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.0.4\", 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()\\\" tabindex=\\\"0\\\">\\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: var(--ax-sys-color-lightest-surface);--ax-comp-donut-chart-data-labels-color: var(--ax-sys-color-dark);--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;color:rgb(var(--ax-comp-donut-chart-data-labels-color));background-color:rgb(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-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-donut-chart-bg-color));padding:1.5rem;border-radius:.5rem;box-shadow:0 2px 12px #00000014;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.0.4\", 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()\\\" tabindex=\\\"0\\\">\\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: var(--ax-sys-color-lightest-surface);--ax-comp-donut-chart-data-labels-color: var(--ax-sys-color-dark);--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;color:rgb(var(--ax-comp-donut-chart-data-labels-color));background-color:rgb(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-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-donut-chart-bg-color));padding:1.5rem;border-radius:.5rem;box-shadow:0 2px 12px #00000014;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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9udXQtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2RvbnV0LWNoYXJ0L3NyYy9saWIvZG9udXQtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2RvbnV0LWNoYXJ0L3NyYy9saWIvZG9udXQtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHNCQUFzQixFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZFLE9BQU8sRUFBRSx1QkFBdUIsRUFBc0IsTUFBTSw4QkFBOEIsQ0FBQztBQUUzRixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBR1QsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDOztBQUc3RDs7O0dBR0c7QUFTSCxNQUFNLE9BQU8scUJBQXFCO0lBQ2hDLHVCQUF1QjtJQUNmLEdBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUV4QyxTQUFTO0lBQ1QsdUJBQXVCO0lBQ3ZCLElBQUksR0FBRyxLQUFLLENBQW9CLEVBQUUsQ0FBQyxDQUFDO0lBRXBDLDBCQUEwQjtJQUMxQixPQUFPLEdBQUcsS0FBSyxDQUFxQixFQUFFLENBQUMsQ0FBQztJQUV4QyxVQUFVO0lBQ1Ysd0NBQXdDO0lBQ3hDLFlBQVksR0FBRyxNQUFNLEVBQW9CLENBQUM7SUFFMUM7O09BRUc7SUFDSCxZQUFZLEdBQUcsTUFBTSxFQUEyQixDQUFDO0lBRWpELDRCQUE0QjtJ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QUFFO2dCQUNYLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLFdBQVcsS0FBSyxHQUFHLENBQUMsRUFBRTtnQkFDMUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNqQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztnQkFDekMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHO2dCQUN2RixNQUFNLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2FBQ3RDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7dUdBdnpCVSxxQkFBcUI7MkZBQXJCLHFCQUFxQixzaEJDcENsQyxzVkFTQSwydUNEd0JZLHVCQUF1Qjs7MkZBR3RCLHFCQUFxQjtrQkFSakMsU0FBUzsrQkFDRSxnQkFBZ0IsaUJBR1gsaUJBQWlCLENBQUMsSUFBSSxXQUM1QixDQUFDLHVCQUF1QixDQUFDLG1CQUNqQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVhfQ0hBUlRfQ09MT1JfUEFMRVRURSwgZ2V0Q2hhcnRDb2xvciB9IGZyb20gJ0BhY29yZXgvY2hhcnRzJztcbmltcG9ydCB7IEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlLCBBWENoYXJ0TGVnZW5kSXRlbSB9IGZyb20gJ0BhY29yZXgvY2hhcnRzL2NoYXJ0LWxlZ2VuZCc7XG5pbXBvcnQgeyBBWENoYXJ0VG9vbHRpcENvbXBvbmVudCwgQVhDaGFydFRvb2x0aXBEYXRhIH0gZnJvbSAnQGFjb3JleC9jaGFydHMvY2hhcnQtdG9vbHRpcCc7XG5cbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBPbkRlc3Ryb3ksXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBhZnRlck5leHRSZW5kZXIsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxuICB1bnRyYWNrZWQsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBWF9ET05VVF9DSEFSVF9DT05GSUcgfSBmcm9tICcuL2RvbnV0LWNoYXJ0LmNvbmZpZyc7XG5pbXBvcnQgeyBBWERvbnV0Q2hhcnREYXRhLCBBWERvbnV0Q2hhcnRPcHRpb24sIEFYRG9udXRDaGFydFZhbHVlIH0gZnJvbSAnLi9kb251dC1jaGFydC50eXBlJztcblxuLyoqXG4gKiBEb251dCBDaGFydCBDb21wb25lbnRcbiAqIERpc3BsYXlzIGRhdGEgaW4gYSBjaXJjdWxhciBkb251dCBjaGFydCB3aXRoIGludGVyYWN0aXZlIHNlZ21lbnRzXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2F4LWRvbnV0LWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RvbnV0LWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZG9udXQtY2hhcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW0FYQ2hhcnRUb29sdGlwQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFYRG9udXRDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQVhDaGFydExlZ2VuZENvbXBhdGlibGUge1xuICAvLyBEZXBlbmRlbmN5IEluamVjdGlvblxuICBwcml2YXRlIGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLy8gSW5wdXRzXG4gIC8qKiBDaGFydCBkYXRhIGlucHV0ICovXG4gIGRhdGEgPSBpbnB1dDxBWERvbnV0Q2hhcnRWYWx1ZT4oW10pO1xuXG4gIC8qKiBDaGFydCBvcHRpb25zIGlucHV0ICovXG4gIG9wdGlvbnMgPSBpbnB1dDxBWERvbnV0Q2hhcnRPcHRpb24+KHt9KTtcblxuICAvLyBPdXRwdXRzXG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBzZWdtZW50IGlzIGNsaWNrZWQgKi9cbiAgc2VnbWVudENsaWNrID0gb3V0cHV0PEFYRG9udXRDaGFydERhdGE+KCk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiBhIHNlZ21lbnQgaGFzIG1vdXNlIGhvdmVyXG4gICAqIENhbiBiZSB1c2VkIGJ5IGV4dGVybmFsIGVsZW1lbnRzIHRvIGhpZ2hsaWdodCB0aGlzIHNlZ21lbnRcbiAgICovXG4gIHNlZ21lbnRIb3ZlciA9IG91dHB1dDxBWERvbnV0Q2hhcnREYXRhIHwgbnVsbD4oKTtcblxuICAvLyBDaGFydCBjb250YWluZXIgcmVmZXJlbmNlXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnRDb250YWluZXJFbCA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ2NoYXJ0Q29udGFpbmVyJyk7XG5cbiAgLy8gRDMgcmVmZXJlbmNlIC0gbG9hZGVkIGFzeW5jaHJvbm91c2x5XG4gIHByb3RlY3RlZCBkMyE6IHR5cGVvZiBpbXBvcnQoJ2QzJyk7XG5cbiAgLy8gQ2hhcnQgU1ZHIHJlZmVyZW5jZVxuICBwcml2YXRlIHN2ZyE6IGFueTtcbiAgcHJpdmF0ZSBwaWVEYXRhOiBhbnlbXSA9IFtdO1xuXG4gIC8vIFN0YXRlIG1hbmFnZW1lbnRcbiAgcHJpdmF0ZSBoaWRkZW5TZWdtZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIF9pbml0aWFsaXplZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX3JlbmRlcmVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfaXNJbml0aWFsQW5pbWF0aW5nID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBUb29sdGlwIHN0YXRlXG4gIHByaXZhdGUgX3Rvb2x0aXBWaXNpYmxlID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfdG9vbHRpcFBvc2l0aW9uID0gc2lnbmFsKHsgeDogMCwgeTogMCB9KTtcbiAgcHJpdmF0ZSBfdG9vbHRpcERhdGEgPSBzaWduYWw8QVhDaGFydFRvb2x0aXBEYXRhPih7XG4gICAgdGl0bGU6ICcnLFxuICAgIHZhbHVlOiAwLFxuICAgIHBlcmNlbnRhZ2U6ICcwJScsXG4gICAgY29sb3I6ICcnLFxuICB9KTtcblxuICAvLyBQdWJsaWMgY29tcHV0ZWQgcHJvcGVydGllcyBmb3IgdGhlIHRlbXBsYXRlXG4gIHByb3RlY3RlZCB0b29sdGlwVmlzaWJsZSA9IHRoaXMuX3Rvb2x0aXBWaXNpYmxlLmFzUmVhZG9ubHkoKTtcbiAgcHJvdGVjdGVkIHRvb2x0aXBQb3NpdGlvbiA9IHRoaXMuX3Rvb2x0aXBQb3NpdGlvbi5hc1JlYWRvbmx5KCk7XG4gIHByb3RlY3RlZCB0b29sdGlwRGF0YSA9IHRoaXMuX3Rvb2x0aXBEYXRhLmFzUmVhZG9ubHkoKTtcblxuICAvLyBJbmplY3QgY29uZmlndXJhdGlvblxuICBwcml2YXRlIGNvbmZpZ1Rva2VuID0gaW5qZWN0KEFYX0RPTlVUX0NIQVJUX0NPTkZJRyk7XG5cbiAgLy8gSW5qZWN0IHRoZSBjaGFydCBjb2xvcnNcbiAgcHJpdmF0ZSBjaGFydENvbG9ycyA9IGluamVjdChBWF9DSEFSVF9DT0xPUl9QQUxFVFRFKTtcblxuICAvLyBDb21wdXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgcHJvdGVjdGVkIGVmZmVjdGl2ZU9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uZmlnVG9rZW4sXG4gICAgICAuLi50aGlzLm9wdGlvbnMoKSxcbiAgICB9O1xuICB9KTtcblxuICAvLyBEYXRhIGFjY2Vzc29yIGZvciBoYW5kbGluZyBkaWZmZXJlbnQgaW5jb21pbmcgZGF0YSBmb3JtYXRzXG4gIHByb3RlY3RlZCBjaGFydERhdGFBcnJheSA9IGNvbXB1dGVkKCgpOiBBWERvbnV0Q2hhcnREYXRhW10gPT4ge1xuICAgIHJldHVybiB0aGlzLmRhdGEoKSB8fCBbXTtcbiAgfSk7XG5cbiAgLy8gQ29sb3IgYWNjZXNzb3IgbWV0aG9kXG4gIHByb3RlY3RlZCBnZXRDb2xvcihpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0Q2hhcnRDb2xvcihpbmRleCwgdGhpcy5jaGFydENvbG9ycyk7XG4gIH1cblxuICAvLyBTZWdtZW50IHZpc2liaWxpdHkgY2hlY2tcbiAgcHJvdGVjdGVkIGlzU2VnbWVudEhpZGRlbihpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGlkZGVuU2VnbWVudHMuaGFzKGlkKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIER5bmFtaWNhbGx5IGxvYWQgRDMgYW5kIGluaXRpYWxpemUgdGhlIGNoYXJ0IHdoZW4gdGhlIGNvbXBvbmVudCBpcyByZWFkeVxuICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG4gICAgICB0aGlzLl9pbml0aWFsaXplZC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLmxvYWREMygpO1xuICAgIH0pO1xuICB9XG5cbiAgI2VmZiA9IGVmZmVjdCgoKSA9PiB7XG4gICAgLy8gQWNjZXNzIGlucHV0cyB0byB0cmFjayB0aGVtXG4gICAgdGhpcy5kYXRhKCk7XG4gICAgLy8gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCk7XG5cbiAgICAvLyBPbmx5IHVwZGF0ZSBpZiBhbHJlYWR5IHJlbmRlcmVkXG4gICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9yZW5kZXJlZCgpKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEhpZ2hsaWdodHMgYSBzcGVjaWZpYyBzZWdtZW50IGJ5IElEXG4gICAqIEBwYXJhbSBpZCBUaGUgc2VnbWVudCBJRCB0byBoaWdobGlnaHQsIG9yIG51bGwgdG8gY2xlYXIgaGlnaGxpZ2h0XG4gICAqL1xuICBoaWdobGlnaHRTZWdtZW50KGlkOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzSW5pdGlhbEFuaW1hdGluZygpKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLnN2ZykgcmV0dXJuO1xuXG4gICAgY29uc3QgdHJhbnNpdGlvbkR1cmF0aW9uID0gMTUwO1xuXG4gICAgLy8gSGVscGVyIHRvIHVuaGlnaGxpZ2h0IGFsbCBzZWdtZW50cyBhbmQgcmVzZXQgdGhlbSB0byB0aGVpciBub3JtYWwgc3RhdGVcbiAgICBjb25zdCB1bmhpZ2hsaWdodEFsbFNlZ21lbnRzID0gKCkgPT4ge1xuICAgICAgdGhpcy5zdmdcbiAgICAgICAgLnNlbGVjdEFsbCgncGF0aCcpXG4gICAgICAgIC5jbGFzc2VkKCdheC1kb251dC1jaGFydC1oaWdobGlnaHRlZCcsIGZhbHNlKVxuICAgICAgICAuY2xhc3NlZCgnYXgtZG9udXQtY2hhcnQtZGltbWVkJywgZmFsc2UpXG4gICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbilcbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICdzY2FsZSgxKScpXG4gICAgICAgIC5zdHlsZSgnZmlsdGVyJywgbnVsbClcbiAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMSk7XG4gICAgICB0aGlzLnNlZ21lbnRIb3Zlci5lbWl0KG51bGwpO1xuICAgIH07XG5cbiAgICAvLyBIZWxwZXIgdG8gZ2V0IGZ1bGwgZGF0YSBmb3IgdGhlIHNlZ21lbnQgSURcbiAgICBjb25zdCBnZXRTZWdtZW50RGF0YUJ5SWQgPSAoc2VnbWVudElkOiBzdHJpbmcpOiBBWERvbnV0Q2hhcnREYXRhIHwgbnVsbCA9PiB7XG4gICAgICByZXR1cm4gdW50cmFja2VkKCgpID0+IHRoaXMuY2hhcnREYXRhQXJyYXkoKSkuZmluZCgoZCkgPT4gZC5pZCA9PT0gc2VnbWVudElkKSB8fCBudWxsO1xuICAgIH07XG5cbiAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgIHVuaGlnaGxpZ2h0QWxsU2VnbWVudHMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRTZWdtZW50ID0gdGhpcy5zdmcuc2VsZWN0QWxsKCdwYXRoJykuZmlsdGVyKChkOiBhbnkpID0+IGQ/LmRhdGE/LmlkID09PSBpZCk7XG5cbiAgICBpZiAodGFyZ2V0U2VnbWVudC5lbXB0eSgpKSB7XG4gICAgICB1bmhpZ2hsaWdodEFsbFNlZ21lbnRzKCk7IC8vIFRhcmdldCBub3QgZm91bmQsIHNvIHVuaGlnaGxpZ2h0IGFsbFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzQ3VycmVudGx5SGlnaGxpZ2h0ZWQgPSB0YXJnZXRTZWdtZW50LmNsYXNzZWQoJ2F4LWRvbnV0LWNoYXJ0LWhpZ2hsaWdodGVkJyk7XG5cbiAgICBpZiAoaXNDdXJyZW50bHlIaWdobGlnaHRlZCkge1xuICAgICAgdW5oaWdobGlnaHRBbGxTZWdtZW50cygpOyAvLyBUb2dnbGUgb2ZmIGlmIGFscmVhZHkgaGlnaGxpZ2h0ZWRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGltIGFsbCBzZWdtZW50cyB0aGF0IGFyZSBOT1QgdGhlIHRhcmdldFxuICAgICAgdGhpcy5zdmdcbiAgICAgICAgLnNlbGVjdEFsbCgncGF0aCcpXG4gICAgICAgIC5maWx0ZXIoKGQ6IGFueSkgPT4gZD8uZGF0YT8uaWQgIT09IGlkKVxuICAgICAgICAuY2xhc3NlZCgnYXgtZG9udXQtY2hhcnQtaGlnaGxpZ2h0ZWQnLCBmYWxzZSkgLy8gRW5zdXJlIG5vdCBoaWdobGlnaHRlZFxuICAgICAgICAuY2xhc3NlZCgnYXgtZG9udXQtY2hhcnQtZGltbWVkJywgdHJ1ZSlcbiAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKVxuICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3NjYWxlKDEpJykgLy8gUmVzZXQgc2NhbGUgaWYgaXQgd2FzIHByZXZpb3VzbHkgaGlnaGxpZ2h0ZWRcbiAgICAgICAgLnN0eWxlKCdmaWx0ZXInLCBudWxsKSAvLyBSZW1vdmUgZmlsdGVyIGlmIGl0IGhhZCBvbmVcbiAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMC41KTsgLy8gRGltIG9wYWNpdHlcblxuICAgICAgLy8gSGlnaGxpZ2h0IHRoZSB0YXJnZXQgc2VnbWVudFxuICAgICAgdGFyZ2V0U2VnbWVudFxuICAgICAgICAuY2xhc3NlZCgnYXgtZG9udXQtY2hhcnQtZGltbWVkJywgZmFsc2UpIC8vIEVuc3VyZSBub3QgZGltbWVkXG4gICAgICAgIC5jbGFzc2VkKCdheC1kb251dC1jaGFydC1oaWdobGlnaHRlZCcsIHRydWUpXG4gICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbilcbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICdzY2FsZSgxLjAyKScpXG4gICAgICAgIC5zdHlsZSgnZmlsdGVyJywgJ3VybCgjYXgtZG9udXQtY2hhcnQtc2VnbWVudC1zaGFkb3cpJykgLy8gQXBwbHkgc2hhZG93XG4gICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDEpOyAvLyBFbnN1cmUgZnVsbCBvcGFjaXR5XG5cbiAgICAgIHRoaXMuc2VnbWVudEhvdmVyLmVtaXQoZ2V0U2VnbWVudERhdGFCeUlkKGlkKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgdmlzaWJpbGl0eSBvZiBhIHNlZ21lbnQgYnkgSURcbiAgICogQHBhcmFtIGlkIFNlZ21lbnQgSUQgdG8gdG9nZ2xlXG4gICAqIEByZXR1cm5zIE5ldyB2aXNpYmlsaXR5IHN0YXRlICh0cnVlID0gdmlzaWJsZSwgZmFsc2UgPSBoaWRkZW4pXG4gICAqL1xuICB0b2dnbGVTZWdtZW50KGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCB3YXNBbGxIaWRkZW4gPVxuICAgICAgdGhpcy5jaGFydERhdGFBcnJheSgpLmxlbmd0aCA+IDAgJiYgdGhpcy5jaGFydERhdGFBcnJheSgpLmV2ZXJ5KChkKSA9PiB0aGlzLmlzU2VnbWVudEhpZGRlbihkLmlkKSk7XG5cbiAgICBpZiAodGhpcy5oaWRkZW5TZWdtZW50cy5oYXMoaWQpKSB7XG4gICAgICAvLyBNYWtpbmcgYSBzZWdtZW50IHZpc2libGVcbiAgICAgIHRoaXMuaGlkZGVuU2VnbWVudHMuZGVsZXRlKGlkKTtcblxuICAgICAgLy8gSWYgYWxsIHNlZ21lbnRzIHdlcmUgcHJldmlvdXNseSBoaWRkZW4sIHdlIG5lZWQgdG8gZW5zdXJlIHRoZSBtZXNzYWdlIGlzIGNsZWFyZWRcbiAgICAgIGlmICh3YXNBbGxIaWRkZW4pIHtcbiAgICAgICAgLy8gRm9yY2UgY29tcGxldGUgRE9NIGNsZWFudXAgYW5kIHJlZHJhd1xuICAgICAgICBpZiAodGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBDbGVhciBldmVyeXRoaW5nIGluIHRoZSBjb250YWluZXJcbiAgICAgICAgICB0aGlzLmQzPy5zZWxlY3QodGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudCkuc2VsZWN0QWxsKCcqJykucmVtb3ZlKCk7XG5cbiAgICAgICAgICAvLyBGb3JjZSBmdWxsIHJlZHJhd1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhpZGluZyBhIHNlZ21lbnRcbiAgICAgIHRoaXMuaGlkZGVuU2VnbWVudHMuYWRkKGlkKTtcbiAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gIXRoaXMuaXNTZWdtZW50SGlkZGVuKGlkKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cENoYXJ0KCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgRDMuanMgZHluYW1pY2FsbHlcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBsb2FkRDMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZDMgPSBhd2FpdCBpbXBvcnQoJ2QzJyk7XG4gICAgICAvLyBJZiBjb250YWluZXIgaXMgcmVhZHksIGNyZWF0ZSBjaGFydFxuICAgICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKCkgJiYgdGhpcy5jaGFydENvbnRhaW5lckVsKCkpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICAgICAgICB0aGlzLl9yZW5kZXJlZC5zZXQodHJ1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIEQzLmpzOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TZWdtZW50Q2xpY2soaXRlbTogQVhEb251dENoYXJ0RGF0YSk6IHZvaWQge1xuICAgIC8vIHRoaXMudG9nZ2xlU2VnbWVudFZpc2liaWxpdHkoaXRlbS5pZCk7XG4gICAgdGhpcy5zZWdtZW50Q2xpY2suZW1pdChpdGVtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBkb251dCBjaGFydFxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kMyB8fCAhdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudDtcblxuICAgICAgdGhpcy5jbGVhckNoYXJ0KGNvbnRhaW5lckVsZW1lbnQpO1xuXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5jaGFydERhdGFBcnJheSgpO1xuXG4gICAgICBpZiAoIWRhdGEgfHwgZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zaG93Tm9EYXRhTWVzc2FnZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEZpbHRlciBvdXQgaGlkZGVuIHNlZ21lbnRzXG4gICAgICBjb25zdCB2aXNpYmxlRGF0YSA9IGRhdGEuZmlsdGVyKChpdGVtKSA9PiAhdGhpcy5oaWRkZW5TZWdtZW50cy5oYXMoaXRlbS5pZCkpO1xuXG4gICAgICAvLyBJZiBhbGwgc2VnbWVudHMgYXJlIGhpZGRlbiwgc2hvdyBtZXNzYWdlXG4gICAgICBpZiAodmlzaWJsZURhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuc2hvd0FsbFNlZ21lbnRzSGlkZGVuTWVzc2FnZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKTtcbiAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5zZXR1cERpbWVuc2lvbnMoY29udGFpbmVyRWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICB0aGlzLnJlbmRlckRvbnV0Q2hhcnQoY29udGFpbmVyRWxlbWVudCwgd2lkdGgsIGhlaWdodCwgdmlzaWJsZURhdGEpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBjcmVhdGluZyBkb251dCBjaGFydDonLCBlcnJvcik7XG4gICAgICB0aGlzLmhhbmRsZUNoYXJ0RXJyb3IoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY2hhcnQgd2l0aCBuZXcgZGF0YVxuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTsgLy8gUmVjcmVhdGUgdGhlIGNoYXJ0IHdpdGggdXBkYXRlZCBkYXRhXG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIHRoZSBjaGFydCBjb250YWluZXJcbiAgICovXG4gIHByaXZhdGUgY2xlYXJDaGFydChjb250YWluZXI6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5kMy5zZWxlY3QoY29udGFpbmVyKS5zZWxlY3RBbGwoJ3N2ZycpLnJlbW92ZSgpO1xuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSBtZXNzYWdlIHdoZW4gbm8gZGF0YSBpcyBhdmFpbGFibGVcbiAgICovXG4gIHByaXZhdGUgc2hvd05vRGF0YU1lc3NhZ2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLmQzLnNlbGVjdChjb250YWluZXIpLnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpO1xuXG4gICAgY29uc3QgbWVzc2FnZUNvbnRhaW5lciA9IHRoaXMuZDNcbiAgICAgIC5zZWxlY3QoY29udGFpbmVyKVxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC8vIEFwcGx5IGdlbmVyaWMgY29udGFpbmVyIGNsYXNzIGFuZCBzcGVjaWZpYyBiYWNrZ3JvdW5kIGNsYXNzXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtZG9udXQtY2hhcnQtbm8tZGF0YS1tZXNzYWdlJyk7XG5cbiAgICBtZXNzYWdlQ29udGFpbmVyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLy8gQXBwbHkgZ2VuZXJpYyBpY29uIGNsYXNzIGFuZCBzcGVjaWZpYyBkb251dCBjaGFydCBpY29uIGNsYXNzXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtY2hhcnQtbWVzc2FnZS1pY29uIGF4LWRvbnV0LWNoYXJ0LW5vLWRhdGEtaWNvbicpXG4gICAgICAuaHRtbCgnPGkgY2xhc3M9XCJmYS1saWdodCBmYS1jaGFydC1waWUgZmEtMnhcIj48L2k+Jyk7IC8vIERvbnV0IGNoYXJ0IGljb25cblxuICAgIG1lc3NhZ2VDb250YWluZXJcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAvLyBBcHBseSBnZW5lcmljIHRleHQgY2xhc3MgYW5kIHNwZWNpZmljIGRvbnV0IGNoYXJ0IHRleHQgY2xhc3NcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1jaGFydC1tZXNzYWdlLXRleHQgYXgtZG9udXQtY2hhcnQtbm8tZGF0YS10ZXh0JylcbiAgICAgIC50ZXh0KCdObyBkYXRhIGF2YWlsYWJsZScpO1xuXG4gICAgbWVzc2FnZUNvbnRhaW5lclxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC8vIEFwcGx5IGdlbmVyaWMgaGVscCBjbGFzcyBhbmQgc3BlY2lmaWMgZG9udXQgY2hhcnQgaGVscCBjbGFzc1xuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWNoYXJ0LW1lc3NhZ2UtaGVscCBheC1kb251dC1jaGFydC1uby1kYXRhLWhlbHAnKVxuICAgICAgLnRleHQoJ1BsZWFzZSBwcm92aWRlIGRhdGEgdG8gZGlzcGxheSB0aGUgY2hhcnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG1lc3NhZ2Ugd2hlbiBhbGwgc2VnbWVudHMgYXJlIGhpZGRlblxuICAgKi9cbiAgcHJpdmF0ZSBzaG93QWxsU2VnbWVudHNIaWRkZW5NZXNzYWdlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5kMy5zZWxlY3QoY29udGFpbmVyKS5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKTtcblxuICAgIGNvbnN0IG1lc3NhZ2VDb250YWluZXIgPSB0aGlzLmQzXG4gICAgICAuc2VsZWN0KGNvbnRhaW5lcilcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAvLyBBcHBseSBnZW5lcmljIGNvbnRhaW5lciBjbGFzcyBhbmQgc3BlY2lmaWMgYmFja2dyb3VuZCBjbGFzc1xuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWRvbnV0LWNoYXJ0LW5vLWRhdGEtbWVzc2FnZScpO1xuXG4gICAgbWVzc2FnZUNvbnRhaW5lclxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC8vIEFwcGx5IGdlbmVyaWMgaWNvbiBjbGFzcyBhbmQgc3BlY2lmaWMgZG9udXQgY2hhcnQgaWNvbiBjbGFzcyBpZiBhbnkgZGlzdGluY3Rpb24gaXMgbmVlZGVkIGxhdGVyXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtY2hhcnQtbWVzc2FnZS1pY29uIGF4LWRvbnV0LWNoYXJ0LW5vLWRhdGEtaWNvbicpXG4gICAgICAuaHRtbCgnPGkgY2xhc3M9XCJmYS1saWdodCBmYS1leWUtc2xhc2ggZmEtMnhcIj48L2k+Jyk7XG5cbiAgICBtZXNzYWdlQ29udGFpbmVyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLy8gQXBwbHkgZ2VuZXJpYyB0ZXh0IGNsYXNzIGFuZCBzcGVjaWZpYyBkb251dCBjaGFydCB0ZXh0IGNsYXNzIGlmIG5lZWRlZFxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWNoYXJ0LW1lc3NhZ2UtdGV4dCBheC1kb251dC1jaGFydC1uby1kYXRhLXRleHQnKVxuICAgICAgLnRleHQoJ0FsbCBzZWdtZW50cyBhcmUgaGlkZGVuJyk7XG5cbiAgICBtZXNzYWdlQ29udGFpbmVyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLy8gQXBwbHkgZ2VuZXJpYyBoZWxwIGNsYXNzIGFuZCBzcGVjaWZpYyBkb251dCBjaGFydCBoZWxwIGNsYXNzIGlmIG5lZWRlZFxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWNoYXJ0LW1lc3NhZ2UtaGVscCBheC1kb251dC1jaGFydC1uby1kYXRhLWhlbHAnKVxuICAgICAgLnRleHQoJ1BsZWFzZSB0b2dnbGUgdmlzaWJpbGl0eSBvZiBhdCBsZWFzdCBvbmUgc2VnbWVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwcyBjaGFydCBkaW1lbnNpb25zIGJhc2VkIG9uIGNvbnRhaW5lciBhbmQgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cERpbWVuc2lvbnMoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9uczogQVhEb251dENoYXJ0T3B0aW9uKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICAvLyBHZXQgY29udGFpbmVyIGRpbWVuc2lvbnMgb3IgdXNlIGRlZmF1bHRzXG4gICAgY29uc3QgY29udGFpbmVyV2lkdGggPSBjb250YWluZXIuY2xpZW50V2lkdGggfHwgNDAwO1xuICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHQgfHwgNDAwO1xuXG4gICAgLy8gRW5zdXJlIG1pbmltdW0gZGltZW5zaW9ucyBmb3IgdGhlIGNoYXJ0XG4gICAgY29uc3QgbWluRGltID0gMjAwO1xuICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgob3B0aW9ucz8ud2lkdGggfHwgY29udGFpbmVyV2lkdGgsIG1pbkRpbSk7XG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgob3B0aW9ucz8uaGVpZ2h0IHx8IGNvbnRhaW5lckhlaWdodCwgbWluRGltKTtcblxuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBkb251dCBjaGFydCB3aXRoIHZpc2libGUgZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJEb251dENoYXJ0KFxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICB2aXNpYmxlRGF0YTogQVhEb251dENoYXJ0RGF0YVtdLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB0b3RhbCA9IHZpc2libGVEYXRhLnJlZHVjZSgoc3VtLCBpdGVtKSA9PiBzdW0gKyBpdGVtLnZhbHVlLCAwKTtcblxuICAgIC8vIENyZWF0ZSBTVkcgY29udGFpbmVyIHdpdGggZmlsdGVyc1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuY3JlYXRlU3ZnV2l0aEZpbHRlcnMoY29udGFpbmVyLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgIC8vIENyZWF0ZSBtYWluIGNoYXJ0IGdyb3VwXG4gICAgdGhpcy5zdmcgPSBzdmcuYXBwZW5kKCdnJykuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3dpZHRoIC8gMn0sICR7aGVpZ2h0IC8gMn0pYCk7XG5cbiAgICAvLyBDcmVhdGUgZG9udXQgc2VnbWVudHNcbiAgICB0aGlzLmNyZWF0ZURvbnV0U2VnbWVudHMod2lkdGgsIGhlaWdodCwgdmlzaWJsZURhdGEsIHRvdGFsKTtcblxuICAgIC8vIEFkZCB0b3RhbCBpbiBjZW50ZXJcbiAgICB0aGlzLmFkZENlbnRlckRpc3BsYXkodG90YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBTVkcgZWxlbWVudCB3aXRoIGZpbHRlciBkZWZpbml0aW9ucyBmb3Igc2hhZG93c1xuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVTdmdXaXRoRmlsdGVycyhjb250YWluZXI6IEhUTUxFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IGFueSB7XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5kM1xuICAgICAgLnNlbGVjdChjb250YWluZXIpXG4gICAgICAuYXBwZW5kKCdzdmcnKVxuICAgICAgLmF0dHIoJ3dpZHRoJywgJzEwMCUnKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsICcxMDAlJylcbiAgICAgIC5hdHRyKCd2aWV3Qm94JywgYDAgMCAke3dpZHRofSAke2hlaWdodH1gKVxuICAgICAgLmF0dHIoJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLCAneE1pZFlNaWQgbWVldCcpO1xuXG4gICAgLy8gQWRkIGRyb3Agc2hhZG93IGZpbHRlclxuICAgIGNvbnN0IGRlZnMgPSBzdmcuYXBwZW5kKCdkZWZzJyk7XG4gICAgY29uc3QgZmlsdGVyID0gZGVmcy5hcHBlbmQoJ2ZpbHRlcicpLmF0dHIoJ2lkJywgJ2F4LWRvbnV0LWNoYXJ0LXNlZ21lbnQtc2hhZG93JykuYXR0cignaGVpZ2h0JywgJzEzMCUnKTtcblxuICAgIGZpbHRlci5hcHBlbmQoJ2ZlR2F1c3NpYW5CbHVyJykuYXR0cignaW4nLCAnU291cmNlQWxwaGEnKS5hdHRyKCdzdGREZXZpYXRpb24nLCAyKS5hdHRyKCdyZXN1bHQnLCAnYmx1cicpO1xuICAgIGZpbHRlci5hcHBlbmQoJ2ZlT2Zmc2V0JykuYXR0cignaW4nLCAnYmx1cicpLmF0dHIoJ2R4JywgMSkuYXR0cignZHknLCAxKS5hdHRyKCdyZXN1bHQnLCAnb2Zmc2V0Qmx1cicpO1xuXG4gICAgY29uc3QgZmVDb21wb25lbnRUcmFuc2ZlciA9IGZpbHRlclxuICAgICAgLmFwcGVuZCgnZmVDb21wb25lbnRUcmFuc2ZlcicpXG4gICAgICAuYXR0cignaW4nLCAnb2Zmc2V0Qmx1cicpXG4gICAgICAuYXR0cigncmVzdWx0JywgJ29mZnNldEJsdXInKTtcblxuICAgIGZlQ29tcG9uZW50VHJhbnNmZXIuYXBwZW5kKCdmZUZ1bmNBJykuYXR0cigndHlwZScsICdsaW5lYXInKS5hdHRyKCdzbG9wZScsIDAuMyk7XG5cbiAgICBjb25zdCBmZU1lcmdlID0gZmlsdGVyLmFwcGVuZCgnZmVNZXJnZScpO1xuICAgIGZlTWVyZ2UuYXBwZW5kKCdmZU1lcmdlTm9kZScpLmF0dHIoJ2luJywgJ29mZnNldEJsdXInKTtcbiAgICBmZU1lcmdlLmFwcGVuZCgnZmVNZXJnZU5vZGUnKS5hdHRyKCdpbicsICdTb3VyY2VHcmFwaGljJyk7XG5cbiAgICByZXR1cm4gc3ZnO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbmQgcmVuZGVyIHRoZSBkb251dCBzZWdtZW50cyB3aXRoIGFuaW1hdGlvbnNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRG9udXRTZWdtZW50cyhjaGFydFdpZHRoOiBudW1iZXIsIGNoYXJ0SGVpZ2h0OiBudW1iZXIsIGRhdGE6IEFYRG9udXRDaGFydERhdGFbXSwgdG90YWw6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2lzSW5pdGlhbEFuaW1hdGluZy5zZXQodHJ1ZSk7XG5cbiAgICAvLyBDcmVhdGUgcGllIGxheW91dFxuICAgIGNvbnN0IHBpZSA9IHRoaXMuZDNcbiAgICAgIC5waWU8QVhEb251dENoYXJ0RGF0YT4oKVxuICAgICAgLnZhbHVlKChkKSA9PiBkLnZhbHVlKVxuICAgICAgLnNvcnQobnVsbClcbiAgICAgIC5wYWRBbmdsZSgwLjAyKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgcmFkaXVzIG9mIHRoZSBkb251dCBjaGFydFxuICAgIGNvbnN0IHJhZGl1cyA9IChNYXRoLm1pbihjaGFydFdpZHRoLCBjaGFydEhlaWdodCkgLyAyKSAqIDAuODU7XG5cbiAgICAvLyBDYWxjdWxhdGUgaW5uZXIgcmFkaXVzIGJhc2VkIG9uIGRvbnV0V2lkdGggcGVyY2VudGFnZVxuICAgIGNvbnN0IGRvbnV0V2lkdGhQZXJjZW50ID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuZG9udXRXaWR0aCAvIDEwMDtcbiAgICBjb25zdCBpbm5lclJhZGl1cyA9IHJhZGl1cyAqICgxIC0gZG9udXRXaWR0aFBlcmNlbnQpO1xuXG4gICAgLy8gQ3JlYXRlIGFyYyBnZW5lcmF0b3Igd2l0aCB0aGUgY29uZmlndXJlZCByYWRpdXMgYW5kIGNvcm5lciByYWRpdXNcbiAgICBjb25zdCBhcmMgPSB0aGlzLmQzXG4gICAgICAuYXJjKClcbiAgICAgIC5pbm5lclJhZGl1cyhpbm5lclJhZGl1cylcbiAgICAgIC5vdXRlclJhZGl1cyhyYWRpdXMgKiAwLjk1KVxuICAgICAgLmNvcm5lclJhZGl1cyh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5jb3JuZXJSYWRpdXMpO1xuXG4gICAgLy8gQ3JlYXRlIGhvdmVyIGFyYyBmb3IgYW5pbWF0aW9uXG4gICAgY29uc3QgaG92ZXJBcmMgPSB0aGlzLmQzXG4gICAgICAuYXJjKClcbiAgICAgIC5pbm5lclJhZGl1cyhpbm5lclJhZGl1cylcbiAgICAgIC5vdXRlclJhZGl1cyhyYWRpdXMgKyAxMClcbiAgICAgIC5jb3JuZXJSYWRpdXModGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuY29ybmVyUmFkaXVzKTtcblxuICAgIC8vIENyZWF0ZSBsYWJlbCBhcmMgZ2VuZXJhdG9yIGZvciBwbGFjaW5nIGxhYmVscyAobWlkZGxlIG9mIHRoZSBkb251dCByaW5nKVxuICAgIGNvbnN0IGxhYmVsQXJjID0gdGhpcy5kM1xuICAgICAgLmFyYygpXG4gICAgICAuaW5uZXJSYWRpdXMoaW5uZXJSYWRpdXMgKyAocmFkaXVzICogMC45NSAtIGlubmVyUmFkaXVzKSAvIDIpXG4gICAgICAub3V0ZXJSYWRpdXMoaW5uZXJSYWRpdXMgKyAocmFkaXVzICogMC45NSAtIGlubmVyUmFkaXVzKSAvIDIpO1xuXG4gICAgLy8gR2V0IGFuaW1hdGlvbiBvcHRpb25zXG4gICAgY29uc3QgYW5pbWF0aW9uRHVyYXRpb24gPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5hbmltYXRpb25EdXJhdGlvbjtcbiAgICBjb25zdCBhbmltYXRpb25FYXNpbmcgPSB0aGlzLmdldEVhc2luZ0Z1bmN0aW9uKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkVhc2luZyk7XG5cbiAgICAvLyBHZW5lcmF0ZSBwaWUgZGF0YVxuICAgIHRoaXMucGllRGF0YSA9IHBpZShkYXRhKTtcblxuICAgIC8vIEFkZCBzZWdtZW50cyB3aXRoIGFuaW1hdGlvblxuICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy5zdmdcbiAgICAgIC5zZWxlY3RBbGwoJ3BhdGgnKVxuICAgICAgLmRhdGEodGhpcy5waWVEYXRhKVxuICAgICAgLmVudGVyKClcbiAgICAgIC5hcHBlbmQoJ3BhdGgnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWRvbnV0LWNoYXJ0LXNlZ21lbnQnKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAoZDogYW55IC8qIGQgaXMgUGllQXJjRGF0dW08QVhEb251dENoYXJ0RGF0YT4gKi8pID0+IHtcbiAgICAgICAgY29uc3QgY2hhcnRJdGVtID0gZC5kYXRhIGFzIEFYRG9udXRDaGFydERhdGE7IC8vIEFYRG9udXRDaGFydERhdGEgZnJvbSB2aXNpYmxlRGF0YVxuICAgICAgICBpZiAoY2hhcnRJdGVtLmNvbG9yKSB7XG4gICAgICAgICAgLy8gUHJpb3JpdGl6ZSBleHBsaWNpdCBjb2xvciBvbiB0aGUgaXRlbVxuICAgICAgICAgIHJldHVybiBjaGFydEl0ZW0uY29sb3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFsbGJhY2s6IGZpbmQgb3JpZ2luYWwgaW5kZXggZm9yIGNvbnNpc3RlbnQgcGFsZXR0ZSBjb2xvclxuICAgICAgICBjb25zdCBvcmlnaW5hbEZ1bGxEYXRhID0gdW50cmFja2VkKCgpID0+IHRoaXMuY2hhcnREYXRhQXJyYXkoKSk7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsSW5kZXggPSBvcmlnaW5hbEZ1bGxEYXRhLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gY2hhcnRJdGVtLmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29sb3Iob3JpZ2luYWxJbmRleCAhPT0gLTEgPyBvcmlnaW5hbEluZGV4IDogMCk7IC8vIEVuc3VyZSB2YWxpZCBpbmRleFxuICAgICAgfSlcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApXG4gICAgICAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJykgLy8gQWRkIGN1cnNvciBwb2ludGVyIHRvIHNlZ21lbnRzXG4gICAgICAub24oJ21vdXNlZW50ZXInLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dUb29sdGlwKSByZXR1cm47XG4gICAgICAgIHRoaXMuaGFuZGxlU2xpY2VIb3ZlcihldmVudCwgZC5kYXRhKTtcbiAgICAgIH0pXG4gICAgICAub24oJ21vdXNlbGVhdmUnLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZVNlZ21lbnRMZWF2ZShldmVudCwgZCwgYXJjKTtcbiAgICAgIH0pXG4gICAgICAub24oJ21vdXNlbW92ZScsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fdG9vbHRpcFZpc2libGUoKSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5vbignY2xpY2snLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uU2VnbWVudENsaWNrKGQuZGF0YSk7XG4gICAgICB9KTtcblxuICAgIC8vIEFuaW1hdGUgc2VnbWVudHNcbiAgICBzZWdtZW50c1xuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgLmVhc2UoYW5pbWF0aW9uRWFzaW5nKVxuICAgICAgLmRlbGF5KChkOiBhbnksIGk6IG51bWJlcikgPT4gaSAqIDUwKVxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICAgIC5hdHRyVHdlZW4oJ2QnLCAoZDogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGludGVycG9sYXRlID0gdGhpcy5kMy5pbnRlcnBvbGF0ZSh7IHN0YXJ0QW5nbGU6IGQuc3RhcnRBbmdsZSwgZW5kQW5nbGU6IGQuc3RhcnRBbmdsZSB9LCBkKTtcbiAgICAgICAgcmV0dXJuICh0OiBudW1iZXIpID0+IGFyYyhpbnRlcnBvbGF0ZSh0KSkgYXMgc3RyaW5nO1xuICAgICAgfSk7XG5cbiAgICAvLyBBZGQgZGF0YSBsYWJlbHMgaWYgZW5hYmxlZFxuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93RGF0YUxhYmVscykge1xuICAgICAgLy8gQ2FsY3VsYXRlIG9wdGltYWwgZm9udCBzaXplIGJhc2VkIG9uIHNlZ21lbnQgc2l6ZSBhbmQgY2hhcnQgZGltZW5zaW9uc1xuICAgICAgY29uc3QgY2FsY3VsYXRlRm9udFNpemUgPSAoZDogYW55KSA9PiB7XG4gICAgICAgIC8vIENhbGN1bGF0ZSBhbmdsZSBzaXplIGluIHJhZGlhbnMgZm9yIHRoZSBzZWdtZW50XG4gICAgICAgIGNvbnN0IGFuZ2xlU2l6ZSA9IGQuZW5kQW5nbGUgLSBkLnN0YXJ0QW5nbGU7XG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgc2VnbWVudCdzIHBlcmNlbnRhZ2Ugb2YgdGhlIHdob2xlXG4gICAgICAgIGNvbnN0IHNlZ21lbnRQZXJjZW50YWdlID0gKGQuZGF0YS52YWx1ZSAvIHRvdGFsKSAqIDEwMDtcblxuICAgICAgICAvLyBCYXNlIG1pbmltdW0gZm9udCBzaXplIG9uIHNlZ21lbnQgc2l6ZVxuICAgICAgICBjb25zdCBtaW5Gb250U2l6ZSA9XG4gICAgICAgICAgc2VnbWVudFBlcmNlbnRhZ2UgPCA1XG4gICAgICAgICAgICA/IDAgLy8gSGlkZSB2ZXJ5IHNtYWxsIHNlZ21lbnRzXG4gICAgICAgICAgICA6IHNlZ21lbnRQZXJjZW50YWdlIDwgMTBcbiAgICAgICAgICAgICAgPyA3IC8vIFNtYWxsZXIgZm9udCBmb3Igc21hbGwgc2VnbWVudHNcbiAgICAgICAgICAgICAgOiBzZWdtZW50UGVyY2VudGFnZSA8IDE1XG4gICAgICAgICAgICAgICAgPyA4IC8vIE1lZGl1bSBmb250IGZvciBtZWRpdW0gc2VnbWVudHNcbiAgICAgICAgICAgICAgICA6IDk7IC8vIFJlZ3VsYXIgZm9udCBmb3IgbGFyZ2Ugc2VnbWVudHNcblxuICAgICAgICAvLyBBZGp1c3QgZm9udCBzaXplIGJhc2VkIG9uIGNoYXJ0IHNpemVcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KG1pbkZvbnRTaXplLCAoYW5nbGVTaXplICogcmFkaXVzKSAvIDEwKSwgMTIpO1xuICAgICAgfTtcblxuICAgICAgLy8gRm9ybWF0IHBlcmNlbnRhZ2UgdmFsdWUgd2l0aCBhcHByb3ByaWF0ZSBwcmVjaXNpb25cbiAgICAgIGNvbnN0IGZvcm1hdFBlcmNlbnRhZ2UgPSAodmFsdWU6IG51bWJlcikgPT4ge1xuICAgICAgICBpZiAodmFsdWUgPCAxKSByZXR1cm4gJzwxJSc7XG4gICAgICAgIGlmICh2YWx1ZSA8IDEwKSByZXR1cm4gYCR7dmFsdWUudG9GaXhlZCgxKX0lYDtcbiAgICAgICAgcmV0dXJuIGAke01hdGgucm91bmQodmFsdWUpfSVgO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgbGFiZWxzID0gdGhpcy5zdmdcbiAgICAgICAgLnNlbGVjdEFsbCgnLmF4LWRvbnV0LWNoYXJ0LWRhdGEtbGFiZWwnKVxuICAgICAgICAuZGF0YSh0aGlzLnBpZURhdGEpXG4gICAgICAgIC5lbnRlcigpXG4gICAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnYXgtZG9udXQtY2hhcnQtZGF0YS1sYWJlbCcpXG4gICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApXG4gICAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1kb251dC1jaGFydC1kYXRhLWxhYmVscy1jb2xvcikpJylcbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIChkKSA9PiB7XG4gICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBjZW50cm9pZCBwb3NpdGlvbiBmb3IgdGhlIGxhYmVsXG4gICAgICAgICAgY29uc3QgY2VudHJvaWQgPSBsYWJlbEFyYy5jZW50cm9pZChkKTtcbiAgICAgICAgICByZXR1cm4gYHRyYW5zbGF0ZSgke2NlbnRyb2lkWzBdfSwgJHtjZW50cm9pZFsxXX0pYDtcbiAgICAgICAgfSlcbiAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAgIC5hdHRyKCdkb21pbmFudC1iYXNlbGluZScsICdtaWRkbGUnKVxuICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIChkKSA9PiBgJHtjYWxjdWxhdGVGb250U2l6ZShkKX1weGApXG4gICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAoZCkgPT4gKChkLmRhdGEudmFsdWUgLyB0b3RhbCkgKiAxMDAgPj0gMTUgPyAnNjAwJyA6ICc1MDAnKSlcbiAgICAgICAgLnRleHQoKGQpID0+IHtcbiAgICAgICAgICAvLyBDYWxjdWxhdGUgcGVyY2VudGFnZSBmb3IgbGFiZWxzXG4gICAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9IChkLmRhdGEudmFsdWUgLyB0b3RhbCkgKiAxMDA7XG4gICAgICAgICAgLy8gT25seSBzaG93IGlmIHNlZ21lbnQgaXMgbGFyZ2UgZW5vdWdoIHRvIGRpc3BsYXkgdGV4dFxuICAgICAgICAgIGlmIChwZXJjZW50YWdlIDwgMSkgcmV0dXJuICcnO1xuICAgICAgICAgIGNvbnN0IGxhYmVsID0gZC5kYXRhLmxhYmVsIHx8ICcnO1xuICAgICAgICAgIGNvbnN0IHBlcmNlbnRhZ2VUZXh0ID0gZm9ybWF0UGVyY2VudGFnZShwZXJjZW50YWdlKTtcbiAgICAgICAgICByZXR1cm4gbGFiZWwgPyBgJHtsYWJlbH0gKCR7cGVyY2VudGFnZVRleHR9KWAgOiBwZXJjZW50YWdlVGV4dDtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIEFuaW1hdGUgbGFiZWxzXG4gICAgICBsYWJlbHNcbiAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAuZHVyYXRpb24oYW5pbWF0aW9uRHVyYXRpb24pXG4gICAgICAgIC5kZWxheSgoZDogYW55LCBpOiBudW1iZXIpID0+IGkgKiA1MCArIDIwMClcbiAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMSk7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIHdoZW4gYWxsIGFuaW1hdGlvbnMgYXJlIGNvbXBsZXRlXG4gICAgY29uc3QgbnVtU2VnbWVudHMgPSB0aGlzLnBpZURhdGEubGVuZ3RoO1xuICAgIGxldCBtYXhJbmRpdmlkdWFsRGVsYXkgPSAwO1xuICAgIGlmIChudW1TZWdtZW50cyA+IDApIHtcbiAgICAgIC8vIEJhc2UgZGVsYXkgZm9yIHNlZ21lbnRzXG4gICAgICBtYXhJbmRpdmlkdWFsRGVsYXkgPSAobnVtU2VnbWVudHMgLSAxKSAqIDUwO1xuICAgICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dEYXRhTGFiZWxzKSB7XG4gICAgICAgIC8vIExhYmVscyBoYXZlIGFuIGFkZGl0aW9uYWwgZml4ZWQgZGVsYXlcbiAgICAgICAgbWF4SW5kaXZpZHVhbERlbGF5ID0gTWF0aC5tYXgobWF4SW5kaXZpZHVhbERlbGF5LCAobnVtU2VnbWVudHMgLSAxKSAqIDUwICsgMjAwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgdG90YWxBbmltYXRpb25DeWNsZVRpbWUgPSBtYXhJbmRpdmlkdWFsRGVsYXkgKyBhbmltYXRpb25EdXJhdGlvbjtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5faXNJbml0aWFsQW5pbWF0aW5nLnNldChmYWxzZSk7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSwgdG90YWxBbmltYXRpb25DeWNsZVRpbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIEQzIGVhc2luZyBmdW5jdGlvbiBiYXNlZCBvbiB0aGUgb3B0aW9uIHN0cmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRFYXNpbmdGdW5jdGlvbihlYXNpbmc/OiBzdHJpbmcpOiBhbnkge1xuICAgIHN3aXRjaCAoZWFzaW5nKSB7XG4gICAgICBjYXNlICdsaW5lYXInOlxuICAgICAgICByZXR1cm4gdGhpcy5kMy5lYXNlTGluZWFyO1xuICAgICAgY2FzZSAnZWFzZSc6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VQb2x5SW5PdXQ7XG4gICAgICBjYXNlICdlYXNlLWluJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZDMuZWFzZVBvbHlJbjtcbiAgICAgIGNhc2UgJ2Vhc2Utb3V0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZDMuZWFzZVBvbHlPdXQ7XG4gICAgICBjYXNlICdlYXNlLWluLW91dCc6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VQb2x5SW5PdXQ7XG4gICAgICBjYXNlICdjdWJpYyc6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VDdWJpYztcbiAgICAgIGNhc2UgJ2N1YmljLWluJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZDMuZWFzZUN1YmljSW47XG4gICAgICBjYXNlICdjdWJpYy1vdXQnOlxuICAgICAgICByZXR1cm4gdGhpcy5kMy5lYXNlQ3ViaWNPdXQ7XG4gICAgICBjYXNlICdjdWJpYy1pbi1vdXQnOlxuICAgICAgICByZXR1cm4gdGhpcy5kMy5lYXNlQ3ViaWNJbk91dDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VDdWJpY091dDsgLy8gRGVmYXVsdCBlYXNpbmdcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGhvdmVyIGVmZmVjdHMgb24gYSBzZWdtZW50XG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVNsaWNlSG92ZXIoZXZlbnQ6IE1vdXNlRXZlbnQsIGRhdHVtOiBBWERvbnV0Q2hhcnREYXRhKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzSW5pdGlhbEFuaW1hdGluZygpKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd1Rvb2x0aXAgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuZGF0YSgpLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZGF0dW0uaWQpO1xuICAgICAgY29uc3QgY29sb3IgPSBkYXR1bS5jb2xvciB8fCBnZXRDaGFydENvbG9yKGluZGV4LCB0aGlzLmNoYXJ0Q29sb3JzKTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIHBlcmNlbnRhZ2Ugb2YgdG90YWxcbiAgICAgIC8vIEVuc3VyZSBkYXRhKCkgaXMgYWNjZXNzZWQgd2l0aGluIGEgdHJhY2tpbmcgY29udGV4dCBpZiBpdCdzIGEgc2lnbmFsLCBvciB1c2UgdW50cmFja2VkIGlmIGFwcHJvcHJpYXRlXG4gICAgICBjb25zdCB0b3RhbCA9IHVudHJhY2tlZCgoKSA9PiB0aGlzLmRhdGEoKSkucmVkdWNlKChzdW0sIGl0ZW0pID0+IHN1bSArIGl0ZW0udmFsdWUsIDApO1xuICAgICAgY29uc3QgcGVyY2VudGFnZSA9IHRvdGFsID4gMCA/ICgoZGF0dW0udmFsdWUgLyB0b3RhbCkgKiAxMDApLnRvRml4ZWQoMSkgOiAnMCc7XG5cbiAgICAgIHRoaXMuX3Rvb2x0aXBEYXRhLnNldCh7XG4gICAgICAgIHRpdGxlOiBkYXR1bS50b29sdGlwTGFiZWwgfHwgZGF0dW0ubGFiZWwsXG4gICAgICAgIHZhbHVlOiBkYXR1bS52YWx1ZS50b1N0cmluZygpLFxuICAgICAgICBwZXJjZW50YWdlOiBgJHtwZXJjZW50YWdlfSVgLFxuICAgICAgICBjb2xvcjogY29sb3IsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICAgICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KHRydWUpO1xuICAgIH1cbiAgICB0aGlzLmhpZ2hsaWdodFNlZ21lbnQoZGF0dW0uaWQpOyAvLyBUaGlzIHdpbGwgbm93IGFsc28gaGFuZGxlIGVtaXR0aW5nIHNlZ21lbnRIb3ZlclxuICAgIC8vIE5vIGRpcmVjdCBzZWdtZW50SG92ZXIuZW1pdChkYXR1bSkgaGVyZSBhbnltb3JlXG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBtb3VzZSBsZWF2ZSBmcm9tIHNlZ21lbnRzXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVNlZ21lbnRMZWF2ZShldmVudDogTW91c2VFdmVudCwgZDogYW55LCBub3JtYWxBcmM6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcoKSkgcmV0dXJuO1xuXG4gICAgLy8gSGlkZSB0b29sdGlwXG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAvLyBFbWl0IG51bGwgdG8gaW5kaWNhdGUgbm8gc2VnbWVudCBpcyBob3ZlcmVkIC0gaGlnaGxpZ2h0U2VnbWVudCB3aWxsIGhhbmRsZSB0aGlzLlxuICAgIC8vIHRoaXMuc2VnbWVudEhvdmVyLmVtaXQobnVsbCk7IC8vIFJlbW92ZWRcblxuICAgIC8vIFJlbW92ZSBob3ZlciBlZmZlY3QgKHZpc3VhbCBzdHlsZSByZWxhdGVkIHRvIGNsYXNzZXMgYW5kIHNjYWxlKVxuICAgIC8vIENhbGxpbmcgaGlnaGxpZ2h0U2VnbWVudCB3aXRoIHRoZSBJRCBvZiB0aGUgc2VnbWVudCBiZWluZyBsZWZ0LlxuICAgIC8vIElmIGl0IHdhcyBoaWdobGlnaHRlZCwgdGhpcyB3aWxsIHRvZ2dsZSBpdCBvZmYgYW5kIGVtaXQgbnVsbCBmb3Igc2VnbWVudEhvdmVyLlxuICAgIHRoaXMuaGlnaGxpZ2h0U2VnbWVudChkLmRhdGEuaWQpO1xuXG4gICAgLy8gQW5pbWF0ZSB0aGUgYXJjIGJhY2sgdG8gbm9ybWFsIGZvciB0aGUgc3BlY2lmaWMgc2VnbWVudCBiZWluZyBsZWZ0LlxuICAgIHRoaXMuZDNcbiAgICAgIC5zZWxlY3QoZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudClcbiAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgIC5kdXJhdGlvbigyMDApXG4gICAgICAuYXR0cignZCcsIChhcmNEYXRhKSA9PiBub3JtYWxBcmMoYXJjRGF0YSkpOyAvLyBFbnN1cmUgYXJjRGF0YSBpcyB1c2VkIGlmICdkJyBpcyBzaGFkb3dlZFxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdG9vbHRpcCBwb3NpdGlvblxuICAgKiBFbnN1cmVzIHRoZSB0b29sdGlwIGlzIHZpc2libGUgYnkgYWRqdXN0aW5nIHBvc2l0aW9uIHdoZW4gbmVhciBlZGdlc1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHRvb2x0aXBFbCA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmNoYXJ0LXRvb2x0aXAnKTtcblxuICAgIGlmICghdG9vbHRpcEVsKSB7XG4gICAgICBjb25zdCB4ID0gZXZlbnQuY2xpZW50WCAtIGNvbnRhaW5lci5sZWZ0O1xuICAgICAgY29uc3QgeSA9IGV2ZW50LmNsaWVudFkgLSBjb250YWluZXIudG9wO1xuICAgICAgdGhpcy5fdG9vbHRpcFBvc2l0aW9uLnNldCh7IHgsIHkgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdG9vbHRpcFJlY3QgPSB0b29sdGlwRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgY3Vyc29yWCA9IGV2ZW50LmNsaWVudFggLSBjb250YWluZXIubGVmdDtcbiAgICBjb25zdCBjdXJzb3JZID0gZXZlbnQuY2xpZW50WSAtIGNvbnRhaW5lci50b3A7XG4gICAgY29uc3QgZ2FwID0gMjA7IC8vIEdhcCBiZXR3ZWVuIGN1cnNvciBhbmQgdG9vbHRpcFxuXG4gICAgLy8gUG9zaXRpb24gdG9vbHRpcCB0byB0aGUgcmlnaHQgYnkgZGVmYXVsdFxuICAgIGxldCB4ID0gY3Vyc29yWCArIGdhcCAvIDM7XG5cbiAgICAvLyBJZiB0b29sdGlwIHdvdWxkIGdvIG9mZiB0aGUgcmlnaHQgZWRnZSwgcG9zaXRpb24gaXQgdG8gdGhlIGxlZnRcbiAgICBpZiAoeCArIHRvb2x0aXBSZWN0LndpZHRoID4gY29udGFpbmVyLndpZHRoKSB7XG4gICAgICB4ID0gY3Vyc29yWCAtIHRvb2x0aXBSZWN0LndpZHRoIC0gZ2FwO1xuICAgIH1cblxuICAgIC8vIEtlZXAgdG9vbHRpcCB3aXRoaW4gY29udGFpbmVyIGJvdW5kc1xuICAgIHggPSBNYXRoLm1heChnYXAsIE1hdGgubWluKHgsIGNvbnRhaW5lci53aWR0aCAtIHRvb2x0aXBSZWN0LndpZHRoIC0gZ2FwKSk7XG4gICAgY29uc3QgeSA9IE1hdGgubWF4KGdhcCwgTWF0aC5taW4oY3Vyc29yWSwgY29udGFpbmVyLmhlaWdodCAtIHRvb2x0aXBSZWN0LmhlaWdodCAtIGdhcCkpO1xuXG4gICAgdGhpcy5fdG9vbHRpcFBvc2l0aW9uLnNldCh7IHgsIHkgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBjZW50ZXIgZGlzcGxheSB3aXRoIHRvdGFsIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGFkZENlbnRlckRpc3BsYXkodG90YWw6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdmcpIHJldHVybjtcblxuICAgIC8vIENhbGN1bGF0ZSBhcHByb3ByaWF0ZSBmb250IHNpemVzIGJhc2VkIG9uIGNoYXJ0IGRpbWVuc2lvbnNcbiAgICBjb25zdCBjaGFydENvbnRhaW5lcldpZHRoID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICBjb25zdCBiYXNlRm9udFNpemUgPSBNYXRoLm1heCgxLjQsIE1hdGgubWluKDIuNCwgY2hhcnRDb250YWluZXJXaWR0aCAvIDIwMCkpOyAvLyBTY2FsZSBiZXR3ZWVuIDEuNHJlbSBhbmQgMi40cmVtXG4gICAgY29uc3Qgc3ViVGV4dEZvbnRTaXplID0gYmFzZUZvbnRTaXplICogMC41O1xuXG4gICAgLy8gQ3JlYXRlIGdyb3VwIGZvciB0aGUgdG90YWwgZGlzcGxheVxuICAgIGNvbnN0IHRvdGFsRGlzcGxheSA9IHRoaXMuc3ZnXG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1kb251dC1jaGFydC10b3RhbC1kaXNwbGF5JylcbiAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKTtcblxuICAgIC8vIEFkZCB0b3RhbCB2YWx1ZVxuICAgIHRvdGFsRGlzcGxheVxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtZG9udXQtY2hhcnQtdG90YWwtdmFsdWUnKVxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBgJHtiYXNlRm9udFNpemV9cmVtYClcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNjAwJylcbiAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1kb251dC1jaGFydC12YWx1ZS1jb2xvcikpJylcbiAgICAgIC50ZXh0KHRvdGFsLnRvTG9jYWxlU3RyaW5nKCkpO1xuXG4gICAgLy8gQWRkIGxhYmVsXG4gICAgdG90YWxEaXNwbGF5XG4gICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1kb251dC1jaGFydC10b3RhbC1sYWJlbCcpXG4gICAgICAuYXR0cignZHknLCAnMS40ZW0nKVxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBgJHtzdWJUZXh0Rm9udFNpemV9cmVtYClcbiAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1kb251dC1jaGFydC12YWx1ZS1jb2xvcikpJylcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsICcwLjgnKVxuICAgICAgLnRleHQodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkudG90YWxMYWJlbCB8fCAnVG90YWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGNoYXJ0IHJlbmRlcmluZyBlcnJvcnNcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlQ2hhcnRFcnJvcigpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICB0aGlzLnNob3dOb0RhdGFNZXNzYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyB1cCBjaGFydCByZXNvdXJjZXNcbiAgICovXG4gIHByaXZhdGUgY2xlYW51cENoYXJ0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN2Zykge1xuICAgICAgdGhpcy5kMy5zZWxlY3QodGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpLnNlbGVjdEFsbCgnc3ZnJykucmVtb3ZlKCk7XG4gICAgICB0aGlzLnN2ZyA9IG51bGw7XG4gICAgICB0aGlzLnBpZURhdGEgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5oaWRkZW5TZWdtZW50cy5jbGVhcigpO1xuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbiBhY2Nlc3NpYmlsaXR5IGxhYmVsIGRlc2NyaWJpbmcgdGhlIGRvbnV0IGNoYXJ0IGZvciBzY3JlZW4gcmVhZGVyc1xuICAgKi9cbiAgcHJvdGVjdGVkIGdldEFjY2Vzc2liaWxpdHlMYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNoYXJ0RGF0YUFycmF5KCk7XG5cbiAgICBpZiAoIWRhdGEgfHwgZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnRW1wdHkgZG9udXQgY2hhcnQuIE5vIGRhdGEgYXZhaWxhYmxlLic7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIHRvdGFsXG4gICAgY29uc3QgdG90YWwgPSBkYXRhLnJlZHVjZSgoc3VtLCBpdGVtKSA9PiBzdW0gKyBpdGVtLnZhbHVlLCAwKTtcblxuICAgIC8vIEdlbmVyYXRlIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNoYXJ0IHdpdGggcGVyY2VudGFnZXNcbiAgICBjb25zdCBzZWdtZW50RGVzY3JpcHRpb25zID0gZGF0YVxuICAgICAgLm1hcCgoc2VnbWVudCkgPT4ge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKChzZWdtZW50LnZhbHVlIC8gdG90YWwpICogMTAwKS50b0ZpeGVkKDEpO1xuICAgICAgICByZXR1cm4gYCR7c2VnbWVudC5sYWJlbH06ICR7c2VnbWVudC52YWx1ZX0gKCR7cGVyY2VudGFnZX0lKWA7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJzsgJyk7XG5cbiAgICByZXR1cm4gYERvbnV0IGNoYXJ0IHdpdGggJHtkYXRhLmxlbmd0aH0gc2VnbWVudHMuIFRvdGFsIHZhbHVlOiAke3RvdGFsfS4gJHtzZWdtZW50RGVzY3JpcHRpb25zfWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGF0YSBpdGVtcyBmb3IgdGhlIGxlZ2VuZFxuICAgKiBAaW1wbGVtZW50cyBBWENoYXJ0TGVnZW5kQ29tcGF0aWJsZVxuICAgKi9cbiAgZ2V0TGVnZW5kSXRlbXMoKTogQVhDaGFydExlZ2VuZEl0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhcnREYXRhQXJyYXkoKS5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogaXRlbS5pZCxcbiAgICAgICAgbmFtZTogaXRlbS5sYWJlbCB8fCBgU2VnbWVudCAke2luZGV4ICsgMX1gLFxuICAgICAgICB2YWx1ZTogaXRlbS52YWx1ZSxcbiAgICAgICAgY29sb3I6IGl0ZW0uY29sb3IgfHwgdGhpcy5nZXRDb2xvcihpbmRleCksXG4gICAgICAgIHBlcmNlbnRhZ2U6IChpdGVtLnZhbHVlIC8gdGhpcy5kYXRhKCkucmVkdWNlKChzdW0sIGl0ZW0pID0+IHN1bSArIGl0ZW0udmFsdWUsIDApKSAqIDEwMCxcbiAgICAgICAgaGlkZGVuOiB0aGlzLmlzU2VnbWVudEhpZGRlbihpdGVtLmlkKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJheC1kb251dC1jaGFydFwiICNjaGFydENvbnRhaW5lciByb2xlPVwiaW1nXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJnZXRBY2Nlc3NpYmlsaXR5TGFiZWwoKVwiIHRhYmluZGV4PVwiMFwiPlxuICA8IS0tIFRvb2x0aXAgY29tcG9uZW50IC0tPlxuICA8YXgtY2hhcnQtdG9vbHRpcFxuICAgIFt2aXNpYmxlXT1cInRvb2x0aXBWaXNpYmxlKClcIlxuICAgIFtwb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24oKVwiXG4gICAgW2RhdGFdPVwidG9vbHRpcERhdGEoKVwiXG4gICAgW3Nob3dQZXJjZW50YWdlXT1cInRydWVcIlxuICA+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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"}