@acorex/charts 20.10.5 → 20.10.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/acorex-charts-bar-chart.mjs +2 -2
- package/fesm2022/acorex-charts-bar-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-donut-chart.mjs +2 -2
- package/fesm2022/acorex-charts-donut-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-funnel-chart.mjs +2 -2
- package/fesm2022/acorex-charts-funnel-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-gauge-chart.mjs +2 -2
- package/fesm2022/acorex-charts-gauge-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-heatmap-chart.mjs +2 -2
- package/fesm2022/acorex-charts-heatmap-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-hierarchy-chart.mjs +2 -2
- package/fesm2022/acorex-charts-hierarchy-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-line-chart.mjs +2 -2
- package/fesm2022/acorex-charts-line-chart.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-charts-gauge-chart.mjs","sources":["../tmp-esm2022/gauge-chart/lib/gauge-chart.config.js","../tmp-esm2022/gauge-chart/lib/gauge-chart.component.js","../tmp-esm2022/gauge-chart/acorex-charts-gauge-chart.js"],"sourcesContent":["import { AX_CHART_DEFAULT_MESSAGES } from '@acorex/charts';\nimport { InjectionToken } from '@angular/core';\nexport const AXGaugeChartDefaultConfig = {\n minValue: 0,\n maxValue: 100,\n gaugeWidth: 22,\n cornerRadius: 5,\n showValue: true,\n showTooltip: true,\n showDataLabels: true,\n animationDuration: 750,\n animationEasing: 'cubic-out',\n messages: {\n ...AX_CHART_DEFAULT_MESSAGES,\n noDataIcon: 'fa-light fa-gauge',\n },\n};\nexport const AX_GAUGE_CHART_CONFIG = new InjectionToken('AX_GAUGE_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXGaugeChartDefaultConfig,\n});\nexport function gaugeChartConfig(config = {}) {\n return {\n ...AXGaugeChartDefaultConfig,\n ...config,\n messages: {\n ...AXGaugeChartDefaultConfig.messages,\n ...config.messages,\n },\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F1Z2UtY2hhcnQuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2dhdWdlLWNoYXJ0L3NyYy9saWIvZ2F1Z2UtY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQXVCO0lBQzNELFFBQVEsRUFBRSxDQUFDO0lBQ1gsUUFBUSxFQUFFLEdBQUc7SUFDYixVQUFVLEVBQUUsRUFBRTtJQUNkLFlBQVksRUFBRSxDQUFDO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsSUFBSTtJQUNqQixjQUFjLEVBQUUsSUFBSTtJQUNwQixpQkFBaUIsRUFBRSxHQUFHO0lBQ3RCLGVBQWUsRUFBRSxXQUFXO0lBQzVCLFFBQVEsRUFBRTtRQUNSLEdBQUcseUJBQXlCO1FBQzVCLFVBQVUsRUFBRSxtQkFBbUI7S0FDaEM7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxjQUFjLENBQXFCLHVCQUF1QixFQUFFO0lBQ25HLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyx5QkFBeUI7Q0FDekMsQ0FBQyxDQUFDO0FBSUgsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFNBQWtDLEVBQUU7SUFDbkUsT0FBTztRQUNMLEdBQUcseUJBQXlCO1FBQzVCLEdBQUcsTUFBTTtRQUNULFFBQVEsRUFBRTtZQUNSLEdBQUcseUJBQXlCLENBQUMsUUFBUTtZQUNyQyxHQUFHLE1BQU0sQ0FBQyxRQUFRO1NBQ25CO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWF9DSEFSVF9ERUZBVUxUX01FU1NBR0VTIH0gZnJvbSAnQGFjb3JleC9jaGFydHMnO1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYR2F1Z2VDaGFydE9wdGlvbiB9IGZyb20gJy4vZ2F1Z2UtY2hhcnQudHlwZSc7XG5cbmV4cG9ydCBjb25zdCBBWEdhdWdlQ2hhcnREZWZhdWx0Q29uZmlnOiBBWEdhdWdlQ2hhcnRPcHRpb24gPSB7XG4gIG1pblZhbHVlOiAwLFxuICBtYXhWYWx1ZTogMTAwLFxuICBnYXVnZVdpZHRoOiAyMixcbiAgY29ybmVyUmFkaXVzOiA1LFxuICBzaG93VmFsdWU6IHRydWUsXG4gIHNob3dUb29sdGlwOiB0cnVlLFxuICBzaG93RGF0YUxhYmVsczogdHJ1ZSxcbiAgYW5pbWF0aW9uRHVyYXRpb246IDc1MCxcbiAgYW5pbWF0aW9uRWFzaW5nOiAnY3ViaWMtb3V0JyxcbiAgbWVzc2FnZXM6IHtcbiAgICAuLi5BWF9DSEFSVF9ERUZBVUxUX01FU1NBR0VTLFxuICAgIG5vRGF0YUljb246ICdmYS1saWdodCBmYS1nYXVnZScsXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgQVhfR0FVR0VfQ0hBUlRfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPEFYR2F1Z2VDaGFydE9wdGlvbj4oJ0FYX0dBVUdFX0NIQVJUX0NPTkZJRycsIHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICBmYWN0b3J5OiAoKSA9PiBBWEdhdWdlQ2hhcnREZWZhdWx0Q29uZmlnLFxufSk7XG5cbmV4cG9ydCB0eXBlIFBhcnRpYWxHYXVnZUNoYXJ0Q29uZmlnID0gUGFydGlhbDxBWEdhdWdlQ2hhcnRPcHRpb24+O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2F1Z2VDaGFydENvbmZpZyhjb25maWc6IFBhcnRpYWxHYXVnZUNoYXJ0Q29uZmlnID0ge30pOiBBWEdhdWdlQ2hhcnRPcHRpb24ge1xuICByZXR1cm4ge1xuICAgIC4uLkFYR2F1Z2VDaGFydERlZmF1bHRDb25maWcsXG4gICAgLi4uY29uZmlnLFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAuLi5BWEdhdWdlQ2hhcnREZWZhdWx0Q29uZmlnLm1lc3NhZ2VzLFxuICAgICAgLi4uY29uZmlnLm1lc3NhZ2VzLFxuICAgIH0sXG4gIH07XG59XG4iXX0=","import { AXChartComponent, computeTooltipPosition, createChartInstanceId, formatLargeNumber, getEasingFunction, mergeChartMessages, mergeChartOptions, renderChartEmptyMessage, } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation, afterNextRender, computed, effect, inject, input, signal, viewChild, } from '@angular/core';\nimport { AX_GAUGE_CHART_CONFIG } from './gauge-chart.config';\nimport * as i0 from \"@angular/core\";\n/**\n * Gauge Chart Component\n * Renders a semi-circular gauge chart with animated needle and thresholds\n */\nexport class AXGaugeChartComponent extends AXChartComponent {\n // Inputs\n /** Chart value input */\n value = input(0, ...(ngDevMode ? [{ debugName: \"value\" }] : []));\n /** Chart options input */\n options = input({}, ...(ngDevMode ? [{ debugName: \"options\" }] : []));\n // Chart container reference\n chartContainerEl = viewChild.required('chartContainer');\n // SVG element reference (created in the code)\n svgElement = null;\n // D3 reference - loaded asynchronously\n d3;\n // Signals for component state\n _initialized = signal(false, ...(ngDevMode ? [{ debugName: \"_initialized\" }] : []));\n _rendered = signal(false, ...(ngDevMode ? [{ debugName: \"_rendered\" }] : []));\n _prevValue = signal(null, ...(ngDevMode ? [{ debugName: \"_prevValue\" }] : []));\n // Track previous options to detect changes\n _prevOptionsString = '';\n // Cache for container dimensions to avoid repeated DOM reads\n _lastContainerRect = null;\n // Tooltip signals\n _tooltipVisible = signal(false, ...(ngDevMode ? [{ debugName: \"_tooltipVisible\" }] : []));\n _tooltipPosition = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: \"_tooltipPosition\" }] : []));\n _tooltipData = signal({\n title: '',\n value: '',\n }, ...(ngDevMode ? [{ debugName: \"_tooltipData\" }] : []));\n _tooltipRafId = null;\n _pendingTooltipCoords = null;\n // Expose tooltip signals as read-only 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_GAUGE_CHART_CONFIG);\n // Computed configuration options\n effectiveOptions = computed(() => mergeChartOptions(this.configToken, this.options()), ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\n effectiveMessages = computed(() => mergeChartMessages(this.configToken.messages, this.options()?.messages), ...(ngDevMode ? [{ debugName: \"effectiveMessages\" }] : []));\n // Constants\n TOOLTIP_GAP = 10;\n HALF_CIRCLE_RADIANS = Math.PI;\n QUARTER_CIRCLE_RADIANS = Math.PI / 2;\n DEGREES_PER_RADIAN = 180 / Math.PI;\n CHART_EDGE_PADDING = 12;\n TICK_LABEL_CHAR_WIDTH_RATIO = 0.62;\n TICK_LABEL_SIDE_PADDING = 6;\n LABEL_TICK_CLEARANCE = 4;\n MIN_SEGMENT_CHORD_FOR_LABEL = 28;\n MIN_SEGMENT_RING_FOR_LABEL = 14;\n MIN_SEGMENT_LABEL_FONT = 10;\n MAX_SEGMENT_LABEL_FONT = 16;\n instanceId = createChartInstanceId('ax-gauge');\n get bgGradientId() {\n return `${this.instanceId}-bg-gradient`;\n }\n thresholdGradientId(index) {\n return `${this.instanceId}-threshold-gradient-${index}`;\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 // Watch for changes to redraw the chart\n effect(() => {\n const currentValue = this.value();\n const options = this.effectiveOptions();\n this._prevValue.set(currentValue);\n if (this._rendered()) {\n const optionsString = JSON.stringify(options);\n if (currentValue == null || !this.svgElement) {\n this._prevOptionsString = optionsString;\n this.updateChart();\n }\n else if (this._prevOptionsString === optionsString) {\n this.updateValueAndDial(currentValue);\n }\n else {\n this._prevOptionsString = optionsString;\n this.updateChart();\n }\n }\n });\n }\n ngOnDestroy() {\n this.cleanupChart();\n }\n /**\n * Loads D3.js dynamically\n */\n async loadD3() {\n if (this.d3)\n return; // Already loaded\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 /**\n * Creates the gauge chart with all elements\n */\n createChart() {\n const containerElement = this.chartContainerEl().nativeElement;\n if (this.svgElement) {\n this.svgElement.remove();\n this.svgElement = null;\n }\n containerElement.querySelectorAll('.ax-chart-empty').forEach((el) => el.remove());\n if (this.value() == null) {\n if (this.d3) {\n const messages = this.effectiveMessages();\n renderChartEmptyMessage(this.d3, containerElement, {\n icon: messages.noDataIcon,\n title: messages.noData,\n help: messages.noDataHelp,\n });\n }\n this._rendered.set(true);\n return;\n }\n const currentValue = this.value();\n // Create SVG element\n this.svgElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n containerElement.appendChild(this.svgElement);\n // Get current options\n const options = this.effectiveOptions();\n // Store options string for comparison\n this._prevOptionsString = JSON.stringify(options);\n const { minValue, maxValue, showValue, label = '', gaugeWidth, cornerRadius, animationDuration } = options;\n const thresholds = options.thresholds ?? [];\n // Calculate responsive dimensions\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n // Cache container dimensions\n this._lastContainerRect = { width: containerWidth, height: containerHeight };\n // Determine chart dimensions - use options if provided, otherwise use container dimensions\n const width = options.width ?? containerWidth;\n const height = options.height ?? containerHeight;\n // Ensure minimum dimensions\n const effectiveWidth = Math.max(width || 1, 1);\n const effectiveHeight = Math.max(height || 1, 1);\n // For a semi-circular gauge, width should be approximately twice the height\n const size = Math.min(effectiveWidth, effectiveHeight * 2);\n // Calculate margin as percentage of size (5-8% with reasonable bounds)\n const marginRatio = 0.08;\n const margin = Math.max(5, Math.min(size * marginRatio, 30));\n const tickCount = this.getTickCount(size);\n const tickFontPx = this.getTickFontSize(size);\n const maxTickLabelWidth = this.estimateMaxTickLabelWidth(tickCount, minValue, maxValue, tickFontPx);\n const tickLength = Math.max(4, Math.min((size / 2) * 0.12, 14));\n // Keep labels closer to the gauge arc while preserving readability.\n const labelGap = Math.max(6, Math.min((size / 2) * 0.06, 14));\n const labelOffsetFromTickEnd = labelGap + tickFontPx * 0.35;\n const tickLabelSpace = tickLength + labelOffsetFromTickEnd + tickFontPx;\n const totalVerticalSpace = size / 2 + tickLabelSpace;\n // Labels at edge ticks use start/end anchors, so they can extend by near full width.\n const horizontalPadding = Math.max(18, maxTickLabelWidth + 8);\n const totalWidth = size + horizontalPadding * 2;\n const viewBoxWidth = totalWidth + this.CHART_EDGE_PADDING * 2;\n const viewBoxHeight = totalVerticalSpace + this.CHART_EDGE_PADDING * 2;\n // Set up SVG with responsive viewBox that accounts for overflow\n const svg = this.d3\n .select(this.svgElement)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${viewBoxWidth} ${viewBoxHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n // Create a group for the chart centered horizontally with padding, positioned to show only the top half\n const chartGroup = svg\n .append('g')\n .attr('transform', `translate(${size / 2 + horizontalPadding + this.CHART_EDGE_PADDING}, ${size / 2 - margin + this.CHART_EDGE_PADDING})`);\n // Define gauge parameters\n const radius = size / 2 - margin;\n const desiredGaugeWidth = typeof gaugeWidth === 'number' && !Number.isNaN(gaugeWidth) ? gaugeWidth : 30;\n // Respect explicit gaugeWidth in px with sane absolute bounds.\n const clampedGaugeWidth = Math.max(6, Math.min(desiredGaugeWidth, radius * 0.7));\n const innerRadius = radius - clampedGaugeWidth;\n const outerRadius = radius;\n // Create gradient definitions\n this.createGradients(svg, thresholds);\n // Draw the background arc\n this.drawBackgroundArc(chartGroup, innerRadius, outerRadius, cornerRadius);\n // Draw the threshold arcs if thresholds exist\n if (thresholds.length > 0) {\n this.drawThresholds(chartGroup, innerRadius, outerRadius, minValue, maxValue, thresholds, cornerRadius);\n }\n // Draw tick marks\n this.drawTicks(chartGroup, outerRadius, minValue, maxValue, size, tickCount, tickFontPx);\n // Draw the dial/needle with animation\n this.drawDial(chartGroup, radius, currentValue, minValue, maxValue, animationDuration);\n // Draw the value display (after the dial so it's on top)\n if (showValue) {\n this.drawValueDisplay(chartGroup, currentValue, label, radius, size);\n }\n // Hide tooltip initially\n this._tooltipVisible.set(false);\n }\n /**\n * Updates the chart when options change\n */\n updateChart() {\n this.createChart();\n }\n /**\n * Updates only the value display and dial position without recreating the chart\n */\n updateValueAndDial(value) {\n if (!this.svgElement)\n return;\n const options = this.effectiveOptions();\n const minValue = options.minValue;\n const maxValue = options.maxValue;\n const animationDuration = options.animationDuration;\n const easingFunction = getEasingFunction(this.d3, options.animationEasing);\n const currentValue = value;\n const svg = this.d3.select(this.svgElement);\n // Update value text\n svg.select('.gauge-value').text(currentValue.toLocaleString());\n // Update needle position\n const angle = this.scaleValueToAngle(currentValue, minValue, maxValue);\n const angleInDegrees = this.radiansToDegrees(angle - this.QUARTER_CIRCLE_RADIANS);\n svg\n .select('.gauge-needle')\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .transition()\n .duration(animationDuration)\n .ease(easingFunction)\n .attr('transform', `rotate(${angleInDegrees})`);\n }\n /**\n * Draw the background arc\n */\n drawBackgroundArc(chartGroup, innerRadius, outerRadius, cornerRadius) {\n // Create arc for the background\n const backgroundArc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius)\n .startAngle(-this.QUARTER_CIRCLE_RADIANS) // Start from bottom (-90 degrees)\n .endAngle(this.QUARTER_CIRCLE_RADIANS) // End at top (90 degrees)\n .cornerRadius(cornerRadius);\n // Draw background arc\n const backgroundPath = chartGroup\n .append('path')\n .attr('d', backgroundArc)\n .attr('class', 'gauge-arc gauge-base')\n .attr('fill', `url(#${this.bgGradientId})`)\n .attr('filter', 'drop-shadow(0px 2px 3px rgba(0,0,0,0.1))');\n // Add tooltip for single arc if no thresholds\n if (!this.effectiveOptions().thresholds || this.effectiveOptions().thresholds.length === 0) {\n backgroundPath\n .style('cursor', 'pointer')\n .on('mouseenter', (event) => {\n if (!this.effectiveOptions().showTooltip)\n return;\n this.showSingleRangeTooltip(event);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n }\n /**\n * Draw the thresholds arcs\n */\n drawThresholds(chartGroup, innerRadius, outerRadius, minValue, maxValue, thresholds, cornerRadius) {\n // Create arc generator\n const arc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius * 0.98)\n .cornerRadius(cornerRadius);\n // Sort thresholds by value in ascending order (only if needed)\n const sortedThresholds = thresholds.length > 1 ? [...thresholds].sort((a, b) => a.value - b.value) : thresholds;\n // Calculate all angles first using the color angle calculation\n const angles = sortedThresholds.map((t) => this.scaleValueToColorAngle(t.value, minValue, maxValue));\n // Start from the minimum value angle\n let previousEndAngle = this.scaleValueToColorAngle(minValue, minValue, maxValue);\n const labeledSegments = [];\n sortedThresholds.forEach((threshold, i) => {\n const endAngle = angles[i];\n // Skip if end angle is not greater than start angle\n if (endAngle <= previousEndAngle)\n return;\n const startAngle = previousEndAngle;\n const arcPath = chartGroup\n .append('path')\n .attr('d', arc({\n innerRadius,\n outerRadius,\n startAngle,\n endAngle,\n }))\n .attr('fill', threshold.color || `url(#${this.thresholdGradientId(i)})`)\n .attr('class', 'gauge-arc threshold-arc')\n .attr('data-value', threshold.value)\n .style('cursor', 'pointer');\n if (threshold.label) {\n labeledSegments.push({ startAngle, endAngle, label: threshold.label });\n }\n // Add tooltip interaction\n if (this.effectiveOptions().showTooltip) {\n // Convert angles back to values for tooltip\n const startValue = this.angleToValue(previousEndAngle, minValue, maxValue);\n const endValue = threshold.value;\n arcPath\n .on('mouseenter', (event) => {\n this.showThresholdTooltip(event, startValue, endValue, threshold.color, threshold.label);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n // Update the previous end angle for the next threshold\n previousEndAngle = endAngle;\n });\n // Draw the last segment if the last threshold is less than the max value\n if (previousEndAngle < this.QUARTER_CIRCLE_RADIANS) {\n const lastArc = chartGroup\n .append('path')\n .attr('d', arc({\n innerRadius,\n outerRadius,\n startAngle: previousEndAngle,\n endAngle: this.QUARTER_CIRCLE_RADIANS,\n }))\n .attr('fill', `url(#${this.bgGradientId})`)\n .attr('class', 'gauge-arc threshold-arc')\n .style('cursor', 'pointer');\n // Add tooltip for the last segment\n if (this.effectiveOptions().showTooltip) {\n const startValue = this.angleToValue(previousEndAngle, minValue, maxValue);\n const endValue = maxValue;\n const lastThreshold = thresholds[thresholds.length - 1];\n lastArc\n .on('mouseenter', (event) => {\n this.showThresholdTooltip(event, startValue, endValue, lastThreshold.color, lastThreshold.label);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n }\n if (this.effectiveOptions().showDataLabels !== false && labeledSegments.length > 0) {\n this.drawSegmentLabels(chartGroup, labeledSegments, innerRadius, outerRadius);\n }\n }\n /**\n * Draws threshold labels centered on each segment arc when space allows.\n */\n drawSegmentLabels(chartGroup, segments, innerRadius, outerRadius) {\n const labelArc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius * 0.98);\n const labelGroup = chartGroup.append('g').attr('class', 'gauge-segment-labels');\n const ringWidth = outerRadius - innerRadius;\n const labelRadius = innerRadius + ringWidth / 2;\n const animationDuration = this.effectiveOptions().animationDuration ?? 750;\n segments.forEach((segment) => {\n const angle = segment.endAngle - segment.startAngle;\n const chordLength = 2 * labelRadius * Math.sin(angle / 2);\n const fontSize = this.calculateSegmentLabelFontSize(angle, ringWidth, chordLength);\n if (fontSize <= 0)\n return;\n const availableWidth = chordLength * 0.8;\n const text = this.getFittedSegmentLabel(segment.label, fontSize, availableWidth);\n if (!text)\n return;\n const centroid = labelArc.centroid({\n innerRadius,\n outerRadius: outerRadius * 0.98,\n startAngle: segment.startAngle,\n endAngle: segment.endAngle,\n });\n labelGroup\n .append('text')\n .attr('class', 'gauge-segment-label')\n .attr('transform', `translate(${centroid[0]}, ${centroid[1]})`)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .style('pointer-events', 'none')\n .style('font-size', `${fontSize}px`)\n .style('font-weight', '600')\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-data-labels-color))')\n .style('opacity', 0)\n .text(text)\n .transition()\n .duration(animationDuration)\n .style('opacity', 1);\n });\n }\n calculateSegmentLabelFontSize(angle, ringWidth, chordLength) {\n if (chordLength < this.MIN_SEGMENT_CHORD_FOR_LABEL || ringWidth < this.MIN_SEGMENT_RING_FOR_LABEL) {\n return 0;\n }\n const ringBasedSize = ringWidth * 0.45;\n const angleScale = Math.min(1, 0.7 + 0.3 * (angle / (this.HALF_CIRCLE_RADIANS / 3)));\n const maxByChord = chordLength / (2 * 0.65);\n const fontSize = Math.min(ringBasedSize * angleScale, maxByChord);\n if (fontSize < this.MIN_SEGMENT_LABEL_FONT)\n return 0;\n return Math.round(Math.max(this.MIN_SEGMENT_LABEL_FONT, Math.min(fontSize, this.MAX_SEGMENT_LABEL_FONT)) * 2) / 2;\n }\n getFittedSegmentLabel(label, fontSize, availableWidth) {\n if (!label)\n return '';\n if (this.doesSegmentLabelFit(label, fontSize, availableWidth))\n return label;\n return this.truncateSegmentLabel(label, fontSize, availableWidth);\n }\n doesSegmentLabelFit(text, fontSize, availableWidth) {\n return text.length * fontSize * 0.65 <= availableWidth;\n }\n truncateSegmentLabel(text, fontSize, availableWidth) {\n const charWidth = fontSize * (fontSize <= 10 ? 0.7 : 0.65);\n const availableForText = availableWidth - fontSize * 0.7;\n if (availableForText <= 0)\n return '';\n const maxChars = Math.floor(availableForText / charWidth);\n if (maxChars <= 0)\n return '';\n if (text.length <= maxChars)\n return text;\n return `${text.substring(0, Math.max(1, maxChars))}…`;\n }\n /**\n * Shows tooltip for a threshold arc\n */\n showThresholdTooltip(event, startValue, endValue, color, label) {\n // Create tooltip data\n this._tooltipData.set({\n title: label || 'Range',\n value: `${startValue.toLocaleString()} - ${endValue.toLocaleString()}`,\n color: color,\n });\n // Show tooltip\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n }\n /**\n * Shows tooltip for the entire range when no thresholds are defined\n */\n showSingleRangeTooltip(event) {\n const options = this.effectiveOptions();\n if (!options.showTooltip)\n return;\n this._tooltipData.set({\n title: options.label || 'Range',\n value: `${options.minValue.toLocaleString()} - ${options.maxValue.toLocaleString()}`,\n color: 'rgb(var(--ax-comp-gauge-chart-track-color))',\n });\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n }\n updateTooltipPosition(event) {\n this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };\n if (this._tooltipRafId != null)\n return;\n this.scheduleTooltipPosition(0);\n }\n scheduleTooltipPosition(attempt) {\n this._tooltipRafId = requestAnimationFrame(() => {\n const coords = this._pendingTooltipCoords;\n if (!coords) {\n this._tooltipRafId = null;\n return;\n }\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl) {\n this._tooltipRafId = null;\n return;\n }\n const tooltipEl = containerEl.querySelector('.chart-tooltip');\n if (!tooltipEl && this._tooltipVisible() && attempt < 3) {\n this.scheduleTooltipPosition(attempt + 1);\n return;\n }\n this._tooltipRafId = null;\n const rect = containerEl.getBoundingClientRect();\n const tooltipRect = tooltipEl?.getBoundingClientRect() ?? null;\n const pos = computeTooltipPosition(rect, tooltipRect, coords.x + 10, coords.y - 10, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n });\n }\n /**\n * Hides the tooltip\n */\n hideTooltip() {\n this._tooltipVisible.set(false);\n }\n /**\n * Cleans up chart resources\n */\n cleanupChart() {\n if (this._tooltipRafId != null) {\n cancelAnimationFrame(this._tooltipRafId);\n this._tooltipRafId = null;\n }\n this._pendingTooltipCoords = null;\n if (this.svgElement) {\n this.svgElement.remove();\n this.svgElement = null;\n }\n this.chartContainerEl()?.nativeElement.querySelectorAll('.ax-chart-empty').forEach((el) => el.remove());\n this._tooltipVisible.set(false);\n this._lastContainerRect = null;\n }\n /**\n * Creates gradient definitions for thresholds\n */\n createGradients(svg, thresholds) {\n const defs = svg.append('defs');\n // Create a radial gradient for the background\n const bgGradient = defs\n .append('radialGradient')\n .attr('id', this.bgGradientId)\n .attr('cx', '50%')\n .attr('cy', '50%')\n .attr('r', '50%')\n .attr('gradientUnits', 'userSpaceOnUse');\n // Get CSS variable for track color\n if (thresholds.length === 0) {\n // Default gradient when no thresholds are provided\n bgGradient.append('stop').attr('offset', '0%').attr('stop-color', 'rgb(var(--ax-comp-gauge-chart-track-color))');\n bgGradient\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', 'rgba(var(--ax-comp-gauge-chart-track-color), 0.8)');\n }\n else {\n bgGradient.append('stop').attr('offset', '0%').attr('stop-color', 'rgb(var(--ax-comp-gauge-chart-track-color))');\n bgGradient\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', 'rgba(var(--ax-comp-gauge-chart-track-color), 0.8)');\n // Create gradients for each threshold\n thresholds.forEach((threshold, i) => {\n const gradient = defs\n .append('linearGradient')\n .attr('id', this.thresholdGradientId(i))\n .attr('gradientUnits', 'userSpaceOnUse')\n .attr('x1', '-1')\n .attr('y1', '0')\n .attr('x2', '1')\n .attr('y2', '0');\n gradient\n .append('stop')\n .attr('offset', '0%')\n .attr('stop-color', this.d3.color(threshold.color)?.brighter(0.5).toString() || threshold.color);\n gradient.append('stop').attr('offset', '100%').attr('stop-color', threshold.color);\n });\n }\n }\n /**\n * Draws tick marks and labels around the gauge\n */\n drawTicks(chartGroup, radius, minValue, maxValue, size, tickCount, tickFontPx) {\n const tickLength = Math.max(4, Math.min(radius * 0.12, 14));\n const baseLabelOffset = this.getBaseLabelOffset(radius, tickLength, tickFontPx);\n const tickGroup = chartGroup.append('g').attr('class', 'ticks');\n const tickValues = [];\n const step = (maxValue - minValue) / (tickCount - 1);\n for (let i = 0; i < tickCount; i++) {\n tickValues.push(minValue + i * step);\n }\n const tickMetrics = tickValues.map((tick) => {\n const angle = this.scaleValueToAngle(tick, minValue, maxValue);\n const radians = angle - this.QUARTER_CIRCLE_RADIANS;\n return {\n radians,\n cos: Math.cos(radians),\n sin: Math.sin(radians),\n label: this.formatTickValue(tick, minValue, maxValue),\n };\n });\n tickMetrics.forEach((metric) => {\n tickGroup\n .append('line')\n .attr('x1', metric.cos * (radius + 5))\n .attr('y1', metric.sin * (radius + 5))\n .attr('x2', metric.cos * (radius + tickLength))\n .attr('y2', metric.sin * (radius + tickLength))\n .attr('stroke', 'rgba(var(--ax-comp-gauge-chart-text-color), 0.5)')\n .attr('stroke-width', 2);\n });\n const textSelection = tickGroup\n .selectAll('text.gauge-tick-label')\n .data(tickMetrics)\n .enter()\n .append('text')\n .attr('class', 'gauge-tick-label')\n .attr('x', 0)\n .attr('y', 0)\n .attr('fill', 'rgba(var(--ax-comp-gauge-chart-text-color), 0.7)')\n .style('font-size', `${tickFontPx}px`)\n .text((d) => d.label);\n textSelection.each((d, index, nodes) => {\n const node = nodes[index];\n let bboxWidth = this.estimateLabelWidth(d.label, tickFontPx);\n let bboxHeight = tickFontPx;\n try {\n const bbox = node.getBBox();\n if (bbox.width > 0)\n bboxWidth = bbox.width;\n if (bbox.height > 0)\n bboxHeight = bbox.height;\n }\n catch {\n // Keep fallback estimates.\n }\n const anchor = this.getTickLabelAnchor(d.cos);\n const nearEdgeExtent = this.getNearEdgeProjection(anchor, d.cos, d.sin, bboxWidth, bboxHeight);\n const requiredOffset = tickLength + this.LABEL_TICK_CLEARANCE + nearEdgeExtent;\n const effectiveLabelOffset = Math.max(baseLabelOffset, requiredOffset);\n const nudge = tickFontPx * 0.1;\n const x = d.cos * (radius + effectiveLabelOffset) + (anchor === 'start' ? nudge : anchor === 'end' ? -nudge : 0);\n const y = d.sin * (radius + effectiveLabelOffset);\n this.d3.select(node).attr('x', x).attr('y', y).attr('text-anchor', anchor).attr('dominant-baseline', 'middle');\n });\n }\n getTickCount(size) {\n if (size < 200)\n return 3;\n if (size < 300)\n return 4;\n if (size < 400)\n return 5;\n if (size > 520)\n return 7;\n return 5;\n }\n getTickFontSize(size) {\n return Math.max(14, Math.min(18, Math.floor(size / 35)));\n }\n getBaseLabelOffset(radius, tickLength, tickFontPx) {\n const labelGap = Math.max(6, Math.min(radius * 0.06, 14));\n return tickLength + labelGap + tickFontPx * 0.2;\n }\n getTickLabelAnchor(cosValue) {\n if (cosValue > 0.35)\n return 'start';\n if (cosValue < -0.35)\n return 'end';\n return 'middle';\n }\n getNearEdgeProjection(anchor, cosValue, sinValue, bboxWidth, bboxHeight) {\n const absCos = Math.abs(cosValue);\n const absSin = Math.abs(sinValue);\n const halfHeightProjection = absSin * (bboxHeight / 2);\n // For start/end anchored labels on edge ticks, the nearest side is close to the anchor point.\n if (anchor === 'start' || anchor === 'end') {\n return halfHeightProjection + absCos * this.TICK_LABEL_SIDE_PADDING;\n }\n // For centered labels, nearest side includes half text width projection.\n return absCos * (bboxWidth / 2) + halfHeightProjection;\n }\n formatTickValue(tick, minValue, maxValue) {\n const valueRange = maxValue - minValue;\n if (valueRange <= 10) {\n return tick.toFixed(2).replace(/\\.?0+$/, '');\n }\n if (valueRange < 1000) {\n return tick % 1 === 0 ? tick.toString() : tick.toFixed(1);\n }\n return formatLargeNumber(Math.round(tick));\n }\n estimateLabelWidth(label, tickFontPx) {\n return label.length * tickFontPx * this.TICK_LABEL_CHAR_WIDTH_RATIO + this.TICK_LABEL_SIDE_PADDING;\n }\n estimateMaxTickLabelWidth(tickCount, minValue, maxValue, tickFontPx) {\n if (tickCount <= 1)\n return tickFontPx;\n const step = (maxValue - minValue) / (tickCount - 1);\n let maxChars = 0;\n for (let i = 0; i < tickCount; i++) {\n const label = this.formatTickValue(minValue + i * step, minValue, maxValue);\n maxChars = Math.max(maxChars, label.length);\n }\n return maxChars * tickFontPx * this.TICK_LABEL_CHAR_WIDTH_RATIO + this.TICK_LABEL_SIDE_PADDING;\n }\n /**\n * Draws the value and label text in the center\n */\n drawValueDisplay(chartGroup, value, label, radius, size) {\n // Px-based scaling for robust small/large sizes with better small-size handling\n const valueFontPx = Math.max(18, Math.min(32, Math.floor(size / 8)));\n const labelFontPx = Math.max(10, Math.min(16, Math.floor(valueFontPx * 0.55)));\n // More vertical gap for small sizes: use larger base value\n const verticalGap = Math.max(6, Math.min(12, Math.floor(size / 40)));\n // Create group for the value display\n const valueGroup = chartGroup.append('g').attr('class', 'gauge-value-display').attr('text-anchor', 'middle');\n // Add value display\n valueGroup\n .append('text')\n .attr('class', 'gauge-value')\n .attr('x', 0)\n .attr('y', radius * 0.15 + valueFontPx)\n .style('font-size', `${valueFontPx}px`)\n .style('font-weight', '600')\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-text-color))')\n .text(value.toLocaleString());\n // Add label display (if provided)\n if (label) {\n valueGroup\n .append('text')\n .attr('class', 'gauge-label')\n .attr('x', 0)\n .attr('y', radius * 0.24 + valueFontPx + verticalGap)\n .style('font-size', `${labelFontPx}px`)\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-text-color))')\n .style('opacity', '0.8')\n .text(label);\n }\n }\n /**\n * Draws the dial/needle pointing to the current value with animation\n */\n drawDial(chartGroup, radius, value, minValue, maxValue, animationDuration) {\n // Clamp value to min/max range\n const clampedValue = Math.max(minValue, Math.min(maxValue, value));\n // Calculate angle for needle based on value\n const angle = this.scaleValueToAngle(clampedValue, minValue, maxValue);\n const angleInDegrees = this.radiansToDegrees(angle - this.QUARTER_CIRCLE_RADIANS);\n // Create a group for the needle\n const dialGroup = chartGroup.append('g').attr('class', 'dial');\n // Draw the needle with initial position at minimum value\n const needlePath = dialGroup\n .append('path')\n .attr('d', this.createNeedlePath(radius))\n .attr('class', 'gauge-needle')\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .attr('transform', `rotate(${this.radiansToDegrees(-this.HALF_CIRCLE_RADIANS)})`); // Start at -180 degrees (left)\n // Add a center circle\n dialGroup\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', radius * 0.08)\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .attr('stroke', '#fff')\n .attr('stroke-width', 2);\n // Add a smaller white center\n dialGroup\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', radius * 0.03)\n .attr('fill', '#fff');\n // Get easing function\n const easingFunction = getEasingFunction(this.d3, this.options()?.animationEasing);\n // Animate the needle from min to current value\n needlePath\n .transition()\n .duration(animationDuration)\n .ease(easingFunction)\n .attr('transform', `rotate(${angleInDegrees})`);\n }\n // getEasingFunction moved to shared chart utils\n /**\n * Creates a path string for the needle\n */\n createNeedlePath(radius) {\n const needleLength = radius * 0.8;\n const needleWidth = radius * 0.06;\n return `M 0,${needleWidth / 2} L ${needleLength},0 L 0,${-needleWidth / 2} Z`;\n }\n /**\n * Scales a value to an angle (in radians)\n */\n scaleValueToAngle(value, min, max) {\n const valueRange = max - min || 1;\n return ((value - min) / valueRange) * this.HALF_CIRCLE_RADIANS - this.QUARTER_CIRCLE_RADIANS;\n }\n /**\n * Scales a value to an angle for color arcs (in radians)\n */\n scaleValueToColorAngle(value, min, max) {\n const valueRange = max - min || 1;\n return ((value - min) / valueRange) * this.HALF_CIRCLE_RADIANS - this.QUARTER_CIRCLE_RADIANS;\n }\n /**\n * Converts an angle back to a value\n */\n angleToValue(angle, min, max) {\n const valueRange = max - min || 1;\n return min + ((angle + this.QUARTER_CIRCLE_RADIANS) / this.HALF_CIRCLE_RADIANS) * valueRange;\n }\n /**\n * Converts radians to degrees\n */\n radiansToDegrees(radians) {\n return radians * this.DEGREES_PER_RADIAN;\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXGaugeChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.3.3\", type: AXGaugeChartComponent, isStandalone: true, selector: \"ax-gauge-chart\", inputs: { value: { classPropertyName: \"value\", publicName: \"value\", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: \"options\", publicName: \"options\", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: \"chartContainerEl\", first: true, predicate: [\"chartContainer\"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: \"<div class=\\\"ax-gauge-chart\\\" role=\\\"img\\\" #chartContainer>\\n <ax-chart-tooltip [data]=\\\"tooltipData()\\\" [position]=\\\"tooltipPosition()\\\" [visible]=\\\"tooltipVisible()\\\"></ax-chart-tooltip>\\n</div>\\n\", styles: [\".ax-chart-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-gauge-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);box-sizing:border-box;--ax-comp-gauge-chart-bg-color: 0, 0, 0, 0;--ax-comp-gauge-chart-text-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-data-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-track-color: var(--ax-sys-color-dark-surface);--ax-comp-gauge-chart-needle-color: var(--ax-sys-color-primary-500)}ax-gauge-chart .ax-gauge-chart{position:relative;width:100%;height:100%;min-height:0;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);overflow:hidden;color:rgb(var(--ax-comp-gauge-chart-text-color));background-color:rgba(var(--ax-comp-gauge-chart-bg-color));border-radius:.5rem}ax-gauge-chart .ax-gauge-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-gauge-chart .ax-gauge-chart svg g:has(text){font-family:inherit}\\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: AXGaugeChartComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-gauge-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"ax-gauge-chart\\\" role=\\\"img\\\" #chartContainer>\\n <ax-chart-tooltip [data]=\\\"tooltipData()\\\" [position]=\\\"tooltipPosition()\\\" [visible]=\\\"tooltipVisible()\\\"></ax-chart-tooltip>\\n</div>\\n\", styles: [\".ax-chart-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-gauge-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);box-sizing:border-box;--ax-comp-gauge-chart-bg-color: 0, 0, 0, 0;--ax-comp-gauge-chart-text-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-data-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-track-color: var(--ax-sys-color-dark-surface);--ax-comp-gauge-chart-needle-color: var(--ax-sys-color-primary-500)}ax-gauge-chart .ax-gauge-chart{position:relative;width:100%;height:100%;min-height:0;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);overflow:hidden;color:rgb(var(--ax-comp-gauge-chart-text-color));background-color:rgba(var(--ax-comp-gauge-chart-bg-color));border-radius:.5rem}ax-gauge-chart .ax-gauge-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-gauge-chart .ax-gauge-chart svg g:has(text){font-family:inherit}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F1Z2UtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2dhdWdlLWNoYXJ0L3NyYy9saWIvZ2F1Z2UtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2dhdWdlLWNoYXJ0L3NyYy9saWIvZ2F1Z2UtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUVoQixzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQix1QkFBdUIsR0FDeEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsdUJBQXVCLEVBQXNCLE1BQU0sOEJBQThCLENBQUM7QUFFM0YsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBR1QsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFHN0Q7OztHQUdHO0FBU0gsTUFBTSxPQUFPLHFCQUFzQixTQUFRLGdCQUFnQjtJQUN6RCxTQUFTO0lBQ1Qsd0JBQXdCO0lBQ3hCLEtBQUssR0FBRyxLQUFLLENBQW9CLENBQUMsaURBQUMsQ0FBQztJQUVwQywwQkFBMEI7SUFDMUIsT0FBTyxHQUFHLEtBQUssQ0FBcUIsRUFBRSxtREFBQyxDQUFDO0lBRXhDLDRCQUE0QjtJQUNYLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQTZCLGdCQUFnQixDQUFDLENBQUM7SUFFckcsOENBQThDO0lBQ3RDLFVBQVUsR0FBeUIsSUFBSSxD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QUFDLEtBQUssR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxVQUFVLENBQUM7SUFDL0YsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZ0JBQWdCLENBQUMsT0FBZTtRQUN0QyxPQUFPLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDM0MsQ0FBQzt1R0F0K0JVLHFCQUFxQjsyRkFBckIscUJBQXFCLHVlQzNDbEMseU1BR0EscytDRHFDWSx1QkFBdUI7OzJGQUd0QixxQkFBcUI7a0JBUmpDLFNBQVM7K0JBQ0UsZ0JBQWdCLGlCQUdYLGlCQUFpQixDQUFDLElBQUksV0FDNUIsQ0FBQyx1QkFBdUIsQ0FBQyxtQkFDakIsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFYQ2hhcnRDb21wb25lbnQsXG4gIEFYQ2hhcnRDb21wb25lbnRCYXNlLFxuICBjb21wdXRlVG9vbHRpcFBvc2l0aW9uLFxuICBjcmVhdGVDaGFydEluc3RhbmNlSWQsXG4gIGZvcm1hdExhcmdlTnVtYmVyLFxuICBnZXRFYXNpbmdGdW5jdGlvbixcbiAgbWVyZ2VDaGFydE1lc3NhZ2VzLFxuICBtZXJnZUNoYXJ0T3B0aW9ucyxcbiAgcmVuZGVyQ2hhcnRFbXB0eU1lc3NhZ2UsXG59IGZyb20gJ0BhY29yZXgvY2hhcnRzJztcbmltcG9ydCB7IEFYQ2hhcnRUb29sdGlwQ29tcG9uZW50LCBBWENoYXJ0VG9vbHRpcERhdGEgfSBmcm9tICdAYWNvcmV4L2NoYXJ0cy9jaGFydC10b29sdGlwJztcblxuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgT25EZXN0cm95LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBzaWduYWwsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSAqIGFzIGQzIGZyb20gJ2QzJztcbmltcG9ydCB7IEFYX0dBVUdFX0NIQVJUX0NPTkZJRyB9IGZyb20gJy4vZ2F1Z2UtY2hhcnQuY29uZmlnJztcbmltcG9ydCB7IEFYR2F1Z2VDaGFydE9wdGlvbiwgQVhHYXVnZUNoYXJ0VmFsdWUgfSBmcm9tICcuL2dhdWdlLWNoYXJ0LnR5cGUnO1xuXG4vKipcbiAqIEdhdWdlIENoYXJ0IENvbXBvbmVudFxuICogUmVuZGVycyBhIHNlbWktY2lyY3VsYXIgZ2F1Z2UgY2hhcnQgd2l0aCBhbmltYXRlZCBuZWVkbGUgYW5kIHRocmVzaG9sZHNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXgtZ2F1Z2UtY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2F1Z2UtY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9nYXVnZS1jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBpbXBvcnRzOiBbQVhDaGFydFRvb2x0aXBDb21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQVhHYXVnZUNoYXJ0Q29tcG9uZW50IGV4dGVuZHMgQVhDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQVhDaGFydENvbXBvbmVudEJhc2Uge1xuICAvLyBJbnB1dHNcbiAgLyoqIENoYXJ0IHZhbHVlIGlucHV0ICovXG4gIHZhbHVlID0gaW5wdXQ8QVhHYXVnZUNoYXJ0VmFsdWU+KDApO1xuXG4gIC8qKiBDaGFydCBvcHRpb25zIGlucHV0ICovXG4gIG9wdGlvbnMgPSBpbnB1dDxBWEdhdWdlQ2hhcnRPcHRpb24+KHt9KTtcblxuICAvLyBDaGFydCBjb250YWluZXIgcmVmZXJlbmNlXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnRDb250YWluZXJFbCA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ2NoYXJ0Q29udGFpbmVyJyk7XG5cbiAgLy8gU1ZHIGVsZW1lbnQgcmVmZXJlbmNlIChjcmVhdGVkIGluIHRoZSBjb2RlKVxuICBwcml2YXRlIHN2Z0VsZW1lbnQ6IFNWR1NWR0VsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAvLyBEMyByZWZlcmVuY2UgLSBsb2FkZWQgYXN5bmNocm9ub3VzbHlcbiAgcHJvdGVjdGVkIGQzITogdHlwZW9mIGltcG9ydCgnZDMnKTtcblxuICAvLyBTaWduYWxzIGZvciBjb21wb25lbnQgc3RhdGVcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9yZW5kZXJlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX3ByZXZWYWx1ZSA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcblxuICAvLyBUcmFjayBwcmV2aW91cyBvcHRpb25zIHRvIGRldGVjdCBjaGFuZ2VzXG4gIHByaXZhdGUgX3ByZXZPcHRpb25zU3RyaW5nID0gJyc7XG5cbiAgLy8gQ2FjaGUgZm9yIGNvbnRhaW5lciBkaW1lbnNpb25zIHRvIGF2b2lkIHJlcGVhdGVkIERPTSByZWFkc1xuICBwcml2YXRlIF9sYXN0Q29udGFpbmVyUmVjdDogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gVG9vbHRpcCBzaWduYWxzXG4gIHByaXZhdGUgX3Rvb2x0aXBWaXNpYmxlID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfdG9vbHRpcFBvc2l0aW9uID0gc2lnbmFsKHsgeDogMCwgeTogMCB9KTtcbiAgcHJpdmF0ZSBfdG9vbHRpcERhdGEgPSBzaWduYWw8QVhDaGFydFRvb2x0aXBEYXRhPih7XG4gICAgdGl0bGU6ICcnLFxuICAgIHZhbHVlOiAnJyxcbiAgfSk7XG4gIHByaXZhdGUgX3Rvb2x0aXBSYWZJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3BlbmRpbmdUb29sdGlwQ29vcmRzOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICAvLyBFeHBvc2UgdG9vbHRpcCBzaWduYWxzIGFzIHJlYWQtb25seSBmb3IgdGhlIHRlbXBsYXRlXG4gIHByb3RlY3RlZCB0b29sdGlwVmlzaWJsZSA9IHRoaXMuX3Rvb2x0aXBWaXNpYmxlLmFzUmVhZG9ubHkoKTtcbiAgcHJvdGVjdGVkIHRvb2x0aXBQb3NpdGlvbiA9IHRoaXMuX3Rvb2x0aXBQb3NpdGlvbi5hc1JlYWRvbmx5KCk7XG4gIHByb3RlY3RlZCB0b29sdGlwRGF0YSA9IHRoaXMuX3Rvb2x0aXBEYXRhLmFzUmVhZG9ubHkoKTtcblxuICAvLyBJbmplY3QgY29uZmlndXJhdGlvblxuICBwcml2YXRlIGNvbmZpZ1Rva2VuID0gaW5qZWN0KEFYX0dBVUdFX0NIQVJUX0NPTkZJRyk7XG5cbiAgLy8gQ29tcHV0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gIHByb3RlY3RlZCBlZmZlY3RpdmVPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4gbWVyZ2VDaGFydE9wdGlvbnModGhpcy5jb25maWdUb2tlbiwgdGhpcy5vcHRpb25zKCkpKTtcblxuICBwcm90ZWN0ZWQgZWZmZWN0aXZlTWVzc2FnZXMgPSBjb21wdXRlZCgoKSA9PlxuICAgIG1lcmdlQ2hhcnRNZXNzYWdlcyh0aGlzLmNvbmZpZ1Rva2VuLm1lc3NhZ2VzLCB0aGlzLm9wdGlvbnMoKT8ubWVzc2FnZXMpLFxuICApO1xuXG4gIC8vIENvbnN0YW50c1xuICBwcml2YXRlIHJlYWRvbmx5IFRPT0xUSVBfR0FQID0gMTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgSEFMRl9DSVJDTEVfUkFESUFOUyA9IE1hdGguUEk7XG4gIHByaXZhdGUgcmVhZG9ubHkgUVVBUlRFUl9DSVJDTEVfUkFESUFOUyA9IE1hdGguUEkgLyAyO1xuICBwcml2YXRlIHJlYWRvbmx5IERFR1JFRVNfUEVSX1JBRElBTiA9IDE4MCAvIE1hdGguUEk7XG4gIHByaXZhdGUgcmVhZG9ubHkgQ0hBUlRfRURHRV9QQURESU5HID0gMTI7XG4gIHByaXZhdGUgcmVhZG9ubHkgVElDS19MQUJFTF9DSEFSX1dJRFRIX1JBVElPID0gMC42MjtcbiAgcHJpdmF0ZSByZWFkb25seSBUSUNLX0xBQkVMX1NJREVfUEFERElORyA9IDY7XG4gIHByaXZhdGUgcmVhZG9ubHkgTEFCRUxfVElDS19DTEVBUkFOQ0UgPSA0O1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9TRUdNRU5UX0NIT1JEX0ZPUl9MQUJFTCA9IDI4O1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9TRUdNRU5UX1JJTkdfRk9SX0xBQkVMID0gMTQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX1NFR01FTlRfTEFCRUxfRk9OVCA9IDEwO1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9TRUdNRU5UX0xBQkVMX0ZPTlQgPSAxNjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0YW5jZUlkID0gY3JlYXRlQ2hhcnRJbnN0YW5jZUlkKCdheC1nYXVnZScpO1xuXG4gIHByaXZhdGUgZ2V0IGJnR3JhZGllbnRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmluc3RhbmNlSWR9LWJnLWdyYWRpZW50YDtcbiAgfVxuXG4gIHByaXZhdGUgdGhyZXNob2xkR3JhZGllbnRJZChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5pbnN0YW5jZUlkfS10aHJlc2hvbGQtZ3JhZGllbnQtJHtpbmRleH1gO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvLyBEeW5hbWljYWxseSBsb2FkIEQzIGFuZCBpbml0aWFsaXplIHRoZSBjaGFydCB3aGVuIHRoZSBjb21wb25lbnQgaXMgcmVhZHlcbiAgICBhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQuc2V0KHRydWUpO1xuICAgICAgdGhpcy5sb2FkRDMoKTtcbiAgICB9KTtcblxuICAgIC8vIFdhdGNoIGZvciBjaGFuZ2VzIHRvIHJlZHJhdyB0aGUgY2hhcnRcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy52YWx1ZSgpO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuICAgICAgdGhpcy5fcHJldlZhbHVlLnNldChjdXJyZW50VmFsdWUpO1xuXG4gICAgICBpZiAodGhpcy5fcmVuZGVyZWQoKSkge1xuICAgICAgICBjb25zdCBvcHRpb25zU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucyk7XG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgPT0gbnVsbCB8fCAhdGhpcy5zdmdFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy5fcHJldk9wdGlvbnNTdHJpbmcgPSBvcHRpb25zU3RyaW5nO1xuICAgICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9wcmV2T3B0aW9uc1N0cmluZyA9PT0gb3B0aW9uc1N0cmluZykge1xuICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmREaWFsKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fcHJldk9wdGlvbnNTdHJpbmcgPSBvcHRpb25zU3RyaW5nO1xuICAgICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhbnVwQ2hhcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBEMy5qcyBkeW5hbWljYWxseVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGxvYWREMygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5kMykgcmV0dXJuOyAvLyBBbHJlYWR5IGxvYWRlZFxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZDMgPSBhd2FpdCBpbXBvcnQoJ2QzJyk7XG4gICAgICAvLyBJZiBjb250YWluZXIgaXMgcmVhZHksIGNyZWF0ZSBjaGFydFxuICAgICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKCkgJiYgdGhpcy5jaGFydENvbnRhaW5lckVsKCkpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICAgICAgICB0aGlzLl9yZW5kZXJlZC5zZXQodHJ1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIEQzLmpzOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZ2F1Z2UgY2hhcnQgd2l0aCBhbGwgZWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVDaGFydCgpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudDtcblxuICAgIGlmICh0aGlzLnN2Z0VsZW1lbnQpIHtcbiAgICAgIHRoaXMuc3ZnRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc3ZnRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICAgIGNvbnRhaW5lckVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmF4LWNoYXJ0LWVtcHR5JykuZm9yRWFjaCgoZWwpID0+IGVsLnJlbW92ZSgpKTtcblxuICAgIGlmICh0aGlzLnZhbHVlKCkgPT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMuZDMpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZXMgPSB0aGlzLmVmZmVjdGl2ZU1lc3NhZ2VzKCk7XG4gICAgICAgIHJlbmRlckNoYXJ0RW1wdHlNZXNzYWdlKHRoaXMuZDMsIGNvbnRhaW5lckVsZW1lbnQsIHtcbiAgICAgICAgICBpY29uOiBtZXNzYWdlcy5ub0RhdGFJY29uLFxuICAgICAgICAgIHRpdGxlOiBtZXNzYWdlcy5ub0RhdGEsXG4gICAgICAgICAgaGVscDogbWVzc2FnZXMubm9EYXRhSGVscCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9yZW5kZXJlZC5zZXQodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy52YWx1ZSgpIGFzIG51bWJlcjtcblxuICAgIC8vIENyZWF0ZSBTVkcgZWxlbWVudFxuICAgIHRoaXMuc3ZnRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnc3ZnJyk7XG4gICAgY29udGFpbmVyRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnN2Z0VsZW1lbnQpO1xuXG4gICAgLy8gR2V0IGN1cnJlbnQgb3B0aW9uc1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKTtcblxuICAgIC8vIFN0b3JlIG9wdGlvbnMgc3RyaW5nIGZvciBjb21wYXJpc29uXG4gICAgdGhpcy5fcHJldk9wdGlvbnNTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zKTtcblxuICAgIGNvbnN0IHsgbWluVmFsdWUsIG1heFZhbHVlLCBzaG93VmFsdWUsIGxhYmVsID0gJycsIGdhdWdlV2lkdGgsIGNvcm5lclJhZGl1cywgYW5pbWF0aW9uRHVyYXRpb24gfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgdGhyZXNob2xkcyA9IG9wdGlvbnMudGhyZXNob2xkcyA/PyBbXTtcblxuICAgIC8vIENhbGN1bGF0ZSByZXNwb25zaXZlIGRpbWVuc2lvbnNcbiAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IGNvbnRhaW5lckVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgY29uc3QgY29udGFpbmVySGVpZ2h0ID0gY29udGFpbmVyRWxlbWVudC5jbGllbnRIZWlnaHQ7XG5cbiAgICAvLyBDYWNoZSBjb250YWluZXIgZGltZW5zaW9uc1xuICAgIHRoaXMuX2xhc3RDb250YWluZXJSZWN0ID0geyB3aWR0aDogY29udGFpbmVyV2lkdGgsIGhlaWdodDogY29udGFpbmVySGVpZ2h0IH07XG5cbiAgICAvLyBEZXRlcm1pbmUgY2hhcnQgZGltZW5zaW9ucyAtIHVzZSBvcHRpb25zIGlmIHByb3ZpZGVkLCBvdGhlcndpc2UgdXNlIGNvbnRhaW5lciBkaW1lbnNpb25zXG4gICAgY29uc3Qgd2lkdGggPSBvcHRpb25zLndpZHRoID8/IGNvbnRhaW5lcldpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0ID8/IGNvbnRhaW5lckhlaWdodDtcblxuICAgIC8vIEVuc3VyZSBtaW5pbXVtIGRpbWVuc2lvbnNcbiAgICBjb25zdCBlZmZlY3RpdmVXaWR0aCA9IE1hdGgubWF4KHdpZHRoIHx8IDEsIDEpO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUhlaWdodCA9IE1hdGgubWF4KGhlaWdodCB8fCAxLCAxKTtcblxuICAgIC8vIEZvciBhIHNlbWktY2lyY3VsYXIgZ2F1Z2UsIHdpZHRoIHNob3VsZCBiZSBhcHByb3hpbWF0ZWx5IHR3aWNlIHRoZSBoZWlnaHRcbiAgICBjb25zdCBzaXplID0gTWF0aC5taW4oZWZmZWN0aXZlV2lkdGgsIGVmZmVjdGl2ZUhlaWdodCAqIDIpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG1hcmdpbiBhcyBwZXJjZW50YWdlIG9mIHNpemUgKDUtOCUgd2l0aCByZWFzb25hYmxlIGJvdW5kcylcbiAgICBjb25zdCBtYXJnaW5SYXRpbyA9IDAuMDg7XG4gICAgY29uc3QgbWFyZ2luID0gTWF0aC5tYXgoNSwgTWF0aC5taW4oc2l6ZSAqIG1hcmdpblJhdGlvLCAzMCkpO1xuXG4gICAgY29uc3QgdGlja0NvdW50ID0gdGhpcy5nZXRUaWNrQ291bnQoc2l6ZSk7XG4gICAgY29uc3QgdGlja0ZvbnRQeCA9IHRoaXMuZ2V0VGlja0ZvbnRTaXplKHNpemUpO1xuICAgIGNvbnN0IG1heFRpY2tMYWJlbFdpZHRoID0gdGhpcy5lc3RpbWF0ZU1heFRpY2tMYWJlbFdpZHRoKHRpY2tDb3VudCwgbWluVmFsdWUsIG1heFZhbHVlLCB0aWNrRm9udFB4KTtcbiAgICBjb25zdCB0aWNrTGVuZ3RoID0gTWF0aC5tYXgoNCwgTWF0aC5taW4oKHNpemUgLyAyKSAqIDAuMTIsIDE0KSk7XG4gICAgLy8gS2VlcCBsYWJlbHMgY2xvc2VyIHRvIHRoZSBnYXVnZSBhcmMgd2hpbGUgcHJlc2VydmluZyByZWFkYWJpbGl0eS5cbiAgICBjb25zdCBsYWJlbEdhcCA9IE1hdGgubWF4KDYsIE1hdGgubWluKChzaXplIC8gMikgKiAwLjA2LCAxNCkpO1xuICAgIGNvbnN0IGxhYmVsT2Zmc2V0RnJvbVRpY2tFbmQgPSBsYWJlbEdhcCArIHRpY2tGb250UHggKiAwLjM1O1xuICAgIGNvbnN0IHRpY2tMYWJlbFNwYWNlID0gdGlja0xlbmd0aCArIGxhYmVsT2Zmc2V0RnJvbVRpY2tFbmQgKyB0aWNrRm9udFB4O1xuICAgIGNvbnN0IHRvdGFsVmVydGljYWxTcGFjZSA9IHNpemUgLyAyICsgdGlja0xhYmVsU3BhY2U7XG5cbiAgICAvLyBMYWJlbHMgYXQgZWRnZSB0aWNrcyB1c2Ugc3RhcnQvZW5kIGFuY2hvcnMsIHNvIHRoZXkgY2FuIGV4dGVuZCBieSBuZWFyIGZ1bGwgd2lkdGguXG4gICAgY29uc3QgaG9yaXpvbnRhbFBhZGRpbmcgPSBNYXRoLm1heCgxOCwgbWF4VGlja0xhYmVsV2lkdGggKyA4KTtcbiAgICBjb25zdCB0b3RhbFdpZHRoID0gc2l6ZSArIGhvcml6b250YWxQYWRkaW5nICogMjtcbiAgICBjb25zdCB2aWV3Qm94V2lkdGggPSB0b3RhbFdpZHRoICsgdGhpcy5DSEFSVF9FREdFX1BBRERJTkcgKiAyO1xuICAgIGNvbnN0IHZpZXdCb3hIZWlnaHQgPSB0b3RhbFZlcnRpY2FsU3BhY2UgKyB0aGlzLkNIQVJUX0VER0VfUEFERElORyAqIDI7XG5cbiAgICAvLyBTZXQgdXAgU1ZHIHdpdGggcmVzcG9uc2l2ZSB2aWV3Qm94IHRoYXQgYWNjb3VudHMgZm9yIG92ZXJmbG93XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5kM1xuICAgICAgLnNlbGVjdCh0aGlzLnN2Z0VsZW1lbnQpXG4gICAgICAuYXR0cignd2lkdGgnLCAnMTAwJScpXG4gICAgICAuYXR0cignaGVpZ2h0JywgJzEwMCUnKVxuICAgICAgLmF0dHIoJ3ZpZXdCb3gnLCBgMCAwICR7dmlld0JveFdpZHRofSAke3ZpZXdCb3hIZWlnaHR9YClcbiAgICAgIC5hdHRyKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJywgJ3hNaWRZTWlkIG1lZXQnKTtcblxuICAgIC8vIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgY2hhcnQgY2VudGVyZWQgaG9yaXpvbnRhbGx5IHdpdGggcGFkZGluZywgcG9zaXRpb25lZCB0byBzaG93IG9ubHkgdGhlIHRvcCBoYWxmXG4gICAgY29uc3QgY2hhcnRHcm91cCA9IHN2Z1xuICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAuYXR0cihcbiAgICAgICAgJ3RyYW5zZm9ybScsXG4gICAgICAgIGB0cmFuc2xhdGUoJHtzaXplIC8gMiArIGhvcml6b250YWxQYWRkaW5nICsgdGhpcy5DSEFSVF9FREdFX1BBRERJTkd9LCAke3NpemUgLyAyIC0gbWFyZ2luICsgdGhpcy5DSEFSVF9FREdFX1BBRERJTkd9KWAsXG4gICAgICApO1xuXG4gICAgLy8gRGVmaW5lIGdhdWdlIHBhcmFtZXRlcnNcbiAgICBjb25zdCByYWRpdXMgPSBzaXplIC8gMiAtIG1hcmdpbjtcbiAgICBjb25zdCBkZXNpcmVkR2F1Z2VXaWR0aCA9IHR5cGVvZiBnYXVnZVdpZHRoID09PSAnbnVtYmVyJyAmJiAhTnVtYmVyLmlzTmFOKGdhdWdlV2lkdGgpID8gZ2F1Z2VXaWR0aCA6IDMwO1xuICAgIC8vIFJlc3BlY3QgZXhwbGljaXQgZ2F1Z2VXaWR0aCBpbiBweCB3aXRoIHNhbmUgYWJzb2x1dGUgYm91bmRzLlxuICAgIGNvbnN0IGNsYW1wZWRHYXVnZVdpZHRoID0gTWF0aC5tYXgoNiwgTWF0aC5taW4oZGVzaXJlZEdhdWdlV2lkdGgsIHJhZGl1cyAqIDAuNykpO1xuICAgIGNvbnN0IGlubmVyUmFkaXVzID0gcmFkaXVzIC0gY2xhbXBlZEdhdWdlV2lkdGg7XG4gICAgY29uc3Qgb3V0ZXJSYWRpdXMgPSByYWRpdXM7XG5cbiAgICAvLyBDcmVhdGUgZ3JhZGllbnQgZGVmaW5pdGlvbnNcbiAgICB0aGlzLmNyZWF0ZUdyYWRpZW50cyhzdmcsIHRocmVzaG9sZHMpO1xuXG4gICAgLy8gRHJhdyB0aGUgYmFja2dyb3VuZCBhcmNcbiAgICB0aGlzLmRyYXdCYWNrZ3JvdW5kQXJjKGNoYXJ0R3JvdXAsIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cywgY29ybmVyUmFkaXVzKTtcblxuICAgIC8vIERyYXcgdGhlIHRocmVzaG9sZCBhcmNzIGlmIHRocmVzaG9sZHMgZXhpc3RcbiAgICBpZiAodGhyZXNob2xkcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmRyYXdUaHJlc2hvbGRzKGNoYXJ0R3JvdXAsIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cywgbWluVmFsdWUsIG1heFZhbHVlLCB0aHJlc2hvbGRzLCBjb3JuZXJSYWRpdXMpO1xuICAgIH1cblxuICAgIC8vIERyYXcgdGljayBtYXJrc1xuICAgIHRoaXMuZHJhd1RpY2tzKGNoYXJ0R3JvdXAsIG91dGVyUmFkaXVzLCBtaW5WYWx1ZSwgbWF4VmFsdWUsIHNpemUsIHRpY2tDb3VudCwgdGlja0ZvbnRQeCk7XG5cbiAgICAvLyBEcmF3IHRoZSBkaWFsL25lZWRsZSB3aXRoIGFuaW1hdGlvblxuICAgIHRoaXMuZHJhd0RpYWwoY2hhcnRHcm91cCwgcmFkaXVzLCBjdXJyZW50VmFsdWUsIG1pblZhbHVlLCBtYXhWYWx1ZSwgYW5pbWF0aW9uRHVyYXRpb24pO1xuXG4gICAgLy8gRHJhdyB0aGUgdmFsdWUgZGlzcGxheSAoYWZ0ZXIgdGhlIGRpYWwgc28gaXQncyBvbiB0b3ApXG4gICAgaWYgKHNob3dWYWx1ZSkge1xuICAgICAgdGhpcy5kcmF3VmFsdWVEaXNwbGF5KGNoYXJ0R3JvdXAsIGN1cnJlbnRWYWx1ZSwgbGFiZWwsIHJhZGl1cywgc2l6ZSk7XG4gICAgfVxuXG4gICAgLy8gSGlkZSB0b29sdGlwIGluaXRpYWxseVxuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY2hhcnQgd2hlbiBvcHRpb25zIGNoYW5nZVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIG9ubHkgdGhlIHZhbHVlIGRpc3BsYXkgYW5kIGRpYWwgcG9zaXRpb24gd2l0aG91dCByZWNyZWF0aW5nIHRoZSBjaGFydFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVZhbHVlQW5kRGlhbCh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN2Z0VsZW1lbnQpIHJldHVybjtcblxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKTtcbiAgICBjb25zdCBtaW5WYWx1ZSA9IG9wdGlvbnMubWluVmFsdWU7XG4gICAgY29uc3QgbWF4VmFsdWUgPSBvcHRpb25zLm1heFZhbHVlO1xuICAgIGNvbnN0IGFuaW1hdGlvbkR1cmF0aW9uID0gb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvbjtcbiAgICBjb25zdCBlYXNpbmdGdW5jdGlvbiA9IGdldEVhc2luZ0Z1bmN0aW9uKHRoaXMuZDMsIG9wdGlvbnMuYW5pbWF0aW9uRWFzaW5nKTtcblxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZhbHVlO1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuZDMuc2VsZWN0KHRoaXMuc3ZnRWxlbWVudCk7XG5cbiAgICAvLyBVcGRhdGUgdmFsdWUgdGV4dFxuICAgIHN2Zy5zZWxlY3QoJy5nYXVnZS12YWx1ZScpLnRleHQoY3VycmVudFZhbHVlLnRvTG9jYWxlU3RyaW5nKCkpO1xuXG4gICAgLy8gVXBkYXRlIG5lZWRsZSBwb3NpdGlvblxuICAgIGNvbnN0IGFuZ2xlID0gdGhpcy5zY2FsZVZhbHVlVG9BbmdsZShjdXJyZW50VmFsdWUsIG1pblZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgY29uc3QgYW5nbGVJbkRlZ3JlZXMgPSB0aGlzLnJhZGlhbnNUb0RlZ3JlZXMoYW5nbGUgLSB0aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlMpO1xuXG4gICAgc3ZnXG4gICAgICAuc2VsZWN0KCcuZ2F1Z2UtbmVlZGxlJylcbiAgICAgIC5hdHRyKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LW5lZWRsZS1jb2xvcikpJylcbiAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgIC5kdXJhdGlvbihhbmltYXRpb25EdXJhdGlvbilcbiAgICAgIC5lYXNlKGVhc2luZ0Z1bmN0aW9uKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGByb3RhdGUoJHthbmdsZUluRGVncmVlc30pYCk7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgYmFja2dyb3VuZCBhcmNcbiAgICovXG4gIHByaXZhdGUgZHJhd0JhY2tncm91bmRBcmMoXG4gICAgY2hhcnRHcm91cDogZDMuU2VsZWN0aW9uPFNWR0dFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+LFxuICAgIGlubmVyUmFkaXVzOiBudW1iZXIsXG4gICAgb3V0ZXJSYWRpdXM6IG51bWJlcixcbiAgICBjb3JuZXJSYWRpdXM6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGFyYyBmb3IgdGhlIGJhY2tncm91bmRcbiAgICBjb25zdCBiYWNrZ3JvdW5kQXJjID0gdGhpcy5kM1xuICAgICAgLmFyYygpXG4gICAgICAuaW5uZXJSYWRpdXMoaW5uZXJSYWRpdXMpXG4gICAgICAub3V0ZXJSYWRpdXMob3V0ZXJSYWRpdXMpXG4gICAgICAuc3RhcnRBbmdsZSgtdGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TKSAvLyBTdGFydCBmcm9tIGJvdHRvbSAoLTkwIGRlZ3JlZXMpXG4gICAgICAuZW5kQW5nbGUodGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TKSAvLyBFbmQgYXQgdG9wICg5MCBkZWdyZWVzKVxuICAgICAgLmNvcm5lclJhZGl1cyhjb3JuZXJSYWRpdXMpO1xuXG4gICAgLy8gRHJhdyBiYWNrZ3JvdW5kIGFyY1xuICAgIGNvbnN0IGJhY2tncm91bmRQYXRoID0gY2hhcnRHcm91cFxuICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAuYXR0cignZCcsIGJhY2tncm91bmRBcmMpXG4gICAgICAuYXR0cignY2xhc3MnLCAnZ2F1Z2UtYXJjIGdhdWdlLWJhc2UnKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCBgdXJsKCMke3RoaXMuYmdHcmFkaWVudElkfSlgKVxuICAgICAgLmF0dHIoJ2ZpbHRlcicsICdkcm9wLXNoYWRvdygwcHggMnB4IDNweCByZ2JhKDAsMCwwLDAuMSkpJyk7XG5cbiAgICAvLyBBZGQgdG9vbHRpcCBmb3Igc2luZ2xlIGFyYyBpZiBubyB0aHJlc2hvbGRzXG4gICAgaWYgKCF0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS50aHJlc2hvbGRzIHx8IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnRocmVzaG9sZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBiYWNrZ3JvdW5kUGF0aFxuICAgICAgICAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJylcbiAgICAgICAgLm9uKCdtb3VzZWVudGVyJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93VG9vbHRpcCkgcmV0dXJuO1xuICAgICAgICAgIHRoaXMuc2hvd1NpbmdsZVJhbmdlVG9vbHRpcChldmVudCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignbW91c2Vtb3ZlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX3Rvb2x0aXBWaXNpYmxlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgICAgICB0aGlzLmhpZGVUb29sdGlwKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IHRoZSB0aHJlc2hvbGRzIGFyY3NcbiAgICovXG4gIHByaXZhdGUgZHJhd1RocmVzaG9sZHMoXG4gICAgY2hhcnRHcm91cDogZDMuU2VsZWN0aW9uPFNWR0dFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+LFxuICAgIGlubmVyUmFkaXVzOiBudW1iZXIsXG4gICAgb3V0ZXJSYWRpdXM6IG51bWJlcixcbiAgICBtaW5WYWx1ZTogbnVtYmVyLFxuICAgIG1heFZhbHVlOiBudW1iZXIsXG4gICAgdGhyZXNob2xkczogeyB2YWx1ZTogbnVtYmVyOyBjb2xvcjogc3RyaW5nOyBsYWJlbD86IHN0cmluZyB9W10sXG4gICAgY29ybmVyUmFkaXVzOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhcmMgZ2VuZXJhdG9yXG4gICAgY29uc3QgYXJjID0gdGhpcy5kM1xuICAgICAgLmFyYygpXG4gICAgICAuaW5uZXJSYWRpdXMoaW5uZXJSYWRpdXMpXG4gICAgICAub3V0ZXJSYWRpdXMob3V0ZXJSYWRpdXMgKiAwLjk4KVxuICAgICAgLmNvcm5lclJhZGl1cyhjb3JuZXJSYWRpdXMpO1xuXG4gICAgLy8gU29ydCB0aHJlc2hvbGRzIGJ5IHZhbHVlIGluIGFzY2VuZGluZyBvcmRlciAob25seSBpZiBuZWVkZWQpXG4gICAgY29uc3Qgc29ydGVkVGhyZXNob2xkcyA9IHRocmVzaG9sZHMubGVuZ3RoID4gMSA/IFsuLi50aHJlc2hvbGRzXS5zb3J0KChhLCBiKSA9PiBhLnZhbHVlIC0gYi52YWx1ZSkgOiB0aHJlc2hvbGRzO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGFsbCBhbmdsZXMgZmlyc3QgdXNpbmcgdGhlIGNvbG9yIGFuZ2xlIGNhbGN1bGF0aW9uXG4gICAgY29uc3QgYW5nbGVzID0gc29ydGVkVGhyZXNob2xkcy5tYXAoKHQpID0+IHRoaXMuc2NhbGVWYWx1ZVRvQ29sb3JBbmdsZSh0LnZhbHVlLCBtaW5WYWx1ZSwgbWF4VmFsdWUpKTtcblxuICAgIC8vIFN0YXJ0IGZyb20gdGhlIG1pbmltdW0gdmFsdWUgYW5nbGVcbiAgICBsZXQgcHJldmlvdXNFbmRBbmdsZSA9IHRoaXMuc2NhbGVWYWx1ZVRvQ29sb3JBbmdsZShtaW5WYWx1ZSwgbWluVmFsdWUsIG1heFZhbHVlKTtcbiAgICBjb25zdCBsYWJlbGVkU2VnbWVudHM6IHtcbiAgICAgIHN0YXJ0QW5nbGU6IG51bWJlcjtcbiAgICAgIGVuZEFuZ2xlOiBudW1iZXI7XG4gICAgICBsYWJlbDogc3RyaW5nO1xuICAgIH1bXSA9IFtdO1xuXG4gICAgc29ydGVkVGhyZXNob2xkcy5mb3JFYWNoKCh0aHJlc2hvbGQsIGkpID0+IHtcbiAgICAgIGNvbnN0IGVuZEFuZ2xlID0gYW5nbGVzW2ldO1xuXG4gICAgICAvLyBTa2lwIGlmIGVuZCBhbmdsZSBpcyBub3QgZ3JlYXRlciB0aGFuIHN0YXJ0IGFuZ2xlXG4gICAgICBpZiAoZW5kQW5nbGUgPD0gcHJldmlvdXNFbmRBbmdsZSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzdGFydEFuZ2xlID0gcHJldmlvdXNFbmRBbmdsZTtcbiAgICAgIGNvbnN0IGFyY1BhdGggPSBjaGFydEdyb3VwXG4gICAgICAgIC5hcHBlbmQoJ3BhdGgnKVxuICAgICAgICAuYXR0cihcbiAgICAgICAgICAnZCcsXG4gICAgICAgICAgYXJjKHtcbiAgICAgICAgICAgIGlubmVyUmFkaXVzLFxuICAgICAgICAgICAgb3V0ZXJSYWRpdXMsXG4gICAgICAgICAgICBzdGFydEFuZ2xlLFxuICAgICAgICAgICAgZW5kQW5nbGUsXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICAgLmF0dHIoJ2ZpbGwnLCB0aHJlc2hvbGQuY29sb3IgfHwgYHVybCgjJHt0aGlzLnRocmVzaG9sZEdyYWRpZW50SWQoaSl9KWApXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdnYXVnZS1hcmMgdGhyZXNob2xkLWFyYycpXG4gICAgICAgIC5hdHRyKCdkYXRhLXZhbHVlJywgdGhyZXNob2xkLnZhbHVlKVxuICAgICAgICAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJyk7XG5cbiAgICAgIGlmICh0aHJlc2hvbGQubGFiZWwpIHtcbiAgICAgICAgbGFiZWxlZFNlZ21lbnRzLnB1c2goeyBzdGFydEFuZ2xlLCBlbmRBbmdsZSwgbGFiZWw6IHRocmVzaG9sZC5sYWJlbCB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIHRvb2x0aXAgaW50ZXJhY3Rpb25cbiAgICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93VG9vbHRpcCkge1xuICAgICAgICAvLyBDb252ZXJ0IGFuZ2xlcyBiYWNrIHRvIHZhbHVlcyBmb3IgdG9vbHRpcFxuICAgICAgICBjb25zdCBzdGFydFZhbHVlID0gdGhpcy5hbmdsZVRvVmFsdWUocHJldmlvdXNFbmRBbmdsZSwgbWluVmFsdWUsIG1heFZhbHVlKTtcbiAgICAgICAgY29uc3QgZW5kVmFsdWUgPSB0aHJlc2hvbGQudmFsdWU7XG5cbiAgICAgICAgYXJjUGF0aFxuICAgICAgICAgIC5vbignbW91c2VlbnRlcicsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93VGhyZXNob2xkVG9vbHRpcChldmVudCwgc3RhcnRWYWx1ZSwgZW5kVmFsdWUsIHRocmVzaG9sZC5jb2xvciwgdGhyZXNob2xkLmxhYmVsKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5vbignbW91c2Vtb3ZlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdG9vbHRpcFZpc2libGUoKSkge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAub24oJ21vdXNlbGVhdmUnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhpZGVUb29sdGlwKCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgcHJldmlvdXMgZW5kIGFuZ2xlIGZvciB0aGUgbmV4dCB0aHJlc2hvbGRcbiAgICAgIHByZXZpb3VzRW5kQW5nbGUgPSBlbmRBbmdsZTtcbiAgICB9KTtcblxuICAgIC8vIERyYXcgdGhlIGxhc3Qgc2VnbWVudCBpZiB0aGUgbGFzdCB0aHJlc2hvbGQgaXMgbGVzcyB0aGFuIHRoZSBtYXggdmFsdWVcbiAgICBpZiAocHJldmlvdXNFbmRBbmdsZSA8IHRoaXMuUVVBUlRFUl9DSVJDTEVfUkFESUFOUykge1xuICAgICAgY29uc3QgbGFzdEFyYyA9IGNoYXJ0R3JvdXBcbiAgICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAgIC5hdHRyKFxuICAgICAgICAgICdkJyxcbiAgICAgICAgICBhcmMoe1xuICAgICAgICAgICAgaW5uZXJSYWRpdXMsXG4gICAgICAgICAgICBvdXRlclJhZGl1cyxcbiAgICAgICAgICAgIHN0YXJ0QW5nbGU6IHByZXZpb3VzRW5kQW5nbGUsXG4gICAgICAgICAgICBlbmRBbmdsZTogdGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICAgIC5hdHRyKCdmaWxsJywgYHVybCgjJHt0aGlzLmJnR3JhZGllbnRJZH0pYClcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2dhdWdlLWFyYyB0aHJlc2hvbGQtYXJjJylcbiAgICAgICAgLnN0eWxlKCdjdXJzb3InLCAncG9pbnRlcicpO1xuXG4gICAgICAvLyBBZGQgdG9vbHRpcCBmb3IgdGhlIGxhc3Qgc2VnbWVudFxuICAgICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dUb29sdGlwKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VmFsdWUgPSB0aGlzLmFuZ2xlVG9WYWx1ZShwcmV2aW91c0VuZEFuZ2xlLCBtaW5WYWx1ZSwgbWF4VmFsdWUpO1xuICAgICAgICBjb25zdCBlbmRWYWx1ZSA9IG1heFZhbHVlO1xuICAgICAgICBjb25zdCBsYXN0VGhyZXNob2xkID0gdGhyZXNob2xkc1t0aHJlc2hvbGRzLmxlbmd0aCAtIDFdO1xuXG4gICAgICAgIGxhc3RBcmNcbiAgICAgICAgICAub24oJ21vdXNlZW50ZXInLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1RocmVzaG9sZFRvb2x0aXAoZXZlbnQsIHN0YXJ0VmFsdWUsIGVuZFZhbHVlLCBsYXN0VGhyZXNob2xkLmNvbG9yLCBsYXN0VGhyZXNob2xkLmxhYmVsKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5vbignbW91c2Vtb3ZlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdG9vbHRpcFZpc2libGUoKSkge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAub24oJ21vdXNlbGVhdmUnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhpZGVUb29sdGlwKCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dEYXRhTGFiZWxzICE9PSBmYWxzZSAmJiBsYWJlbGVkU2VnbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5kcmF3U2VnbWVudExhYmVscyhjaGFydEdyb3VwLCBsYWJlbGVkU2VnbWVudHMsIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyYXdzIHRocmVzaG9sZCBsYWJlbHMgY2VudGVyZWQgb24gZWFjaCBzZWdtZW50IGFyYyB3aGVuIHNwYWNlIGFsbG93cy5cbiAgICovXG4gIHByaXZhdGUgZHJhd1NlZ21lbnRMYWJlbHMoXG4gICAgY2hhcnRHcm91cDogZDMuU2VsZWN0aW9uPFNWR0dFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+LFxuICAgIHNlZ21lbnRzOiB7IHN0YXJ0QW5nbGU6IG51bWJlcjsgZW5kQW5nbGU6IG51bWJlcjsgbGFiZWw6IHN0cmluZyB9W10sXG4gICAgaW5uZXJSYWRpdXM6IG51bWJlcixcbiAgICBvdXRlclJhZGl1czogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBsYWJlbEFyYyA9IHRoaXMuZDNcbiAgICAgIC5hcmMoKVxuICAgICAgLmlubmVyUmFkaXVzKGlubmVyUmFkaXVzKVxuICAgICAgLm91dGVyUmFkaXVzKG91dGVyUmFkaXVzICogMC45OCk7XG5cbiAgICBjb25zdCBsYWJlbEdyb3VwID0gY2hhcnRHcm91cC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdnYXVnZS1zZWdtZW50LWxhYmVscycpO1xuICAgIGNvbnN0IHJpbmdXaWR0aCA9IG91dGVyUmFkaXVzIC0gaW5uZXJSYWRpdXM7XG4gICAgY29uc3QgbGFiZWxSYWRpdXMgPSBpbm5lclJhZGl1cyArIHJpbmdXaWR0aCAvIDI7XG4gICAgY29uc3QgYW5pbWF0aW9uRHVyYXRpb24gPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5hbmltYXRpb25EdXJhdGlvbiA/PyA3NTA7XG5cbiAgICBzZWdtZW50cy5mb3JFYWNoKChzZWdtZW50KSA9PiB7XG4gICAgICBjb25zdCBhbmdsZSA9IHNlZ21lbnQuZW5kQW5nbGUgLSBzZWdtZW50LnN0YXJ0QW5nbGU7XG4gICAgICBjb25zdCBjaG9yZExlbmd0aCA9IDIgKiBsYWJlbFJhZGl1cyAqIE1hdGguc2luKGFuZ2xlIC8gMik7XG4gICAgICBjb25zdCBmb250U2l6ZSA9IHRoaXMuY2FsY3VsYXRlU2VnbWVudExhYmVsRm9udFNpemUoYW5nbGUsIHJpbmdXaWR0aCwgY2hvcmRMZW5ndGgpO1xuICAgICAgaWYgKGZvbnRTaXplIDw9IDApIHJldHVybjtcblxuICAgICAgY29uc3QgYXZhaWxhYmxlV2lkdGggPSBjaG9yZExlbmd0aCAqIDAuODtcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmdldEZpdHRlZFNlZ21lbnRMYWJlbChzZWdtZW50LmxhYmVsLCBmb250U2l6ZSwgYXZhaWxhYmxlV2lkdGgpO1xuICAgICAgaWYgKCF0ZXh0KSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGNlbnRyb2lkID0gbGFiZWxBcmMuY2VudHJvaWQoe1xuICAgICAgICBpbm5lclJhZGl1cyxcbiAgICAgICAgb3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzICogMC45OCxcbiAgICAgICAgc3RhcnRBbmdsZTogc2VnbWVudC5zdGFydEFuZ2xlLFxuICAgICAgICBlbmRBbmdsZTogc2VnbWVudC5lbmRBbmdsZSxcbiAgICAgIH0pO1xuXG4gICAgICBsYWJlbEdyb3VwXG4gICAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnZ2F1Z2Utc2VnbWVudC1sYWJlbCcpXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7Y2VudHJvaWRbMF19LCAke2NlbnRyb2lkWzFdfSlgKVxuICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgICAgLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ21pZGRsZScpXG4gICAgICAgIC5zdHlsZSgncG9pbnRlci1ldmVudHMnLCAnbm9uZScpXG4gICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgYCR7Zm9udFNpemV9cHhgKVxuICAgICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJzYwMCcpXG4gICAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC1kYXRhLWxhYmVscy1jb2xvcikpJylcbiAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMClcbiAgICAgICAgLnRleHQodGV4dClcbiAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAuZHVyYXRpb24oYW5pbWF0aW9uRHVyYXRpb24pXG4gICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDEpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVTZWdtZW50TGFiZWxGb250U2l6ZShhbmdsZTogbnVtYmVyLCByaW5nV2lkdGg6IG51bWJlciwgY2hvcmRMZW5ndGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKGNob3JkTGVuZ3RoIDwgdGhpcy5NSU5fU0VHTUVOVF9DSE9SRF9GT1JfTEFCRUwgfHwgcmluZ1dpZHRoIDwgdGhpcy5NSU5fU0VHTUVOVF9SSU5HX0ZPUl9MQUJFTCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgcmluZ0Jhc2VkU2l6ZSA9IHJpbmdXaWR0aCAqIDAuNDU7XG4gICAgY29uc3QgYW5nbGVTY2FsZSA9IE1hdGgubWluKDEsIDAuNyArIDAuMyAqIChhbmdsZSAvICh0aGlzLkhBTEZfQ0lSQ0xFX1JBRElBTlMgLyAzKSkpO1xuICAgIGNvbnN0IG1heEJ5Q2hvcmQgPSBjaG9yZExlbmd0aCAvICgyICogMC42NSk7XG4gICAgY29uc3QgZm9udFNpemUgPSBNYXRoLm1pbihyaW5nQmFzZWRTaXplICogYW5nbGVTY2FsZSwgbWF4QnlDaG9yZCk7XG5cbiAgICBpZiAoZm9udFNpemUgPCB0aGlzLk1JTl9TRUdNRU5UX0xBQkVMX0ZPTlQpIHJldHVybiAwO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKE1hdGgubWF4KHRoaXMuTUlOX1NFR01FTlRfTEFCRUxfRk9OVCwgTWF0aC5taW4oZm9udFNpemUsIHRoaXMuTUFYX1NFR01FTlRfTEFCRUxfRk9OVCkpICogMikgLyAyO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGaXR0ZWRTZWdtZW50TGFiZWwobGFiZWw6IHN0cmluZywgZm9udFNpemU6IG51bWJlciwgYXZhaWxhYmxlV2lkdGg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCFsYWJlbCkgcmV0dXJuICcnO1xuICAgIGlmICh0aGlzLmRvZXNTZWdtZW50TGFiZWxGaXQobGFiZWwsIGZvbnRTaXplLCBhdmFpbGFibGVXaWR0aCkpIHJldHVybiBsYWJlbDtcbiAgICByZXR1cm4gdGhpcy50cnVuY2F0ZVNlZ21lbnRMYWJlbChsYWJlbCwgZm9udFNpemUsIGF2YWlsYWJsZVdpZHRoKTtcbiAgfVxuXG4gIHByaXZhdGUgZG9lc1NlZ21lbnRMYWJlbEZpdCh0ZXh0OiBzdHJpbmcsIGZvbnRTaXplOiBudW1iZXIsIGF2YWlsYWJsZVdpZHRoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGV4dC5sZW5ndGggKiBmb250U2l6ZSAqIDAuNjUgPD0gYXZhaWxhYmxlV2lkdGg7XG4gIH1cblxuICBwcml2YXRlIHRydW5jYXRlU2VnbWVudExhYmVsKHRleHQ6IHN0cmluZywgZm9udFNpemU6IG51bWJlciwgYXZhaWxhYmxlV2lkdGg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgY2hhcldpZHRoID0gZm9udFNpemUgKiAoZm9udFNpemUgPD0gMTAgPyAwLjcgOiAwLjY1KTtcbiAgICBjb25zdCBhdmFpbGFibGVGb3JUZXh0ID0gYXZhaWxhYmxlV2lkdGggLSBmb250U2l6ZSAqIDAuNztcbiAgICBpZiAoYXZhaWxhYmxlRm9yVGV4dCA8PSAwKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCBtYXhDaGFycyA9IE1hdGguZmxvb3IoYXZhaWxhYmxlRm9yVGV4dCAvIGNoYXJXaWR0aCk7XG4gICAgaWYgKG1heENoYXJzIDw9IDApIHJldHVybiAnJztcbiAgICBpZiAodGV4dC5sZW5ndGggPD0gbWF4Q2hhcnMpIHJldHVybiB0ZXh0O1xuICAgIHJldHVybiBgJHt0ZXh0LnN1YnN0cmluZygwLCBNYXRoLm1heCgxLCBtYXhDaGFycykpfeKApmA7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgdG9vbHRpcCBmb3IgYSB0aHJlc2hvbGQgYXJjXG4gICAqL1xuICBwcml2YXRlIHNob3dUaHJlc2hvbGRUb29sdGlwKFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50LFxuICAgIHN0YXJ0VmFsdWU6IG51bWJlcixcbiAgICBlbmRWYWx1ZTogbnVtYmVyLFxuICAgIGNvbG9yOiBzdHJpbmcsXG4gICAgbGFiZWw/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSB0b29sdGlwIGRhdGFcbiAgICB0aGlzLl90b29sdGlwRGF0YS5zZXQoe1xuICAgICAgdGl0bGU6IGxhYmVsIHx8ICdSYW5nZScsXG4gICAgICB2YWx1ZTogYCR7c3RhcnRWYWx1ZS50b0xvY2FsZVN0cmluZygpfSAtICR7ZW5kVmFsdWUudG9Mb2NhbGVTdHJpbmcoKX1gLFxuICAgICAgY29sb3I6IGNvbG9yLFxuICAgIH0pO1xuXG4gICAgLy8gU2hvdyB0b29sdGlwXG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KHRydWUpO1xuICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyB0b29sdGlwIGZvciB0aGUgZW50aXJlIHJhbmdlIHdoZW4gbm8gdGhyZXNob2xkcyBhcmUgZGVmaW5lZFxuICAgKi9cbiAgcHJpdmF0ZSBzaG93U2luZ2xlUmFuZ2VUb29sdGlwKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuICAgIGlmICghb3B0aW9ucy5zaG93VG9vbHRpcCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fdG9vbHRpcERhdGEuc2V0KHtcbiAgICAgIHRpdGxlOiBvcHRpb25zLmxhYmVsIHx8ICdSYW5nZScsXG4gICAgICB2YWx1ZTogYCR7b3B0aW9ucy5taW5WYWx1ZS50b0xvY2FsZVN0cmluZygpfSAtICR7b3B0aW9ucy5tYXhWYWx1ZS50b0xvY2FsZVN0cmluZygpfWAsXG4gICAgICBjb2xvcjogJ3JnYih2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LXRyYWNrLWNvbG9yKSknLFxuICAgIH0pO1xuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldCh0cnVlKTtcbiAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzID0geyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH07XG4gICAgaWYgKHRoaXMuX3Rvb2x0aXBSYWZJZCAhPSBudWxsKSByZXR1cm47XG4gICAgdGhpcy5zY2hlZHVsZVRvb2x0aXBQb3NpdGlvbigwKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVUb29sdGlwUG9zaXRpb24oYXR0ZW1wdDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fdG9vbHRpcFJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzO1xuICAgICAgaWYgKCFjb29yZHMpIHtcbiAgICAgICAgdGhpcy5fdG9vbHRpcFJhZklkID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250YWluZXJFbCA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFjb250YWluZXJFbCkge1xuICAgICAgICB0aGlzLl90b29sdGlwUmFmSWQgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRvb2x0aXBFbCA9IGNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoJy5jaGFydC10b29sdGlwJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgaWYgKCF0b29sdGlwRWwgJiYgdGhpcy5fdG9vbHRpcFZpc2libGUoKSAmJiBhdHRlbXB0IDwgMykge1xuICAgICAgICB0aGlzLnNjaGVkdWxlVG9vbHRpcFBvc2l0aW9uKGF0dGVtcHQgKyAxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl90b29sdGlwUmFmSWQgPSBudWxsO1xuICAgICAgY29uc3QgcmVjdCA9IGNvbnRhaW5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgdG9vbHRpcFJlY3QgPSB0b29sdGlwRWw/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpID8/IG51bGw7XG4gICAgICBjb25zdCBwb3MgPSBjb21wdXRlVG9vbHRpcFBvc2l0aW9uKHJlY3QsIHRvb2x0aXBSZWN0LCBjb29yZHMueCArIDEwLCBjb29yZHMueSAtIDEwLCB0aGlzLlRPT0xUSVBfR0FQKTtcbiAgICAgIHRoaXMuX3Rvb2x0aXBQb3NpdGlvbi5zZXQocG9zKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyB0aGUgdG9vbHRpcFxuICAgKi9cbiAgcHJpdmF0ZSBoaWRlVG9vbHRpcCgpOiB2b2lkIHtcbiAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyB1cCBjaGFydCByZXNvdXJjZXNcbiAgICovXG4gIHB1YmxpYyBjbGVhbnVwQ2hhcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Rvb2x0aXBSYWZJZCAhPSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl90b29sdGlwUmFmSWQpO1xuICAgICAgdGhpcy5fdG9vbHRpcFJhZklkID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fcGVuZGluZ1Rvb2x0aXBDb29yZHMgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMuc3ZnRWxlbWVudCkge1xuICAgICAgdGhpcy5zdmdFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5zdmdFbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmF4LWNoYXJ0LWVtcHR5JykuZm9yRWFjaCgoZWwpID0+IGVsLnJlbW92ZSgpKTtcbiAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuX2xhc3RDb250YWluZXJSZWN0ID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGdyYWRpZW50IGRlZmluaXRpb25zIGZvciB0aHJlc2hvbGRzXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUdyYWRpZW50cyhcbiAgICBzdmc6IGQzLlNlbGVjdGlvbjxTVkdTVkdFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+LFxuICAgIHRocmVzaG9sZHM6IHsgdmFsdWU6IG51bWJlcjsgY29sb3I6IHN0cmluZyB9W10sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGRlZnMgPSBzdmcuYXBwZW5kKCdkZWZzJyk7XG5cbiAgICAvLyBDcmVhdGUgYSByYWRpYWwgZ3JhZGllbnQgZm9yIHRoZSBiYWNrZ3JvdW5kXG4gICAgY29uc3QgYmdHcmFkaWVudCA9IGRlZnNcbiAgICAgIC5hcHBlbmQoJ3JhZGlhbEdyYWRpZW50JylcbiAgICAgIC5hdHRyKCdpZCcsIHRoaXMuYmdHcmFkaWVudElkKVxuICAgICAgLmF0dHIoJ2N4JywgJzUwJScpXG4gICAgICAuYXR0cignY3knLCAnNTAlJylcbiAgICAgIC5hdHRyKCdyJywgJzUwJScpXG4gICAgICAuYXR0cignZ3JhZGllbnRVbml0cycsICd1c2VyU3BhY2VPblVzZScpO1xuXG4gICAgLy8gR2V0IENTUyB2YXJpYWJsZSBmb3IgdHJhY2sgY29sb3JcbiAgICBpZiAodGhyZXNob2xkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIERlZmF1bHQgZ3JhZGllbnQgd2hlbiBubyB0aHJlc2hvbGRzIGFyZSBwcm92aWRlZFxuICAgICAgYmdHcmFkaWVudC5hcHBlbmQoJ3N0b3AnKS5hdHRyKCdvZmZzZXQnLCAnMCUnKS5hdHRyKCdzdG9wLWNvbG9yJywgJ3JnYih2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LXRyYWNrLWNvbG9yKSknKTtcbiAgICAgIGJnR3JhZGllbnRcbiAgICAgICAgLmFwcGVuZCgnc3RvcCcpXG4gICAgICAgIC5hdHRyKCdvZmZzZXQnLCAnMTAwJScpXG4gICAgICAgIC5hdHRyKCdzdG9wLWNvbG9yJywgJ3JnYmEodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10cmFjay1jb2xvciksIDAuOCknKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmdHcmFkaWVudC5hcHBlbmQoJ3N0b3AnKS5hdHRyKCdvZmZzZXQnLCAnMCUnKS5hdHRyKCdzdG9wLWNvbG9yJywgJ3JnYih2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LXRyYWNrLWNvbG9yKSknKTtcbiAgICAgIGJnR3JhZGllbnRcbiAgICAgICAgLmFwcGVuZCgnc3RvcCcpXG4gICAgICAgIC5hdHRyKCdvZmZzZXQnLCAnMTAwJScpXG4gICAgICAgIC5hdHRyKCdzdG9wLWNvbG9yJywgJ3JnYmEodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10cmFjay1jb2xvciksIDAuOCknKTtcblxuICAgICAgLy8gQ3JlYXRlIGdyYWRpZW50cyBmb3IgZWFjaCB0aHJlc2hvbGRcbiAgICAgIHRocmVzaG9sZHMuZm9yRWFjaCgodGhyZXNob2xkLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGdyYWRpZW50ID0gZGVmc1xuICAgICAgICAgIC5hcHBlbmQoJ2xpbmVhckdyYWRpZW50JylcbiAgICAgICAgICAuYXR0cignaWQnLCB0aGlzLnRocmVzaG9sZEdyYWRpZW50SWQoaSkpXG4gICAgICAgICAgLmF0dHIoJ2dyYWRpZW50VW5pdHMnLCAndXNlclNwYWNlT25Vc2UnKVxuICAgICAgICAgIC5hdHRyKCd4MScsICctMScpXG4gICAgICAgICAgLmF0dHIoJ3kxJywgJzAnKVxuICAgICAgICAgIC5hdHRyKCd4MicsICcxJylcbiAgICAgICAgICAuYXR0cigneTInLCAnMCcpO1xuXG4gICAgICAgIGdyYWRpZW50XG4gICAgICAgICAgLmFwcGVuZCgnc3RvcCcpXG4gICAgICAgICAgLmF0dHIoJ29mZnNldCcsICcwJScpXG4gICAgICAgICAgLmF0dHIoJ3N0b3AtY29sb3InLCB0aGlzLmQzLmNvbG9yKHRocmVzaG9sZC5jb2xvcik/LmJyaWdodGVyKDAuNSkudG9TdHJpbmcoKSB8fCB0aHJlc2hvbGQuY29sb3IpO1xuXG4gICAgICAgIGdyYWRpZW50LmFwcGVuZCgnc3RvcCcpLmF0dHIoJ29mZnNldCcsICcxMDAlJykuYXR0cignc3RvcC1jb2xvcicsIHRocmVzaG9sZC5jb2xvcik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgdGljayBtYXJrcyBhbmQgbGFiZWxzIGFyb3VuZCB0aGUgZ2F1Z2VcbiAgICovXG4gIHByaXZhdGUgZHJhd1RpY2tzKFxuICAgIGNoYXJ0R3JvdXA6IGQzLlNlbGVjdGlvbjxTVkdHRWxlbWVudCwgdW5rbm93biwgbnVsbCwgdW5kZWZpbmVkPixcbiAgICByYWRpdXM6IG51bWJlcixcbiAgICBtaW5WYWx1ZTogbnVtYmVyLFxuICAgIG1heFZhbHVlOiBudW1iZXIsXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIHRpY2tDb3VudDogbnVtYmVyLFxuICAgIHRpY2tGb250UHg6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgdGlja0xlbmd0aCA9IE1hdGgubWF4KDQsIE1hdGgubWluKHJhZGl1cyAqIDAuMTIsIDE0KSk7XG4gICAgY29uc3QgYmFzZUxhYmVsT2Zmc2V0ID0gdGhpcy5nZXRCYXNlTGFiZWxPZmZzZXQocmFkaXVzLCB0aWNrTGVuZ3RoLCB0aWNrRm9udFB4KTtcbiAgICBjb25zdCB0aWNrR3JvdXAgPSBjaGFydEdyb3VwLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ3RpY2tzJyk7XG5cbiAgICBjb25zdCB0aWNrVmFsdWVzID0gW10gYXMgbnVtYmVyW107XG4gICAgY29uc3Qgc3RlcCA9IChtYXhWYWx1ZSAtIG1pblZhbHVlKSAvICh0aWNrQ291bnQgLSAxKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRpY2tDb3VudDsgaSsrKSB7XG4gICAgICB0aWNrVmFsdWVzLnB1c2gobWluVmFsdWUgKyBpICogc3RlcCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGlja01ldHJpY3MgPSB0aWNrVmFsdWVzLm1hcCgodGljaykgPT4ge1xuICAgICAgY29uc3QgYW5nbGUgPSB0aGlzLnNjYWxlVmFsdWVUb0FuZ2xlKHRpY2ssIG1pblZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgICBjb25zdCByYWRpYW5zID0gYW5nbGUgLSB0aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlM7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByYWRpYW5zLFxuICAgICAgICBjb3M6IE1hdGguY29zKHJhZGlhbnMpLFxuICAgICAgICBzaW46IE1hdGguc2luKHJhZGlhbnMpLFxuICAgICAgICBsYWJlbDogdGhpcy5mb3JtYXRUaWNrVmFsdWUodGljaywgbWluVmFsdWUsIG1heFZhbHVlKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aWNrTWV0cmljcy5mb3JFYWNoKChtZXRyaWMpID0+IHtcbiAgICAgIHRpY2tHcm91cFxuICAgICAgICAuYXBwZW5kKCdsaW5lJylcbiAgICAgICAgLmF0dHIoJ3gxJywgbWV0cmljLmNvcyAqIChyYWRpdXMgKyA1KSlcbiAgICAgICAgLmF0dHIoJ3kxJywgbWV0cmljLnNpbiAqIChyYWRpdXMgKyA1KSlcbiAgICAgICAgLmF0dHIoJ3gyJywgbWV0cmljLmNvcyAqIChyYWRpdXMgKyB0aWNrTGVuZ3RoKSlcbiAgICAgICAgLmF0dHIoJ3kyJywgbWV0cmljLnNpbiAqIChyYWRpdXMgKyB0aWNrTGVuZ3RoKSlcbiAgICAgICAgLmF0dHIoJ3N0cm9rZScsICdyZ2JhKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtdGV4dC1jb2xvciksIDAuNSknKVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgMik7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0ZXh0U2VsZWN0aW9uID0gdGlja0dyb3VwXG4gICAgICAuc2VsZWN0QWxsPFNWR1RleHRFbGVtZW50LCAodHlwZW9mIHRpY2tNZXRyaWNzKVtudW1iZXJdPigndGV4dC5nYXVnZS10aWNrLWxhYmVsJylcbiAgICAgIC5kYXRhKHRpY2tNZXRyaWNzKVxuICAgICAgLmVudGVyKClcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2dhdWdlLXRpY2stbGFiZWwnKVxuICAgICAgLmF0dHIoJ3gnLCAwKVxuICAgICAgLmF0dHIoJ3knLCAwKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAncmdiYSh2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LXRleHQtY29sb3IpLCAwLjcpJylcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgYCR7dGlja0ZvbnRQeH1weGApXG4gICAgICAudGV4dCgoZCkgPT4gZC5sYWJlbCk7XG5cbiAgICB0ZXh0U2VsZWN0aW9uLmVhY2goKGQsIGluZGV4LCBub2RlcykgPT4ge1xuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2luZGV4XTtcbiAgICAgIGxldCBiYm94V2lkdGggPSB0aGlzLmVzdGltYXRlTGFiZWxXaWR0aChkLmxhYmVsLCB0aWNrRm9udFB4KTtcbiAgICAgIGxldCBiYm94SGVpZ2h0ID0gdGlja0ZvbnRQeDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJib3ggPSBub2RlLmdldEJCb3goKTtcbiAgICAgICAgaWYgKGJib3gud2lkdGggPiAwKSBiYm94V2lkdGggPSBiYm94LndpZHRoO1xuICAgICAgICBpZiAoYmJveC5oZWlnaHQgPiAwKSBiYm94SGVpZ2h0ID0gYmJveC5oZWlnaHQ7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gS2VlcCBmYWxsYmFjayBlc3RpbWF0ZXMuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFuY2hvciA9IHRoaXMuZ2V0VGlja0xhYmVsQW5jaG9yKGQuY29zKTtcbiAgICAgIGNvbnN0IG5lYXJFZGdlRXh0ZW50ID0gdGhpcy5nZXROZWFyRWRnZVByb2plY3Rpb24oYW5jaG9yLCBkLmNvcywgZC5zaW4sIGJib3hXaWR0aCwgYmJveEhlaWdodCk7XG4gICAgICBjb25zdCByZXF1aXJlZE9mZnNldCA9IHRpY2tMZW5ndGggKyB0aGlzLkxBQkVMX1RJQ0tfQ0xFQVJBTkNFICsgbmVhckVkZ2VFeHRlbnQ7XG4gICAgICBjb25zdCBlZmZlY3RpdmVMYWJlbE9mZnNldCA9IE1hdGgubWF4KGJhc2VMYWJlbE9mZnNldCwgcmVxdWlyZWRPZmZzZXQpO1xuICAgICAgY29uc3QgbnVkZ2UgPSB0aWNrRm9udFB4ICogMC4xO1xuXG4gICAgICBjb25zdCB4ID0gZC5jb3MgKiAocmFkaXVzICsgZWZmZWN0aXZlTGFiZWxPZmZzZXQpICsgKGFuY2hvciA9PT0gJ3N0YXJ0JyA/IG51ZGdlIDogYW5jaG9yID09PSAnZW5kJyA/IC1udWRnZSA6IDApO1xuICAgICAgY29uc3QgeSA9IGQuc2luICogKHJhZGl1cyArIGVmZmVjdGl2ZUxhYmVsT2Zmc2V0KTtcblxuICAgICAgdGhpcy5kMy5zZWxlY3Qobm9kZSkuYXR0cigneCcsIHgpLmF0dHIoJ3knLCB5KS5hdHRyKCd0ZXh0LWFuY2hvcicsIGFuY2hvcikuYXR0cignZG9taW5hbnQtYmFzZWxpbmUnLCAnbWlkZGxlJyk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRpY2tDb3VudChzaXplOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmIChzaXplIDwgMjAwKSByZXR1cm4gMztcbiAgICBpZiAoc2l6ZSA8IDMwMCkgcmV0dXJuIDQ7XG4gICAgaWYgKHNpemUgPCA0MDApIHJldHVybiA1O1xuICAgIGlmIChzaXplID4gNTIwKSByZXR1cm4gNztcbiAgICByZXR1cm4gNTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGlja0ZvbnRTaXplKHNpemU6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDE0LCBNYXRoLm1pbigxOCwgTWF0aC5mbG9vcihzaXplIC8gMzUpKSk7XG4gIH1cblxuICBwcml2YXRlIGdldEJhc2VMYWJlbE9mZnNldChyYWRpdXM6IG51bWJlciwgdGlja0xlbmd0aDogbnVtYmVyLCB0aWNrRm9udFB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGxhYmVsR2FwID0gTWF0aC5tYXgoNiwgTWF0aC5taW4ocmFkaXVzICogMC4wNiwgMTQpKTtcbiAgICByZXR1cm4gdGlja0xlbmd0aCArIGxhYmVsR2FwICsgdGlja0ZvbnRQeCAqIDAuMjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGlja0xhYmVsQW5jaG9yKGNvc1ZhbHVlOiBudW1iZXIpOiAnc3RhcnQnIHwgJ21pZGRsZScgfCAnZW5kJyB7XG4gICAgaWYgKGNvc1ZhbHVlID4gMC4zNSkgcmV0dXJuICdzdGFydCc7XG4gICAgaWYgKGNvc1ZhbHVlIDwgLTAuMzUpIHJldHVybiAnZW5kJztcbiAgICByZXR1cm4gJ21pZGRsZSc7XG4gIH1cblxuICBwcml2YXRlIGdldE5lYXJFZGdlUHJvamVjdGlvbihcbiAgICBhbmNob3I6ICdzdGFydCcgfCAnbWlkZGxlJyB8ICdlbmQnLFxuICAgIGNvc1ZhbHVlOiBudW1iZXIsXG4gICAgc2luVmFsdWU6IG51bWJlcixcbiAgICBiYm94V2lkdGg6IG51bWJlcixcbiAgICBiYm94SGVpZ2h0OiBudW1iZXIsXG4gICk6IG51bWJlciB7XG4gICAgY29uc3QgYWJzQ29zID0gTWF0aC5hYnMoY29zVmFsdWUpO1xuICAgIGNvbnN0IGFic1NpbiA9IE1hdGguYWJzKHNpblZhbHVlKTtcbiAgICBjb25zdCBoYWxmSGVpZ2h0UHJvamVjdGlvbiA9IGFic1NpbiAqIChiYm94SGVpZ2h0IC8gMik7XG5cbiAgICAvLyBGb3Igc3RhcnQvZW5kIGFuY2hvcmVkIGxhYmVscyBvbiBlZGdlIHRpY2tzLCB0aGUgbmVhcmVzdCBzaWRlIGlzIGNsb3NlIHRvIHRoZSBhbmNob3IgcG9pbnQuXG4gICAgaWYgKGFuY2hvciA9PT0gJ3N0YXJ0JyB8fCBhbmNob3IgPT09ICdlbmQnKSB7XG4gICAgICByZXR1cm4gaGFsZkhlaWdodFByb2plY3Rpb24gKyBhYnNDb3MgKiB0aGlzLlRJQ0tfTEFCRUxfU0lERV9QQURESU5HO1xuICAgIH1cblxuICAgIC8vIEZvciBjZW50ZXJlZCBsYWJlbHMsIG5lYXJlc3Qgc2lkZSBpbmNsdWRlcyBoYWxmIHRleHQgd2lkdGggcHJvamVjdGlvbi5cbiAgICByZXR1cm4gYWJzQ29zICogKGJib3hXaWR0aCAvIDIpICsgaGFsZkhlaWdodFByb2plY3Rpb247XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFRpY2tWYWx1ZSh0aWNrOiBudW1iZXIsIG1pblZhbHVlOiBudW1iZXIsIG1heFZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlUmFuZ2UgPSBtYXhWYWx1ZSAtIG1pblZhbHVlO1xuICAgIGlmICh2YWx1ZVJhbmdlIDw9IDEwKSB7XG4gICAgICByZXR1cm4gdGljay50b0ZpeGVkKDIpLnJlcGxhY2UoL1xcLj8wKyQvLCAnJyk7XG4gICAgfVxuICAgIGlmICh2YWx1ZVJhbmdlIDwgMTAwMCkge1xuICAgICAgcmV0dXJuIHRpY2sgJSAxID09PSAwID8gdGljay50b1N0cmluZygpIDogdGljay50b0ZpeGVkKDEpO1xuICAgIH1cbiAgICByZXR1cm4gZm9ybWF0TGFyZ2VOdW1iZXIoTWF0aC5yb3VuZCh0aWNrKSk7XG4gIH1cblxuICBwcml2YXRlIGVzdGltYXRlTGFiZWxXaWR0aChsYWJlbDogc3RyaW5nLCB0aWNrRm9udFB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBsYWJlbC5sZW5ndGggKiB0aWNrRm9udFB4ICogdGhpcy5USUNLX0xBQkVMX0NIQVJfV0lEVEhfUkFUSU8gKyB0aGlzLlRJQ0tfTEFCRUxfU0lERV9QQURESU5HO1xuICB9XG5cbiAgcHJpdmF0ZSBlc3RpbWF0ZU1heFRpY2tMYWJlbFdpZHRoKHRpY2tDb3VudDogbnVtYmVyLCBtaW5WYWx1ZTogbnVtYmVyLCBtYXhWYWx1ZTogbnVtYmVyLCB0aWNrRm9udFB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh0aWNrQ291bnQgPD0gMSkgcmV0dXJuIHRpY2tGb250UHg7XG4gICAgY29uc3Qgc3RlcCA9IChtYXhWYWx1ZSAtIG1pblZhbHVlKSAvICh0aWNrQ291bnQgLSAxKTtcbiAgICBsZXQgbWF4Q2hhcnMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGlja0NvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5mb3JtYXRUaWNrVmFsdWUobWluVmFsdWUgKyBpICogc3RlcCwgbWluVmFsdWUsIG1heFZhbHVlKTtcbiAgICAgIG1heENoYXJzID0gTWF0aC5tYXgobWF4Q2hhcnMsIGxhYmVsLmxlbmd0aCk7XG4gICAgfVxuICAgIHJldHVybiBtYXhDaGFycyAqIHRpY2tGb250UHggKiB0aGlzLlRJQ0tfTEFCRUxfQ0hBUl9XSURUSF9SQVRJTyArIHRoaXMuVElDS19MQUJFTF9TSURFX1BBRERJTkc7XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgdGhlIHZhbHVlIGFuZCBsYWJlbCB0ZXh0IGluIHRoZSBjZW50ZXJcbiAgICovXG4gIHByaXZhdGUgZHJhd1ZhbHVlRGlzcGxheShcbiAgICBjaGFydEdyb3VwOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIHJhZGl1czogbnVtYmVyLFxuICAgIHNpemU6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgLy8gUHgtYmFzZWQgc2NhbGluZyBmb3Igcm9idXN0IHNtYWxsL2xhcmdlIHNpemVzIHdpdGggYmV0dGVyIHNtYWxsLXNpemUgaGFuZGxpbmdcbiAgICBjb25zdCB2YWx1ZUZvbnRQeCA9IE1hdGgubWF4KDE4LCBNYXRoLm1pbigzMiwgTWF0aC5mbG9vcihzaXplIC8gOCkpKTtcbiAgICBjb25zdCBsYWJlbEZvbnRQeCA9IE1hdGgubWF4KDEwLCBNYXRoLm1pbigxNiwgTWF0aC5mbG9vcih2YWx1ZUZvbnRQeCAqIDAuNTUpKSk7XG4gICAgLy8gTW9yZSB2ZXJ0aWNhbCBnYXAgZm9yIHNtYWxsIHNpemVzOiB1c2UgbGFyZ2VyIGJhc2UgdmFsdWVcbiAgICBjb25zdCB2ZXJ0aWNhbEdhcCA9IE1hdGgubWF4KDYsIE1hdGgubWluKDEyLCBNYXRoLmZsb29yKHNpemUgLyA0MCkpKTtcblxuICAgIC8vIENyZWF0ZSBncm91cCBmb3IgdGhlIHZhbHVlIGRpc3BsYXlcbiAgICBjb25zdCB2YWx1ZUdyb3VwID0gY2hhcnRHcm91cC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdnYXVnZS12YWx1ZS1kaXNwbGF5JykuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJyk7XG5cbiAgICAvLyBBZGQgdmFsdWUgZGlzcGxheVxuICAgIHZhbHVlR3JvdXBcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2dhdWdlLXZhbHVlJylcbiAgICAgIC5hdHRyKCd4JywgMClcbiAgICAgIC5hdHRyKCd5JywgcmFkaXVzICogMC4xNSArIHZhbHVlRm9udFB4KVxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBgJHt2YWx1ZUZvbnRQeH1weGApXG4gICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJzYwMCcpXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtdGV4dC1jb2xvcikpJylcbiAgICAgIC50ZXh0KHZhbHVlLnRvTG9jYWxlU3RyaW5nKCkpO1xuXG4gICAgLy8gQWRkIGxhYmVsIGRpc3BsYXkgKGlmIHByb3ZpZGVkKVxuICAgIGlmIChsYWJlbCkge1xuICAgICAgdmFsdWVHcm91cFxuICAgICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2dhdWdlLWxhYmVsJylcbiAgICAgICAgLmF0dHIoJ3gnLCAwKVxuICAgICAgICAuYXR0cigneScsIHJhZGl1cyAqIDAuMjQgKyB2YWx1ZUZvbnRQeCArIHZlcnRpY2FsR2FwKVxuICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGAke2xhYmVsRm9udFB4fXB4YClcbiAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LXRleHQtY29sb3IpKScpXG4gICAgICAgIC5zdHlsZSgnb3BhY2l0eScsICcwLjgnKVxuICAgICAgICAudGV4dChsYWJlbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyYXdzIHRoZSBkaWFsL25lZWRsZSBwb2ludGluZyB0byB0aGUgY3VycmVudCB2YWx1ZSB3aXRoIGFuaW1hdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3RGlhbChcbiAgICBjaGFydEdyb3VwOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sXG4gICAgcmFkaXVzOiBudW1iZXIsXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICBtaW5WYWx1ZTogbnVtYmVyLFxuICAgIG1heFZhbHVlOiBudW1iZXIsXG4gICAgYW5pbWF0aW9uRHVyYXRpb246IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgLy8gQ2xhbXAgdmFsdWUgdG8gbWluL21heCByYW5nZVxuICAgIGNvbnN0IGNsYW1wZWRWYWx1ZSA9IE1hdGgubWF4KG1pblZhbHVlLCBNYXRoLm1pbihtYXhWYWx1ZSwgdmFsdWUpKTtcblxuICAgIC8vIENhbGN1bGF0ZSBhbmdsZSBmb3IgbmVlZGxlIGJhc2VkIG9uIHZhbHVlXG4gICAgY29uc3QgYW5nbGUgPSB0aGlzLnNjYWxlVmFsdWVUb0FuZ2xlKGNsYW1wZWRWYWx1ZSwgbWluVmFsdWUsIG1heFZhbHVlKTtcbiAgICBjb25zdCBhbmdsZUluRGVncmVlcyA9IHRoaXMucmFkaWFuc1RvRGVncmVlcyhhbmdsZSAtIHRoaXMuUVVBUlRFUl9DSVJDTEVfUkFESUFOUyk7XG5cbiAgICAvLyBDcmVhdGUgYSBncm91cCBmb3IgdGhlIG5lZWRsZVxuICAgIGNvbnN0IGRpYWxHcm91cCA9IGNoYXJ0R3JvdXAuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZGlhbCcpO1xuXG4gICAgLy8gRHJhdyB0aGUgbmVlZGxlIHdpdGggaW5pdGlhbCBwb3NpdGlvbiBhdCBtaW5pbXVtIHZhbHVlXG4gICAgY29uc3QgbmVlZGxlUGF0aCA9IGRpYWxHcm91cFxuICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAuYXR0cignZCcsIHRoaXMuY3JlYXRlTmVlZGxlUGF0aChyYWRpdXMpKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2dhdWdlLW5lZWRsZScpXG4gICAgICAuYXR0cignZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC1uZWVkbGUtY29sb3IpKScpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHJvdGF0ZSgke3RoaXMucmFkaWFuc1RvRGVncmVlcygtdGhpcy5IQUxGX0NJUkNMRV9SQURJQU5TKX0pYCk7IC8vIFN0YXJ0IGF0IC0xODAgZGVncmVlcyAobGVmdClcblxuICAgIC8vIEFkZCBhIGNlbnRlciBjaXJjbGVcbiAgICBkaWFsR3JvdXBcbiAgICAgIC5hcHBlbmQoJ2NpcmNsZScpXG4gICAgICAuYXR0cignY3gnLCAwKVxuICAgICAgLmF0dHIoJ2N5JywgMClcbiAgICAgIC5hdHRyKCdyJywgcmFkaXVzICogMC4wOClcbiAgICAgIC5hdHRyKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LW5lZWRsZS1jb2xvcikpJylcbiAgICAgIC5hdHRyKCdzdHJva2UnLCAnI2ZmZicpXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgMik7XG5cbiAgICAvLyBBZGQgYSBzbWFsbGVyIHdoaXRlIGNlbnRlclxuICAgIGRpYWxHcm91cFxuICAgICAgLmFwcGVuZCgnY2lyY2xlJylcbiAgICAgIC5hdHRyKCdjeCcsIDApXG4gICAgICAuYXR0cignY3knLCAwKVxuICAgICAgLmF0dHIoJ3InLCByYWRpdXMgKiAwLjAzKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAnI2ZmZicpO1xuXG4gICAgLy8gR2V0IGVhc2luZyBmdW5jdGlvblxuICAgIGNvbnN0IGVhc2luZ0Z1bmN0aW9uID0gZ2V0RWFzaW5nRnVuY3Rpb24odGhpcy5kMywgdGhpcy5vcHRpb25zKCk/LmFuaW1hdGlvbkVhc2luZyk7XG5cbiAgICAvLyBBbmltYXRlIHRoZSBuZWVkbGUgZnJvbSBtaW4gdG8gY3VycmVudCB2YWx1ZVxuICAgIG5lZWRsZVBhdGhcbiAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgIC5kdXJhdGlvbihhbmltYXRpb25EdXJhdGlvbilcbiAgICAgIC5lYXNlKGVhc2luZ0Z1bmN0aW9uKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGByb3RhdGUoJHthbmdsZUluRGVncmVlc30pYCk7XG4gIH1cblxuICAvLyBnZXRFYXNpbmdGdW5jdGlvbiBtb3ZlZCB0byBzaGFyZWQgY2hhcnQgdXRpbHNcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHBhdGggc3RyaW5nIGZvciB0aGUgbmVlZGxlXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZU5lZWRsZVBhdGgocmFkaXVzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5lZWRsZUxlbmd0aCA9IHJhZGl1cyAqIDAuODtcbiAgICBjb25zdCBuZWVkbGVXaWR0aCA9IHJhZGl1cyAqIDAuMDY7XG4gICAgcmV0dXJuIGBNIDAsJHtuZWVkbGVXaWR0aCAvIDJ9IEwgJHtuZWVkbGVMZW5ndGh9LDAgTCAwLCR7LW5lZWRsZVdpZHRoIC8gMn0gWmA7XG4gIH1cblxuICAvKipcbiAgICogU2NhbGVzIGEgdmFsdWUgdG8gYW4gYW5nbGUgKGluIHJhZGlhbnMpXG4gICAqL1xuICBwcml2YXRlIHNjYWxlVmFsdWVUb0FuZ2xlKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgdmFsdWVSYW5nZSA9IG1heCAtIG1pbiB8fCAxO1xuICAgIHJldHVybiAoKHZhbHVlIC0gbWluKSAvIHZhbHVlUmFuZ2UpICogdGhpcy5IQUxGX0NJUkNMRV9SQURJQU5TIC0gdGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYWxlcyBhIHZhbHVlIHRvIGFuIGFuZ2xlIGZvciBjb2xvciBhcmNzIChpbiByYWRpYW5zKVxuICAgKi9cbiAgcHJpdmF0ZSBzY2FsZVZhbHVlVG9Db2xvckFuZ2xlKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgdmFsdWVSYW5nZSA9IG1heCAtIG1pbiB8fCAxO1xuICAgIHJldHVybiAoKHZhbHVlIC0gbWluKSAvIHZhbHVlUmFuZ2UpICogdGhpcy5IQUxGX0NJUkNMRV9SQURJQU5TIC0gdGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGFuIGFuZ2xlIGJhY2sgdG8gYSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBhbmdsZVRvVmFsdWUoYW5nbGU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB2YWx1ZVJhbmdlID0gbWF4IC0gbWluIHx8IDE7XG4gICAgcmV0dXJuIG1pbiArICgoYW5nbGUgKyB0aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlMpIC8gdGhpcy5IQUxGX0NJUkNMRV9SQURJQU5TKSAqIHZhbHVlUmFuZ2U7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgcmFkaWFucyB0byBkZWdyZWVzXG4gICAqL1xuICBwcml2YXRlIHJhZGlhbnNUb0RlZ3JlZXMocmFkaWFuczogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcmFkaWFucyAqIHRoaXMuREVHUkVFU19QRVJfUkFESUFOO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYXgtZ2F1Z2UtY2hhcnRcIiByb2xlPVwiaW1nXCIgI2NoYXJ0Q29udGFpbmVyPlxuICA8YXgtY2hhcnQtdG9vbHRpcCBbZGF0YV09XCJ0b29sdGlwRGF0YSgpXCIgW3Bvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbigpXCIgW3Zpc2libGVdPVwidG9vbHRpcFZpc2libGUoKVwiPjwvYXgtY2hhcnQtdG9vbHRpcD5cbjwvZGl2PlxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1nYXVnZS1jaGFydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9nYXVnZS1jaGFydC9zcmMvYWNvcmV4LWNoYXJ0cy1nYXVnZS1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-charts-gauge-chart.mjs","sources":["../tmp-esm2022/gauge-chart/lib/gauge-chart.config.js","../tmp-esm2022/gauge-chart/lib/gauge-chart.component.js","../tmp-esm2022/gauge-chart/acorex-charts-gauge-chart.js"],"sourcesContent":["import { AX_CHART_DEFAULT_MESSAGES } from '@acorex/charts';\nimport { InjectionToken } from '@angular/core';\nexport const AXGaugeChartDefaultConfig = {\n minValue: 0,\n maxValue: 100,\n gaugeWidth: 22,\n cornerRadius: 5,\n showValue: true,\n showTooltip: true,\n showDataLabels: true,\n animationDuration: 750,\n animationEasing: 'cubic-out',\n messages: {\n ...AX_CHART_DEFAULT_MESSAGES,\n noDataIcon: 'fa-light fa-gauge',\n },\n};\nexport const AX_GAUGE_CHART_CONFIG = new InjectionToken('AX_GAUGE_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXGaugeChartDefaultConfig,\n});\nexport function gaugeChartConfig(config = {}) {\n return {\n ...AXGaugeChartDefaultConfig,\n ...config,\n messages: {\n ...AXGaugeChartDefaultConfig.messages,\n ...config.messages,\n },\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F1Z2UtY2hhcnQuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2dhdWdlLWNoYXJ0L3NyYy9saWIvZ2F1Z2UtY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQXVCO0lBQzNELFFBQVEsRUFBRSxDQUFDO0lBQ1gsUUFBUSxFQUFFLEdBQUc7SUFDYixVQUFVLEVBQUUsRUFBRTtJQUNkLFlBQVksRUFBRSxDQUFDO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsSUFBSTtJQUNqQixjQUFjLEVBQUUsSUFBSTtJQUNwQixpQkFBaUIsRUFBRSxHQUFHO0lBQ3RCLGVBQWUsRUFBRSxXQUFXO0lBQzVCLFFBQVEsRUFBRTtRQUNSLEdBQUcseUJBQXlCO1FBQzVCLFVBQVUsRUFBRSxtQkFBbUI7S0FDaEM7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxjQUFjLENBQXFCLHVCQUF1QixFQUFFO0lBQ25HLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyx5QkFBeUI7Q0FDekMsQ0FBQyxDQUFDO0FBSUgsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFNBQWtDLEVBQUU7SUFDbkUsT0FBTztRQUNMLEdBQUcseUJBQXlCO1FBQzVCLEdBQUcsTUFBTTtRQUNULFFBQVEsRUFBRTtZQUNSLEdBQUcseUJBQXlCLENBQUMsUUFBUTtZQUNyQyxHQUFHLE1BQU0sQ0FBQyxRQUFRO1NBQ25CO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWF9DSEFSVF9ERUZBVUxUX01FU1NBR0VTIH0gZnJvbSAnQGFjb3JleC9jaGFydHMnO1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYR2F1Z2VDaGFydE9wdGlvbiB9IGZyb20gJy4vZ2F1Z2UtY2hhcnQudHlwZSc7XG5cbmV4cG9ydCBjb25zdCBBWEdhdWdlQ2hhcnREZWZhdWx0Q29uZmlnOiBBWEdhdWdlQ2hhcnRPcHRpb24gPSB7XG4gIG1pblZhbHVlOiAwLFxuICBtYXhWYWx1ZTogMTAwLFxuICBnYXVnZVdpZHRoOiAyMixcbiAgY29ybmVyUmFkaXVzOiA1LFxuICBzaG93VmFsdWU6IHRydWUsXG4gIHNob3dUb29sdGlwOiB0cnVlLFxuICBzaG93RGF0YUxhYmVsczogdHJ1ZSxcbiAgYW5pbWF0aW9uRHVyYXRpb246IDc1MCxcbiAgYW5pbWF0aW9uRWFzaW5nOiAnY3ViaWMtb3V0JyxcbiAgbWVzc2FnZXM6IHtcbiAgICAuLi5BWF9DSEFSVF9ERUZBVUxUX01FU1NBR0VTLFxuICAgIG5vRGF0YUljb246ICdmYS1saWdodCBmYS1nYXVnZScsXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgQVhfR0FVR0VfQ0hBUlRfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPEFYR2F1Z2VDaGFydE9wdGlvbj4oJ0FYX0dBVUdFX0NIQVJUX0NPTkZJRycsIHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICBmYWN0b3J5OiAoKSA9PiBBWEdhdWdlQ2hhcnREZWZhdWx0Q29uZmlnLFxufSk7XG5cbmV4cG9ydCB0eXBlIFBhcnRpYWxHYXVnZUNoYXJ0Q29uZmlnID0gUGFydGlhbDxBWEdhdWdlQ2hhcnRPcHRpb24+O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2F1Z2VDaGFydENvbmZpZyhjb25maWc6IFBhcnRpYWxHYXVnZUNoYXJ0Q29uZmlnID0ge30pOiBBWEdhdWdlQ2hhcnRPcHRpb24ge1xuICByZXR1cm4ge1xuICAgIC4uLkFYR2F1Z2VDaGFydERlZmF1bHRDb25maWcsXG4gICAgLi4uY29uZmlnLFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAuLi5BWEdhdWdlQ2hhcnREZWZhdWx0Q29uZmlnLm1lc3NhZ2VzLFxuICAgICAgLi4uY29uZmlnLm1lc3NhZ2VzLFxuICAgIH0sXG4gIH07XG59XG4iXX0=","import { AXChartComponent, computeTooltipPosition, createChartInstanceId, formatLargeNumber, getEasingFunction, mergeChartMessages, mergeChartOptions, renderChartEmptyMessage, } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation, afterNextRender, computed, effect, inject, input, signal, viewChild, } from '@angular/core';\nimport { AX_GAUGE_CHART_CONFIG } from './gauge-chart.config';\nimport * as i0 from \"@angular/core\";\n/**\n * Gauge Chart Component\n * Renders a semi-circular gauge chart with animated needle and thresholds\n */\nexport class AXGaugeChartComponent extends AXChartComponent {\n // Inputs\n /** Chart value input */\n value = input(0, ...(ngDevMode ? [{ debugName: \"value\" }] : []));\n /** Chart options input */\n options = input({}, ...(ngDevMode ? [{ debugName: \"options\" }] : []));\n // Chart container reference\n chartContainerEl = viewChild.required('chartContainer');\n // SVG element reference (created in the code)\n svgElement = null;\n // D3 reference - loaded asynchronously\n d3;\n // Signals for component state\n _initialized = signal(false, ...(ngDevMode ? [{ debugName: \"_initialized\" }] : []));\n _rendered = signal(false, ...(ngDevMode ? [{ debugName: \"_rendered\" }] : []));\n _prevValue = signal(null, ...(ngDevMode ? [{ debugName: \"_prevValue\" }] : []));\n // Track previous options to detect changes\n _prevOptionsString = '';\n // Cache for container dimensions to avoid repeated DOM reads\n _lastContainerRect = null;\n // Tooltip signals\n _tooltipVisible = signal(false, ...(ngDevMode ? [{ debugName: \"_tooltipVisible\" }] : []));\n _tooltipPosition = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: \"_tooltipPosition\" }] : []));\n _tooltipData = signal({\n title: '',\n value: '',\n }, ...(ngDevMode ? [{ debugName: \"_tooltipData\" }] : []));\n _tooltipRafId = null;\n _pendingTooltipCoords = null;\n // Expose tooltip signals as read-only 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_GAUGE_CHART_CONFIG);\n // Computed configuration options\n effectiveOptions = computed(() => mergeChartOptions(this.configToken, this.options()), ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\n effectiveMessages = computed(() => mergeChartMessages(this.configToken.messages, this.options()?.messages), ...(ngDevMode ? [{ debugName: \"effectiveMessages\" }] : []));\n // Constants\n TOOLTIP_GAP = 10;\n HALF_CIRCLE_RADIANS = Math.PI;\n QUARTER_CIRCLE_RADIANS = Math.PI / 2;\n DEGREES_PER_RADIAN = 180 / Math.PI;\n CHART_EDGE_PADDING = 12;\n TICK_LABEL_CHAR_WIDTH_RATIO = 0.62;\n TICK_LABEL_SIDE_PADDING = 6;\n LABEL_TICK_CLEARANCE = 4;\n MIN_SEGMENT_CHORD_FOR_LABEL = 28;\n MIN_SEGMENT_RING_FOR_LABEL = 14;\n MIN_SEGMENT_LABEL_FONT = 10;\n MAX_SEGMENT_LABEL_FONT = 16;\n instanceId = createChartInstanceId('ax-gauge');\n get bgGradientId() {\n return `${this.instanceId}-bg-gradient`;\n }\n thresholdGradientId(index) {\n return `${this.instanceId}-threshold-gradient-${index}`;\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 // Watch for changes to redraw the chart\n effect(() => {\n const currentValue = this.value();\n const options = this.effectiveOptions();\n this._prevValue.set(currentValue);\n if (this._rendered()) {\n const optionsString = JSON.stringify(options);\n if (currentValue == null || !this.svgElement) {\n this._prevOptionsString = optionsString;\n this.updateChart();\n }\n else if (this._prevOptionsString === optionsString) {\n this.updateValueAndDial(currentValue);\n }\n else {\n this._prevOptionsString = optionsString;\n this.updateChart();\n }\n }\n });\n }\n ngOnDestroy() {\n this.cleanupChart();\n }\n /**\n * Loads D3.js dynamically\n */\n async loadD3() {\n if (this.d3)\n return; // Already loaded\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 /**\n * Creates the gauge chart with all elements\n */\n createChart() {\n const containerElement = this.chartContainerEl().nativeElement;\n if (this.svgElement) {\n this.svgElement.remove();\n this.svgElement = null;\n }\n containerElement.querySelectorAll('.ax-chart-empty').forEach((el) => el.remove());\n if (this.value() == null) {\n if (this.d3) {\n const messages = this.effectiveMessages();\n renderChartEmptyMessage(this.d3, containerElement, {\n icon: messages.noDataIcon,\n title: messages.noData,\n help: messages.noDataHelp,\n });\n }\n this._rendered.set(true);\n return;\n }\n const currentValue = this.value();\n // Create SVG element\n this.svgElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n containerElement.appendChild(this.svgElement);\n // Get current options\n const options = this.effectiveOptions();\n // Store options string for comparison\n this._prevOptionsString = JSON.stringify(options);\n const { minValue, maxValue, showValue, label = '', gaugeWidth, cornerRadius, animationDuration } = options;\n const thresholds = options.thresholds ?? [];\n // Calculate responsive dimensions\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n // Cache container dimensions\n this._lastContainerRect = { width: containerWidth, height: containerHeight };\n // Determine chart dimensions - use options if provided, otherwise use container dimensions\n const width = options.width ?? containerWidth;\n const height = options.height ?? containerHeight;\n // Ensure minimum dimensions\n const effectiveWidth = Math.max(width || 1, 1);\n const effectiveHeight = Math.max(height || 1, 1);\n // For a semi-circular gauge, width should be approximately twice the height\n const size = Math.min(effectiveWidth, effectiveHeight * 2);\n // Calculate margin as percentage of size (5-8% with reasonable bounds)\n const marginRatio = 0.08;\n const margin = Math.max(5, Math.min(size * marginRatio, 30));\n const tickCount = this.getTickCount(size);\n const tickFontPx = this.getTickFontSize(size);\n const maxTickLabelWidth = this.estimateMaxTickLabelWidth(tickCount, minValue, maxValue, tickFontPx);\n const tickLength = Math.max(4, Math.min((size / 2) * 0.12, 14));\n // Keep labels closer to the gauge arc while preserving readability.\n const labelGap = Math.max(6, Math.min((size / 2) * 0.06, 14));\n const labelOffsetFromTickEnd = labelGap + tickFontPx * 0.35;\n const tickLabelSpace = tickLength + labelOffsetFromTickEnd + tickFontPx;\n const totalVerticalSpace = size / 2 + tickLabelSpace;\n // Labels at edge ticks use start/end anchors, so they can extend by near full width.\n const horizontalPadding = Math.max(18, maxTickLabelWidth + 8);\n const totalWidth = size + horizontalPadding * 2;\n const viewBoxWidth = totalWidth + this.CHART_EDGE_PADDING * 2;\n const viewBoxHeight = totalVerticalSpace + this.CHART_EDGE_PADDING * 2;\n // Set up SVG with responsive viewBox that accounts for overflow\n const svg = this.d3\n .select(this.svgElement)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${viewBoxWidth} ${viewBoxHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n // Create a group for the chart centered horizontally with padding, positioned to show only the top half\n const chartGroup = svg\n .append('g')\n .attr('transform', `translate(${size / 2 + horizontalPadding + this.CHART_EDGE_PADDING}, ${size / 2 - margin + this.CHART_EDGE_PADDING})`);\n // Define gauge parameters\n const radius = size / 2 - margin;\n const desiredGaugeWidth = typeof gaugeWidth === 'number' && !Number.isNaN(gaugeWidth) ? gaugeWidth : 30;\n // Respect explicit gaugeWidth in px with sane absolute bounds.\n const clampedGaugeWidth = Math.max(6, Math.min(desiredGaugeWidth, radius * 0.7));\n const innerRadius = radius - clampedGaugeWidth;\n const outerRadius = radius;\n // Create gradient definitions\n this.createGradients(svg, thresholds);\n // Draw the background arc\n this.drawBackgroundArc(chartGroup, innerRadius, outerRadius, cornerRadius);\n // Draw the threshold arcs if thresholds exist\n if (thresholds.length > 0) {\n this.drawThresholds(chartGroup, innerRadius, outerRadius, minValue, maxValue, thresholds, cornerRadius);\n }\n // Draw tick marks\n this.drawTicks(chartGroup, outerRadius, minValue, maxValue, size, tickCount, tickFontPx);\n // Draw the dial/needle with animation\n this.drawDial(chartGroup, radius, currentValue, minValue, maxValue, animationDuration);\n // Draw the value display (after the dial so it's on top)\n if (showValue) {\n this.drawValueDisplay(chartGroup, currentValue, label, radius, size);\n }\n // Hide tooltip initially\n this._tooltipVisible.set(false);\n }\n /**\n * Updates the chart when options change\n */\n updateChart() {\n this.createChart();\n }\n /**\n * Updates only the value display and dial position without recreating the chart\n */\n updateValueAndDial(value) {\n if (!this.svgElement)\n return;\n const options = this.effectiveOptions();\n const minValue = options.minValue;\n const maxValue = options.maxValue;\n const animationDuration = options.animationDuration;\n const easingFunction = getEasingFunction(this.d3, options.animationEasing);\n const currentValue = value;\n const svg = this.d3.select(this.svgElement);\n // Update value text\n svg.select('.gauge-value').text(currentValue.toLocaleString());\n // Update needle position\n const angle = this.scaleValueToAngle(currentValue, minValue, maxValue);\n const angleInDegrees = this.radiansToDegrees(angle - this.QUARTER_CIRCLE_RADIANS);\n svg\n .select('.gauge-needle')\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .transition()\n .duration(animationDuration)\n .ease(easingFunction)\n .attr('transform', `rotate(${angleInDegrees})`);\n }\n /**\n * Draw the background arc\n */\n drawBackgroundArc(chartGroup, innerRadius, outerRadius, cornerRadius) {\n // Create arc for the background\n const backgroundArc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius)\n .startAngle(-this.QUARTER_CIRCLE_RADIANS) // Start from bottom (-90 degrees)\n .endAngle(this.QUARTER_CIRCLE_RADIANS) // End at top (90 degrees)\n .cornerRadius(cornerRadius);\n // Draw background arc\n const backgroundPath = chartGroup\n .append('path')\n .attr('d', backgroundArc)\n .attr('class', 'gauge-arc gauge-base')\n .attr('fill', `url(#${this.bgGradientId})`)\n .attr('filter', 'drop-shadow(0px 2px 3px rgba(0,0,0,0.1))');\n // Add tooltip for single arc if no thresholds\n if (!this.effectiveOptions().thresholds || this.effectiveOptions().thresholds.length === 0) {\n backgroundPath\n .style('cursor', 'pointer')\n .on('mouseenter', (event) => {\n if (!this.effectiveOptions().showTooltip)\n return;\n this.showSingleRangeTooltip(event);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n }\n /**\n * Draw the thresholds arcs\n */\n drawThresholds(chartGroup, innerRadius, outerRadius, minValue, maxValue, thresholds, cornerRadius) {\n // Create arc generator\n const arc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius * 0.98)\n .cornerRadius(cornerRadius);\n // Sort thresholds by value in ascending order (only if needed)\n const sortedThresholds = thresholds.length > 1 ? [...thresholds].sort((a, b) => a.value - b.value) : thresholds;\n // Calculate all angles first using the color angle calculation\n const angles = sortedThresholds.map((t) => this.scaleValueToColorAngle(t.value, minValue, maxValue));\n // Start from the minimum value angle\n let previousEndAngle = this.scaleValueToColorAngle(minValue, minValue, maxValue);\n const labeledSegments = [];\n sortedThresholds.forEach((threshold, i) => {\n const endAngle = angles[i];\n // Skip if end angle is not greater than start angle\n if (endAngle <= previousEndAngle)\n return;\n const startAngle = previousEndAngle;\n const arcPath = chartGroup\n .append('path')\n .attr('d', arc({\n innerRadius,\n outerRadius,\n startAngle,\n endAngle,\n }))\n .attr('fill', threshold.color || `url(#${this.thresholdGradientId(i)})`)\n .attr('class', 'gauge-arc threshold-arc')\n .attr('data-value', threshold.value)\n .style('cursor', 'pointer');\n if (threshold.label) {\n labeledSegments.push({ startAngle, endAngle, label: threshold.label });\n }\n // Add tooltip interaction\n if (this.effectiveOptions().showTooltip) {\n // Convert angles back to values for tooltip\n const startValue = this.angleToValue(previousEndAngle, minValue, maxValue);\n const endValue = threshold.value;\n arcPath\n .on('mouseenter', (event) => {\n this.showThresholdTooltip(event, startValue, endValue, threshold.color, threshold.label);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n // Update the previous end angle for the next threshold\n previousEndAngle = endAngle;\n });\n // Draw the last segment if the last threshold is less than the max value\n if (previousEndAngle < this.QUARTER_CIRCLE_RADIANS) {\n const lastArc = chartGroup\n .append('path')\n .attr('d', arc({\n innerRadius,\n outerRadius,\n startAngle: previousEndAngle,\n endAngle: this.QUARTER_CIRCLE_RADIANS,\n }))\n .attr('fill', `url(#${this.bgGradientId})`)\n .attr('class', 'gauge-arc threshold-arc')\n .style('cursor', 'pointer');\n // Add tooltip for the last segment\n if (this.effectiveOptions().showTooltip) {\n const startValue = this.angleToValue(previousEndAngle, minValue, maxValue);\n const endValue = maxValue;\n const lastThreshold = thresholds[thresholds.length - 1];\n lastArc\n .on('mouseenter', (event) => {\n this.showThresholdTooltip(event, startValue, endValue, lastThreshold.color, lastThreshold.label);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n }\n if (this.effectiveOptions().showDataLabels !== false && labeledSegments.length > 0) {\n this.drawSegmentLabels(chartGroup, labeledSegments, innerRadius, outerRadius);\n }\n }\n /**\n * Draws threshold labels centered on each segment arc when space allows.\n */\n drawSegmentLabels(chartGroup, segments, innerRadius, outerRadius) {\n const labelArc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius * 0.98);\n const labelGroup = chartGroup.append('g').attr('class', 'gauge-segment-labels');\n const ringWidth = outerRadius - innerRadius;\n const labelRadius = innerRadius + ringWidth / 2;\n const animationDuration = this.effectiveOptions().animationDuration ?? 750;\n segments.forEach((segment) => {\n const angle = segment.endAngle - segment.startAngle;\n const chordLength = 2 * labelRadius * Math.sin(angle / 2);\n const fontSize = this.calculateSegmentLabelFontSize(angle, ringWidth, chordLength);\n if (fontSize <= 0)\n return;\n const availableWidth = chordLength * 0.8;\n const text = this.getFittedSegmentLabel(segment.label, fontSize, availableWidth);\n if (!text)\n return;\n const centroid = labelArc.centroid({\n innerRadius,\n outerRadius: outerRadius * 0.98,\n startAngle: segment.startAngle,\n endAngle: segment.endAngle,\n });\n labelGroup\n .append('text')\n .attr('class', 'gauge-segment-label')\n .attr('transform', `translate(${centroid[0]}, ${centroid[1]})`)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .style('pointer-events', 'none')\n .style('font-size', `${fontSize}px`)\n .style('font-weight', '600')\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-data-labels-color))')\n .style('opacity', 0)\n .text(text)\n .transition()\n .duration(animationDuration)\n .style('opacity', 1);\n });\n }\n calculateSegmentLabelFontSize(angle, ringWidth, chordLength) {\n if (chordLength < this.MIN_SEGMENT_CHORD_FOR_LABEL || ringWidth < this.MIN_SEGMENT_RING_FOR_LABEL) {\n return 0;\n }\n const ringBasedSize = ringWidth * 0.45;\n const angleScale = Math.min(1, 0.7 + 0.3 * (angle / (this.HALF_CIRCLE_RADIANS / 3)));\n const maxByChord = chordLength / (2 * 0.65);\n const fontSize = Math.min(ringBasedSize * angleScale, maxByChord);\n if (fontSize < this.MIN_SEGMENT_LABEL_FONT)\n return 0;\n return Math.round(Math.max(this.MIN_SEGMENT_LABEL_FONT, Math.min(fontSize, this.MAX_SEGMENT_LABEL_FONT)) * 2) / 2;\n }\n getFittedSegmentLabel(label, fontSize, availableWidth) {\n if (!label)\n return '';\n if (this.doesSegmentLabelFit(label, fontSize, availableWidth))\n return label;\n return this.truncateSegmentLabel(label, fontSize, availableWidth);\n }\n doesSegmentLabelFit(text, fontSize, availableWidth) {\n return text.length * fontSize * 0.65 <= availableWidth;\n }\n truncateSegmentLabel(text, fontSize, availableWidth) {\n const charWidth = fontSize * (fontSize <= 10 ? 0.7 : 0.65);\n const availableForText = availableWidth - fontSize * 0.7;\n if (availableForText <= 0)\n return '';\n const maxChars = Math.floor(availableForText / charWidth);\n if (maxChars <= 0)\n return '';\n if (text.length <= maxChars)\n return text;\n return `${text.substring(0, Math.max(1, maxChars))}…`;\n }\n /**\n * Shows tooltip for a threshold arc\n */\n showThresholdTooltip(event, startValue, endValue, color, label) {\n // Create tooltip data\n this._tooltipData.set({\n title: label || 'Range',\n value: `${startValue.toLocaleString()} - ${endValue.toLocaleString()}`,\n color: color,\n });\n // Show tooltip\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n }\n /**\n * Shows tooltip for the entire range when no thresholds are defined\n */\n showSingleRangeTooltip(event) {\n const options = this.effectiveOptions();\n if (!options.showTooltip)\n return;\n this._tooltipData.set({\n title: options.label || 'Range',\n value: `${options.minValue.toLocaleString()} - ${options.maxValue.toLocaleString()}`,\n color: 'rgb(var(--ax-comp-gauge-chart-track-color))',\n });\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n }\n updateTooltipPosition(event) {\n this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };\n if (this._tooltipRafId != null)\n return;\n this.scheduleTooltipPosition(0);\n }\n scheduleTooltipPosition(attempt) {\n this._tooltipRafId = requestAnimationFrame(() => {\n const coords = this._pendingTooltipCoords;\n if (!coords) {\n this._tooltipRafId = null;\n return;\n }\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl) {\n this._tooltipRafId = null;\n return;\n }\n const tooltipEl = containerEl.querySelector('.chart-tooltip');\n if (!tooltipEl && this._tooltipVisible() && attempt < 3) {\n this.scheduleTooltipPosition(attempt + 1);\n return;\n }\n this._tooltipRafId = null;\n const rect = containerEl.getBoundingClientRect();\n const tooltipRect = tooltipEl?.getBoundingClientRect() ?? null;\n const pos = computeTooltipPosition(rect, tooltipRect, coords.x + 10, coords.y - 10, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n });\n }\n /**\n * Hides the tooltip\n */\n hideTooltip() {\n this._tooltipVisible.set(false);\n }\n /**\n * Cleans up chart resources\n */\n cleanupChart() {\n if (this._tooltipRafId != null) {\n cancelAnimationFrame(this._tooltipRafId);\n this._tooltipRafId = null;\n }\n this._pendingTooltipCoords = null;\n if (this.svgElement) {\n this.svgElement.remove();\n this.svgElement = null;\n }\n this.chartContainerEl()?.nativeElement.querySelectorAll('.ax-chart-empty').forEach((el) => el.remove());\n this._tooltipVisible.set(false);\n this._lastContainerRect = null;\n }\n /**\n * Creates gradient definitions for thresholds\n */\n createGradients(svg, thresholds) {\n const defs = svg.append('defs');\n // Create a radial gradient for the background\n const bgGradient = defs\n .append('radialGradient')\n .attr('id', this.bgGradientId)\n .attr('cx', '50%')\n .attr('cy', '50%')\n .attr('r', '50%')\n .attr('gradientUnits', 'userSpaceOnUse');\n // Get CSS variable for track color\n if (thresholds.length === 0) {\n // Default gradient when no thresholds are provided\n bgGradient.append('stop').attr('offset', '0%').attr('stop-color', 'rgb(var(--ax-comp-gauge-chart-track-color))');\n bgGradient\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', 'rgba(var(--ax-comp-gauge-chart-track-color), 0.8)');\n }\n else {\n bgGradient.append('stop').attr('offset', '0%').attr('stop-color', 'rgb(var(--ax-comp-gauge-chart-track-color))');\n bgGradient\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', 'rgba(var(--ax-comp-gauge-chart-track-color), 0.8)');\n // Create gradients for each threshold\n thresholds.forEach((threshold, i) => {\n const gradient = defs\n .append('linearGradient')\n .attr('id', this.thresholdGradientId(i))\n .attr('gradientUnits', 'userSpaceOnUse')\n .attr('x1', '-1')\n .attr('y1', '0')\n .attr('x2', '1')\n .attr('y2', '0');\n gradient\n .append('stop')\n .attr('offset', '0%')\n .attr('stop-color', this.d3.color(threshold.color)?.brighter(0.5).toString() || threshold.color);\n gradient.append('stop').attr('offset', '100%').attr('stop-color', threshold.color);\n });\n }\n }\n /**\n * Draws tick marks and labels around the gauge\n */\n drawTicks(chartGroup, radius, minValue, maxValue, size, tickCount, tickFontPx) {\n const tickLength = Math.max(4, Math.min(radius * 0.12, 14));\n const baseLabelOffset = this.getBaseLabelOffset(radius, tickLength, tickFontPx);\n const tickGroup = chartGroup.append('g').attr('class', 'ticks');\n const tickValues = [];\n const step = (maxValue - minValue) / (tickCount - 1);\n for (let i = 0; i < tickCount; i++) {\n tickValues.push(minValue + i * step);\n }\n const tickMetrics = tickValues.map((tick) => {\n const angle = this.scaleValueToAngle(tick, minValue, maxValue);\n const radians = angle - this.QUARTER_CIRCLE_RADIANS;\n return {\n radians,\n cos: Math.cos(radians),\n sin: Math.sin(radians),\n label: this.formatTickValue(tick, minValue, maxValue),\n };\n });\n tickMetrics.forEach((metric) => {\n tickGroup\n .append('line')\n .attr('x1', metric.cos * (radius + 5))\n .attr('y1', metric.sin * (radius + 5))\n .attr('x2', metric.cos * (radius + tickLength))\n .attr('y2', metric.sin * (radius + tickLength))\n .attr('stroke', 'rgba(var(--ax-comp-gauge-chart-text-color), 0.5)')\n .attr('stroke-width', 2);\n });\n const textSelection = tickGroup\n .selectAll('text.gauge-tick-label')\n .data(tickMetrics)\n .enter()\n .append('text')\n .attr('class', 'gauge-tick-label')\n .attr('x', 0)\n .attr('y', 0)\n .attr('fill', 'rgba(var(--ax-comp-gauge-chart-text-color), 0.7)')\n .style('font-size', `${tickFontPx}px`)\n .text((d) => d.label);\n textSelection.each((d, index, nodes) => {\n const node = nodes[index];\n let bboxWidth = this.estimateLabelWidth(d.label, tickFontPx);\n let bboxHeight = tickFontPx;\n try {\n const bbox = node.getBBox();\n if (bbox.width > 0)\n bboxWidth = bbox.width;\n if (bbox.height > 0)\n bboxHeight = bbox.height;\n }\n catch {\n // Keep fallback estimates.\n }\n const anchor = this.getTickLabelAnchor(d.cos);\n const nearEdgeExtent = this.getNearEdgeProjection(anchor, d.cos, d.sin, bboxWidth, bboxHeight);\n const requiredOffset = tickLength + this.LABEL_TICK_CLEARANCE + nearEdgeExtent;\n const effectiveLabelOffset = Math.max(baseLabelOffset, requiredOffset);\n const nudge = tickFontPx * 0.1;\n const x = d.cos * (radius + effectiveLabelOffset) + (anchor === 'start' ? nudge : anchor === 'end' ? -nudge : 0);\n const y = d.sin * (radius + effectiveLabelOffset);\n this.d3.select(node).attr('x', x).attr('y', y).attr('text-anchor', anchor).attr('dominant-baseline', 'middle');\n });\n }\n getTickCount(size) {\n if (size < 200)\n return 3;\n if (size < 300)\n return 4;\n if (size < 400)\n return 5;\n if (size > 520)\n return 7;\n return 5;\n }\n getTickFontSize(size) {\n return Math.max(14, Math.min(18, Math.floor(size / 35)));\n }\n getBaseLabelOffset(radius, tickLength, tickFontPx) {\n const labelGap = Math.max(6, Math.min(radius * 0.06, 14));\n return tickLength + labelGap + tickFontPx * 0.2;\n }\n getTickLabelAnchor(cosValue) {\n if (cosValue > 0.35)\n return 'start';\n if (cosValue < -0.35)\n return 'end';\n return 'middle';\n }\n getNearEdgeProjection(anchor, cosValue, sinValue, bboxWidth, bboxHeight) {\n const absCos = Math.abs(cosValue);\n const absSin = Math.abs(sinValue);\n const halfHeightProjection = absSin * (bboxHeight / 2);\n // For start/end anchored labels on edge ticks, the nearest side is close to the anchor point.\n if (anchor === 'start' || anchor === 'end') {\n return halfHeightProjection + absCos * this.TICK_LABEL_SIDE_PADDING;\n }\n // For centered labels, nearest side includes half text width projection.\n return absCos * (bboxWidth / 2) + halfHeightProjection;\n }\n formatTickValue(tick, minValue, maxValue) {\n const valueRange = maxValue - minValue;\n if (valueRange <= 10) {\n return tick.toFixed(2).replace(/\\.?0+$/, '');\n }\n if (valueRange < 1000) {\n return tick % 1 === 0 ? tick.toString() : tick.toFixed(1);\n }\n return formatLargeNumber(Math.round(tick));\n }\n estimateLabelWidth(label, tickFontPx) {\n return label.length * tickFontPx * this.TICK_LABEL_CHAR_WIDTH_RATIO + this.TICK_LABEL_SIDE_PADDING;\n }\n estimateMaxTickLabelWidth(tickCount, minValue, maxValue, tickFontPx) {\n if (tickCount <= 1)\n return tickFontPx;\n const step = (maxValue - minValue) / (tickCount - 1);\n let maxChars = 0;\n for (let i = 0; i < tickCount; i++) {\n const label = this.formatTickValue(minValue + i * step, minValue, maxValue);\n maxChars = Math.max(maxChars, label.length);\n }\n return maxChars * tickFontPx * this.TICK_LABEL_CHAR_WIDTH_RATIO + this.TICK_LABEL_SIDE_PADDING;\n }\n /**\n * Draws the value and label text in the center\n */\n drawValueDisplay(chartGroup, value, label, radius, size) {\n // Px-based scaling for robust small/large sizes with better small-size handling\n const valueFontPx = Math.max(18, Math.min(32, Math.floor(size / 8)));\n const labelFontPx = Math.max(10, Math.min(16, Math.floor(valueFontPx * 0.55)));\n // More vertical gap for small sizes: use larger base value\n const verticalGap = Math.max(6, Math.min(12, Math.floor(size / 40)));\n // Create group for the value display\n const valueGroup = chartGroup.append('g').attr('class', 'gauge-value-display').attr('text-anchor', 'middle');\n // Add value display\n valueGroup\n .append('text')\n .attr('class', 'gauge-value')\n .attr('x', 0)\n .attr('y', radius * 0.15 + valueFontPx)\n .style('font-size', `${valueFontPx}px`)\n .style('font-weight', '600')\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-text-color))')\n .text(value.toLocaleString());\n // Add label display (if provided)\n if (label) {\n valueGroup\n .append('text')\n .attr('class', 'gauge-label')\n .attr('x', 0)\n .attr('y', radius * 0.24 + valueFontPx + verticalGap)\n .style('font-size', `${labelFontPx}px`)\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-text-color))')\n .style('opacity', '0.8')\n .text(label);\n }\n }\n /**\n * Draws the dial/needle pointing to the current value with animation\n */\n drawDial(chartGroup, radius, value, minValue, maxValue, animationDuration) {\n // Clamp value to min/max range\n const clampedValue = Math.max(minValue, Math.min(maxValue, value));\n // Calculate angle for needle based on value\n const angle = this.scaleValueToAngle(clampedValue, minValue, maxValue);\n const angleInDegrees = this.radiansToDegrees(angle - this.QUARTER_CIRCLE_RADIANS);\n // Create a group for the needle\n const dialGroup = chartGroup.append('g').attr('class', 'dial');\n // Draw the needle with initial position at minimum value\n const needlePath = dialGroup\n .append('path')\n .attr('d', this.createNeedlePath(radius))\n .attr('class', 'gauge-needle')\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .attr('transform', `rotate(${this.radiansToDegrees(-this.HALF_CIRCLE_RADIANS)})`); // Start at -180 degrees (left)\n // Add a center circle\n dialGroup\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', radius * 0.08)\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .attr('stroke', '#fff')\n .attr('stroke-width', 2);\n // Add a smaller white center\n dialGroup\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', radius * 0.03)\n .attr('fill', '#fff');\n // Get easing function\n const easingFunction = getEasingFunction(this.d3, this.options()?.animationEasing);\n // Animate the needle from min to current value\n needlePath\n .transition()\n .duration(animationDuration)\n .ease(easingFunction)\n .attr('transform', `rotate(${angleInDegrees})`);\n }\n // getEasingFunction moved to shared chart utils\n /**\n * Creates a path string for the needle\n */\n createNeedlePath(radius) {\n const needleLength = radius * 0.8;\n const needleWidth = radius * 0.06;\n return `M 0,${needleWidth / 2} L ${needleLength},0 L 0,${-needleWidth / 2} Z`;\n }\n /**\n * Scales a value to an angle (in radians)\n */\n scaleValueToAngle(value, min, max) {\n const valueRange = max - min || 1;\n return ((value - min) / valueRange) * this.HALF_CIRCLE_RADIANS - this.QUARTER_CIRCLE_RADIANS;\n }\n /**\n * Scales a value to an angle for color arcs (in radians)\n */\n scaleValueToColorAngle(value, min, max) {\n const valueRange = max - min || 1;\n return ((value - min) / valueRange) * this.HALF_CIRCLE_RADIANS - this.QUARTER_CIRCLE_RADIANS;\n }\n /**\n * Converts an angle back to a value\n */\n angleToValue(angle, min, max) {\n const valueRange = max - min || 1;\n return min + ((angle + this.QUARTER_CIRCLE_RADIANS) / this.HALF_CIRCLE_RADIANS) * valueRange;\n }\n /**\n * Converts radians to degrees\n */\n radiansToDegrees(radians) {\n return radians * this.DEGREES_PER_RADIAN;\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXGaugeChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.3.3\", type: AXGaugeChartComponent, isStandalone: true, selector: \"ax-gauge-chart\", inputs: { value: { classPropertyName: \"value\", publicName: \"value\", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: \"options\", publicName: \"options\", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: \"chartContainerEl\", first: true, predicate: [\"chartContainer\"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: \"<div class=\\\"ax-gauge-chart\\\" role=\\\"img\\\" #chartContainer>\\n <ax-chart-tooltip [data]=\\\"tooltipData()\\\" [position]=\\\"tooltipPosition()\\\" [visible]=\\\"tooltipVisible()\\\"></ax-chart-tooltip>\\n</div>\\n\", styles: [\".ax-chart-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-gauge-chart{display:block;width:100%;height:100%;min-height:0;box-sizing:border-box;--ax-comp-gauge-chart-bg-color: 0, 0, 0, 0;--ax-comp-gauge-chart-text-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-data-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-track-color: var(--ax-sys-color-dark-surface);--ax-comp-gauge-chart-needle-color: var(--ax-sys-color-primary-500)}ax-gauge-chart .ax-gauge-chart{position:relative;width:100%;height:100%;min-height:0;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);overflow:hidden;color:rgb(var(--ax-comp-gauge-chart-text-color));background-color:rgba(var(--ax-comp-gauge-chart-bg-color));border-radius:.5rem}ax-gauge-chart .ax-gauge-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-gauge-chart .ax-gauge-chart svg g:has(text){font-family:inherit}\\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: AXGaugeChartComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-gauge-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"ax-gauge-chart\\\" role=\\\"img\\\" #chartContainer>\\n <ax-chart-tooltip [data]=\\\"tooltipData()\\\" [position]=\\\"tooltipPosition()\\\" [visible]=\\\"tooltipVisible()\\\"></ax-chart-tooltip>\\n</div>\\n\", styles: [\".ax-chart-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-gauge-chart{display:block;width:100%;height:100%;min-height:0;box-sizing:border-box;--ax-comp-gauge-chart-bg-color: 0, 0, 0, 0;--ax-comp-gauge-chart-text-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-data-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-track-color: var(--ax-sys-color-dark-surface);--ax-comp-gauge-chart-needle-color: var(--ax-sys-color-primary-500)}ax-gauge-chart .ax-gauge-chart{position:relative;width:100%;height:100%;min-height:0;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);overflow:hidden;color:rgb(var(--ax-comp-gauge-chart-text-color));background-color:rgba(var(--ax-comp-gauge-chart-bg-color));border-radius:.5rem}ax-gauge-chart .ax-gauge-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-gauge-chart .ax-gauge-chart svg g:has(text){font-family:inherit}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F1Z2UtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2dhdWdlLWNoYXJ0L3NyYy9saWIvZ2F1Z2UtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2dhdWdlLWNoYXJ0L3NyYy9saWIvZ2F1Z2UtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUVoQixzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQix1QkFBdUIsR0FDeEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsdUJBQXVCLEVBQXNCLE1BQU0sOEJBQThCLENBQUM7QUFFM0YsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBR1QsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFHN0Q7OztHQUdHO0FBU0gsTUFBTSxPQUFPLHFCQUFzQixTQUFRLGdCQUFnQjtJQUN6RCxTQUFTO0lBQ1Qsd0JBQXdCO0lBQ3hCLEtBQUssR0FBRyxLQUFLLENBQW9CLENBQUMsaURBQUMsQ0FBQztJQUVwQywwQkFBMEI7SUFDMUIsT0FBTyxHQUFHLEtBQUssQ0FBcUIsRUFBRSxtREFBQyxDQUFDO0lBRXhDLDRCQUE0QjtJQUNYLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQTZCLGdCQUFnQixDQUFDLENBQUM7SUFFckcsOENBQThDO0lBQ3RDLFVBQVUsR0FBeUIsSUFBSSxD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QUFDLEtBQUssR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxVQUFVLENBQUM7SUFDL0YsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZ0JBQWdCLENBQUMsT0FBZTtRQUN0QyxPQUFPLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDM0MsQ0FBQzt1R0F0K0JVLHFCQUFxQjsyRkFBckIscUJBQXFCLHVlQzNDbEMseU1BR0EsZzlDRHFDWSx1QkFBdUI7OzJGQUd0QixxQkFBcUI7a0JBUmpDLFNBQVM7K0JBQ0UsZ0JBQWdCLGlCQUdYLGlCQUFpQixDQUFDLElBQUksV0FDNUIsQ0FBQyx1QkFBdUIsQ0FBQyxtQkFDakIsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFYQ2hhcnRDb21wb25lbnQsXG4gIEFYQ2hhcnRDb21wb25lbnRCYXNlLFxuICBjb21wdXRlVG9vbHRpcFBvc2l0aW9uLFxuICBjcmVhdGVDaGFydEluc3RhbmNlSWQsXG4gIGZvcm1hdExhcmdlTnVtYmVyLFxuICBnZXRFYXNpbmdGdW5jdGlvbixcbiAgbWVyZ2VDaGFydE1lc3NhZ2VzLFxuICBtZXJnZUNoYXJ0T3B0aW9ucyxcbiAgcmVuZGVyQ2hhcnRFbXB0eU1lc3NhZ2UsXG59IGZyb20gJ0BhY29yZXgvY2hhcnRzJztcbmltcG9ydCB7IEFYQ2hhcnRUb29sdGlwQ29tcG9uZW50LCBBWENoYXJ0VG9vbHRpcERhdGEgfSBmcm9tICdAYWNvcmV4L2NoYXJ0cy9jaGFydC10b29sdGlwJztcblxuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgT25EZXN0cm95LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBzaWduYWwsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSAqIGFzIGQzIGZyb20gJ2QzJztcbmltcG9ydCB7IEFYX0dBVUdFX0NIQVJUX0NPTkZJRyB9IGZyb20gJy4vZ2F1Z2UtY2hhcnQuY29uZmlnJztcbmltcG9ydCB7IEFYR2F1Z2VDaGFydE9wdGlvbiwgQVhHYXVnZUNoYXJ0VmFsdWUgfSBmcm9tICcuL2dhdWdlLWNoYXJ0LnR5cGUnO1xuXG4vKipcbiAqIEdhdWdlIENoYXJ0IENvbXBvbmVudFxuICogUmVuZGVycyBhIHNlbWktY2lyY3VsYXIgZ2F1Z2UgY2hhcnQgd2l0aCBhbmltYXRlZCBuZWVkbGUgYW5kIHRocmVzaG9sZHNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXgtZ2F1Z2UtY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2F1Z2UtY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9nYXVnZS1jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBpbXBvcnRzOiBbQVhDaGFydFRvb2x0aXBDb21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQVhHYXVnZUNoYXJ0Q29tcG9uZW50IGV4dGVuZHMgQVhDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQVhDaGFydENvbXBvbmVudEJhc2Uge1xuICAvLyBJbnB1dHNcbiAgLyoqIENoYXJ0IHZhbHVlIGlucHV0ICovXG4gIHZhbHVlID0gaW5wdXQ8QVhHYXVnZUNoYXJ0VmFsdWU+KDApO1xuXG4gIC8qKiBDaGFydCBvcHRpb25zIGlucHV0ICovXG4gIG9wdGlvbnMgPSBpbnB1dDxBWEdhdWdlQ2hhcnRPcHRpb24+KHt9KTtcblxuICAvLyBDaGFydCBjb250YWluZXIgcmVmZXJlbmNlXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnRDb250YWluZXJFbCA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ2NoYXJ0Q29udGFpbmVyJyk7XG5cbiAgLy8gU1ZHIGVsZW1lbnQgcmVmZXJlbmNlIChjcmVhdGVkIGluIHRoZSBjb2RlKVxuICBwcml2YXRlIHN2Z0VsZW1lbnQ6IFNWR1NWR0VsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAvLyBEMyByZWZlcmVuY2UgLSBsb2FkZWQgYXN5bmNocm9ub3VzbHlcbiAgcHJvdGVjdGVkIGQzITogdHlwZW9mIGltcG9ydCgnZDMnKTtcblxuICAvLyBTaWduYWxzIGZvciBjb21wb25lbnQgc3RhdGVcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9yZW5kZXJlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX3ByZXZWYWx1ZSA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcblxuICAvLyBUcmFjayBwcmV2aW91cyBvcHRpb25zIHRvIGRldGVjdCBjaGFuZ2VzXG4gIHByaXZhdGUgX3ByZXZPcHRpb25zU3RyaW5nID0gJyc7XG5cbiAgLy8gQ2FjaGUgZm9yIGNvbnRhaW5lciBkaW1lbnNpb25zIHRvIGF2b2lkIHJlcGVhdGVkIERPTSByZWFkc1xuICBwcml2YXRlIF9sYXN0Q29udGFpbmVyUmVjdDogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gVG9vbHRpcCBzaWduYWxzXG4gIHByaXZhdGUgX3Rvb2x0aXBWaXNpYmxlID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfdG9vbHRpcFBvc2l0aW9uID0gc2lnbmFsKHsgeDogMCwgeTogMCB9KTtcbiAgcHJpdmF0ZSBfdG9vbHRpcERhdGEgPSBzaWduYWw8QVhDaGFydFRvb2x0aXBEYXRhPih7XG4gICAgdGl0bGU6ICcnLFxuICAgIHZhbHVlOiAnJyxcbiAgfSk7XG4gIHByaXZhdGUgX3Rvb2x0aXBSYWZJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3BlbmRpbmdUb29sdGlwQ29vcmRzOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICAvLyBFeHBvc2UgdG9vbHRpcCBzaWduYWxzIGFzIHJlYWQtb25seSBmb3IgdGhlIHRlbXBsYXRlXG4gIHByb3RlY3RlZCB0b29sdGlwVmlzaWJsZSA9IHRoaXMuX3Rvb2x0aXBWaXNpYmxlLmFzUmVhZG9ubHkoKTtcbiAgcHJvdGVjdGVkIHRvb2x0aXBQb3NpdGlvbiA9IHRoaXMuX3Rvb2x0aXBQb3NpdGlvbi5hc1JlYWRvbmx5KCk7XG4gIHByb3RlY3RlZCB0b29sdGlwRGF0YSA9IHRoaXMuX3Rvb2x0aXBEYXRhLmFzUmVhZG9ubHkoKTtcblxuICAvLyBJbmplY3QgY29uZmlndXJhdGlvblxuICBwcml2YXRlIGNvbmZpZ1Rva2VuID0gaW5qZWN0KEFYX0dBVUdFX0NIQVJUX0NPTkZJRyk7XG5cbiAgLy8gQ29tcHV0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gIHByb3RlY3RlZCBlZmZlY3RpdmVPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4gbWVyZ2VDaGFydE9wdGlvbnModGhpcy5jb25maWdUb2tlbiwgdGhpcy5vcHRpb25zKCkpKTtcblxuICBwcm90ZWN0ZWQgZWZmZWN0aXZlTWVzc2FnZXMgPSBjb21wdXRlZCgoKSA9PlxuICAgIG1lcmdlQ2hhcnRNZXNzYWdlcyh0aGlzLmNvbmZpZ1Rva2VuLm1lc3NhZ2VzLCB0aGlzLm9wdGlvbnMoKT8ubWVzc2FnZXMpLFxuICApO1xuXG4gIC8vIENvbnN0YW50c1xuICBwcml2YXRlIHJlYWRvbmx5IFRPT0xUSVBfR0FQID0gMTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgSEFMRl9DSVJDTEVfUkFESUFOUyA9IE1hdGguUEk7XG4gIHByaXZhdGUgcmVhZG9ubHkgUVVBUlRFUl9DSVJDTEVfUkFESUFOUyA9IE1hdGguUEkgLyAyO1xuICBwcml2YXRlIHJlYWRvbmx5IERFR1JFRVNfUEVSX1JBRElBTiA9IDE4MCAvIE1hdGguUEk7XG4gIHByaXZhdGUgcmVhZG9ubHkgQ0hBUlRfRURHRV9QQURESU5HID0gMTI7XG4gIHByaXZhdGUgcmVhZG9ubHkgVElDS19MQUJFTF9DSEFSX1dJRFRIX1JBVElPID0gMC42MjtcbiAgcHJpdmF0ZSByZWFkb25seSBUSUNLX0xBQkVMX1NJREVfUEFERElORyA9IDY7XG4gIHByaXZhdGUgcmVhZG9ubHkgTEFCRUxfVElDS19DTEVBUkFOQ0UgPSA0O1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9TRUdNRU5UX0NIT1JEX0ZPUl9MQUJFTCA9IDI4O1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9TRUdNRU5UX1JJTkdfRk9SX0xBQkVMID0gMTQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX1NFR01FTlRfTEFCRUxfRk9OVCA9IDEwO1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9TRUdNRU5UX0xBQkVMX0ZPTlQgPSAxNjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0YW5jZUlkID0gY3JlYXRlQ2hhcnRJbnN0YW5jZUlkKCdheC1nYXVnZScpO1xuXG4gIHByaXZhdGUgZ2V0IGJnR3JhZGllbnRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmluc3RhbmNlSWR9LWJnLWdyYWRpZW50YDtcbiAgfVxuXG4gIHByaXZhdGUgdGhyZXNob2xkR3JhZGllbnRJZChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5pbnN0YW5jZUlkfS10aHJlc2hvbGQtZ3JhZGllbnQtJHtpbmRleH1gO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvLyBEeW5hbWljYWxseSBsb2FkIEQzIGFuZCBpbml0aWFsaXplIHRoZSBjaGFydCB3aGVuIHRoZSBjb21wb25lbnQgaXMgcmVhZHlcbiAgICBhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQuc2V0KHRydWUpO1xuICAgICAgdGhpcy5sb2FkRDMoKTtcbiAgICB9KTtcblxuICAgIC8vIFdhdGNoIGZvciBjaGFuZ2VzIHRvIHJlZHJhdyB0aGUgY2hhcnRcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy52YWx1ZSgpO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuICAgICAgdGhpcy5fcHJldlZhbHVlLnNldChjdXJyZW50VmFsdWUpO1xuXG4gICAgICBpZiAodGhpcy5fcmVuZGVyZWQoKSkge1xuICAgICAgICBjb25zdCBvcHRpb25zU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucyk7XG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgPT0gbnVsbCB8fCAhdGhpcy5zdmdFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy5fcHJldk9wdGlvbnNTdHJpbmcgPSBvcHRpb25zU3RyaW5nO1xuICAgICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9wcmV2T3B0aW9uc1N0cmluZyA9PT0gb3B0aW9uc1N0cmluZykge1xuICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmREaWFsKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fcHJldk9wdGlvbnNTdHJpbmcgPSBvcHRpb25zU3RyaW5nO1xuICAgICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhbnVwQ2hhcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBEMy5qcyBkeW5hbWljYWxseVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGxvYWREMygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5kMykgcmV0dXJuOyAvLyBBbHJlYWR5IGxvYWRlZFxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZDMgPSBhd2FpdCBpbXBvcnQoJ2QzJyk7XG4gICAgICAvLyBJZiBjb250YWluZXIgaXMgcmVhZHksIGNyZWF0ZSBjaGFydFxuICAgICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKCkgJiYgdGhpcy5jaGFydENvbnRhaW5lckVsKCkpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICAgICAgICB0aGlzLl9yZW5kZXJlZC5zZXQodHJ1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIEQzLmpzOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZ2F1Z2UgY2hhcnQgd2l0aCBhbGwgZWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVDaGFydCgpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudDtcblxuICAgIGlmICh0aGlzLnN2Z0VsZW1lbnQpIHtcbiAgICAgIHRoaXMuc3ZnRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc3ZnRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICAgIGNvbnRhaW5lckVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmF4LWNoYXJ0LWVtcHR5JykuZm9yRWFjaCgoZWwpID0+IGVsLnJlbW92ZSgpKTtcblxuICAgIGlmICh0aGlzLnZhbHVlKCkgPT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMuZDMpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZXMgPSB0aGlzLmVmZmVjdGl2ZU1lc3NhZ2VzKCk7XG4gICAgICAgIHJlbmRlckNoYXJ0RW1wdHlNZXNzYWdlKHRoaXMuZDMsIGNvbnRhaW5lckVsZW1lbnQsIHtcbiAgICAgICAgICBpY29uOiBtZXNzYWdlcy5ub0RhdGFJY29uLFxuICAgICAgICAgIHRpdGxlOiBtZXNzYWdlcy5ub0RhdGEsXG4gICAgICAgICAgaGVscDogbWVzc2FnZXMubm9EYXRhSGVscCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9yZW5kZXJlZC5zZXQodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy52YWx1ZSgpIGFzIG51bWJlcjtcblxuICAgIC8vIENyZWF0ZSBTVkcgZWxlbWVudFxuICAgIHRoaXMuc3ZnRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnc3ZnJyk7XG4gICAgY29udGFpbmVyRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnN2Z0VsZW1lbnQpO1xuXG4gICAgLy8gR2V0IGN1cnJlbnQgb3B0aW9uc1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKTtcblxuICAgIC8vIFN0b3JlIG9wdGlvbnMgc3RyaW5nIGZvciBjb21wYXJpc29uXG4gICAgdGhpcy5fcHJldk9wdGlvbnNTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zKTtcblxuICAgIGNvbnN0IHsgbWluVmFsdWUsIG1heFZhbHVlLCBzaG93VmFsdWUsIGxhYmVsID0gJycsIGdhdWdlV2lkdGgsIGNvcm5lclJhZGl1cywgYW5pbWF0aW9uRHVyYXRpb24gfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgdGhyZXNob2xkcyA9IG9wdGlvbnMudGhyZXNob2xkcyA/PyBbXTtcblxuICAgIC8vIENhbGN1bGF0ZSByZXNwb25zaXZlIGRpbWVuc2lvbnNcbiAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IGNvbnRhaW5lckVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgY29uc3QgY29udGFpbmVySGVpZ2h0ID0gY29udGFpbmVyRWxlbWVudC5jbGllbnRIZWlnaHQ7XG5cbiAgICAvLyBDYWNoZSBjb250YWluZXIgZGltZW5zaW9uc1xuICAgIHRoaXMuX2xhc3RDb250YWluZXJSZWN0ID0geyB3aWR0aDogY29udGFpbmVyV2lkdGgsIGhlaWdodDogY29udGFpbmVySGVpZ2h0IH07XG5cbiAgICAvLyBEZXRlcm1pbmUgY2hhcnQgZGltZW5zaW9ucyAtIHVzZSBvcHRpb25zIGlmIHByb3ZpZGVkLCBvdGhlcndpc2UgdXNlIGNvbnRhaW5lciBkaW1lbnNpb25zXG4gICAgY29uc3Qgd2lkdGggPSBvcHRpb25zLndpZHRoID8/IGNvbnRhaW5lcldpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0ID8/IGNvbnRhaW5lckhlaWdodDtcblxuICAgIC8vIEVuc3VyZSBtaW5pbXVtIGRpbWVuc2lvbnNcbiAgICBjb25zdCBlZmZlY3RpdmVXaWR0aCA9IE1hdGgubWF4KHdpZHRoIHx8IDEsIDEpO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUhlaWdodCA9IE1hdGgubWF4KGhlaWdodCB8fCAxLCAxKTtcblxuICAgIC8vIEZvciBhIHNlbWktY2lyY3VsYXIgZ2F1Z2UsIHdpZHRoIHNob3VsZCBiZSBhcHByb3hpbWF0ZWx5IHR3aWNlIHRoZSBoZWlnaHRcbiAgICBjb25zdCBzaXplID0gTWF0aC5taW4oZWZmZWN0aXZlV2lkdGgsIGVmZmVjdGl2ZUhlaWdodCAqIDIpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG1hcmdpbiBhcyBwZXJjZW50YWdlIG9mIHNpemUgKDUtOCUgd2l0aCByZWFzb25hYmxlIGJvdW5kcylcbiAgICBjb25zdCBtYXJnaW5SYXRpbyA9IDAuMDg7XG4gICAgY29uc3QgbWFyZ2luID0gTWF0aC5tYXgoNSwgTWF0aC5taW4oc2l6ZSAqIG1hcmdpblJhdGlvLCAzMCkpO1xuXG4gICAgY29uc3QgdGlja0NvdW50ID0gdGhpcy5nZXRUaWNrQ291bnQoc2l6ZSk7XG4gICAgY29uc3QgdGlja0ZvbnRQeCA9IHRoaXMuZ2V0VGlja0ZvbnRTaXplKHNpemUpO1xuICAgIGNvbnN0IG1heFRpY2tMYWJlbFdpZHRoID0gdGhpcy5lc3RpbWF0ZU1heFRpY2tMYWJlbFdpZHRoKHRpY2tDb3VudCwgbWluVmFsdWUsIG1heFZhbHVlLCB0aWNrRm9udFB4KTtcbiAgICBjb25zdCB0aWNrTGVuZ3RoID0gTWF0aC5tYXgoNCwgTWF0aC5taW4oKHNpemUgLyAyKSAqIDAuMTIsIDE0KSk7XG4gICAgLy8gS2VlcCBsYWJlbHMgY2xvc2VyIHRvIHRoZSBnYXVnZSBhcmMgd2hpbGUgcHJlc2VydmluZyByZWFkYWJpbGl0eS5cbiAgICBjb25zdCBsYWJlbEdhcCA9IE1hdGgubWF4KDYsIE1hdGgubWluKChzaXplIC8gMikgKiAwLjA2LCAxNCkpO1xuICAgIGNvbnN0IGxhYmVsT2Zmc2V0RnJvbVRpY2tFbmQgPSBsYWJlbEdhcCArIHRpY2tGb250UHggKiAwLjM1O1xuICAgIGNvbnN0IHRpY2tMYWJlbFNwYWNlID0gdGlja0xlbmd0aCArIGxhYmVsT2Zmc2V0RnJvbVRpY2tFbmQgKyB0aWNrRm9udFB4O1xuICAgIGNvbnN0IHRvdGFsVmVydGljYWxTcGFjZSA9IHNpemUgLyAyICsgdGlja0xhYmVsU3BhY2U7XG5cbiAgICAvLyBMYWJlbHMgYXQgZWRnZSB0aWNrcyB1c2Ugc3RhcnQvZW5kIGFuY2hvcnMsIHNvIHRoZXkgY2FuIGV4dGVuZCBieSBuZWFyIGZ1bGwgd2lkdGguXG4gICAgY29uc3QgaG9yaXpvbnRhbFBhZGRpbmcgPSBNYXRoLm1heCgxOCwgbWF4VGlja0xhYmVsV2lkdGggKyA4KTtcbiAgICBjb25zdCB0b3RhbFdpZHRoID0gc2l6ZSArIGhvcml6b250YWxQYWRkaW5nICogMjtcbiAgICBjb25zdCB2aWV3Qm94V2lkdGggPSB0b3RhbFdpZHRoICsgdGhpcy5DSEFSVF9FREdFX1BBRERJTkcgKiAyO1xuICAgIGNvbnN0IHZpZXdCb3hIZWlnaHQgPSB0b3RhbFZlcnRpY2FsU3BhY2UgKyB0aGlzLkNIQVJUX0VER0VfUEFERElORyAqIDI7XG5cbiAgICAvLyBTZXQgdXAgU1ZHIHdpdGggcmVzcG9uc2l2ZSB2aWV3Qm94IHRoYXQgYWNjb3VudHMgZm9yIG92ZXJmbG93XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5kM1xuICAgICAgLnNlbGVjdCh0aGlzLnN2Z0VsZW1lbnQpXG4gICAgICAuYXR0cignd2lkdGgnLCAnMTAwJScpXG4gICAgICAuYXR0cignaGVpZ2h0JywgJzEwMCUnKVxuICAgICAgLmF0dHIoJ3ZpZXdCb3gnLCBgMCAwICR7dmlld0JveFdpZHRofSAke3ZpZXdCb3hIZWlnaHR9YClcbiAgICAgIC5hdHRyKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJywgJ3hNaWRZTWlkIG1lZXQnKTtcblxuICAgIC8vIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgY2hhcnQgY2VudGVyZWQgaG9yaXpvbnRhbGx5IHdpdGggcGFkZGluZywgcG9zaXRpb25lZCB0byBzaG93IG9ubHkgdGhlIHRvcCBoYWxmXG4gICAgY29uc3QgY2hhcnRHcm91cCA9IHN2Z1xuICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAuYXR0cihcbiAgICAgICAgJ3RyYW5zZm9ybScsXG4gICAgICAgIGB0cmFuc2xhdGUoJHtzaXplIC8gMiArIGhvcml6b250YWxQYWRkaW5nICsgdGhpcy5DSEFSVF9FREdFX1BBRERJTkd9LCAke3NpemUgLyAyIC0gbWFyZ2luICsgdGhpcy5DSEFSVF9FREdFX1BBRERJTkd9KWAsXG4gICAgICApO1xuXG4gICAgLy8gRGVmaW5lIGdhdWdlIHBhcmFtZXRlcnNcbiAgICBjb25zdCByYWRpdXMgPSBzaXplIC8gMiAtIG1hcmdpbjtcbiAgICBjb25zdCBkZXNpcmVkR2F1Z2VXaWR0aCA9IHR5cGVvZiBnYXVnZVdpZHRoID09PSAnbnVtYmVyJyAmJiAhTnVtYmVyLmlzTmFOKGdhdWdlV2lkdGgpID8gZ2F1Z2VXaWR0aCA6IDMwO1xuICAgIC8vIFJlc3BlY3QgZXhwbGljaXQgZ2F1Z2VXaWR0aCBpbiBweCB3aXRoIHNhbmUgYWJzb2x1dGUgYm91bmRzLlxuICAgIGNvbnN0IGNsYW1wZWRHYXVnZVdpZHRoID0gTWF0aC5tYXgoNiwgTWF0aC5taW4oZGVzaXJlZEdhdWdlV2lkdGgsIHJhZGl1cyAqIDAuNykpO1xuICAgIGNvbnN0IGlubmVyUmFkaXVzID0gcmFkaXVzIC0gY2xhbXBlZEdhdWdlV2lkdGg7XG4gICAgY29uc3Qgb3V0ZXJSYWRpdXMgPSByYWRpdXM7XG5cbiAgICAvLyBDcmVhdGUgZ3JhZGllbnQgZGVmaW5pdGlvbnNcbiAgICB0aGlzLmNyZWF0ZUdyYWRpZW50cyhzdmcsIHRocmVzaG9sZHMpO1xuXG4gICAgLy8gRHJhdyB0aGUgYmFja2dyb3VuZCBhcmNcbiAgICB0aGlzLmRyYXdCYWNrZ3JvdW5kQXJjKGNoYXJ0R3JvdXAsIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cywgY29ybmVyUmFkaXVzKTtcblxuICAgIC8vIERyYXcgdGhlIHRocmVzaG9sZCBhcmNzIGlmIHRocmVzaG9sZHMgZXhpc3RcbiAgICBpZiAodGhyZXNob2xkcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmRyYXdUaHJlc2hvbGRzKGNoYXJ0R3JvdXAsIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cywgbWluVmFsdWUsIG1heFZhbHVlLCB0aHJlc2hvbGRzLCBjb3JuZXJSYWRpdXMpO1xuICAgIH1cblxuICAgIC8vIERyYXcgdGljayBtYXJrc1xuICAgIHRoaXMuZHJhd1RpY2tzKGNoYXJ0R3JvdXAsIG91dGVyUmFkaXVzLCBtaW5WYWx1ZSwgbWF4VmFsdWUsIHNpemUsIHRpY2tDb3VudCwgdGlja0ZvbnRQeCk7XG5cbiAgICAvLyBEcmF3IHRoZSBkaWFsL25lZWRsZSB3aXRoIGFuaW1hdGlvblxuICAgIHRoaXMuZHJhd0RpYWwoY2hhcnRHcm91cCwgcmFkaXVzLCBjdXJyZW50VmFsdWUsIG1pblZhbHVlLCBtYXhWYWx1ZSwgYW5pbWF0aW9uRHVyYXRpb24pO1xuXG4gICAgLy8gRHJhdyB0aGUgdmFsdWUgZGlzcGxheSAoYWZ0ZXIgdGhlIGRpYWwgc28gaXQncyBvbiB0b3ApXG4gICAgaWYgKHNob3dWYWx1ZSkge1xuICAgICAgdGhpcy5kcmF3VmFsdWVEaXNwbGF5KGNoYXJ0R3JvdXAsIGN1cnJlbnRWYWx1ZSwgbGFiZWwsIHJhZGl1cywgc2l6ZSk7XG4gICAgfVxuXG4gICAgLy8gSGlkZSB0b29sdGlwIGluaXRpYWxseVxuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY2hhcnQgd2hlbiBvcHRpb25zIGNoYW5nZVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIG9ubHkgdGhlIHZhbHVlIGRpc3BsYXkgYW5kIGRpYWwgcG9zaXRpb24gd2l0aG91dCByZWNyZWF0aW5nIHRoZSBjaGFydFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVZhbHVlQW5kRGlhbCh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN2Z0VsZW1lbnQpIHJldHVybjtcblxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKTtcbiAgICBjb25zdCBtaW5WYWx1ZSA9IG9wdGlvbnMubWluVmFsdWU7XG4gICAgY29uc3QgbWF4VmFsdWUgPSBvcHRpb25zLm1heFZhbHVlO1xuICAgIGNvbnN0IGFuaW1hdGlvbkR1cmF0aW9uID0gb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvbjtcbiAgICBjb25zdCBlYXNpbmdGdW5jdGlvbiA9IGdldEVhc2luZ0Z1bmN0aW9uKHRoaXMuZDMsIG9wdGlvbnMuYW5pbWF0aW9uRWFzaW5nKTtcblxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZhbHVlO1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuZDMuc2VsZWN0KHRoaXMuc3ZnRWxlbWVudCk7XG5cbiAgICAvLyBVcGRhdGUgdmFsdWUgdGV4dFxuICAgIHN2Zy5zZWxlY3QoJy5nYXVnZS12YWx1ZScpLnRleHQoY3VycmVudFZhbHVlLnRvTG9jYWxlU3RyaW5nKCkpO1xuXG4gICAgLy8gVXBkYXRlIG5lZWRsZSBwb3NpdGlvblxuICAgIGNvbnN0IGFuZ2xlID0gdGhpcy5zY2FsZVZhbHVlVG9BbmdsZShjdXJyZW50VmFsdWUsIG1pblZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgY29uc3QgYW5nbGVJbkRlZ3JlZXMgPSB0aGlzLnJhZGlhbnNUb0RlZ3JlZXMoYW5nbGUgLSB0aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlMpO1xuXG4gICAgc3ZnXG4gICAgICAuc2VsZWN0KCcuZ2F1Z2UtbmVlZGxlJylcbiAgICAgIC5hdHRyKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LW5lZWRsZS1jb2xvcikpJylcbiAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgIC5kdXJhdGlvbihhbmltYXRpb25EdXJhdGlvbilcbiAgICAgIC5lYXNlKGVhc2luZ0Z1bmN0aW9uKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGByb3RhdGUoJHthbmdsZUluRGVncmVlc30pYCk7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgYmFja2dyb3VuZCBhcmNcbiAgICovXG4gIHByaXZhdGUgZHJhd0JhY2tncm91bmRBcmMoXG4gICAgY2hhcnRHcm91cDogZDMuU2VsZWN0aW9uPFNWR0dFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+LFxuICAgIGlubmVyUmFkaXVzOiBudW1iZXIsXG4gICAgb3V0ZXJSYWRpdXM6IG51bWJlcixcbiAgICBjb3JuZXJSYWRpdXM6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGFyYyBmb3IgdGhlIGJhY2tncm91bmRcbiAgICBjb25zdCBiYWNrZ3JvdW5kQXJjID0gdGhpcy5kM1xuICAgICAgLmFyYygpXG4gICAgICAuaW5uZXJSYWRpdXMoaW5uZXJSYWRpdXMpXG4gICAgICAub3V0ZXJSYWRpdXMob3V0ZXJSYWRpdXMpXG4gICAgICAuc3RhcnRBbmdsZSgtdGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TKSAvLyBTdGFydCBmcm9tIGJvdHRvbSAoLTkwIGRlZ3JlZXMpXG4gICAgICAuZW5kQW5nbGUodGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TKSAvLyBFbmQgYXQgdG9wICg5MCBkZWdyZWVzKVxuICAgICAgLmNvcm5lclJhZGl1cyhjb3JuZXJSYWRpdXMpO1xuXG4gICAgLy8gRHJhdyBiYWNrZ3JvdW5kIGFyY1xuICAgIGNvbnN0IGJhY2tncm91bmRQYXRoID0gY2hhcnRHcm91cFxuICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAuYXR0cignZCcsIGJhY2tncm91bmRBcmMpXG4gICAgICAuYXR0cignY2xhc3MnLCAnZ2F1Z2UtYXJjIGdhdWdlLWJhc2UnKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCBgdXJsKCMke3RoaXMuYmdHcmFkaWVudElkfSlgKVxuICAgICAgLmF0dHIoJ2ZpbHRlcicsICdkcm9wLXNoYWRvdygwcHggMnB4IDNweCByZ2JhKDAsMCwwLDAuMSkpJyk7XG5cbiAgICAvLyBBZGQgdG9vbHRpcCBmb3Igc2luZ2xlIGFyYyBpZiBubyB0aHJlc2hvbGRzXG4gICAgaWYgKCF0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS50aHJlc2hvbGRzIHx8IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnRocmVzaG9sZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBiYWNrZ3JvdW5kUGF0aFxuICAgICAgICAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJylcbiAgICAgICAgLm9uKCdtb3VzZWVudGVyJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93VG9vbHRpcCkgcmV0dXJuO1xuICAgICAgICAgIHRoaXMuc2hvd1NpbmdsZVJhbmdlVG9vbHRpcChldmVudCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignbW91c2Vtb3ZlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX3Rvb2x0aXBWaXNpYmxlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgICAgICB0aGlzLmhpZGVUb29sdGlwKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IHRoZSB0aHJlc2hvbGRzIGFyY3NcbiAgICovXG4gIHByaXZhdGUgZHJhd1RocmVzaG9sZHMoXG4gICAgY2hhcnRHcm91cDogZDMuU2VsZWN0aW9uPFNWR0dFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+LFxuICAgIGlubmVyUmFkaXVzOiBudW1iZXIsXG4gICAgb3V0ZXJSYWRpdXM6IG51bWJlcixcbiAgICBtaW5WYWx1ZTogbnVtYmVyLFxuICAgIG1heFZhbHVlOiBudW1iZXIsXG4gICAgdGhyZXNob2xkczogeyB2YWx1ZTogbnVtYmVyOyBjb2xvcjogc3RyaW5nOyBsYWJlbD86IHN0cmluZyB9W10sXG4gICAgY29ybmVyUmFkaXVzOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhcmMgZ2VuZXJhdG9yXG4gICAgY29uc3QgYXJjID0gdGhpcy5kM1xuICAgICAgLmFyYygpXG4gICAgICAuaW5uZXJSYWRpdXMoaW5uZXJSYWRpdXMpXG4gICAgICAub3V0ZXJSYWRpdXMob3V0ZXJSYWRpdXMgKiAwLjk4KVxuICAgICAgLmNvcm5lclJhZGl1cyhjb3JuZXJSYWRpdXMpO1xuXG4gICAgLy8gU29ydCB0aHJlc2hvbGRzIGJ5IHZhbHVlIGluIGFzY2VuZGluZyBvcmRlciAob25seSBpZiBuZWVkZWQpXG4gICAgY29uc3Qgc29ydGVkVGhyZXNob2xkcyA9IHRocmVzaG9sZHMubGVuZ3RoID4gMSA/IFsuLi50aHJlc2hvbGRzXS5zb3J0KChhLCBiKSA9PiBhLnZhbHVlIC0gYi52YWx1ZSkgOiB0aHJlc2hvbGRzO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGFsbCBhbmdsZXMgZmlyc3QgdXNpbmcgdGhlIGNvbG9yIGFuZ2xlIGNhbGN1bGF0aW9uXG4gICAgY29uc3QgYW5nbGVzID0gc29ydGVkVGhyZXNob2xkcy5tYXAoKHQpID0+IHRoaXMuc2NhbGVWYWx1ZVRvQ29sb3JBbmdsZSh0LnZhbHVlLCBtaW5WYWx1ZSwgbWF4VmFsdWUpKTtcblxuICAgIC8vIFN0YXJ0IGZyb20gdGhlIG1pbmltdW0gdmFsdWUgYW5nbGVcbiAgICBsZXQgcHJldmlvdXNFbmRBbmdsZSA9IHRoaXMuc2NhbGVWYWx1ZVRvQ29sb3JBbmdsZShtaW5WYWx1ZSwgbWluVmFsdWUsIG1heFZhbHVlKTtcbiAgICBjb25zdCBsYWJlbGVkU2VnbWVudHM6IHtcbiAgICAgIHN0YXJ0QW5nbGU6IG51bWJlcjtcbiAgICAgIGVuZEFuZ2xlOiBudW1iZXI7XG4gICAgICBsYWJlbDogc3RyaW5nO1xuICAgIH1bXSA9IFtdO1xuXG4gICAgc29ydGVkVGhyZXNob2xkcy5mb3JFYWNoKCh0aHJlc2hvbGQsIGkpID0+IHtcbiAgICAgIGNvbnN0IGVuZEFuZ2xlID0gYW5nbGVzW2ldO1xuXG4gICAgICAvLyBTa2lwIGlmIGVuZCBhbmdsZSBpcyBub3QgZ3JlYXRlciB0aGFuIHN0YXJ0IGFuZ2xlXG4gICAgICBpZiAoZW5kQW5nbGUgPD0gcHJldmlvdXNFbmRBbmdsZSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzdGFydEFuZ2xlID0gcHJldmlvdXNFbmRBbmdsZTtcbiAgICAgIGNvbnN0IGFyY1BhdGggPSBjaGFydEdyb3VwXG4gICAgICAgIC5hcHBlbmQoJ3BhdGgnKVxuICAgICAgICAuYXR0cihcbiAgICAgICAgICAnZCcsXG4gICAgICAgICAgYXJjKHtcbiAgICAgICAgICAgIGlubmVyUmFkaXVzLFxuICAgICAgICAgICAgb3V0ZXJSYWRpdXMsXG4gICAgICAgICAgICBzdGFydEFuZ2xlLFxuICAgICAgICAgICAgZW5kQW5nbGUsXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICAgLmF0dHIoJ2ZpbGwnLCB0aHJlc2hvbGQuY29sb3IgfHwgYHVybCgjJHt0aGlzLnRocmVzaG9sZEdyYWRpZW50SWQoaSl9KWApXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdnYXVnZS1hcmMgdGhyZXNob2xkLWFyYycpXG4gICAgICAgIC5hdHRyKCdkYXRhLXZhbHVlJywgdGhyZXNob2xkLnZhbHVlKVxuICAgICAgICAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJyk7XG5cbiAgICAgIGlmICh0aHJlc2hvbGQubGFiZWwpIHtcbiAgICAgICAgbGFiZWxlZFNlZ21lbnRzLnB1c2goeyBzdGFydEFuZ2xlLCBlbmRBbmdsZSwgbGFiZWw6IHRocmVzaG9sZC5sYWJlbCB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIHRvb2x0aXAgaW50ZXJhY3Rpb25cbiAgICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93VG9vbHRpcCkge1xuICAgICAgICAvLyBDb252ZXJ0IGFuZ2xlcyBiYWNrIHRvIHZhbHVlcyBmb3IgdG9vbHRpcFxuICAgICAgICBjb25zdCBzdGFydFZhbHVlID0gdGhpcy5hbmdsZVRvVmFsdWUocHJldmlvdXNFbmRBbmdsZSwgbWluVmFsdWUsIG1heFZhbHVlKTtcbiAgICAgICAgY29uc3QgZW5kVmFsdWUgPSB0aHJlc2hvbGQudmFsdWU7XG5cbiAgICAgICAgYXJjUGF0aFxuICAgICAgICAgIC5vbignbW91c2VlbnRlcicsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93VGhyZXNob2xkVG9vbHRpcChldmVudCwgc3RhcnRWYWx1ZSwgZW5kVmFsdWUsIHRocmVzaG9sZC5jb2xvciwgdGhyZXNob2xkLmxhYmVsKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5vbignbW91c2Vtb3ZlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdG9vbHRpcFZpc2libGUoKSkge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAub24oJ21vdXNlbGVhdmUnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhpZGVUb29sdGlwKCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgcHJldmlvdXMgZW5kIGFuZ2xlIGZvciB0aGUgbmV4dCB0aHJlc2hvbGRcbiAgICAgIHByZXZpb3VzRW5kQW5nbGUgPSBlbmRBbmdsZTtcbiAgICB9KTtcblxuICAgIC8vIERyYXcgdGhlIGxhc3Qgc2VnbWVudCBpZiB0aGUgbGFzdCB0aHJlc2hvbGQgaXMgbGVzcyB0aGFuIHRoZSBtYXggdmFsdWVcbiAgICBpZiAocHJldmlvdXNFbmRBbmdsZSA8IHRoaXMuUVVBUlRFUl9DSVJDTEVfUkFESUFOUykge1xuICAgICAgY29uc3QgbGFzdEFyYyA9IGNoYXJ0R3JvdXBcbiAgICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAgIC5hdHRyKFxuICAgICAgICAgICdkJyxcbiAgICAgICAgICBhcmMoe1xuICAgICAgICAgICAgaW5uZXJSYWRpdXMsXG4gICAgICAgICAgICBvdXRlclJhZGl1cyxcbiAgICAgICAgICAgIHN0YXJ0QW5nbGU6IHByZXZpb3VzRW5kQW5nbGUsXG4gICAgICAgICAgICBlbmRBbmdsZTogdGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICAgIC5hdHRyKCdmaWxsJywgYHVybCgjJHt0aGlzLmJnR3JhZGllbnRJZH0pYClcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2dhdWdlLWFyYyB0aHJlc2hvbGQtYXJjJylcbiAgICAgICAgLnN0eWxlKCdjdXJzb3InLCAncG9pbnRlcicpO1xuXG4gICAgICAvLyBBZGQgdG9vbHRpcCBmb3IgdGhlIGxhc3Qgc2VnbWVudFxuICAgICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dUb29sdGlwKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VmFsdWUgPSB0aGlzLmFuZ2xlVG9WYWx1ZShwcmV2aW91c0VuZEFuZ2xlLCBtaW5WYWx1ZSwgbWF4VmFsdWUpO1xuICAgICAgICBjb25zdCBlbmRWYWx1ZSA9IG1heFZhbHVlO1xuICAgICAgICBjb25zdCBsYXN0VGhyZXNob2xkID0gdGhyZXNob2xkc1t0aHJlc2hvbGRzLmxlbmd0aCAtIDFdO1xuXG4gICAgICAgIGxhc3RBcmNcbiAgICAgICAgICAub24oJ21vdXNlZW50ZXInLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1RocmVzaG9sZFRvb2x0aXAoZXZlbnQsIHN0YXJ0VmFsdWUsIGVuZFZhbHVlLCBsYXN0VGhyZXNob2xkLmNvbG9yLCBsYXN0VGhyZXNob2xkLmxhYmVsKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5vbignbW91c2Vtb3ZlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdG9vbHRpcFZpc2libGUoKSkge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAub24oJ21vdXNlbGVhdmUnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhpZGVUb29sdGlwKCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dEYXRhTGFiZWxzICE9PSBmYWxzZSAmJiBsYWJlbGVkU2VnbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5kcmF3U2VnbWVudExhYmVscyhjaGFydEdyb3VwLCBsYWJlbGVkU2VnbWVudHMsIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyYXdzIHRocmVzaG9sZCBsYWJlbHMgY2VudGVyZWQgb24gZWFjaCBzZWdtZW50IGFyYyB3aGVuIHNwYWNlIGFsbG93cy5cbiAgICovXG4gIHByaXZhdGUgZHJhd1NlZ21lbnRMYWJlbHMoXG4gICAgY2hhcnRHcm91cDogZDMuU2VsZWN0aW9uPFNWR0dFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+LFxuICAgIHNlZ21lbnRzOiB7IHN0YXJ0QW5nbGU6IG51bWJlcjsgZW5kQW5nbGU6IG51bWJlcjsgbGFiZWw6IHN0cmluZyB9W10sXG4gICAgaW5uZXJSYWRpdXM6IG51bWJlcixcbiAgICBvdXRlclJhZGl1czogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBsYWJlbEFyYyA9IHRoaXMuZDNcbiAgICAgIC5hcmMoKVxuICAgICAgLmlubmVyUmFkaXVzKGlubmVyUmFkaXVzKVxuICAgICAgLm91dGVyUmFkaXVzKG91dGVyUmFkaXVzICogMC45OCk7XG5cbiAgICBjb25zdCBsYWJlbEdyb3VwID0gY2hhcnRHcm91cC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdnYXVnZS1zZWdtZW50LWxhYmVscycpO1xuICAgIGNvbnN0IHJpbmdXaWR0aCA9IG91dGVyUmFkaXVzIC0gaW5uZXJSYWRpdXM7XG4gICAgY29uc3QgbGFiZWxSYWRpdXMgPSBpbm5lclJhZGl1cyArIHJpbmdXaWR0aCAvIDI7XG4gICAgY29uc3QgYW5pbWF0aW9uRHVyYXRpb24gPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5hbmltYXRpb25EdXJhdGlvbiA/PyA3NTA7XG5cbiAgICBzZWdtZW50cy5mb3JFYWNoKChzZWdtZW50KSA9PiB7XG4gICAgICBjb25zdCBhbmdsZSA9IHNlZ21lbnQuZW5kQW5nbGUgLSBzZWdtZW50LnN0YXJ0QW5nbGU7XG4gICAgICBjb25zdCBjaG9yZExlbmd0aCA9IDIgKiBsYWJlbFJhZGl1cyAqIE1hdGguc2luKGFuZ2xlIC8gMik7XG4gICAgICBjb25zdCBmb250U2l6ZSA9IHRoaXMuY2FsY3VsYXRlU2VnbWVudExhYmVsRm9udFNpemUoYW5nbGUsIHJpbmdXaWR0aCwgY2hvcmRMZW5ndGgpO1xuICAgICAgaWYgKGZvbnRTaXplIDw9IDApIHJldHVybjtcblxuICAgICAgY29uc3QgYXZhaWxhYmxlV2lkdGggPSBjaG9yZExlbmd0aCAqIDAuODtcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmdldEZpdHRlZFNlZ21lbnRMYWJlbChzZWdtZW50LmxhYmVsLCBmb250U2l6ZSwgYXZhaWxhYmxlV2lkdGgpO1xuICAgICAgaWYgKCF0ZXh0KSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGNlbnRyb2lkID0gbGFiZWxBcmMuY2VudHJvaWQoe1xuICAgICAgICBpbm5lclJhZGl1cyxcbiAgICAgICAgb3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzICogMC45OCxcbiAgICAgICAgc3RhcnRBbmdsZTogc2VnbWVudC5zdGFydEFuZ2xlLFxuICAgICAgICBlbmRBbmdsZTogc2VnbWVudC5lbmRBbmdsZSxcbiAgICAgIH0pO1xuXG4gICAgICBsYWJlbEdyb3VwXG4gICAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnZ2F1Z2Utc2VnbWVudC1sYWJlbCcpXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7Y2VudHJvaWRbMF19LCAke2NlbnRyb2lkWzFdfSlgKVxuICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgICAgLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ21pZGRsZScpXG4gICAgICAgIC5zdHlsZSgncG9pbnRlci1ldmVudHMnLCAnbm9uZScpXG4gICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgYCR7Zm9udFNpemV9cHhgKVxuICAgICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJzYwMCcpXG4gICAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC1kYXRhLWxhYmVscy1jb2xvcikpJylcbiAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMClcbiAgICAgICAgLnRleHQodGV4dClcbiAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAuZHVyYXRpb24oYW5pbWF0aW9uRHVyYXRpb24pXG4gICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDEpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVTZWdtZW50TGFiZWxGb250U2l6ZShhbmdsZTogbnVtYmVyLCByaW5nV2lkdGg6IG51bWJlciwgY2hvcmRMZW5ndGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKGNob3JkTGVuZ3RoIDwgdGhpcy5NSU5fU0VHTUVOVF9DSE9SRF9GT1JfTEFCRUwgfHwgcmluZ1dpZHRoIDwgdGhpcy5NSU5fU0VHTUVOVF9SSU5HX0ZPUl9MQUJFTCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgcmluZ0Jhc2VkU2l6ZSA9IHJpbmdXaWR0aCAqIDAuNDU7XG4gICAgY29uc3QgYW5nbGVTY2FsZSA9IE1hdGgubWluKDEsIDAuNyArIDAuMyAqIChhbmdsZSAvICh0aGlzLkhBTEZfQ0lSQ0xFX1JBRElBTlMgLyAzKSkpO1xuICAgIGNvbnN0IG1heEJ5Q2hvcmQgPSBjaG9yZExlbmd0aCAvICgyICogMC42NSk7XG4gICAgY29uc3QgZm9udFNpemUgPSBNYXRoLm1pbihyaW5nQmFzZWRTaXplICogYW5nbGVTY2FsZSwgbWF4QnlDaG9yZCk7XG5cbiAgICBpZiAoZm9udFNpemUgPCB0aGlzLk1JTl9TRUdNRU5UX0xBQkVMX0ZPTlQpIHJldHVybiAwO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKE1hdGgubWF4KHRoaXMuTUlOX1NFR01FTlRfTEFCRUxfRk9OVCwgTWF0aC5taW4oZm9udFNpemUsIHRoaXMuTUFYX1NFR01FTlRfTEFCRUxfRk9OVCkpICogMikgLyAyO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGaXR0ZWRTZWdtZW50TGFiZWwobGFiZWw6IHN0cmluZywgZm9udFNpemU6IG51bWJlciwgYXZhaWxhYmxlV2lkdGg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCFsYWJlbCkgcmV0dXJuICcnO1xuICAgIGlmICh0aGlzLmRvZXNTZWdtZW50TGFiZWxGaXQobGFiZWwsIGZvbnRTaXplLCBhdmFpbGFibGVXaWR0aCkpIHJldHVybiBsYWJlbDtcbiAgICByZXR1cm4gdGhpcy50cnVuY2F0ZVNlZ21lbnRMYWJlbChsYWJlbCwgZm9udFNpemUsIGF2YWlsYWJsZVdpZHRoKTtcbiAgfVxuXG4gIHByaXZhdGUgZG9lc1NlZ21lbnRMYWJlbEZpdCh0ZXh0OiBzdHJpbmcsIGZvbnRTaXplOiBudW1iZXIsIGF2YWlsYWJsZVdpZHRoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGV4dC5sZW5ndGggKiBmb250U2l6ZSAqIDAuNjUgPD0gYXZhaWxhYmxlV2lkdGg7XG4gIH1cblxuICBwcml2YXRlIHRydW5jYXRlU2VnbWVudExhYmVsKHRleHQ6IHN0cmluZywgZm9udFNpemU6IG51bWJlciwgYXZhaWxhYmxlV2lkdGg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgY2hhcldpZHRoID0gZm9udFNpemUgKiAoZm9udFNpemUgPD0gMTAgPyAwLjcgOiAwLjY1KTtcbiAgICBjb25zdCBhdmFpbGFibGVGb3JUZXh0ID0gYXZhaWxhYmxlV2lkdGggLSBmb250U2l6ZSAqIDAuNztcbiAgICBpZiAoYXZhaWxhYmxlRm9yVGV4dCA8PSAwKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCBtYXhDaGFycyA9IE1hdGguZmxvb3IoYXZhaWxhYmxlRm9yVGV4dCAvIGNoYXJXaWR0aCk7XG4gICAgaWYgKG1heENoYXJzIDw9IDApIHJldHVybiAnJztcbiAgICBpZiAodGV4dC5sZW5ndGggPD0gbWF4Q2hhcnMpIHJldHVybiB0ZXh0O1xuICAgIHJldHVybiBgJHt0ZXh0LnN1YnN0cmluZygwLCBNYXRoLm1heCgxLCBtYXhDaGFycykpfeKApmA7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgdG9vbHRpcCBmb3IgYSB0aHJlc2hvbGQgYXJjXG4gICAqL1xuICBwcml2YXRlIHNob3dUaHJlc2hvbGRUb29sdGlwKFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50LFxuICAgIHN0YXJ0VmFsdWU6IG51bWJlcixcbiAgICBlbmRWYWx1ZTogbnVtYmVyLFxuICAgIGNvbG9yOiBzdHJpbmcsXG4gICAgbGFiZWw/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSB0b29sdGlwIGRhdGFcbiAgICB0aGlzLl90b29sdGlwRGF0YS5zZXQoe1xuICAgICAgdGl0bGU6IGxhYmVsIHx8ICdSYW5nZScsXG4gICAgICB2YWx1ZTogYCR7c3RhcnRWYWx1ZS50b0xvY2FsZVN0cmluZygpfSAtICR7ZW5kVmFsdWUudG9Mb2NhbGVTdHJpbmcoKX1gLFxuICAgICAgY29sb3I6IGNvbG9yLFxuICAgIH0pO1xuXG4gICAgLy8gU2hvdyB0b29sdGlwXG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KHRydWUpO1xuICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyB0b29sdGlwIGZvciB0aGUgZW50aXJlIHJhbmdlIHdoZW4gbm8gdGhyZXNob2xkcyBhcmUgZGVmaW5lZFxuICAgKi9cbiAgcHJpdmF0ZSBzaG93U2luZ2xlUmFuZ2VUb29sdGlwKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuICAgIGlmICghb3B0aW9ucy5zaG93VG9vbHRpcCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fdG9vbHRpcERhdGEuc2V0KHtcbiAgICAgIHRpdGxlOiBvcHRpb25zLmxhYmVsIHx8ICdSYW5nZScsXG4gICAgICB2YWx1ZTogYCR7b3B0aW9ucy5taW5WYWx1ZS50b0xvY2FsZVN0cmluZygpfSAtICR7b3B0aW9ucy5tYXhWYWx1ZS50b0xvY2FsZVN0cmluZygpfWAsXG4gICAgICBjb2xvcjogJ3JnYih2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LXRyYWNrLWNvbG9yKSknLFxuICAgIH0pO1xuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldCh0cnVlKTtcbiAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzID0geyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH07XG4gICAgaWYgKHRoaXMuX3Rvb2x0aXBSYWZJZCAhPSBudWxsKSByZXR1cm47XG4gICAgdGhpcy5zY2hlZHVsZVRvb2x0aXBQb3NpdGlvbigwKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVUb29sdGlwUG9zaXRpb24oYXR0ZW1wdDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fdG9vbHRpcFJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzO1xuICAgICAgaWYgKCFjb29yZHMpIHtcbiAgICAgICAgdGhpcy5fdG9vbHRpcFJhZklkID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250YWluZXJFbCA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFjb250YWluZXJFbCkge1xuICAgICAgICB0aGlzLl90b29sdGlwUmFmSWQgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRvb2x0aXBFbCA9IGNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoJy5jaGFydC10b29sdGlwJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgaWYgKCF0b29sdGlwRWwgJiYgdGhpcy5fdG9vbHRpcFZpc2libGUoKSAmJiBhdHRlbXB0IDwgMykge1xuICAgICAgICB0aGlzLnNjaGVkdWxlVG9vbHRpcFBvc2l0aW9uKGF0dGVtcHQgKyAxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl90b29sdGlwUmFmSWQgPSBudWxsO1xuICAgICAgY29uc3QgcmVjdCA9IGNvbnRhaW5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgdG9vbHRpcFJlY3QgPSB0b29sdGlwRWw/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpID8/IG51bGw7XG4gICAgICBjb25zdCBwb3MgPSBjb21wdXRlVG9vbHRpcFBvc2l0aW9uKHJlY3QsIHRvb2x0aXBSZWN0LCBjb29yZHMueCArIDEwLCBjb29yZHMueSAtIDEwLCB0aGlzLlRPT0xUSVBfR0FQKTtcbiAgICAgIHRoaXMuX3Rvb2x0aXBQb3NpdGlvbi5zZXQocG9zKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyB0aGUgdG9vbHRpcFxuICAgKi9cbiAgcHJpdmF0ZSBoaWRlVG9vbHRpcCgpOiB2b2lkIHtcbiAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyB1cCBjaGFydCByZXNvdXJjZXNcbiAgICovXG4gIHB1YmxpYyBjbGVhbnVwQ2hhcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Rvb2x0aXBSYWZJZCAhPSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl90b29sdGlwUmFmSWQpO1xuICAgICAgdGhpcy5fdG9vbHRpcFJhZklkID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fcGVuZGluZ1Rvb2x0aXBDb29yZHMgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMuc3ZnRWxlbWVudCkge1xuICAgICAgdGhpcy5zdmdFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5zdmdFbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmF4LWNoYXJ0LWVtcHR5JykuZm9yRWFjaCgoZWwpID0+IGVsLnJlbW92ZSgpKTtcbiAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuX2xhc3RDb250YWluZXJSZWN0ID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGdyYWRpZW50IGRlZmluaXRpb25zIGZvciB0aHJlc2hvbGRzXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUdyYWRpZW50cyhcbiAgICBzdmc6IGQzLlNlbGVjdGlvbjxTVkdTVkdFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+LFxuICAgIHRocmVzaG9sZHM6IHsgdmFsdWU6IG51bWJlcjsgY29sb3I6IHN0cmluZyB9W10sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGRlZnMgPSBzdmcuYXBwZW5kKCdkZWZzJyk7XG5cbiAgICAvLyBDcmVhdGUgYSByYWRpYWwgZ3JhZGllbnQgZm9yIHRoZSBiYWNrZ3JvdW5kXG4gICAgY29uc3QgYmdHcmFkaWVudCA9IGRlZnNcbiAgICAgIC5hcHBlbmQoJ3JhZGlhbEdyYWRpZW50JylcbiAgICAgIC5hdHRyKCdpZCcsIHRoaXMuYmdHcmFkaWVudElkKVxuICAgICAgLmF0dHIoJ2N4JywgJzUwJScpXG4gICAgICAuYXR0cignY3knLCAnNTAlJylcbiAgICAgIC5hdHRyKCdyJywgJzUwJScpXG4gICAgICAuYXR0cignZ3JhZGllbnRVbml0cycsICd1c2VyU3BhY2VPblVzZScpO1xuXG4gICAgLy8gR2V0IENTUyB2YXJpYWJsZSBmb3IgdHJhY2sgY29sb3JcbiAgICBpZiAodGhyZXNob2xkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIERlZmF1bHQgZ3JhZGllbnQgd2hlbiBubyB0aHJlc2hvbGRzIGFyZSBwcm92aWRlZFxuICAgICAgYmdHcmFkaWVudC5hcHBlbmQoJ3N0b3AnKS5hdHRyKCdvZmZzZXQnLCAnMCUnKS5hdHRyKCdzdG9wLWNvbG9yJywgJ3JnYih2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LXRyYWNrLWNvbG9yKSknKTtcbiAgICAgIGJnR3JhZGllbnRcbiAgICAgICAgLmFwcGVuZCgnc3RvcCcpXG4gICAgICAgIC5hdHRyKCdvZmZzZXQnLCAnMTAwJScpXG4gICAgICAgIC5hdHRyKCdzdG9wLWNvbG9yJywgJ3JnYmEodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10cmFjay1jb2xvciksIDAuOCknKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmdHcmFkaWVudC5hcHBlbmQoJ3N0b3AnKS5hdHRyKCdvZmZzZXQnLCAnMCUnKS5hdHRyKCdzdG9wLWNvbG9yJywgJ3JnYih2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LXRyYWNrLWNvbG9yKSknKTtcbiAgICAgIGJnR3JhZGllbnRcbiAgICAgICAgLmFwcGVuZCgnc3RvcCcpXG4gICAgICAgIC5hdHRyKCdvZmZzZXQnLCAnMTAwJScpXG4gICAgICAgIC5hdHRyKCdzdG9wLWNvbG9yJywgJ3JnYmEodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10cmFjay1jb2xvciksIDAuOCknKTtcblxuICAgICAgLy8gQ3JlYXRlIGdyYWRpZW50cyBmb3IgZWFjaCB0aHJlc2hvbGRcbiAgICAgIHRocmVzaG9sZHMuZm9yRWFjaCgodGhyZXNob2xkLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGdyYWRpZW50ID0gZGVmc1xuICAgICAgICAgIC5hcHBlbmQoJ2xpbmVhckdyYWRpZW50JylcbiAgICAgICAgICAuYXR0cignaWQnLCB0aGlzLnRocmVzaG9sZEdyYWRpZW50SWQoaSkpXG4gICAgICAgICAgLmF0dHIoJ2dyYWRpZW50VW5pdHMnLCAndXNlclNwYWNlT25Vc2UnKVxuICAgICAgICAgIC5hdHRyKCd4MScsICctMScpXG4gICAgICAgICAgLmF0dHIoJ3kxJywgJzAnKVxuICAgICAgICAgIC5hdHRyKCd4MicsICcxJylcbiAgICAgICAgICAuYXR0cigneTInLCAnMCcpO1xuXG4gICAgICAgIGdyYWRpZW50XG4gICAgICAgICAgLmFwcGVuZCgnc3RvcCcpXG4gICAgICAgICAgLmF0dHIoJ29mZnNldCcsICcwJScpXG4gICAgICAgICAgLmF0dHIoJ3N0b3AtY29sb3InLCB0aGlzLmQzLmNvbG9yKHRocmVzaG9sZC5jb2xvcik/LmJyaWdodGVyKDAuNSkudG9TdHJpbmcoKSB8fCB0aHJlc2hvbGQuY29sb3IpO1xuXG4gICAgICAgIGdyYWRpZW50LmFwcGVuZCgnc3RvcCcpLmF0dHIoJ29mZnNldCcsICcxMDAlJykuYXR0cignc3RvcC1jb2xvcicsIHRocmVzaG9sZC5jb2xvcik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgdGljayBtYXJrcyBhbmQgbGFiZWxzIGFyb3VuZCB0aGUgZ2F1Z2VcbiAgICovXG4gIHByaXZhdGUgZHJhd1RpY2tzKFxuICAgIGNoYXJ0R3JvdXA6IGQzLlNlbGVjdGlvbjxTVkdHRWxlbWVudCwgdW5rbm93biwgbnVsbCwgdW5kZWZpbmVkPixcbiAgICByYWRpdXM6IG51bWJlcixcbiAgICBtaW5WYWx1ZTogbnVtYmVyLFxuICAgIG1heFZhbHVlOiBudW1iZXIsXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIHRpY2tDb3VudDogbnVtYmVyLFxuICAgIHRpY2tGb250UHg6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgdGlja0xlbmd0aCA9IE1hdGgubWF4KDQsIE1hdGgubWluKHJhZGl1cyAqIDAuMTIsIDE0KSk7XG4gICAgY29uc3QgYmFzZUxhYmVsT2Zmc2V0ID0gdGhpcy5nZXRCYXNlTGFiZWxPZmZzZXQocmFkaXVzLCB0aWNrTGVuZ3RoLCB0aWNrRm9udFB4KTtcbiAgICBjb25zdCB0aWNrR3JvdXAgPSBjaGFydEdyb3VwLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ3RpY2tzJyk7XG5cbiAgICBjb25zdCB0aWNrVmFsdWVzID0gW10gYXMgbnVtYmVyW107XG4gICAgY29uc3Qgc3RlcCA9IChtYXhWYWx1ZSAtIG1pblZhbHVlKSAvICh0aWNrQ291bnQgLSAxKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRpY2tDb3VudDsgaSsrKSB7XG4gICAgICB0aWNrVmFsdWVzLnB1c2gobWluVmFsdWUgKyBpICogc3RlcCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGlja01ldHJpY3MgPSB0aWNrVmFsdWVzLm1hcCgodGljaykgPT4ge1xuICAgICAgY29uc3QgYW5nbGUgPSB0aGlzLnNjYWxlVmFsdWVUb0FuZ2xlKHRpY2ssIG1pblZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgICBjb25zdCByYWRpYW5zID0gYW5nbGUgLSB0aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlM7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByYWRpYW5zLFxuICAgICAgICBjb3M6IE1hdGguY29zKHJhZGlhbnMpLFxuICAgICAgICBzaW46IE1hdGguc2luKHJhZGlhbnMpLFxuICAgICAgICBsYWJlbDogdGhpcy5mb3JtYXRUaWNrVmFsdWUodGljaywgbWluVmFsdWUsIG1heFZhbHVlKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aWNrTWV0cmljcy5mb3JFYWNoKChtZXRyaWMpID0+IHtcbiAgICAgIHRpY2tHcm91cFxuICAgICAgICAuYXBwZW5kKCdsaW5lJylcbiAgICAgICAgLmF0dHIoJ3gxJywgbWV0cmljLmNvcyAqIChyYWRpdXMgKyA1KSlcbiAgICAgICAgLmF0dHIoJ3kxJywgbWV0cmljLnNpbiAqIChyYWRpdXMgKyA1KSlcbiAgICAgICAgLmF0dHIoJ3gyJywgbWV0cmljLmNvcyAqIChyYWRpdXMgKyB0aWNrTGVuZ3RoKSlcbiAgICAgICAgLmF0dHIoJ3kyJywgbWV0cmljLnNpbiAqIChyYWRpdXMgKyB0aWNrTGVuZ3RoKSlcbiAgICAgICAgLmF0dHIoJ3N0cm9rZScsICdyZ2JhKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtdGV4dC1jb2xvciksIDAuNSknKVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgMik7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0ZXh0U2VsZWN0aW9uID0gdGlja0dyb3VwXG4gICAgICAuc2VsZWN0QWxsPFNWR1RleHRFbGVtZW50LCAodHlwZW9mIHRpY2tNZXRyaWNzKVtudW1iZXJdPigndGV4dC5nYXVnZS10aWNrLWxhYmVsJylcbiAgICAgIC5kYXRhKHRpY2tNZXRyaWNzKVxuICAgICAgLmVudGVyKClcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2dhdWdlLXRpY2stbGFiZWwnKVxuICAgICAgLmF0dHIoJ3gnLCAwKVxuICAgICAgLmF0dHIoJ3knLCAwKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAncmdiYSh2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LXRleHQtY29sb3IpLCAwLjcpJylcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgYCR7dGlja0ZvbnRQeH1weGApXG4gICAgICAudGV4dCgoZCkgPT4gZC5sYWJlbCk7XG5cbiAgICB0ZXh0U2VsZWN0aW9uLmVhY2goKGQsIGluZGV4LCBub2RlcykgPT4ge1xuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2luZGV4XTtcbiAgICAgIGxldCBiYm94V2lkdGggPSB0aGlzLmVzdGltYXRlTGFiZWxXaWR0aChkLmxhYmVsLCB0aWNrRm9udFB4KTtcbiAgICAgIGxldCBiYm94SGVpZ2h0ID0gdGlja0ZvbnRQeDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJib3ggPSBub2RlLmdldEJCb3goKTtcbiAgICAgICAgaWYgKGJib3gud2lkdGggPiAwKSBiYm94V2lkdGggPSBiYm94LndpZHRoO1xuICAgICAgICBpZiAoYmJveC5oZWlnaHQgPiAwKSBiYm94SGVpZ2h0ID0gYmJveC5oZWlnaHQ7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gS2VlcCBmYWxsYmFjayBlc3RpbWF0ZXMuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFuY2hvciA9IHRoaXMuZ2V0VGlja0xhYmVsQW5jaG9yKGQuY29zKTtcbiAgICAgIGNvbnN0IG5lYXJFZGdlRXh0ZW50ID0gdGhpcy5nZXROZWFyRWRnZVByb2plY3Rpb24oYW5jaG9yLCBkLmNvcywgZC5zaW4sIGJib3hXaWR0aCwgYmJveEhlaWdodCk7XG4gICAgICBjb25zdCByZXF1aXJlZE9mZnNldCA9IHRpY2tMZW5ndGggKyB0aGlzLkxBQkVMX1RJQ0tfQ0xFQVJBTkNFICsgbmVhckVkZ2VFeHRlbnQ7XG4gICAgICBjb25zdCBlZmZlY3RpdmVMYWJlbE9mZnNldCA9IE1hdGgubWF4KGJhc2VMYWJlbE9mZnNldCwgcmVxdWlyZWRPZmZzZXQpO1xuICAgICAgY29uc3QgbnVkZ2UgPSB0aWNrRm9udFB4ICogMC4xO1xuXG4gICAgICBjb25zdCB4ID0gZC5jb3MgKiAocmFkaXVzICsgZWZmZWN0aXZlTGFiZWxPZmZzZXQpICsgKGFuY2hvciA9PT0gJ3N0YXJ0JyA/IG51ZGdlIDogYW5jaG9yID09PSAnZW5kJyA/IC1udWRnZSA6IDApO1xuICAgICAgY29uc3QgeSA9IGQuc2luICogKHJhZGl1cyArIGVmZmVjdGl2ZUxhYmVsT2Zmc2V0KTtcblxuICAgICAgdGhpcy5kMy5zZWxlY3Qobm9kZSkuYXR0cigneCcsIHgpLmF0dHIoJ3knLCB5KS5hdHRyKCd0ZXh0LWFuY2hvcicsIGFuY2hvcikuYXR0cignZG9taW5hbnQtYmFzZWxpbmUnLCAnbWlkZGxlJyk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRpY2tDb3VudChzaXplOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmIChzaXplIDwgMjAwKSByZXR1cm4gMztcbiAgICBpZiAoc2l6ZSA8IDMwMCkgcmV0dXJuIDQ7XG4gICAgaWYgKHNpemUgPCA0MDApIHJldHVybiA1O1xuICAgIGlmIChzaXplID4gNTIwKSByZXR1cm4gNztcbiAgICByZXR1cm4gNTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGlja0ZvbnRTaXplKHNpemU6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDE0LCBNYXRoLm1pbigxOCwgTWF0aC5mbG9vcihzaXplIC8gMzUpKSk7XG4gIH1cblxuICBwcml2YXRlIGdldEJhc2VMYWJlbE9mZnNldChyYWRpdXM6IG51bWJlciwgdGlja0xlbmd0aDogbnVtYmVyLCB0aWNrRm9udFB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGxhYmVsR2FwID0gTWF0aC5tYXgoNiwgTWF0aC5taW4ocmFkaXVzICogMC4wNiwgMTQpKTtcbiAgICByZXR1cm4gdGlja0xlbmd0aCArIGxhYmVsR2FwICsgdGlja0ZvbnRQeCAqIDAuMjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGlja0xhYmVsQW5jaG9yKGNvc1ZhbHVlOiBudW1iZXIpOiAnc3RhcnQnIHwgJ21pZGRsZScgfCAnZW5kJyB7XG4gICAgaWYgKGNvc1ZhbHVlID4gMC4zNSkgcmV0dXJuICdzdGFydCc7XG4gICAgaWYgKGNvc1ZhbHVlIDwgLTAuMzUpIHJldHVybiAnZW5kJztcbiAgICByZXR1cm4gJ21pZGRsZSc7XG4gIH1cblxuICBwcml2YXRlIGdldE5lYXJFZGdlUHJvamVjdGlvbihcbiAgICBhbmNob3I6ICdzdGFydCcgfCAnbWlkZGxlJyB8ICdlbmQnLFxuICAgIGNvc1ZhbHVlOiBudW1iZXIsXG4gICAgc2luVmFsdWU6IG51bWJlcixcbiAgICBiYm94V2lkdGg6IG51bWJlcixcbiAgICBiYm94SGVpZ2h0OiBudW1iZXIsXG4gICk6IG51bWJlciB7XG4gICAgY29uc3QgYWJzQ29zID0gTWF0aC5hYnMoY29zVmFsdWUpO1xuICAgIGNvbnN0IGFic1NpbiA9IE1hdGguYWJzKHNpblZhbHVlKTtcbiAgICBjb25zdCBoYWxmSGVpZ2h0UHJvamVjdGlvbiA9IGFic1NpbiAqIChiYm94SGVpZ2h0IC8gMik7XG5cbiAgICAvLyBGb3Igc3RhcnQvZW5kIGFuY2hvcmVkIGxhYmVscyBvbiBlZGdlIHRpY2tzLCB0aGUgbmVhcmVzdCBzaWRlIGlzIGNsb3NlIHRvIHRoZSBhbmNob3IgcG9pbnQuXG4gICAgaWYgKGFuY2hvciA9PT0gJ3N0YXJ0JyB8fCBhbmNob3IgPT09ICdlbmQnKSB7XG4gICAgICByZXR1cm4gaGFsZkhlaWdodFByb2plY3Rpb24gKyBhYnNDb3MgKiB0aGlzLlRJQ0tfTEFCRUxfU0lERV9QQURESU5HO1xuICAgIH1cblxuICAgIC8vIEZvciBjZW50ZXJlZCBsYWJlbHMsIG5lYXJlc3Qgc2lkZSBpbmNsdWRlcyBoYWxmIHRleHQgd2lkdGggcHJvamVjdGlvbi5cbiAgICByZXR1cm4gYWJzQ29zICogKGJib3hXaWR0aCAvIDIpICsgaGFsZkhlaWdodFByb2plY3Rpb247XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFRpY2tWYWx1ZSh0aWNrOiBudW1iZXIsIG1pblZhbHVlOiBudW1iZXIsIG1heFZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlUmFuZ2UgPSBtYXhWYWx1ZSAtIG1pblZhbHVlO1xuICAgIGlmICh2YWx1ZVJhbmdlIDw9IDEwKSB7XG4gICAgICByZXR1cm4gdGljay50b0ZpeGVkKDIpLnJlcGxhY2UoL1xcLj8wKyQvLCAnJyk7XG4gICAgfVxuICAgIGlmICh2YWx1ZVJhbmdlIDwgMTAwMCkge1xuICAgICAgcmV0dXJuIHRpY2sgJSAxID09PSAwID8gdGljay50b1N0cmluZygpIDogdGljay50b0ZpeGVkKDEpO1xuICAgIH1cbiAgICByZXR1cm4gZm9ybWF0TGFyZ2VOdW1iZXIoTWF0aC5yb3VuZCh0aWNrKSk7XG4gIH1cblxuICBwcml2YXRlIGVzdGltYXRlTGFiZWxXaWR0aChsYWJlbDogc3RyaW5nLCB0aWNrRm9udFB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBsYWJlbC5sZW5ndGggKiB0aWNrRm9udFB4ICogdGhpcy5USUNLX0xBQkVMX0NIQVJfV0lEVEhfUkFUSU8gKyB0aGlzLlRJQ0tfTEFCRUxfU0lERV9QQURESU5HO1xuICB9XG5cbiAgcHJpdmF0ZSBlc3RpbWF0ZU1heFRpY2tMYWJlbFdpZHRoKHRpY2tDb3VudDogbnVtYmVyLCBtaW5WYWx1ZTogbnVtYmVyLCBtYXhWYWx1ZTogbnVtYmVyLCB0aWNrRm9udFB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh0aWNrQ291bnQgPD0gMSkgcmV0dXJuIHRpY2tGb250UHg7XG4gICAgY29uc3Qgc3RlcCA9IChtYXhWYWx1ZSAtIG1pblZhbHVlKSAvICh0aWNrQ291bnQgLSAxKTtcbiAgICBsZXQgbWF4Q2hhcnMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGlja0NvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5mb3JtYXRUaWNrVmFsdWUobWluVmFsdWUgKyBpICogc3RlcCwgbWluVmFsdWUsIG1heFZhbHVlKTtcbiAgICAgIG1heENoYXJzID0gTWF0aC5tYXgobWF4Q2hhcnMsIGxhYmVsLmxlbmd0aCk7XG4gICAgfVxuICAgIHJldHVybiBtYXhDaGFycyAqIHRpY2tGb250UHggKiB0aGlzLlRJQ0tfTEFCRUxfQ0hBUl9XSURUSF9SQVRJTyArIHRoaXMuVElDS19MQUJFTF9TSURFX1BBRERJTkc7XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgdGhlIHZhbHVlIGFuZCBsYWJlbCB0ZXh0IGluIHRoZSBjZW50ZXJcbiAgICovXG4gIHByaXZhdGUgZHJhd1ZhbHVlRGlzcGxheShcbiAgICBjaGFydEdyb3VwOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIHJhZGl1czogbnVtYmVyLFxuICAgIHNpemU6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgLy8gUHgtYmFzZWQgc2NhbGluZyBmb3Igcm9idXN0IHNtYWxsL2xhcmdlIHNpemVzIHdpdGggYmV0dGVyIHNtYWxsLXNpemUgaGFuZGxpbmdcbiAgICBjb25zdCB2YWx1ZUZvbnRQeCA9IE1hdGgubWF4KDE4LCBNYXRoLm1pbigzMiwgTWF0aC5mbG9vcihzaXplIC8gOCkpKTtcbiAgICBjb25zdCBsYWJlbEZvbnRQeCA9IE1hdGgubWF4KDEwLCBNYXRoLm1pbigxNiwgTWF0aC5mbG9vcih2YWx1ZUZvbnRQeCAqIDAuNTUpKSk7XG4gICAgLy8gTW9yZSB2ZXJ0aWNhbCBnYXAgZm9yIHNtYWxsIHNpemVzOiB1c2UgbGFyZ2VyIGJhc2UgdmFsdWVcbiAgICBjb25zdCB2ZXJ0aWNhbEdhcCA9IE1hdGgubWF4KDYsIE1hdGgubWluKDEyLCBNYXRoLmZsb29yKHNpemUgLyA0MCkpKTtcblxuICAgIC8vIENyZWF0ZSBncm91cCBmb3IgdGhlIHZhbHVlIGRpc3BsYXlcbiAgICBjb25zdCB2YWx1ZUdyb3VwID0gY2hhcnRHcm91cC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdnYXVnZS12YWx1ZS1kaXNwbGF5JykuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJyk7XG5cbiAgICAvLyBBZGQgdmFsdWUgZGlzcGxheVxuICAgIHZhbHVlR3JvdXBcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2dhdWdlLXZhbHVlJylcbiAgICAgIC5hdHRyKCd4JywgMClcbiAgICAgIC5hdHRyKCd5JywgcmFkaXVzICogMC4xNSArIHZhbHVlRm9udFB4KVxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBgJHt2YWx1ZUZvbnRQeH1weGApXG4gICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJzYwMCcpXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtdGV4dC1jb2xvcikpJylcbiAgICAgIC50ZXh0KHZhbHVlLnRvTG9jYWxlU3RyaW5nKCkpO1xuXG4gICAgLy8gQWRkIGxhYmVsIGRpc3BsYXkgKGlmIHByb3ZpZGVkKVxuICAgIGlmIChsYWJlbCkge1xuICAgICAgdmFsdWVHcm91cFxuICAgICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2dhdWdlLWxhYmVsJylcbiAgICAgICAgLmF0dHIoJ3gnLCAwKVxuICAgICAgICAuYXR0cigneScsIHJhZGl1cyAqIDAuMjQgKyB2YWx1ZUZvbnRQeCArIHZlcnRpY2FsR2FwKVxuICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGAke2xhYmVsRm9udFB4fXB4YClcbiAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LXRleHQtY29sb3IpKScpXG4gICAgICAgIC5zdHlsZSgnb3BhY2l0eScsICcwLjgnKVxuICAgICAgICAudGV4dChsYWJlbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyYXdzIHRoZSBkaWFsL25lZWRsZSBwb2ludGluZyB0byB0aGUgY3VycmVudCB2YWx1ZSB3aXRoIGFuaW1hdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3RGlhbChcbiAgICBjaGFydEdyb3VwOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sXG4gICAgcmFkaXVzOiBudW1iZXIsXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICBtaW5WYWx1ZTogbnVtYmVyLFxuICAgIG1heFZhbHVlOiBudW1iZXIsXG4gICAgYW5pbWF0aW9uRHVyYXRpb246IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgLy8gQ2xhbXAgdmFsdWUgdG8gbWluL21heCByYW5nZVxuICAgIGNvbnN0IGNsYW1wZWRWYWx1ZSA9IE1hdGgubWF4KG1pblZhbHVlLCBNYXRoLm1pbihtYXhWYWx1ZSwgdmFsdWUpKTtcblxuICAgIC8vIENhbGN1bGF0ZSBhbmdsZSBmb3IgbmVlZGxlIGJhc2VkIG9uIHZhbHVlXG4gICAgY29uc3QgYW5nbGUgPSB0aGlzLnNjYWxlVmFsdWVUb0FuZ2xlKGNsYW1wZWRWYWx1ZSwgbWluVmFsdWUsIG1heFZhbHVlKTtcbiAgICBjb25zdCBhbmdsZUluRGVncmVlcyA9IHRoaXMucmFkaWFuc1RvRGVncmVlcyhhbmdsZSAtIHRoaXMuUVVBUlRFUl9DSVJDTEVfUkFESUFOUyk7XG5cbiAgICAvLyBDcmVhdGUgYSBncm91cCBmb3IgdGhlIG5lZWRsZVxuICAgIGNvbnN0IGRpYWxHcm91cCA9IGNoYXJ0R3JvdXAuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZGlhbCcpO1xuXG4gICAgLy8gRHJhdyB0aGUgbmVlZGxlIHdpdGggaW5pdGlhbCBwb3NpdGlvbiBhdCBtaW5pbXVtIHZhbHVlXG4gICAgY29uc3QgbmVlZGxlUGF0aCA9IGRpYWxHcm91cFxuICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAuYXR0cignZCcsIHRoaXMuY3JlYXRlTmVlZGxlUGF0aChyYWRpdXMpKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2dhdWdlLW5lZWRsZScpXG4gICAgICAuYXR0cignZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC1uZWVkbGUtY29sb3IpKScpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHJvdGF0ZSgke3RoaXMucmFkaWFuc1RvRGVncmVlcygtdGhpcy5IQUxGX0NJUkNMRV9SQURJQU5TKX0pYCk7IC8vIFN0YXJ0IGF0IC0xODAgZGVncmVlcyAobGVmdClcblxuICAgIC8vIEFkZCBhIGNlbnRlciBjaXJjbGVcbiAgICBkaWFsR3JvdXBcbiAgICAgIC5hcHBlbmQoJ2NpcmNsZScpXG4gICAgICAuYXR0cignY3gnLCAwKVxuICAgICAgLmF0dHIoJ2N5JywgMClcbiAgICAgIC5hdHRyKCdyJywgcmFkaXVzICogMC4wOClcbiAgICAgIC5hdHRyKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LW5lZWRsZS1jb2xvcikpJylcbiAgICAgIC5hdHRyKCdzdHJva2UnLCAnI2ZmZicpXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgMik7XG5cbiAgICAvLyBBZGQgYSBzbWFsbGVyIHdoaXRlIGNlbnRlclxuICAgIGRpYWxHcm91cFxuICAgICAgLmFwcGVuZCgnY2lyY2xlJylcbiAgICAgIC5hdHRyKCdjeCcsIDApXG4gICAgICAuYXR0cignY3knLCAwKVxuICAgICAgLmF0dHIoJ3InLCByYWRpdXMgKiAwLjAzKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAnI2ZmZicpO1xuXG4gICAgLy8gR2V0IGVhc2luZyBmdW5jdGlvblxuICAgIGNvbnN0IGVhc2luZ0Z1bmN0aW9uID0gZ2V0RWFzaW5nRnVuY3Rpb24odGhpcy5kMywgdGhpcy5vcHRpb25zKCk/LmFuaW1hdGlvbkVhc2luZyk7XG5cbiAgICAvLyBBbmltYXRlIHRoZSBuZWVkbGUgZnJvbSBtaW4gdG8gY3VycmVudCB2YWx1ZVxuICAgIG5lZWRsZVBhdGhcbiAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgIC5kdXJhdGlvbihhbmltYXRpb25EdXJhdGlvbilcbiAgICAgIC5lYXNlKGVhc2luZ0Z1bmN0aW9uKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGByb3RhdGUoJHthbmdsZUluRGVncmVlc30pYCk7XG4gIH1cblxuICAvLyBnZXRFYXNpbmdGdW5jdGlvbiBtb3ZlZCB0byBzaGFyZWQgY2hhcnQgdXRpbHNcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHBhdGggc3RyaW5nIGZvciB0aGUgbmVlZGxlXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZU5lZWRsZVBhdGgocmFkaXVzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5lZWRsZUxlbmd0aCA9IHJhZGl1cyAqIDAuODtcbiAgICBjb25zdCBuZWVkbGVXaWR0aCA9IHJhZGl1cyAqIDAuMDY7XG4gICAgcmV0dXJuIGBNIDAsJHtuZWVkbGVXaWR0aCAvIDJ9IEwgJHtuZWVkbGVMZW5ndGh9LDAgTCAwLCR7LW5lZWRsZVdpZHRoIC8gMn0gWmA7XG4gIH1cblxuICAvKipcbiAgICogU2NhbGVzIGEgdmFsdWUgdG8gYW4gYW5nbGUgKGluIHJhZGlhbnMpXG4gICAqL1xuICBwcml2YXRlIHNjYWxlVmFsdWVUb0FuZ2xlKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgdmFsdWVSYW5nZSA9IG1heCAtIG1pbiB8fCAxO1xuICAgIHJldHVybiAoKHZhbHVlIC0gbWluKSAvIHZhbHVlUmFuZ2UpICogdGhpcy5IQUxGX0NJUkNMRV9SQURJQU5TIC0gdGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYWxlcyBhIHZhbHVlIHRvIGFuIGFuZ2xlIGZvciBjb2xvciBhcmNzIChpbiByYWRpYW5zKVxuICAgKi9cbiAgcHJpdmF0ZSBzY2FsZVZhbHVlVG9Db2xvckFuZ2xlKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgdmFsdWVSYW5nZSA9IG1heCAtIG1pbiB8fCAxO1xuICAgIHJldHVybiAoKHZhbHVlIC0gbWluKSAvIHZhbHVlUmFuZ2UpICogdGhpcy5IQUxGX0NJUkNMRV9SQURJQU5TIC0gdGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGFuIGFuZ2xlIGJhY2sgdG8gYSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBhbmdsZVRvVmFsdWUoYW5nbGU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB2YWx1ZVJhbmdlID0gbWF4IC0gbWluIHx8IDE7XG4gICAgcmV0dXJuIG1pbiArICgoYW5nbGUgKyB0aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlMpIC8gdGhpcy5IQUxGX0NJUkNMRV9SQURJQU5TKSAqIHZhbHVlUmFuZ2U7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgcmFkaWFucyB0byBkZWdyZWVzXG4gICAqL1xuICBwcml2YXRlIHJhZGlhbnNUb0RlZ3JlZXMocmFkaWFuczogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcmFkaWFucyAqIHRoaXMuREVHUkVFU19QRVJfUkFESUFOO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYXgtZ2F1Z2UtY2hhcnRcIiByb2xlPVwiaW1nXCIgI2NoYXJ0Q29udGFpbmVyPlxuICA8YXgtY2hhcnQtdG9vbHRpcCBbZGF0YV09XCJ0b29sdGlwRGF0YSgpXCIgW3Bvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbigpXCIgW3Zpc2libGVdPVwidG9vbHRpcFZpc2libGUoKVwiPjwvYXgtY2hhcnQtdG9vbHRpcD5cbjwvZGl2PlxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1nYXVnZS1jaGFydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9nYXVnZS1jaGFydC9zcmMvYWNvcmV4LWNoYXJ0cy1nYXVnZS1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
|