@acorex/charts 20.6.17 → 20.6.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-charts-donut-chart.mjs","sources":["../tmp-esm2022/donut-chart/lib/donut-chart.config.js","../tmp-esm2022/donut-chart/lib/donut-chart.component.js","../tmp-esm2022/donut-chart/acorex-charts-donut-chart.js"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nexport const AXDonutChartDefaultConfig = {\n showTooltip: true,\n showDataLabels: true,\n donutWidth: 35,\n cornerRadius: 4,\n animationDuration: 800,\n animationEasing: 'cubic-out',\n messages: {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All segments are hidden',\n allHiddenHelp: 'Please toggle visibility of at least one segment',\n noDataIcon: 'fa-light fa-chart-pie',\n allHiddenIcon: 'fa-light fa-eye-slash',\n },\n};\nexport const AX_DONUT_CHART_CONFIG = new InjectionToken('AX_DONUT_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXDonutChartDefaultConfig,\n});\nexport function donutChartConfig(config = {}) {\n const result = {\n ...AXDonutChartDefaultConfig,\n ...config,\n };\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9udXQtY2hhcnQuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2RvbnV0LWNoYXJ0L3NyYy9saWIvZG9udXQtY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQXVCO0lBQzNELFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGNBQWMsRUFBRSxJQUFJO0lBQ3BCLFVBQVUsRUFBRSxFQUFFO0lBQ2QsWUFBWSxFQUFFLENBQUM7SUFDZixpQkFBaUIsRUFBRSxHQUFHO0lBQ3RCLGVBQWUsRUFBRSxXQUFXO0lBQzVCLFFBQVEsRUFBRTtRQUNSLE1BQU0sRUFBRSxtQkFBbUI7UUFDM0IsVUFBVSxFQUFFLDBDQUEwQztRQUN0RCxTQUFTLEVBQUUseUJBQXlCO1FBQ3BDLGFBQWEsRUFBRSxrREFBa0Q7UUFDakUsVUFBVSxFQUFFLHVCQUF1QjtRQUNuQyxhQUFhLEVBQUUsdUJBQXVCO0tBQ3ZDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLElBQUksY0FBYyxDQUFxQix1QkFBdUIsRUFBRTtJQUNuRyxVQUFVLEVBQUUsTUFBTTtJQUNsQixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMseUJBQXlCO0NBQ3pDLENBQUMsQ0FBQztBQUlILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxTQUFrQyxFQUFFO0lBQ25FLE1BQU0sTUFBTSxHQUFHO1FBQ2IsR0FBRyx5QkFBeUI7UUFDNUIsR0FBRyxNQUFNO0tBQ1YsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhEb251dENoYXJ0T3B0aW9uIH0gZnJvbSAnLi9kb251dC1jaGFydC50eXBlJztcblxuZXhwb3J0IGNvbnN0IEFYRG9udXRDaGFydERlZmF1bHRDb25maWc6IEFYRG9udXRDaGFydE9wdGlvbiA9IHtcbiAgc2hvd1Rvb2x0aXA6IHRydWUsXG4gIHNob3dEYXRhTGFiZWxzOiB0cnVlLFxuICBkb251dFdpZHRoOiAzNSxcbiAgY29ybmVyUmFkaXVzOiA0LFxuICBhbmltYXRpb25EdXJhdGlvbjogODAwLFxuICBhbmltYXRpb25FYXNpbmc6ICdjdWJpYy1vdXQnLFxuICBtZXNzYWdlczoge1xuICAgIG5vRGF0YTogJ05vIGRhdGEgYXZhaWxhYmxlJyxcbiAgICBub0RhdGFIZWxwOiAnUGxlYXNlIHByb3ZpZGUgZGF0YSB0byBkaXNwbGF5IHRoZSBjaGFydCcsXG4gICAgYWxsSGlkZGVuOiAnQWxsIHNlZ21lbnRzIGFyZSBoaWRkZW4nLFxuICAgIGFsbEhpZGRlbkhlbHA6ICdQbGVhc2UgdG9nZ2xlIHZpc2liaWxpdHkgb2YgYXQgbGVhc3Qgb25lIHNlZ21lbnQnLFxuICAgIG5vRGF0YUljb246ICdmYS1saWdodCBmYS1jaGFydC1waWUnLFxuICAgIGFsbEhpZGRlbkljb246ICdmYS1saWdodCBmYS1leWUtc2xhc2gnLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEFYX0RPTlVUX0NIQVJUX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxBWERvbnV0Q2hhcnRPcHRpb24+KCdBWF9ET05VVF9DSEFSVF9DT05GSUcnLCB7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgZmFjdG9yeTogKCkgPT4gQVhEb251dENoYXJ0RGVmYXVsdENvbmZpZyxcbn0pO1xuXG5leHBvcnQgdHlwZSBQYXJ0aWFsRG9udXRDaGFydENvbmZpZyA9IFBhcnRpYWw8QVhEb251dENoYXJ0T3B0aW9uPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGRvbnV0Q2hhcnRDb25maWcoY29uZmlnOiBQYXJ0aWFsRG9udXRDaGFydENvbmZpZyA9IHt9KTogQVhEb251dENoYXJ0T3B0aW9uIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIC4uLkFYRG9udXRDaGFydERlZmF1bHRDb25maWcsXG4gICAgLi4uY29uZmlnLFxuICB9O1xuICByZXR1cm4gcmVzdWx0O1xufVxuIl19","import { AX_CHART_COLOR_PALETTE, AXChartComponent, computeTooltipPosition, getChartColor, getEasingFunction, } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { afterNextRender, ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, effect, inject, input, output, signal, untracked, viewChild, ViewEncapsulation, } from '@angular/core';\nimport { AX_DONUT_CHART_CONFIG } from './donut-chart.config';\nimport * as i0 from \"@angular/core\";\n/**\n * Donut Chart Component\n * Displays data in a circular donut chart with interactive segments\n */\nexport class AXDonutChartComponent extends AXChartComponent {\n // Dependency Injection\n cdr = inject(ChangeDetectorRef);\n // Inputs\n /** Chart data input */\n data = input([], ...(ngDevMode ? [{ debugName: \"data\" }] : []));\n /** Chart options input */\n options = input({}, ...(ngDevMode ? [{ debugName: \"options\" }] : []));\n // Outputs\n /** Emitted when a segment is clicked */\n segmentClick = output();\n /** Emitted when a segment has mouse hover\n * Can be used by external elements to highlight this segment\n */\n segmentHover = output();\n // Chart container reference\n chartContainerEl = viewChild.required('chartContainer');\n // D3 reference - loaded asynchronously\n d3;\n // Chart SVG reference (using 'any' since D3 is loaded dynamically at runtime)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n svg = null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pieData = [];\n // State management\n hiddenSegments = new Set();\n _initialized = signal(false, ...(ngDevMode ? [{ debugName: \"_initialized\" }] : []));\n _rendered = signal(false, ...(ngDevMode ? [{ debugName: \"_rendered\" }] : []));\n _isInitialAnimating = signal(false, ...(ngDevMode ? [{ debugName: \"_isInitialAnimating\" }] : []));\n _currentlyHighlightedSegment = signal(null, ...(ngDevMode ? [{ debugName: \"_currentlyHighlightedSegment\" }] : []));\n // Tooltip state\n _tooltipVisible = signal(false, ...(ngDevMode ? [{ debugName: \"_tooltipVisible\" }] : []));\n _tooltipPosition = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: \"_tooltipPosition\" }] : []));\n _tooltipData = signal({\n title: '',\n value: 0,\n percentage: '0%',\n color: '',\n }, ...(ngDevMode ? [{ debugName: \"_tooltipData\" }] : []));\n _tooltipRafId = null;\n _pendingTooltipCoords = null;\n // Public computed properties for the template\n tooltipVisible = this._tooltipVisible.asReadonly();\n tooltipPosition = this._tooltipPosition.asReadonly();\n tooltipData = this._tooltipData.asReadonly();\n // Inject configuration\n configToken = inject(AX_DONUT_CHART_CONFIG);\n // Inject the chart colors\n chartColors = inject(AX_CHART_COLOR_PALETTE);\n // Computed configuration options\n effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\n // Constants\n TOOLTIP_GAP = 10;\n HIGHLIGHT_TRANSITION_DURATION = 150;\n HIGHLIGHT_TRANSITION_NAME = 'highlight';\n SEGMENT_ANIMATION_DELAY = 50;\n LABEL_ANIMATION_DELAY = 200;\n MIN_CHART_DIMENSION = 200;\n MIN_CHART_FOR_LABELS = 260;\n DIMMED_OPACITY = 0.5;\n VISIBLE_OPACITY = 1;\n // Messages with defaults\n effectiveMessages = computed(() => {\n const defaultMessages = {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All segments are hidden',\n allHiddenHelp: 'Please toggle visibility of at least one segment',\n noDataIcon: 'fa-light fa-chart-pie',\n allHiddenIcon: 'fa-light fa-eye-slash',\n };\n return {\n ...defaultMessages,\n ...this.effectiveOptions().messages,\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveMessages\" }] : []));\n // Data accessor for handling different incoming data formats\n chartDataArray = computed(() => {\n return this.data() || [];\n }, ...(ngDevMode ? [{ debugName: \"chartDataArray\" }] : []));\n // Color accessor method\n getColor(index) {\n return getChartColor(index, this.chartColors);\n }\n // Segment visibility check\n isSegmentHidden(id) {\n return this.hiddenSegments.has(id);\n }\n constructor() {\n super();\n // Dynamically load D3 and initialize the chart when the component is ready\n afterNextRender(() => {\n this._initialized.set(true);\n this.loadD3();\n });\n }\n dataChangeEffect = effect(() => {\n // Track data and options changes\n this.data();\n this.effectiveOptions();\n // Only update if already rendered\n untracked(() => {\n if (this._rendered()) {\n this.updateChart();\n }\n });\n }, ...(ngDevMode ? [{ debugName: \"dataChangeEffect\" }] : []));\n /**\n * Highlights a specific segment by ID\n * @param id The segment ID to highlight, or null to clear highlight\n */\n highlightSegment(id) {\n if (this._isInitialAnimating() || !this.svg)\n return;\n if (this._currentlyHighlightedSegment() === id)\n return;\n this._currentlyHighlightedSegment.set(id);\n // Only interrupt ongoing HIGHLIGHT transitions (not initial animations)\n this.svg.selectAll('path').interrupt(this.HIGHLIGHT_TRANSITION_NAME);\n if (id === null) {\n this.clearAllHighlights();\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const targetSegment = this.svg.selectAll('path').filter((d) => d?.data?.id === id);\n if (targetSegment.empty()) {\n this._currentlyHighlightedSegment.set(null);\n this.highlightSegment(null);\n return;\n }\n this.dimNonTargetSegments(id);\n this.highlightTargetSegment(targetSegment);\n this.segmentHover.emit(this.getSegmentDataById(id));\n }\n clearAllHighlights() {\n if (!this.svg)\n return;\n this.svg\n .selectAll('path')\n .classed('ax-donut-chart-highlighted', false)\n .classed('ax-donut-chart-dimmed', false)\n .transition(this.HIGHLIGHT_TRANSITION_NAME)\n .duration(this.HIGHLIGHT_TRANSITION_DURATION)\n .attr('transform', null)\n .style('filter', null)\n .style('opacity', this.VISIBLE_OPACITY);\n this.segmentHover.emit(null);\n }\n dimNonTargetSegments(targetId) {\n if (!this.svg)\n return;\n this.svg\n .selectAll('path')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .filter((d) => d?.data?.id !== targetId)\n .classed('ax-donut-chart-highlighted', false)\n .classed('ax-donut-chart-dimmed', true)\n .transition(this.HIGHLIGHT_TRANSITION_NAME)\n .duration(this.HIGHLIGHT_TRANSITION_DURATION)\n .attr('transform', null)\n .style('filter', null)\n .style('opacity', this.DIMMED_OPACITY);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n highlightTargetSegment(targetSegment) {\n targetSegment\n .classed('ax-donut-chart-dimmed', false)\n .classed('ax-donut-chart-highlighted', true)\n .transition(this.HIGHLIGHT_TRANSITION_NAME)\n .duration(this.HIGHLIGHT_TRANSITION_DURATION)\n .style('filter', 'url(#ax-donut-chart-segment-shadow)')\n .style('opacity', this.VISIBLE_OPACITY);\n }\n getSegmentDataById(segmentId) {\n return untracked(() => this.chartDataArray()).find((d) => d.id === segmentId) || null;\n }\n /**\n * Toggles visibility of a segment by ID\n * @param id Segment ID to toggle\n * @returns New visibility state (true = visible, false = hidden)\n */\n toggleSegment(id) {\n const chartData = this.chartDataArray();\n const wasAllHidden = chartData.length > 0 && chartData.every((d) => this.isSegmentHidden(d.id));\n if (this.hiddenSegments.has(id)) {\n // Making a segment visible\n this.hiddenSegments.delete(id);\n // If all segments were previously hidden, we need to ensure the message is cleared\n if (wasAllHidden) {\n // Force complete DOM cleanup and redraw\n if (this.chartContainerEl()?.nativeElement) {\n // Clear only chart SVG and message containers (preserve tooltip component)\n this.d3\n ?.select(this.chartContainerEl().nativeElement)\n .selectAll('svg, .ax-chart-message-container, .ax-donut-chart-no-data-message')\n .remove();\n // Force full redraw\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n }\n else {\n this.updateChart();\n }\n }\n else {\n // Hiding a segment\n this.hiddenSegments.add(id);\n this.updateChart();\n }\n return !this.isSegmentHidden(id);\n }\n ngOnDestroy() {\n this.cleanupChart();\n }\n /**\n * Loads D3.js dynamically\n */\n async loadD3() {\n try {\n this.d3 = await import('d3');\n // If container is ready, create chart\n if (this._initialized() && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n }\n catch (error) {\n console.error('Failed to load D3.js:', error);\n }\n }\n onSegmentClick(item) {\n this.segmentClick.emit(item);\n }\n /**\n * Creates the donut chart from current data\n */\n createChart() {\n if (!this.d3 || !this.chartContainerEl()?.nativeElement)\n return;\n try {\n const containerElement = this.chartContainerEl().nativeElement;\n this.clearChart(containerElement);\n const data = this.chartDataArray();\n if (!data || data.length === 0) {\n this.showNoDataMessage();\n return;\n }\n const visibleData = data.filter((item) => !this.hiddenSegments.has(item.id));\n if (visibleData.length === 0) {\n this.showAllSegmentsHiddenMessage();\n return;\n }\n const options = this.effectiveOptions();\n const { width, height } = this.setupDimensions(containerElement, options);\n this.renderDonutChart(containerElement, width, height, visibleData);\n }\n catch (error) {\n console.error('Error creating donut chart:', error);\n this.handleChartError();\n }\n }\n /**\n * Updates the chart with new data\n */\n updateChart() {\n // Reset highlighted segment state when updating\n this._currentlyHighlightedSegment.set(null);\n this.createChart(); // Recreate the chart with updated data\n }\n /**\n * Clears the chart container\n */\n clearChart(container) {\n this.d3.select(container).selectAll('svg, .ax-chart-message-container, .ax-donut-chart-no-data-message').remove();\n this._tooltipVisible.set(false);\n }\n /**\n * Shows a message when no data is available\n */\n showNoDataMessage() {\n if (!this.chartContainerEl()?.nativeElement)\n return;\n const container = this.chartContainerEl().nativeElement;\n this.renderMessage(container, this.effectiveMessages().noDataIcon, this.effectiveMessages().noData, this.effectiveMessages().noDataHelp, 'ax-donut-chart-no-data-message');\n }\n /**\n * Shows a message when all segments are hidden\n */\n showAllSegmentsHiddenMessage() {\n if (!this.chartContainerEl()?.nativeElement)\n return;\n const container = this.chartContainerEl().nativeElement;\n this.renderMessage(container, this.effectiveMessages().allHiddenIcon, this.effectiveMessages().allHidden, this.effectiveMessages().allHiddenHelp, 'ax-donut-chart-no-data-message');\n }\n /**\n * Setups chart dimensions based on container and options\n */\n setupDimensions(container, options) {\n const containerWidth = container.clientWidth || 400;\n const containerHeight = container.clientHeight || 400;\n const width = Math.max(options?.width || containerWidth, this.MIN_CHART_DIMENSION);\n const height = Math.max(options?.height || containerHeight, this.MIN_CHART_DIMENSION);\n return { width, height };\n }\n /**\n * Renders the donut chart with visible data\n */\n renderDonutChart(container, width, height, visibleData) {\n const total = visibleData.reduce((sum, item) => sum + item.value, 0);\n // Create SVG container with filters\n const svg = this.createSvgWithFilters(container, width, height);\n // Create main chart group\n this.svg = svg.append('g').attr('transform', `translate(${width / 2}, ${height / 2})`);\n // Create donut segments\n this.createDonutSegments(width, height, visibleData, total);\n // Add total in center\n this.addCenterDisplay(total);\n }\n /**\n * Create SVG element with filter definitions for shadows\n * @returns D3 SVG selection (any type due to dynamic D3 loading)\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n createSvgWithFilters(container, width, height) {\n const svg = this.d3\n .select(container)\n .append('svg')\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${width} ${height}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n // Add drop shadow filter\n const defs = svg.append('defs');\n const filter = defs.append('filter').attr('id', 'ax-donut-chart-segment-shadow').attr('height', '130%');\n filter.append('feGaussianBlur').attr('in', 'SourceAlpha').attr('stdDeviation', 2).attr('result', 'blur');\n filter.append('feOffset').attr('in', 'blur').attr('dx', 1).attr('dy', 1).attr('result', 'offsetBlur');\n const feComponentTransfer = filter\n .append('feComponentTransfer')\n .attr('in', 'offsetBlur')\n .attr('result', 'offsetBlur');\n feComponentTransfer.append('feFuncA').attr('type', 'linear').attr('slope', 0.3);\n const feMerge = filter.append('feMerge');\n feMerge.append('feMergeNode').attr('in', 'offsetBlur');\n feMerge.append('feMergeNode').attr('in', 'SourceGraphic');\n return svg;\n }\n /**\n * Create and render the donut segments with animations\n */\n createDonutSegments(chartWidth, chartHeight, data, total) {\n this._isInitialAnimating.set(true);\n // Create pie layout\n const pie = this.d3\n .pie()\n .value((d) => d.value)\n .sort(null)\n .padAngle(0.02);\n // Calculate the radius of the donut chart\n const radius = (Math.min(chartWidth, chartHeight) / 2) * 0.85;\n // Calculate inner radius based on donutWidth percentage\n const donutWidthPercent = this.effectiveOptions().donutWidth / 100;\n const innerRadius = radius * (1 - donutWidthPercent);\n const outerRadius = radius * 0.95;\n const ringWidth = outerRadius - innerRadius;\n const arc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius)\n .cornerRadius(this.effectiveOptions().cornerRadius);\n const labelArc = this.d3\n .arc()\n .innerRadius(innerRadius + ringWidth / 2)\n .outerRadius(innerRadius + ringWidth / 2);\n // Get animation options\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n // Generate pie data\n this.pieData = pie(data);\n // Add segments with animation\n const segments = this.svg\n .selectAll('path')\n .data(this.pieData)\n .enter()\n .append('path')\n .attr('class', 'ax-donut-chart-segment')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .attr('fill', (d) => this.getSegmentColor(d.data))\n .style('opacity', 0)\n .style('cursor', 'pointer')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('mouseenter', (event, d) => {\n if (this.effectiveOptions().showTooltip) {\n this.handleSliceHover(event, d.data);\n }\n })\n .on('mouseleave', () => this.handleSegmentLeave())\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('click', (_event, d) => {\n this.onSegmentClick(d.data);\n });\n // Animate segments\n const numSegments = this.pieData.length;\n let completed = 0;\n segments\n .transition()\n .duration(animationDuration)\n .ease(animationEasing)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .delay((_d, i) => i * this.SEGMENT_ANIMATION_DELAY)\n .style('opacity', this.VISIBLE_OPACITY)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .attrTween('d', (d) => {\n const interpolate = this.d3.interpolate({ startAngle: d.startAngle, endAngle: d.startAngle }, d);\n return (t) => arc(interpolate(t));\n })\n .on('end', () => {\n completed++;\n if (completed >= numSegments) {\n this._isInitialAnimating.set(false);\n this.cdr.detectChanges();\n }\n })\n .on('interrupt', () => {\n // Treat interrupts as completion to avoid getting stuck in animating state\n completed++;\n if (completed >= numSegments) {\n this._isInitialAnimating.set(false);\n this.cdr.detectChanges();\n }\n });\n // Add data labels if enabled and chart size is sufficient\n if (this.effectiveOptions().showDataLabels && this.isChartLargeEnoughForLabels(chartWidth, chartHeight)) {\n this.addDataLabels(labelArc, outerRadius, innerRadius, total, animationDuration);\n }\n // Determine when all segment animations are complete (handle empty case)\n if (numSegments === 0) {\n this._isInitialAnimating.set(false);\n this.cdr.detectChanges();\n }\n }\n isChartLargeEnoughForLabels(width, height) {\n return Math.min(width, height) >= this.MIN_CHART_FOR_LABELS;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n addDataLabels(labelArc, outerRadius, innerRadius, total, animationDuration) {\n if (!this.svg)\n return;\n const dataWithLabels = this.pieData.filter((d) => {\n return this.calculateLabelFontSize(d, outerRadius, innerRadius, total) > 0;\n });\n const labels = this.svg\n .selectAll('.ax-donut-chart-data-label')\n .data(dataWithLabels)\n .enter()\n .append('text')\n .attr('class', 'ax-donut-chart-data-label')\n .style('opacity', 0)\n .style('pointer-events', 'none')\n .style('fill', 'rgb(var(--ax-comp-donut-chart-data-labels-color))')\n .attr('transform', (d) => {\n const centroid = labelArc.centroid(d);\n return `translate(${centroid[0]}, ${centroid[1]})`;\n })\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .style('font-size', (d) => `${this.calculateLabelFontSize(d, outerRadius, innerRadius, total)}px`)\n .style('font-weight', (d) => ((d.data.value / total) * 100 >= 15 ? '600' : '500'))\n .text((d) => this.getTruncatedLabelText(d, outerRadius, innerRadius, total));\n labels\n .transition()\n .duration(animationDuration)\n .delay((_d, i) => i * this.SEGMENT_ANIMATION_DELAY + this.LABEL_ANIMATION_DELAY)\n .style('opacity', this.VISIBLE_OPACITY);\n }\n /**\n * Calculates font size for data labels using the donut ring's physical dimensions.\n *\n * Primary driver is the ring width (radial space), with chord length as an\n * overflow guard and a gentle scale-down for smaller segments to create\n * visual hierarchy.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n calculateLabelFontSize(d, outerRadius, innerRadius, total) {\n const angle = d.endAngle - d.startAngle;\n const segmentPercentage = (d.data.value / total) * 100;\n if (segmentPercentage < 2)\n return 0;\n const ringWidth = outerRadius - innerRadius;\n const labelRadius = innerRadius + ringWidth / 2;\n const chordLength = 2 * labelRadius * Math.sin(angle / 2);\n const MIN_CHORD = 22;\n const MIN_RING = 16;\n if (chordLength < MIN_CHORD || ringWidth < MIN_RING)\n return 0;\n const ringBasedSize = ringWidth * 0.48;\n // Segments >= 20% get full size; smaller ones scale from 0.75 → 1.0\n const segmentScale = Math.min(1, 0.75 + 0.25 * (segmentPercentage / 20));\n // At least 2 characters (\"X%\") must fit horizontally\n const maxByChord = chordLength / (2 * 0.65);\n const fontSize = Math.min(ringBasedSize * segmentScale, maxByChord);\n const MIN_FONT_SIZE = 11;\n const MAX_FONT_SIZE = 20;\n return Math.round(Math.max(MIN_FONT_SIZE, Math.min(fontSize, MAX_FONT_SIZE)) * 2) / 2;\n }\n formatPercentage(value) {\n if (value < 1)\n return '<1%';\n if (value < 10)\n return `${value.toFixed(1)}%`;\n return `${Math.round(value)}%`;\n }\n /**\n * Returns the best-fit label text for a segment, progressively truncating\n * from \"Label (XX%)\" → \"Label\" → \"XX%\" → truncated label → truncated percentage.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getTruncatedLabelText(d, outerRadius, innerRadius, total) {\n const fontSize = this.calculateLabelFontSize(d, outerRadius, innerRadius, total);\n if (fontSize === 0)\n return '';\n const ringWidth = outerRadius - innerRadius;\n const labelRadius = innerRadius + ringWidth / 2;\n const angle = d.endAngle - d.startAngle;\n const chordLength = 2 * labelRadius * Math.sin(angle / 2);\n const availableWidth = chordLength * 0.8;\n const percentage = (d.data.value / total) * 100;\n if (percentage < 2)\n return '';\n const label = d.data.label || '';\n const percentageText = this.formatPercentage(percentage);\n const fullText = label ? `${label} (${percentageText})` : percentageText;\n if (this.doesTextFit(fullText, fontSize, availableWidth))\n return fullText;\n if (label && this.doesTextFit(label, fontSize, availableWidth))\n return label;\n if (this.doesTextFit(percentageText, fontSize, availableWidth))\n return percentageText;\n if (label)\n return this.truncateTextToFit(label, fontSize, availableWidth);\n return this.truncateTextToFit(percentageText, fontSize, availableWidth);\n }\n /**\n * Checks if text fits within available width using conservative estimation\n * Uses 0.65em per character to account for font variations\n */\n doesTextFit(text, fontSize, availableWidth) {\n if (!text)\n return false;\n // Use conservative character width (0.65em for safety)\n // Wider fonts like bold text need more space\n const estimatedWidth = text.length * fontSize * 0.65;\n return estimatedWidth <= availableWidth;\n }\n /**\n * Truncates text to fit within available width with ellipsis\n * Uses conservative character width to prevent overflow\n * Adapts character width estimation based on font size\n */\n truncateTextToFit(text, fontSize, availableWidth) {\n if (!text)\n return '';\n // Adaptive character width: smaller fonts are relatively wider\n // Larger fonts: ~0.6em, Smaller fonts: ~0.7em\n const charWidthRatio = fontSize <= 10 ? 0.7 : 0.65;\n const charWidth = fontSize * charWidthRatio;\n // Reserve space for ellipsis\n const ellipsisWidth = fontSize * 0.7;\n const availableForText = availableWidth - ellipsisWidth;\n if (availableForText <= 0)\n return '';\n const maxChars = Math.floor(availableForText / charWidth);\n if (maxChars <= 0)\n return '';\n if (text.length <= maxChars)\n return text;\n // Ensure at least 1 character before ellipsis\n return text.substring(0, Math.max(1, maxChars)) + '…';\n }\n getSegmentColor(data) {\n if (data.color)\n return data.color;\n const originalFullData = untracked(() => this.chartDataArray());\n const originalIndex = originalFullData.findIndex((item) => item.id === data.id);\n return this.getColor(originalIndex !== -1 ? originalIndex : 0);\n }\n /**\n * Handle hover effects on a segment\n */\n handleSliceHover(event, datum) {\n if (this._isInitialAnimating())\n return;\n if (this.effectiveOptions().showTooltip !== false) {\n this.showTooltip(event, datum);\n }\n this.highlightSegment(datum.id);\n }\n showTooltip(event, datum) {\n const total = untracked(() => this.data()).reduce((sum, item) => sum + item.value, 0);\n const percentage = total > 0 ? ((datum.value / total) * 100).toFixed(1) : '0';\n const color = this.getSegmentColor(datum);\n this._tooltipData.set({\n title: datum.tooltipLabel || datum.label,\n value: datum.value.toString(),\n percentage: `${percentage}%`,\n color,\n });\n this.updateTooltipPosition(event);\n this._tooltipVisible.set(true);\n }\n /**\n * Handles mouse leave from segments\n */\n handleSegmentLeave() {\n if (this._isInitialAnimating())\n return;\n this._tooltipVisible.set(false);\n this.highlightSegment(null);\n }\n updateTooltipPosition(event) {\n this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };\n if (this._tooltipRafId != null)\n return;\n this._tooltipRafId = requestAnimationFrame(() => {\n this._tooltipRafId = null;\n const coords = this._pendingTooltipCoords;\n if (!coords)\n return;\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl)\n return;\n const containerRect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip');\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = computeTooltipPosition(containerRect, tooltipRect, coords.x, coords.y, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n });\n }\n /**\n * Adds center display with total value\n */\n addCenterDisplay(total) {\n if (!this.svg)\n return;\n const chartContainerWidth = this.chartContainerEl().nativeElement.clientWidth;\n // Improved font scaling: better minimum for small sizes, better ratio for scaling\n const baseFontSize = Math.max(1.8, Math.min(3.2, chartContainerWidth / 150));\n const subTextFontSize = baseFontSize * 0.5;\n // Create group for the total display\n const totalDisplay = this.svg\n .append('g')\n .attr('class', 'ax-donut-chart-total-display')\n .attr('text-anchor', 'middle');\n // Add total value\n totalDisplay\n .append('text')\n .attr('class', 'ax-donut-chart-total-value')\n .style('font-size', `${baseFontSize}rem`)\n .style('font-weight', '600')\n .style('fill', 'rgb(var(--ax-comp-donut-chart-value-color))')\n .text(total.toLocaleString());\n // Add label\n totalDisplay\n .append('text')\n .attr('class', 'ax-donut-chart-total-label')\n .attr('dy', '1.4em')\n .style('font-size', `${subTextFontSize}rem`)\n .style('fill', 'rgb(var(--ax-comp-donut-chart-value-color))')\n .style('opacity', '0.8')\n .text(this.effectiveOptions().totalLabel || 'Total');\n }\n /**\n * Handles chart rendering errors\n */\n handleChartError() {\n const container = this.chartContainerEl()?.nativeElement;\n if (container) {\n this.showNoDataMessage();\n }\n }\n /**\n * Cleans up chart resources\n */\n cleanupChart() {\n if (this._tooltipRafId != null) {\n cancelAnimationFrame(this._tooltipRafId);\n this._tooltipRafId = null;\n }\n this._pendingTooltipCoords = null;\n if (!this.svg)\n return;\n this.d3.select(this.chartContainerEl()?.nativeElement).selectAll('svg').remove();\n this.svg = null;\n this.pieData = [];\n this.hiddenSegments.clear();\n this._tooltipVisible.set(false);\n this._currentlyHighlightedSegment.set(null);\n }\n // ===== Helper utilities for modularity and maintainability =====\n renderMessage(container, iconClass, messageText, helpText, specificClass) {\n // Clear container area first (preserve tooltip component)\n this.d3.select(container).selectAll('svg, .ax-chart-message-container, .ax-donut-chart-no-data-message').remove();\n const messageContainer = this.d3\n .select(container)\n .append('div')\n .attr('class', `ax-chart-message-container ax-donut-chart-message-background ${specificClass}`);\n messageContainer\n .append('div')\n .attr('class', 'ax-chart-message-icon ax-donut-chart-no-data-icon')\n .html(`<i class=\"${iconClass} fa-2x\"></i>`);\n messageContainer.append('div').attr('class', 'ax-chart-message-text ax-donut-chart-no-data-text').text(messageText);\n messageContainer.append('div').attr('class', 'ax-chart-message-help ax-donut-chart-no-data-help').text(helpText);\n }\n // computeTooltipPosition moved to shared chart utils\n /**\n * Gets an accessibility label describing the donut chart for screen readers\n * @returns Descriptive string for screen readers\n */\n getAccessibilityLabel() {\n const data = this.chartDataArray();\n if (!data || data.length === 0) {\n return 'Empty donut chart. No data available.';\n }\n const total = data.reduce((sum, item) => sum + item.value, 0);\n const segmentDescriptions = data\n .map((segment) => {\n const percentage = total > 0 ? ((segment.value / total) * 100).toFixed(1) : '0';\n return `${segment.label}: ${segment.value} (${percentage}%)`;\n })\n .join('; ');\n return `Donut chart with ${data.length} segments. Total value: ${total}. ${segmentDescriptions}`;\n }\n /**\n * Returns the data items for the legend\n * @implements AXChartLegendCompatible\n */\n getLegendItems() {\n const total = this.data().reduce((sum, item) => sum + item.value, 0);\n return this.chartDataArray().map((item, index) => ({\n id: item.id,\n name: item.label || `Segment ${index + 1}`,\n value: item.value,\n color: this.getSegmentColor(item),\n percentage: total > 0 ? (item.value / total) * 100 : 0,\n hidden: this.isSegmentHidden(item.id),\n }));\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXDonutChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.3.3\", type: AXDonutChartComponent, isStandalone: true, selector: \"ax-donut-chart\", inputs: { data: { classPropertyName: \"data\", publicName: \"data\", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: \"options\", publicName: \"options\", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { segmentClick: \"segmentClick\", segmentHover: \"segmentHover\" }, viewQueries: [{ propertyName: \"chartContainerEl\", first: true, predicate: [\"chartContainer\"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: \"<div class=\\\"ax-donut-chart\\\" #chartContainer role=\\\"img\\\" [attr.aria-label]=\\\"getAccessibilityLabel()\\\">\\n <!-- Tooltip component -->\\n <ax-chart-tooltip\\n [visible]=\\\"tooltipVisible()\\\"\\n [position]=\\\"tooltipPosition()\\\"\\n [data]=\\\"tooltipData()\\\"\\n [showPercentage]=\\\"true\\\"\\n ></ax-chart-tooltip>\\n</div>\\n\", styles: [\"ax-donut-chart{display:block;width:100%;height:100%;--ax-comp-donut-chart-bg-color: 0, 0, 0, 0;--ax-comp-donut-chart-value-color: var(--ax-sys-color-on-lightest-surface)}ax-donut-chart .ax-donut-chart{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;border-radius:.5rem;background-color:rgba(var(--ax-comp-donut-chart-bg-color))}ax-donut-chart .ax-donut-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}ax-donut-chart .ax-donut-chart svg g:has(text){font-family:inherit}ax-donut-chart .ax-donut-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-donut-chart-bg-color));border:1px solid rgba(var(--ax-sys-color-surface));padding:1.5rem;border-radius:.5rem;width:80%;max-width:300px}ax-donut-chart .ax-donut-chart-no-data-message .ax-donut-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-donut-chart .ax-donut-chart-no-data-message .ax-donut-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-donut-chart .ax-donut-chart-no-data-message .ax-donut-chart-no-data-help{font-size:.8rem;opacity:.6}\\n\"], dependencies: [{ kind: \"component\", type: AXChartTooltipComponent, selector: \"ax-chart-tooltip\", inputs: [\"data\", \"position\", \"visible\", \"showPercentage\", \"style\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXDonutChartComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-donut-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"ax-donut-chart\\\" #chartContainer role=\\\"img\\\" [attr.aria-label]=\\\"getAccessibilityLabel()\\\">\\n <!-- Tooltip component -->\\n <ax-chart-tooltip\\n [visible]=\\\"tooltipVisible()\\\"\\n [position]=\\\"tooltipPosition()\\\"\\n [data]=\\\"tooltipData()\\\"\\n [showPercentage]=\\\"true\\\"\\n ></ax-chart-tooltip>\\n</div>\\n\", styles: [\"ax-donut-chart{display:block;width:100%;height:100%;--ax-comp-donut-chart-bg-color: 0, 0, 0, 0;--ax-comp-donut-chart-value-color: var(--ax-sys-color-on-lightest-surface)}ax-donut-chart .ax-donut-chart{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;border-radius:.5rem;background-color:rgba(var(--ax-comp-donut-chart-bg-color))}ax-donut-chart .ax-donut-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}ax-donut-chart .ax-donut-chart svg g:has(text){font-family:inherit}ax-donut-chart .ax-donut-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-donut-chart-bg-color));border:1px solid rgba(var(--ax-sys-color-surface));padding:1.5rem;border-radius:.5rem;width:80%;max-width:300px}ax-donut-chart .ax-donut-chart-no-data-message .ax-donut-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-donut-chart .ax-donut-chart-no-data-message .ax-donut-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-donut-chart .ax-donut-chart-no-data-message .ax-donut-chart-no-data-help{font-size:.8rem;opacity:.6}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9udXQtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2RvbnV0LWNoYXJ0L3NyYy9saWIvZG9udXQtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2RvbnV0LWNoYXJ0L3NyYy9saWIvZG9udXQtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFFaEIsc0JBQXNCLEVBQ3RCLGFBQWEsRUFDYixpQkFBaUIsR0FDbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsdUJBQXVCLEVBQXNCLE1BQU0sOEJBQThCLENBQUM7QUFFM0YsT0FBTyxFQUNMLGVBQWUsRUFDZix1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsTUFBTSxFQUVOLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFHN0Q7OztHQUdHO0FBU0gsTUFBTSxPQUFPLHFCQUNYLFNBQVEsZ0JBQWdCO0lBR3hCLHVCQUF1QjtJQUNmLEdBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUV4QyxTQUFTO0lBQ1QsdUJBQXVCO0lBQ3ZCLElBQUksR0FBRyxLQUFLLENBQW9CLEVBQUUsZ0RBQUMsQ0FBQztJQUVwQywwQkFBMEI7SUFDMUIsT0FBTyxHQUFHLEtBQUssQ0FBcUIsRUFBRSxtREFBQyxDQUFDO0lBRXhDLFVBQVU7SUFDVix3Q0FBd0M7SUFDeEMsWUFBWSxHQUFHLE1BQU0sRUFBb0IsQ0FBQztJQUUx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LE1BQU0sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7U0FDdEMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO3VHQW40QlUscUJBQXFCOzJGQUFyQixxQkFBcUIsNmlCQzNDbEMsdVVBU0EsOHBDRCtCWSx1QkFBdUI7OzJGQUd0QixxQkFBcUI7a0JBUmpDLFNBQVM7K0JBQ0UsZ0JBQWdCLGlCQUdYLGlCQUFpQixDQUFDLElBQUksV0FDNUIsQ0FBQyx1QkFBdUIsQ0FBQyxtQkFDakIsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFYX0NIQVJUX0NPTE9SX1BBTEVUVEUsXG4gIEFYQ2hhcnRDb21wb25lbnQsXG4gIEFYQ2hhcnRDb21wb25lbnRCYXNlLFxuICBjb21wdXRlVG9vbHRpcFBvc2l0aW9uLFxuICBnZXRDaGFydENvbG9yLFxuICBnZXRFYXNpbmdGdW5jdGlvbixcbn0gZnJvbSAnQGFjb3JleC9jaGFydHMnO1xuaW1wb3J0IHsgQVhDaGFydExlZ2VuZENvbXBhdGlibGUsIEFYQ2hhcnRMZWdlbmRJdGVtIH0gZnJvbSAnQGFjb3JleC9jaGFydHMvY2hhcnQtbGVnZW5kJztcbmltcG9ydCB7IEFYQ2hhcnRUb29sdGlwQ29tcG9uZW50LCBBWENoYXJ0VG9vbHRpcERhdGEgfSBmcm9tICdAYWNvcmV4L2NoYXJ0cy9jaGFydC10b29sdGlwJztcblxuaW1wb3J0IHtcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgRWxlbWVudFJlZixcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgT25EZXN0cm95LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgdW50cmFja2VkLFxuICB2aWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYX0RPTlVUX0NIQVJUX0NPTkZJRyB9IGZyb20gJy4vZG9udXQtY2hhcnQuY29uZmlnJztcbmltcG9ydCB7IEFYRG9udXRDaGFydERhdGEsIEFYRG9udXRDaGFydE9wdGlvbiwgQVhEb251dENoYXJ0VmFsdWUgfSBmcm9tICcuL2RvbnV0LWNoYXJ0LnR5cGUnO1xuXG4vKipcbiAqIERvbnV0IENoYXJ0IENvbXBvbmVudFxuICogRGlzcGxheXMgZGF0YSBpbiBhIGNpcmN1bGFyIGRvbnV0IGNoYXJ0IHdpdGggaW50ZXJhY3RpdmUgc2VnbWVudHNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXgtZG9udXQtY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZG9udXQtY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kb251dC1jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBpbXBvcnRzOiBbQVhDaGFydFRvb2x0aXBDb21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQVhEb251dENoYXJ0Q29tcG9uZW50XG4gIGV4dGVuZHMgQVhDaGFydENvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQVhDaGFydExlZ2VuZENvbXBhdGlibGUsIEFYQ2hhcnRDb21wb25lbnRCYXNlXG57XG4gIC8vIERlcGVuZGVuY3kgSW5qZWN0aW9uXG4gIHByaXZhdGUgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAvLyBJbnB1dHNcbiAgLyoqIENoYXJ0IGRhdGEgaW5wdXQgKi9cbiAgZGF0YSA9IGlucHV0PEFYRG9udXRDaGFydFZhbHVlPihbXSk7XG5cbiAgLyoqIENoYXJ0IG9wdGlvbnMgaW5wdXQgKi9cbiAgb3B0aW9ucyA9IGlucHV0PEFYRG9udXRDaGFydE9wdGlvbj4oe30pO1xuXG4gIC8vIE91dHB1dHNcbiAgLyoqIEVtaXR0ZWQgd2hlbiBhIHNlZ21lbnQgaXMgY2xpY2tlZCAqL1xuICBzZWdtZW50Q2xpY2sgPSBvdXRwdXQ8QVhEb251dENoYXJ0RGF0YT4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIGEgc2VnbWVudCBoYXMgbW91c2UgaG92ZXJcbiAgICogQ2FuIGJlIHVzZWQgYnkgZXh0ZXJuYWwgZWxlbWVudHMgdG8gaGlnaGxpZ2h0IHRoaXMgc2VnbWVudFxuICAgKi9cbiAgc2VnbWVudEhvdmVyID0gb3V0cHV0PEFYRG9udXRDaGFydERhdGEgfCBudWxsPigpO1xuXG4gIC8vIENoYXJ0IGNvbnRhaW5lciByZWZlcmVuY2VcbiAgcHJpdmF0ZSByZWFkb25seSBjaGFydENvbnRhaW5lckVsID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignY2hhcnRDb250YWluZXInKTtcblxuICAvLyBEMyByZWZlcmVuY2UgLSBsb2FkZWQgYXN5bmNocm9ub3VzbHlcbiAgcHJvdGVjdGVkIGQzITogdHlwZW9mIGltcG9ydCgnZDMnKTtcblxuICAvLyBDaGFydCBTVkcgcmVmZXJlbmNlICh1c2luZyAnYW55JyBzaW5jZSBEMyBpcyBsb2FkZWQgZHluYW1pY2FsbHkgYXQgcnVudGltZSlcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBzdmc6IGFueSA9IG51bGw7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgcGllRGF0YTogYW55W10gPSBbXTtcblxuICAvLyBTdGF0ZSBtYW5hZ2VtZW50XG4gIHByaXZhdGUgaGlkZGVuU2VnbWVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9yZW5kZXJlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX2lzSW5pdGlhbEFuaW1hdGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX2N1cnJlbnRseUhpZ2hsaWdodGVkU2VnbWVudCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvLyBUb29sdGlwIHN0YXRlXG4gIHByaXZhdGUgX3Rvb2x0aXBWaXNpYmxlID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfdG9vbHRpcFBvc2l0aW9uID0gc2lnbmFsKHsgeDogMCwgeTogMCB9KTtcbiAgcHJpdmF0ZSBfdG9vbHRpcERhdGEgPSBzaWduYWw8QVhDaGFydFRvb2x0aXBEYXRhPih7XG4gICAgdGl0bGU6ICcnLFxuICAgIHZhbHVlOiAwLFxuICAgIHBlcmNlbnRhZ2U6ICcwJScsXG4gICAgY29sb3I6ICcnLFxuICB9KTtcbiAgcHJpdmF0ZSBfdG9vbHRpcFJhZklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfcGVuZGluZ1Rvb2x0aXBDb29yZHM6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFB1YmxpYyBjb21wdXRlZCBwcm9wZXJ0aWVzIGZvciB0aGUgdGVtcGxhdGVcbiAgcHJvdGVjdGVkIHRvb2x0aXBWaXNpYmxlID0gdGhpcy5fdG9vbHRpcFZpc2libGUuYXNSZWFkb25seSgpO1xuICBwcm90ZWN0ZWQgdG9vbHRpcFBvc2l0aW9uID0gdGhpcy5fdG9vbHRpcFBvc2l0aW9uLmFzUmVhZG9ubHkoKTtcbiAgcHJvdGVjdGVkIHRvb2x0aXBEYXRhID0gdGhpcy5fdG9vbHRpcERhdGEuYXNSZWFkb25seSgpO1xuXG4gIC8vIEluamVjdCBjb25maWd1cmF0aW9uXG4gIHByaXZhdGUgY29uZmlnVG9rZW4gPSBpbmplY3QoQVhfRE9OVVRfQ0hBUlRfQ09ORklHKTtcblxuICAvLyBJbmplY3QgdGhlIGNoYXJ0IGNvbG9yc1xuICBwcml2YXRlIGNoYXJ0Q29sb3JzID0gaW5qZWN0KEFYX0NIQVJUX0NPTE9SX1BBTEVUVEUpO1xuXG4gIC8vIENvbXB1dGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICBwcm90ZWN0ZWQgZWZmZWN0aXZlT3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25maWdUb2tlbixcbiAgICAgIC4uLnRoaXMub3B0aW9ucygpLFxuICAgIH07XG4gIH0pO1xuXG4gIC8vIENvbnN0YW50c1xuICBwcml2YXRlIHJlYWRvbmx5IFRPT0xUSVBfR0FQID0gMTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgSElHSExJR0hUX1RSQU5TSVRJT05fRFVSQVRJT04gPSAxNTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgSElHSExJR0hUX1RSQU5TSVRJT05fTkFNRSA9ICdoaWdobGlnaHQnO1xuICBwcml2YXRlIHJlYWRvbmx5IFNFR01FTlRfQU5JTUFUSU9OX0RFTEFZID0gNTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgTEFCRUxfQU5JTUFUSU9OX0RFTEFZID0gMjAwO1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9DSEFSVF9ESU1FTlNJT04gPSAyMDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX0NIQVJUX0ZPUl9MQUJFTFMgPSAyNjA7XG4gIHByaXZhdGUgcmVhZG9ubHkgRElNTUVEX09QQUNJVFkgPSAwLjU7XG4gIHByaXZhdGUgcmVhZG9ubHkgVklTSUJMRV9PUEFDSVRZID0gMTtcblxuICAvLyBNZXNzYWdlcyB3aXRoIGRlZmF1bHRzXG4gIHByb3RlY3RlZCBlZmZlY3RpdmVNZXNzYWdlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0TWVzc2FnZXMgPSB7XG4gICAgICBub0RhdGE6ICdObyBkYXRhIGF2YWlsYWJsZScsXG4gICAgICBub0RhdGFIZWxwOiAnUGxlYXNlIHByb3ZpZGUgZGF0YSB0byBkaXNwbGF5IHRoZSBjaGFydCcsXG4gICAgICBhbGxIaWRkZW46ICdBbGwgc2VnbWVudHMgYXJlIGhpZGRlbicsXG4gICAgICBhbGxIaWRkZW5IZWxwOiAnUGxlYXNlIHRvZ2dsZSB2aXNpYmlsaXR5IG9mIGF0IGxlYXN0IG9uZSBzZWdtZW50JyxcbiAgICAgIG5vRGF0YUljb246ICdmYS1saWdodCBmYS1jaGFydC1waWUnLFxuICAgICAgYWxsSGlkZGVuSWNvbjogJ2ZhLWxpZ2h0IGZhLWV5ZS1zbGFzaCcsXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmYXVsdE1lc3NhZ2VzLFxuICAgICAgLi4udGhpcy5lZmZlY3RpdmVPcHRpb25zKCkubWVzc2FnZXMsXG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gRGF0YSBhY2Nlc3NvciBmb3IgaGFuZGxpbmcgZGlmZmVyZW50IGluY29taW5nIGRhdGEgZm9ybWF0c1xuICBwcm90ZWN0ZWQgY2hhcnREYXRhQXJyYXkgPSBjb21wdXRlZCgoKTogQVhEb251dENoYXJ0RGF0YVtdID0+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhKCkgfHwgW107XG4gIH0pO1xuXG4gIC8vIENvbG9yIGFjY2Vzc29yIG1ldGhvZFxuICBwcm90ZWN0ZWQgZ2V0Q29sb3IoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdldENoYXJ0Q29sb3IoaW5kZXgsIHRoaXMuY2hhcnRDb2xvcnMpO1xuICB9XG5cbiAgLy8gU2VnbWVudCB2aXNpYmlsaXR5IGNoZWNrXG4gIHByb3RlY3RlZCBpc1NlZ21lbnRIaWRkZW4oaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhpZGRlblNlZ21lbnRzLmhhcyhpZCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIC8vIER5bmFtaWNhbGx5IGxvYWQgRDMgYW5kIGluaXRpYWxpemUgdGhlIGNoYXJ0IHdoZW4gdGhlIGNvbXBvbmVudCBpcyByZWFkeVxuICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG4gICAgICB0aGlzLl9pbml0aWFsaXplZC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLmxvYWREMygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhQ2hhbmdlRWZmZWN0ID0gZWZmZWN0KCgpID0+IHtcbiAgICAvLyBUcmFjayBkYXRhIGFuZCBvcHRpb25zIGNoYW5nZXNcbiAgICB0aGlzLmRhdGEoKTtcbiAgICB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKTtcblxuICAgIC8vIE9ubHkgdXBkYXRlIGlmIGFscmVhZHkgcmVuZGVyZWRcbiAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX3JlbmRlcmVkKCkpIHtcbiAgICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICAvKipcbiAgICogSGlnaGxpZ2h0cyBhIHNwZWNpZmljIHNlZ21lbnQgYnkgSURcbiAgICogQHBhcmFtIGlkIFRoZSBzZWdtZW50IElEIHRvIGhpZ2hsaWdodCwgb3IgbnVsbCB0byBjbGVhciBoaWdobGlnaHRcbiAgICovXG4gIGhpZ2hsaWdodFNlZ21lbnQoaWQ6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faXNJbml0aWFsQW5pbWF0aW5nKCkgfHwgIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5fY3VycmVudGx5SGlnaGxpZ2h0ZWRTZWdtZW50KCkgPT09IGlkKSByZXR1cm47XG5cbiAgICB0aGlzLl9jdXJyZW50bHlIaWdobGlnaHRlZFNlZ21lbnQuc2V0KGlkKTtcblxuICAgIC8vIE9ubHkgaW50ZXJydXB0IG9uZ29pbmcgSElHSExJR0hUIHRyYW5zaXRpb25zIChub3QgaW5pdGlhbCBhbmltYXRpb25zKVxuICAgIHRoaXMuc3ZnLnNlbGVjdEFsbCgncGF0aCcpLmludGVycnVwdCh0aGlzLkhJR0hMSUdIVF9UUkFOU0lUSU9OX05BTUUpO1xuXG4gICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICB0aGlzLmNsZWFyQWxsSGlnaGxpZ2h0cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgdGFyZ2V0U2VnbWVudCA9IHRoaXMuc3ZnLnNlbGVjdEFsbCgncGF0aCcpLmZpbHRlcigoZDogYW55KSA9PiBkPy5kYXRhPy5pZCA9PT0gaWQpO1xuXG4gICAgaWYgKHRhcmdldFNlZ21lbnQuZW1wdHkoKSkge1xuICAgICAgdGhpcy5fY3VycmVudGx5SGlnaGxpZ2h0ZWRTZWdtZW50LnNldChudWxsKTtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0U2VnbWVudChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpbU5vblRhcmdldFNlZ21lbnRzKGlkKTtcbiAgICB0aGlzLmhpZ2hsaWdodFRhcmdldFNlZ21lbnQodGFyZ2V0U2VnbWVudCk7XG4gICAgdGhpcy5zZWdtZW50SG92ZXIuZW1pdCh0aGlzLmdldFNlZ21lbnREYXRhQnlJZChpZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckFsbEhpZ2hsaWdodHMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN2ZykgcmV0dXJuO1xuXG4gICAgdGhpcy5zdmdcbiAgICAgIC5zZWxlY3RBbGwoJ3BhdGgnKVxuICAgICAgLmNsYXNzZWQoJ2F4LWRvbnV0LWNoYXJ0LWhpZ2hsaWdodGVkJywgZmFsc2UpXG4gICAgICAuY2xhc3NlZCgnYXgtZG9udXQtY2hhcnQtZGltbWVkJywgZmFsc2UpXG4gICAgICAudHJhbnNpdGlvbih0aGlzLkhJR0hMSUdIVF9UUkFOU0lUSU9OX05BTUUpXG4gICAgICAuZHVyYXRpb24odGhpcy5ISUdITElHSFRfVFJBTlNJVElPTl9EVVJBVElPTilcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBudWxsKVxuICAgICAgLnN0eWxlKCdmaWx0ZXInLCBudWxsKVxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgdGhpcy5WSVNJQkxFX09QQUNJVFkpO1xuXG4gICAgdGhpcy5zZWdtZW50SG92ZXIuZW1pdChudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgZGltTm9uVGFyZ2V0U2VnbWVudHModGFyZ2V0SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdmcpIHJldHVybjtcblxuICAgIHRoaXMuc3ZnXG4gICAgICAuc2VsZWN0QWxsKCdwYXRoJylcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAuZmlsdGVyKChkOiBhbnkpID0+IGQ/LmRhdGE/LmlkICE9PSB0YXJnZXRJZClcbiAgICAgIC5jbGFzc2VkKCdheC1kb251dC1jaGFydC1oaWdobGlnaHRlZCcsIGZhbHNlKVxuICAgICAgLmNsYXNzZWQoJ2F4LWRvbnV0LWNoYXJ0LWRpbW1lZCcsIHRydWUpXG4gICAgICAudHJhbnNpdGlvbih0aGlzLkhJR0hMSUdIVF9UUkFOU0lUSU9OX05BTUUpXG4gICAgICAuZHVyYXRpb24odGhpcy5ISUdITElHSFRfVFJBTlNJVElPTl9EVVJBVElPTilcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBudWxsKVxuICAgICAgLnN0eWxlKCdmaWx0ZXInLCBudWxsKVxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgdGhpcy5ESU1NRURfT1BBQ0lUWSk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIGhpZ2hsaWdodFRhcmdldFNlZ21lbnQodGFyZ2V0U2VnbWVudDogYW55KTogdm9pZCB7XG4gICAgdGFyZ2V0U2VnbWVudFxuICAgICAgLmNsYXNzZWQoJ2F4LWRvbnV0LWNoYXJ0LWRpbW1lZCcsIGZhbHNlKVxuICAgICAgLmNsYXNzZWQoJ2F4LWRvbnV0LWNoYXJ0LWhpZ2hsaWdodGVkJywgdHJ1ZSlcbiAgICAgIC50cmFuc2l0aW9uKHRoaXMuSElHSExJR0hUX1RSQU5TSVRJT05fTkFNRSlcbiAgICAgIC5kdXJhdGlvbih0aGlzLkhJR0hMSUdIVF9UUkFOU0lUSU9OX0RVUkFUSU9OKVxuICAgICAgLnN0eWxlKCdmaWx0ZXInLCAndXJsKCNheC1kb251dC1jaGFydC1zZWdtZW50LXNoYWRvdyknKVxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgdGhpcy5WSVNJQkxFX09QQUNJVFkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWdtZW50RGF0YUJ5SWQoc2VnbWVudElkOiBzdHJpbmcpOiBBWERvbnV0Q2hhcnREYXRhIHwgbnVsbCB7XG4gICAgcmV0dXJuIHVudHJhY2tlZCgoKSA9PiB0aGlzLmNoYXJ0RGF0YUFycmF5KCkpLmZpbmQoKGQpID0+IGQuaWQgPT09IHNlZ21lbnRJZCkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHZpc2liaWxpdHkgb2YgYSBzZWdtZW50IGJ5IElEXG4gICAqIEBwYXJhbSBpZCBTZWdtZW50IElEIHRvIHRvZ2dsZVxuICAgKiBAcmV0dXJucyBOZXcgdmlzaWJpbGl0eSBzdGF0ZSAodHJ1ZSA9IHZpc2libGUsIGZhbHNlID0gaGlkZGVuKVxuICAgKi9cbiAgdG9nZ2xlU2VnbWVudChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2hhcnREYXRhID0gdGhpcy5jaGFydERhdGFBcnJheSgpO1xuICAgIGNvbnN0IHdhc0FsbEhpZGRlbiA9IGNoYXJ0RGF0YS5sZW5ndGggPiAwICYmIGNoYXJ0RGF0YS5ldmVyeSgoZCkgPT4gdGhpcy5pc1NlZ21lbnRIaWRkZW4oZC5pZCkpO1xuXG4gICAgaWYgKHRoaXMuaGlkZGVuU2VnbWVudHMuaGFzKGlkKSkge1xuICAgICAgLy8gTWFraW5nIGEgc2VnbWVudCB2aXNpYmxlXG4gICAgICB0aGlzLmhpZGRlblNlZ21lbnRzLmRlbGV0ZShpZCk7XG5cbiAgICAgIC8vIElmIGFsbCBzZWdtZW50cyB3ZXJlIHByZXZpb3VzbHkgaGlkZGVuLCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGUgbWVzc2FnZSBpcyBjbGVhcmVkXG4gICAgICBpZiAod2FzQWxsSGlkZGVuKSB7XG4gICAgICAgIC8vIEZvcmNlIGNvbXBsZXRlIERPTSBjbGVhbnVwIGFuZCByZWRyYXdcbiAgICAgICAgaWYgKHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgLy8gQ2xlYXIgb25seSBjaGFydCBTVkcgYW5kIG1lc3NhZ2UgY29udGFpbmVycyAocHJlc2VydmUgdG9vbHRpcCBjb21wb25lbnQpXG4gICAgICAgICAgdGhpcy5kM1xuICAgICAgICAgICAgPy5zZWxlY3QodGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAgIC5zZWxlY3RBbGwoJ3N2ZywgLmF4LWNoYXJ0LW1lc3NhZ2UtY29udGFpbmVyLCAuYXgtZG9udXQtY2hhcnQtbm8tZGF0YS1tZXNzYWdlJylcbiAgICAgICAgICAgIC5yZW1vdmUoKTtcblxuICAgICAgICAgIC8vIEZvcmNlIGZ1bGwgcmVkcmF3XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGlkaW5nIGEgc2VnbWVudFxuICAgICAgdGhpcy5oaWRkZW5TZWdtZW50cy5hZGQoaWQpO1xuICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgIH1cblxuICAgIHJldHVybiAhdGhpcy5pc1NlZ21lbnRIaWRkZW4oaWQpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhbnVwQ2hhcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBEMy5qcyBkeW5hbWljYWxseVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGxvYWREMygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5kMyA9IGF3YWl0IGltcG9ydCgnZDMnKTtcbiAgICAgIC8vIElmIGNvbnRhaW5lciBpcyByZWFkeSwgY3JlYXRlIGNoYXJ0XG4gICAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQoKSAmJiB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKSkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkLnNldCh0cnVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgRDMuanM6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvblNlZ21lbnRDbGljayhpdGVtOiBBWERvbnV0Q2hhcnREYXRhKTogdm9pZCB7XG4gICAgdGhpcy5zZWdtZW50Q2xpY2suZW1pdChpdGVtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBkb251dCBjaGFydCBmcm9tIGN1cnJlbnQgZGF0YVxuICAgKi9cbiAgcHVibGljIGNyZWF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kMyB8fCAhdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudDtcbiAgICAgIHRoaXMuY2xlYXJDaGFydChjb250YWluZXJFbGVtZW50KTtcblxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuY2hhcnREYXRhQXJyYXkoKTtcbiAgICAgIGlmICghZGF0YSB8fCBkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnNob3dOb0RhdGFNZXNzYWdlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmlzaWJsZURhdGEgPSBkYXRhLmZpbHRlcigoaXRlbSkgPT4gIXRoaXMuaGlkZGVuU2VnbWVudHMuaGFzKGl0ZW0uaWQpKTtcbiAgICAgIGlmICh2aXNpYmxlRGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zaG93QWxsU2VnbWVudHNIaWRkZW5NZXNzYWdlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0aGlzLnNldHVwRGltZW5zaW9ucyhjb250YWluZXJFbGVtZW50LCBvcHRpb25zKTtcbiAgICAgIHRoaXMucmVuZGVyRG9udXRDaGFydChjb250YWluZXJFbGVtZW50LCB3aWR0aCwgaGVpZ2h0LCB2aXNpYmxlRGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNyZWF0aW5nIGRvbnV0IGNoYXJ0OicsIGVycm9yKTtcbiAgICAgIHRoaXMuaGFuZGxlQ2hhcnRFcnJvcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBjaGFydCB3aXRoIG5ldyBkYXRhXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgLy8gUmVzZXQgaGlnaGxpZ2h0ZWQgc2VnbWVudCBzdGF0ZSB3aGVuIHVwZGF0aW5nXG4gICAgdGhpcy5fY3VycmVudGx5SGlnaGxpZ2h0ZWRTZWdtZW50LnNldChudWxsKTtcbiAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7IC8vIFJlY3JlYXRlIHRoZSBjaGFydCB3aXRoIHVwZGF0ZWQgZGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgY2hhcnQgY29udGFpbmVyXG4gICAqL1xuICBwcml2YXRlIGNsZWFyQ2hhcnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMuZDMuc2VsZWN0KGNvbnRhaW5lcikuc2VsZWN0QWxsKCdzdmcsIC5heC1jaGFydC1tZXNzYWdlLWNvbnRhaW5lciwgLmF4LWRvbnV0LWNoYXJ0LW5vLWRhdGEtbWVzc2FnZScpLnJlbW92ZSgpO1xuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSBtZXNzYWdlIHdoZW4gbm8gZGF0YSBpcyBhdmFpbGFibGVcbiAgICovXG4gIHByaXZhdGUgc2hvd05vRGF0YU1lc3NhZ2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5yZW5kZXJNZXNzYWdlKFxuICAgICAgY29udGFpbmVyLFxuICAgICAgdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLm5vRGF0YUljb24sXG4gICAgICB0aGlzLmVmZmVjdGl2ZU1lc3NhZ2VzKCkubm9EYXRhLFxuICAgICAgdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLm5vRGF0YUhlbHAsXG4gICAgICAnYXgtZG9udXQtY2hhcnQtbm8tZGF0YS1tZXNzYWdlJyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGEgbWVzc2FnZSB3aGVuIGFsbCBzZWdtZW50cyBhcmUgaGlkZGVuXG4gICAqL1xuICBwcml2YXRlIHNob3dBbGxTZWdtZW50c0hpZGRlbk1lc3NhZ2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5yZW5kZXJNZXNzYWdlKFxuICAgICAgY29udGFpbmVyLFxuICAgICAgdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLmFsbEhpZGRlbkljb24sXG4gICAgICB0aGlzLmVmZmVjdGl2ZU1lc3NhZ2VzKCkuYWxsSGlkZGVuLFxuICAgICAgdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLmFsbEhpZGRlbkhlbHAsXG4gICAgICAnYXgtZG9udXQtY2hhcnQtbm8tZGF0YS1tZXNzYWdlJyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwcyBjaGFydCBkaW1lbnNpb25zIGJhc2VkIG9uIGNvbnRhaW5lciBhbmQgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cERpbWVuc2lvbnMoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9uczogQVhEb251dENoYXJ0T3B0aW9uKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IGNvbnRhaW5lci5jbGllbnRXaWR0aCB8fCA0MDA7XG4gICAgY29uc3QgY29udGFpbmVySGVpZ2h0ID0gY29udGFpbmVyLmNsaWVudEhlaWdodCB8fCA0MDA7XG5cbiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KG9wdGlvbnM/LndpZHRoIHx8IGNvbnRhaW5lcldpZHRoLCB0aGlzLk1JTl9DSEFSVF9ESU1FTlNJT04pO1xuICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KG9wdGlvbnM/LmhlaWdodCB8fCBjb250YWluZXJIZWlnaHQsIHRoaXMuTUlOX0NIQVJUX0RJTUVOU0lPTik7XG5cbiAgICByZXR1cm4geyB3aWR0aCwgaGVpZ2h0IH07XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgZG9udXQgY2hhcnQgd2l0aCB2aXNpYmxlIGRhdGFcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyRG9udXRDaGFydChcbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgdmlzaWJsZURhdGE6IEFYRG9udXRDaGFydERhdGFbXSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgdG90YWwgPSB2aXNpYmxlRGF0YS5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4gc3VtICsgaXRlbS52YWx1ZSwgMCk7XG5cbiAgICAvLyBDcmVhdGUgU1ZHIGNvbnRhaW5lciB3aXRoIGZpbHRlcnNcbiAgICBjb25zdCBzdmcgPSB0aGlzLmNyZWF0ZVN2Z1dpdGhGaWx0ZXJzKGNvbnRhaW5lciwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICAvLyBDcmVhdGUgbWFpbiBjaGFydCBncm91cFxuICAgIHRoaXMuc3ZnID0gc3ZnLmFwcGVuZCgnZycpLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHt3aWR0aCAvIDJ9LCAke2hlaWdodCAvIDJ9KWApO1xuXG4gICAgLy8gQ3JlYXRlIGRvbnV0IHNlZ21lbnRzXG4gICAgdGhpcy5jcmVhdGVEb251dFNlZ21lbnRzKHdpZHRoLCBoZWlnaHQsIHZpc2libGVEYXRhLCB0b3RhbCk7XG5cbiAgICAvLyBBZGQgdG90YWwgaW4gY2VudGVyXG4gICAgdGhpcy5hZGRDZW50ZXJEaXNwbGF5KHRvdGFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgU1ZHIGVsZW1lbnQgd2l0aCBmaWx0ZXIgZGVmaW5pdGlvbnMgZm9yIHNoYWRvd3NcbiAgICogQHJldHVybnMgRDMgU1ZHIHNlbGVjdGlvbiAoYW55IHR5cGUgZHVlIHRvIGR5bmFtaWMgRDMgbG9hZGluZylcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgY3JlYXRlU3ZnV2l0aEZpbHRlcnMoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBhbnkge1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuZDNcbiAgICAgIC5zZWxlY3QoY29udGFpbmVyKVxuICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgIC5hdHRyKCd3aWR0aCcsICcxMDAlJylcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCAnMTAwJScpXG4gICAgICAuYXR0cigndmlld0JveCcsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YClcbiAgICAgIC5hdHRyKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJywgJ3hNaWRZTWlkIG1lZXQnKTtcblxuICAgIC8vIEFkZCBkcm9wIHNoYWRvdyBmaWx0ZXJcbiAgICBjb25zdCBkZWZzID0gc3ZnLmFwcGVuZCgnZGVmcycpO1xuICAgIGNvbnN0IGZpbHRlciA9IGRlZnMuYXBwZW5kKCdmaWx0ZXInKS5hdHRyKCdpZCcsICdheC1kb251dC1jaGFydC1zZWdtZW50LXNoYWRvdycpLmF0dHIoJ2hlaWdodCcsICcxMzAlJyk7XG5cbiAgICBmaWx0ZXIuYXBwZW5kKCdmZUdhdXNzaWFuQmx1cicpLmF0dHIoJ2luJywgJ1NvdXJjZUFscGhhJykuYXR0cignc3RkRGV2aWF0aW9uJywgMikuYXR0cigncmVzdWx0JywgJ2JsdXInKTtcbiAgICBmaWx0ZXIuYXBwZW5kKCdmZU9mZnNldCcpLmF0dHIoJ2luJywgJ2JsdXInKS5hdHRyKCdkeCcsIDEpLmF0dHIoJ2R5JywgMSkuYXR0cigncmVzdWx0JywgJ29mZnNldEJsdXInKTtcblxuICAgIGNvbnN0IGZlQ29tcG9uZW50VHJhbnNmZXIgPSBmaWx0ZXJcbiAgICAgIC5hcHBlbmQoJ2ZlQ29tcG9uZW50VHJhbnNmZXInKVxuICAgICAgLmF0dHIoJ2luJywgJ29mZnNldEJsdXInKVxuICAgICAgLmF0dHIoJ3Jlc3VsdCcsICdvZmZzZXRCbHVyJyk7XG5cbiAgICBmZUNvbXBvbmVudFRyYW5zZmVyLmFwcGVuZCgnZmVGdW5jQScpLmF0dHIoJ3R5cGUnLCAnbGluZWFyJykuYXR0cignc2xvcGUnLCAwLjMpO1xuXG4gICAgY29uc3QgZmVNZXJnZSA9IGZpbHRlci5hcHBlbmQoJ2ZlTWVyZ2UnKTtcbiAgICBmZU1lcmdlLmFwcGVuZCgnZmVNZXJnZU5vZGUnKS5hdHRyKCdpbicsICdvZmZzZXRCbHVyJyk7XG4gICAgZmVNZXJnZS5hcHBlbmQoJ2ZlTWVyZ2VOb2RlJykuYXR0cignaW4nLCAnU291cmNlR3JhcGhpYycpO1xuXG4gICAgcmV0dXJuIHN2ZztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW5kIHJlbmRlciB0aGUgZG9udXQgc2VnbWVudHMgd2l0aCBhbmltYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZURvbnV0U2VnbWVudHMoY2hhcnRXaWR0aDogbnVtYmVyLCBjaGFydEhlaWdodDogbnVtYmVyLCBkYXRhOiBBWERvbnV0Q2hhcnREYXRhW10sIHRvdGFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcuc2V0KHRydWUpO1xuXG4gICAgLy8gQ3JlYXRlIHBpZSBsYXlvdXRcbiAgICBjb25zdCBwaWUgPSB0aGlzLmQzXG4gICAgICAucGllPEFYRG9udXRDaGFydERhdGE+KClcbiAgICAgIC52YWx1ZSgoZCkgPT4gZC52YWx1ZSlcbiAgICAgIC5zb3J0KG51bGwpXG4gICAgICAucGFkQW5nbGUoMC4wMik7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIHJhZGl1cyBvZiB0aGUgZG9udXQgY2hhcnRcbiAgICBjb25zdCByYWRpdXMgPSAoTWF0aC5taW4oY2hhcnRXaWR0aCwgY2hhcnRIZWlnaHQpIC8gMikgKiAwLjg1O1xuXG4gICAgLy8gQ2FsY3VsYXRlIGlubmVyIHJhZGl1cyBiYXNlZCBvbiBkb251dFdpZHRoIHBlcmNlbnRhZ2VcbiAgICBjb25zdCBkb251dFdpZHRoUGVyY2VudCA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmRvbnV0V2lkdGggLyAxMDA7XG4gICAgY29uc3QgaW5uZXJSYWRpdXMgPSByYWRpdXMgKiAoMSAtIGRvbnV0V2lkdGhQZXJjZW50KTtcblxuICAgIGNvbnN0IG91dGVyUmFkaXVzID0gcmFkaXVzICogMC45NTtcbiAgICBjb25zdCByaW5nV2lkdGggPSBvdXRlclJhZGl1cyAtIGlubmVyUmFkaXVzO1xuXG4gICAgY29uc3QgYXJjID0gdGhpcy5kM1xuICAgICAgLmFyYygpXG4gICAgICAuaW5uZXJSYWRpdXMoaW5uZXJSYWRpdXMpXG4gICAgICAub3V0ZXJSYWRpdXMob3V0ZXJSYWRpdXMpXG4gICAgICAuY29ybmVyUmFkaXVzKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmNvcm5lclJhZGl1cyk7XG5cbiAgICBjb25zdCBsYWJlbEFyYyA9IHRoaXMuZDNcbiAgICAgIC5hcmMoKVxuICAgICAgLmlubmVyUmFkaXVzKGlubmVyUmFkaXVzICsgcmluZ1dpZHRoIC8gMilcbiAgICAgIC5vdXRlclJhZGl1cyhpbm5lclJhZGl1cyArIHJpbmdXaWR0aCAvIDIpO1xuXG4gICAgLy8gR2V0IGFuaW1hdGlvbiBvcHRpb25zXG4gICAgY29uc3QgYW5pbWF0aW9uRHVyYXRpb24gPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5hbmltYXRpb25EdXJhdGlvbjtcbiAgICBjb25zdCBhbmltYXRpb25FYXNpbmcgPSBnZXRFYXNpbmdGdW5jdGlvbih0aGlzLmQzLCB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5hbmltYXRpb25FYXNpbmcpO1xuXG4gICAgLy8gR2VuZXJhdGUgcGllIGRhdGFcbiAgICB0aGlzLnBpZURhdGEgPSBwaWUoZGF0YSk7XG5cbiAgICAvLyBBZGQgc2VnbWVudHMgd2l0aCBhbmltYXRpb25cbiAgICBjb25zdCBzZWdtZW50cyA9IHRoaXMuc3ZnXG4gICAgICAuc2VsZWN0QWxsKCdwYXRoJylcbiAgICAgIC5kYXRhKHRoaXMucGllRGF0YSlcbiAgICAgIC5lbnRlcigpXG4gICAgICAuYXBwZW5kKCdwYXRoJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1kb251dC1jaGFydC1zZWdtZW50JylcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAuYXR0cignZmlsbCcsIChkOiBhbnkpID0+IHRoaXMuZ2V0U2VnbWVudENvbG9yKGQuZGF0YSkpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgICAgLnN0eWxlKCdjdXJzb3InLCAncG9pbnRlcicpXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgLm9uKCdtb3VzZWVudGVyJywgKGV2ZW50OiBNb3VzZUV2ZW50LCBkOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dUb29sdGlwKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVTbGljZUhvdmVyKGV2ZW50LCBkLmRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKCkgPT4gdGhpcy5oYW5kbGVTZWdtZW50TGVhdmUoKSlcbiAgICAgIC5vbignbW91c2Vtb3ZlJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl90b29sdGlwVmlzaWJsZSgpKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIC5vbignY2xpY2snLCAoX2V2ZW50OiBNb3VzZUV2ZW50LCBkOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vblNlZ21lbnRDbGljayhkLmRhdGEpO1xuICAgICAgfSk7XG5cbiAgICAvLyBBbmltYXRlIHNlZ21lbnRzXG4gICAgY29uc3QgbnVtU2VnbWVudHMgPSB0aGlzLnBpZURhdGEubGVuZ3RoO1xuICAgIGxldCBjb21wbGV0ZWQgPSAwO1xuICAgIHNlZ21lbnRzXG4gICAgICAudHJhbnNpdGlvbigpXG4gICAgICAuZHVyYXRpb24oYW5pbWF0aW9uRHVyYXRpb24pXG4gICAgICAuZWFzZShhbmltYXRpb25FYXNpbmcpXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgLmRlbGF5KChfZDogYW55LCBpOiBudW1iZXIpID0+IGkgKiB0aGlzLlNFR01FTlRfQU5JTUFUSU9OX0RFTEFZKVxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgdGhpcy5WSVNJQkxFX09QQUNJVFkpXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgLmF0dHJUd2VlbignZCcsIChkOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGUgPSB0aGlzLmQzLmludGVycG9sYXRlKHsgc3RhcnRBbmdsZTogZC5zdGFydEFuZ2xlLCBlbmRBbmdsZTogZC5zdGFydEFuZ2xlIH0sIGQpO1xuICAgICAgICByZXR1cm4gKHQ6IG51bWJlcikgPT4gYXJjKGludGVycG9sYXRlKHQpKSBhcyBzdHJpbmc7XG4gICAgICB9KVxuICAgICAgLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgIGNvbXBsZXRlZCsrO1xuICAgICAgICBpZiAoY29tcGxldGVkID49IG51bVNlZ21lbnRzKSB7XG4gICAgICAgICAgdGhpcy5faXNJbml0aWFsQW5pbWF0aW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLm9uKCdpbnRlcnJ1cHQnLCAoKSA9PiB7XG4gICAgICAgIC8vIFRyZWF0IGludGVycnVwdHMgYXMgY29tcGxldGlvbiB0byBhdm9pZCBnZXR0aW5nIHN0dWNrIGluIGFuaW1hdGluZyBzdGF0ZVxuICAgICAgICBjb21wbGV0ZWQrKztcbiAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBudW1TZWdtZW50cykge1xuICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbEFuaW1hdGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAvLyBBZGQgZGF0YSBsYWJlbHMgaWYgZW5hYmxlZCBhbmQgY2hhcnQgc2l6ZSBpcyBzdWZmaWNpZW50XG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dEYXRhTGFiZWxzICYmIHRoaXMuaXNDaGFydExhcmdlRW5vdWdoRm9yTGFiZWxzKGNoYXJ0V2lkdGgsIGNoYXJ0SGVpZ2h0KSkge1xuICAgICAgdGhpcy5hZGREYXRhTGFiZWxzKGxhYmVsQXJjLCBvdXRlclJhZGl1cywgaW5uZXJSYWRpdXMsIHRvdGFsLCBhbmltYXRpb25EdXJhdGlvbik7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIHdoZW4gYWxsIHNlZ21lbnQgYW5pbWF0aW9ucyBhcmUgY29tcGxldGUgKGhhbmRsZSBlbXB0eSBjYXNlKVxuICAgIGlmIChudW1TZWdtZW50cyA9PT0gMCkge1xuICAgICAgdGhpcy5faXNJbml0aWFsQW5pbWF0aW5nLnNldChmYWxzZSk7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0NoYXJ0TGFyZ2VFbm91Z2hGb3JMYWJlbHMod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gTWF0aC5taW4od2lkdGgsIGhlaWdodCkgPj0gdGhpcy5NSU5fQ0hBUlRfRk9SX0xBQkVMUztcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgYWRkRGF0YUxhYmVscyhcbiAgICBsYWJlbEFyYzogYW55LFxuICAgIG91dGVyUmFkaXVzOiBudW1iZXIsXG4gICAgaW5uZXJSYWRpdXM6IG51bWJlcixcbiAgICB0b3RhbDogbnVtYmVyLFxuICAgIGFuaW1hdGlvbkR1cmF0aW9uOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdmcpIHJldHVybjtcblxuICAgIGNvbnN0IGRhdGFXaXRoTGFiZWxzID0gdGhpcy5waWVEYXRhLmZpbHRlcigoZCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlTGFiZWxGb250U2l6ZShkLCBvdXRlclJhZGl1cywgaW5uZXJSYWRpdXMsIHRvdGFsKSA+IDA7XG4gICAgfSk7XG5cbiAgICBjb25zdCBsYWJlbHMgPSB0aGlzLnN2Z1xuICAgICAgLnNlbGVjdEFsbCgnLmF4LWRvbnV0LWNoYXJ0LWRhdGEtbGFiZWwnKVxuICAgICAgLmRhdGEoZGF0YVdpdGhMYWJlbHMpXG4gICAgICAuZW50ZXIoKVxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtZG9udXQtY2hhcnQtZGF0YS1sYWJlbCcpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgICAgLnN0eWxlKCdwb2ludGVyLWV2ZW50cycsICdub25lJylcbiAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1kb251dC1jaGFydC1kYXRhLWxhYmVscy1jb2xvcikpJylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoZCkgPT4ge1xuICAgICAgICBjb25zdCBjZW50cm9pZCA9IGxhYmVsQXJjLmNlbnRyb2lkKGQpO1xuICAgICAgICByZXR1cm4gYHRyYW5zbGF0ZSgke2NlbnRyb2lkWzBdfSwgJHtjZW50cm9pZFsxXX0pYDtcbiAgICAgIH0pXG4gICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgIC5hdHRyKCdkb21pbmFudC1iYXNlbGluZScsICdtaWRkbGUnKVxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAoZCkgPT4gYCR7dGhpcy5jYWxjdWxhdGVMYWJlbEZvbnRTaXplKGQsIG91dGVyUmFkaXVzLCBpbm5lclJhZGl1cywgdG90YWwpfXB4YClcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAoZCkgPT4gKChkLmRhdGEudmFsdWUgLyB0b3RhbCkgKiAxMDAgPj0gMTUgPyAnNjAwJyA6ICc1MDAnKSlcbiAgICAgIC50ZXh0KChkKSA9PiB0aGlzLmdldFRydW5jYXRlZExhYmVsVGV4dChkLCBvdXRlclJhZGl1cywgaW5uZXJSYWRpdXMsIHRvdGFsKSk7XG5cbiAgICBsYWJlbHNcbiAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgIC5kdXJhdGlvbihhbmltYXRpb25EdXJhdGlvbilcbiAgICAgIC5kZWxheSgoX2QsIGk6IG51bWJlcikgPT4gaSAqIHRoaXMuU0VHTUVOVF9BTklNQVRJT05fREVMQVkgKyB0aGlzLkxBQkVMX0FOSU1BVElPTl9ERUxBWSlcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsIHRoaXMuVklTSUJMRV9PUEFDSVRZKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIGZvbnQgc2l6ZSBmb3IgZGF0YSBsYWJlbHMgdXNpbmcgdGhlIGRvbnV0IHJpbmcncyBwaHlzaWNhbCBkaW1lbnNpb25zLlxuICAgKlxuICAgKiBQcmltYXJ5IGRyaXZlciBpcyB0aGUgcmluZyB3aWR0aCAocmFkaWFsIHNwYWNlKSwgd2l0aCBjaG9yZCBsZW5ndGggYXMgYW5cbiAgICogb3ZlcmZsb3cgZ3VhcmQgYW5kIGEgZ2VudGxlIHNjYWxlLWRvd24gZm9yIHNtYWxsZXIgc2VnbWVudHMgdG8gY3JlYXRlXG4gICAqIHZpc3VhbCBoaWVyYXJjaHkuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIGNhbGN1bGF0ZUxhYmVsRm9udFNpemUoZDogYW55LCBvdXRlclJhZGl1czogbnVtYmVyLCBpbm5lclJhZGl1czogbnVtYmVyLCB0b3RhbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBhbmdsZSA9IGQuZW5kQW5nbGUgLSBkLnN0YXJ0QW5nbGU7XG4gICAgY29uc3Qgc2VnbWVudFBlcmNlbnRhZ2UgPSAoZC5kYXRhLnZhbHVlIC8gdG90YWwpICogMTAwO1xuXG4gICAgaWYgKHNlZ21lbnRQZXJjZW50YWdlIDwgMikgcmV0dXJuIDA7XG5cbiAgICBjb25zdCByaW5nV2lkdGggPSBvdXRlclJhZGl1cyAtIGlubmVyUmFkaXVzO1xuICAgIGNvbnN0IGxhYmVsUmFkaXVzID0gaW5uZXJSYWRpdXMgKyByaW5nV2lkdGggLyAyO1xuICAgIGNvbnN0IGNob3JkTGVuZ3RoID0gMiAqIGxhYmVsUmFkaXVzICogTWF0aC5zaW4oYW5nbGUgLyAyKTtcblxuICAgIGNvbnN0IE1JTl9DSE9SRCA9IDIyO1xuICAgIGNvbnN0IE1JTl9SSU5HID0gMTY7XG4gICAgaWYgKGNob3JkTGVuZ3RoIDwgTUlOX0NIT1JEIHx8IHJpbmdXaWR0aCA8IE1JTl9SSU5HKSByZXR1cm4gMDtcblxuICAgIGNvbnN0IHJpbmdCYXNlZFNpemUgPSByaW5nV2lkdGggKiAwLjQ4O1xuXG4gICAgLy8gU2VnbWVudHMgPj0gMjAlIGdldCBmdWxsIHNpemU7IHNtYWxsZXIgb25lcyBzY2FsZSBmcm9tIDAuNzUg4oaSIDEuMFxuICAgIGNvbnN0IHNlZ21lbnRTY2FsZSA9IE1hdGgubWluKDEsIDAuNzUgKyAwLjI1ICogKHNlZ21lbnRQZXJjZW50YWdlIC8gMjApKTtcblxuICAgIC8vIEF0IGxlYXN0IDIgY2hhcmFjdGVycyAoXCJYJVwiKSBtdXN0IGZpdCBob3Jpem9udGFsbHlcbiAgICBjb25zdCBtYXhCeUNob3JkID0gY2hvcmRMZW5ndGggLyAoMiAqIDAuNjUpO1xuXG4gICAgY29uc3QgZm9udFNpemUgPSBNYXRoLm1pbihyaW5nQmFzZWRTaXplICogc2VnbWVudFNjYWxlLCBtYXhCeUNob3JkKTtcblxuICAgIGNvbnN0IE1JTl9GT05UX1NJWkUgPSAxMTtcbiAgICBjb25zdCBNQVhfRk9OVF9TSVpFID0gMjA7XG5cbiAgICByZXR1cm4gTWF0aC5yb3VuZChNYXRoLm1heChNSU5fRk9OVF9TSVpFLCBNYXRoLm1pbihmb250U2l6ZSwgTUFYX0ZPTlRfU0laRSkpICogMikgLyAyO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRQZXJjZW50YWdlKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICh2YWx1ZSA8IDEpIHJldHVybiAnPDElJztcbiAgICBpZiAodmFsdWUgPCAxMCkgcmV0dXJuIGAke3ZhbHVlLnRvRml4ZWQoMSl9JWA7XG4gICAgcmV0dXJuIGAke01hdGgucm91bmQodmFsdWUpfSVgO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGJlc3QtZml0IGxhYmVsIHRleHQgZm9yIGEgc2VnbWVudCwgcHJvZ3Jlc3NpdmVseSB0cnVuY2F0aW5nXG4gICAqIGZyb20gXCJMYWJlbCAoWFglKVwiIOKGkiBcIkxhYmVsXCIg4oaSIFwiWFglXCIg4oaSIHRydW5jYXRlZCBsYWJlbCDihpIgdHJ1bmNhdGVkIHBlcmNlbnRhZ2UuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIGdldFRydW5jYXRlZExhYmVsVGV4dChkOiBhbnksIG91dGVyUmFkaXVzOiBudW1iZXIsIGlubmVyUmFkaXVzOiBudW1iZXIsIHRvdGFsOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZvbnRTaXplID0gdGhpcy5jYWxjdWxhdGVMYWJlbEZvbnRTaXplKGQsIG91dGVyUmFkaXVzLCBpbm5lclJhZGl1cywgdG90YWwpO1xuICAgIGlmIChmb250U2l6ZSA9PT0gMCkgcmV0dXJuICcnO1xuXG4gICAgY29uc3QgcmluZ1dpZHRoID0gb3V0ZXJSYWRpdXMgLSBpbm5lclJhZGl1cztcbiAgICBjb25zdCBsYWJlbFJhZGl1cyA9IGlubmVyUmFkaXVzICsgcmluZ1dpZHRoIC8gMjtcbiAgICBjb25zdCBhbmdsZSA9IGQuZW5kQW5nbGUgLSBkLnN0YXJ0QW5nbGU7XG4gICAgY29uc3QgY2hvcmRMZW5ndGggPSAyICogbGFiZWxSYWRpdXMgKiBNYXRoLnNpbihhbmdsZSAvIDIpO1xuICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoID0gY2hvcmRMZW5ndGggKiAwLjg7XG5cbiAgICBjb25zdCBwZXJjZW50YWdlID0gKGQuZGF0YS52YWx1ZSAvIHRvdGFsKSAqIDEwMDtcbiAgICBpZiAocGVyY2VudGFnZSA8IDIpIHJldHVybiAnJztcblxuICAgIGNvbnN0IGxhYmVsID0gZC5kYXRhLmxhYmVsIHx8ICcnO1xuICAgIGNvbnN0IHBlcmNlbnRhZ2VUZXh0ID0gdGhpcy5mb3JtYXRQZXJjZW50YWdlKHBlcmNlbnRhZ2UpO1xuICAgIGNvbnN0IGZ1bGxUZXh0ID0gbGFiZWwgPyBgJHtsYWJlbH0gKCR7cGVyY2VudGFnZVRleHR9KWAgOiBwZXJjZW50YWdlVGV4dDtcblxuICAgIGlmICh0aGlzLmRvZXNUZXh0Rml0KGZ1bGxUZXh0LCBmb250U2l6ZSwgYXZhaWxhYmxlV2lkdGgpKSByZXR1cm4gZnVsbFRleHQ7XG4gICAgaWYgKGxhYmVsICYmIHRoaXMuZG9lc1RleHRGaXQobGFiZWwsIGZvbnRTaXplLCBhdmFpbGFibGVXaWR0aCkpIHJldHVybiBsYWJlbDtcbiAgICBpZiAodGhpcy5kb2VzVGV4dEZpdChwZXJjZW50YWdlVGV4dCwgZm9udFNpemUsIGF2YWlsYWJsZVdpZHRoKSkgcmV0dXJuIHBlcmNlbnRhZ2VUZXh0O1xuICAgIGlmIChsYWJlbCkgcmV0dXJuIHRoaXMudHJ1bmNhdGVUZXh0VG9GaXQobGFiZWwsIGZvbnRTaXplLCBhdmFpbGFibGVXaWR0aCk7XG4gICAgcmV0dXJuIHRoaXMudHJ1bmNhdGVUZXh0VG9GaXQocGVyY2VudGFnZVRleHQsIGZvbnRTaXplLCBhdmFpbGFibGVXaWR0aCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRleHQgZml0cyB3aXRoaW4gYXZhaWxhYmxlIHdpZHRoIHVzaW5nIGNvbnNlcnZhdGl2ZSBlc3RpbWF0aW9uXG4gICAqIFVzZXMgMC42NWVtIHBlciBjaGFyYWN0ZXIgdG8gYWNjb3VudCBmb3IgZm9udCB2YXJpYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGRvZXNUZXh0Rml0KHRleHQ6IHN0cmluZywgZm9udFNpemU6IG51bWJlciwgYXZhaWxhYmxlV2lkdGg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGV4dCkgcmV0dXJuIGZhbHNlO1xuICAgIFxuICAgIC8vIFVzZSBjb25zZXJ2YXRpdmUgY2hhcmFjdGVyIHdpZHRoICgwLjY1ZW0gZm9yIHNhZmV0eSlcbiAgICAvLyBXaWRlciBmb250cyBsaWtlIGJvbGQgdGV4dCBuZWVkIG1vcmUgc3BhY2VcbiAgICBjb25zdCBlc3RpbWF0ZWRXaWR0aCA9IHRleHQubGVuZ3RoICogZm9udFNpemUgKiAwLjY1O1xuICAgIHJldHVybiBlc3RpbWF0ZWRXaWR0aCA8PSBhdmFpbGFibGVXaWR0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnVuY2F0ZXMgdGV4dCB0byBmaXQgd2l0aGluIGF2YWlsYWJsZSB3aWR0aCB3aXRoIGVsbGlwc2lzXG4gICAqIFVzZXMgY29uc2VydmF0aXZlIGNoYXJhY3RlciB3aWR0aCB0byBwcmV2ZW50IG92ZXJmbG93XG4gICAqIEFkYXB0cyBjaGFyYWN0ZXIgd2lkdGggZXN0aW1hdGlvbiBiYXNlZCBvbiBmb250IHNpemVcbiAgICovXG4gIHByaXZhdGUgdHJ1bmNhdGVUZXh0VG9GaXQodGV4dDogc3RyaW5nLCBmb250U2l6ZTogbnVtYmVyLCBhdmFpbGFibGVXaWR0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoIXRleHQpIHJldHVybiAnJztcbiAgICBcbiAgICAvLyBBZGFwdGl2ZSBjaGFyYWN0ZXIgd2lkdGg6IHNtYWxsZXIgZm9udHMgYXJlIHJlbGF0aXZlbHkgd2lkZXJcbiAgICAvLyBMYXJnZXIgZm9udHM6IH4wLjZlbSwgU21hbGxlciBmb250czogfjAuN2VtXG4gICAgY29uc3QgY2hhcldpZHRoUmF0aW8gPSBmb250U2l6ZSA8PSAxMCA/IDAuNyA6IDAuNjU7XG4gICAgY29uc3QgY2hhcldpZHRoID0gZm9udFNpemUgKiBjaGFyV2lkdGhSYXRpbztcbiAgICBcbiAgICAvLyBSZXNlcnZlIHNwYWNlIGZvciBlbGxpcHNpc1xuICAgIGNvbnN0IGVsbGlwc2lzV2lkdGggPSBmb250U2l6ZSAqIDAuNztcbiAgICBjb25zdCBhdmFpbGFibGVGb3JUZXh0ID0gYXZhaWxhYmxlV2lkdGggLSBlbGxpcHNpc1dpZHRoO1xuICAgIFxuICAgIGlmIChhdmFpbGFibGVGb3JUZXh0IDw9IDApIHJldHVybiAnJztcbiAgICBcbiAgICBjb25zdCBtYXhDaGFycyA9IE1hdGguZmxvb3IoYXZhaWxhYmxlRm9yVGV4dCAvIGNoYXJXaWR0aCk7XG4gICAgXG4gICAgaWYgKG1heENoYXJzIDw9IDApIHJldHVybiAnJztcbiAgICBpZiAodGV4dC5sZW5ndGggPD0gbWF4Q2hhcnMpIHJldHVybiB0ZXh0O1xuICAgIFxuICAgIC8vIEVuc3VyZSBhdCBsZWFzdCAxIGNoYXJhY3RlciBiZWZvcmUgZWxsaXBzaXNcbiAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgTWF0aC5tYXgoMSwgbWF4Q2hhcnMpKSArICfigKYnO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWdtZW50Q29sb3IoZGF0YTogQVhEb251dENoYXJ0RGF0YSk6IHN0cmluZyB7XG4gICAgaWYgKGRhdGEuY29sb3IpIHJldHVybiBkYXRhLmNvbG9yO1xuXG4gICAgY29uc3Qgb3JpZ2luYWxGdWxsRGF0YSA9IHVudHJhY2tlZCgoKSA9PiB0aGlzLmNoYXJ0RGF0YUFycmF5KCkpO1xuICAgIGNvbnN0IG9yaWdpbmFsSW5kZXggPSBvcmlnaW5hbEZ1bGxEYXRhLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZGF0YS5pZCk7XG4gICAgXG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29sb3Iob3JpZ2luYWxJbmRleCAhPT0gLTEgPyBvcmlnaW5hbEluZGV4IDogMCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGhvdmVyIGVmZmVjdHMgb24gYSBzZWdtZW50XG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVNsaWNlSG92ZXIoZXZlbnQ6IE1vdXNlRXZlbnQsIGRhdHVtOiBBWERvbnV0Q2hhcnREYXRhKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzSW5pdGlhbEFuaW1hdGluZygpKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd1Rvb2x0aXAgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnNob3dUb29sdGlwKGV2ZW50LCBkYXR1bSk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuaGlnaGxpZ2h0U2VnbWVudChkYXR1bS5pZCk7XG4gIH1cblxuICBwcml2YXRlIHNob3dUb29sdGlwKGV2ZW50OiBNb3VzZUV2ZW50LCBkYXR1bTogQVhEb251dENoYXJ0RGF0YSk6IHZvaWQge1xuICAgIGNvbnN0IHRvdGFsID0gdW50cmFja2VkKCgpID0+IHRoaXMuZGF0YSgpKS5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4gc3VtICsgaXRlbS52YWx1ZSwgMCk7XG4gICAgY29uc3QgcGVyY2VudGFnZSA9IHRvdGFsID4gMCA/ICgoZGF0dW0udmFsdWUgLyB0b3RhbCkgKiAxMDApLnRvRml4ZWQoMSkgOiAnMCc7XG4gICAgY29uc3QgY29sb3IgPSB0aGlzLmdldFNlZ21lbnRDb2xvcihkYXR1bSk7XG5cbiAgICB0aGlzLl90b29sdGlwRGF0YS5zZXQoe1xuICAgICAgdGl0bGU6IGRhdHVtLnRvb2x0aXBMYWJlbCB8fCBkYXR1bS5sYWJlbCxcbiAgICAgIHZhbHVlOiBkYXR1bS52YWx1ZS50b1N0cmluZygpLFxuICAgICAgcGVyY2VudGFnZTogYCR7cGVyY2VudGFnZX0lYCxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIG1vdXNlIGxlYXZlIGZyb20gc2VnbWVudHNcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlU2VnbWVudExlYXZlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcoKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmhpZ2hsaWdodFNlZ21lbnQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzID0geyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH07XG4gICAgaWYgKHRoaXMuX3Rvb2x0aXBSYWZJZCAhPSBudWxsKSByZXR1cm47XG4gICAgdGhpcy5fdG9vbHRpcFJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRoaXMuX3Rvb2x0aXBSYWZJZCA9IG51bGw7XG4gICAgICBjb25zdCBjb29yZHMgPSB0aGlzLl9wZW5kaW5nVG9vbHRpcENvb3JkcztcbiAgICAgIGlmICghY29vcmRzKSByZXR1cm47XG4gICAgICBjb25zdCBjb250YWluZXJFbCA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFjb250YWluZXJFbCkgcmV0dXJuO1xuICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgdG9vbHRpcEVsID0gY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLmNoYXJ0LXRvb2x0aXAnKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICBjb25zdCB0b29sdGlwUmVjdCA9IHRvb2x0aXBFbCA/IHRvb2x0aXBFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IG51bGw7XG4gICAgICBjb25zdCBwb3MgPSBjb21wdXRlVG9vbHRpcFBvc2l0aW9uKGNvbnRhaW5lclJlY3QsIHRvb2x0aXBSZWN0LCBjb29yZHMueCwgY29vcmRzLnksIHRoaXMuVE9PTFRJUF9HQVApO1xuICAgICAgdGhpcy5fdG9vbHRpcFBvc2l0aW9uLnNldChwb3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgY2VudGVyIGRpc3BsYXkgd2l0aCB0b3RhbCB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBhZGRDZW50ZXJEaXNwbGF5KHRvdGFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICBjb25zdCBjaGFydENvbnRhaW5lcldpZHRoID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAvLyBJbXByb3ZlZCBmb250IHNjYWxpbmc6IGJldHRlciBtaW5pbXVtIGZvciBzbWFsbCBzaXplcywgYmV0dGVyIHJhdGlvIGZvciBzY2FsaW5nXG4gICAgY29uc3QgYmFzZUZvbnRTaXplID0gTWF0aC5tYXgoMS44LCBNYXRoLm1pbigzLjIsIGNoYXJ0Q29udGFpbmVyV2lkdGggLyAxNTApKTtcbiAgICBjb25zdCBzdWJUZXh0Rm9udFNpemUgPSBiYXNlRm9udFNpemUgKiAwLjU7XG5cbiAgICAvLyBDcmVhdGUgZ3JvdXAgZm9yIHRoZSB0b3RhbCBkaXNwbGF5XG4gICAgY29uc3QgdG90YWxEaXNwbGF5ID0gdGhpcy5zdmdcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWRvbnV0LWNoYXJ0LXRvdGFsLWRpc3BsYXknKVxuICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpO1xuXG4gICAgLy8gQWRkIHRvdGFsIHZhbHVlXG4gICAgdG90YWxEaXNwbGF5XG4gICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1kb251dC1jaGFydC10b3RhbC12YWx1ZScpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGAke2Jhc2VGb250U2l6ZX1yZW1gKVxuICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc2MDAnKVxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWRvbnV0LWNoYXJ0LXZhbHVlLWNvbG9yKSknKVxuICAgICAgLnRleHQodG90YWwudG9Mb2NhbGVTdHJpbmcoKSk7XG5cbiAgICAvLyBBZGQgbGFiZWxcbiAgICB0b3RhbERpc3BsYXlcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWRvbnV0LWNoYXJ0LXRvdGFsLWxhYmVsJylcbiAgICAgIC5hdHRyKCdkeScsICcxLjRlbScpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGAke3N1YlRleHRGb250U2l6ZX1yZW1gKVxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWRvbnV0LWNoYXJ0LXZhbHVlLWNvbG9yKSknKVxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgJzAuOCcpXG4gICAgICAudGV4dCh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS50b3RhbExhYmVsIHx8ICdUb3RhbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgY2hhcnQgcmVuZGVyaW5nIGVycm9yc1xuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVDaGFydEVycm9yKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIHRoaXMuc2hvd05vRGF0YU1lc3NhZ2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW5zIHVwIGNoYXJ0IHJlc291cmNlc1xuICAgKi9cbiAgcHVibGljIGNsZWFudXBDaGFydCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdG9vbHRpcFJhZklkICE9IG51bGwpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3Rvb2x0aXBSYWZJZCk7XG4gICAgICB0aGlzLl90b29sdGlwUmFmSWQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLl9wZW5kaW5nVG9vbHRpcENvb3JkcyA9IG51bGw7XG5cbiAgICBpZiAoIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICB0aGlzLmQzLnNlbGVjdCh0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkuc2VsZWN0QWxsKCdzdmcnKS5yZW1vdmUoKTtcbiAgICB0aGlzLnN2ZyA9IG51bGw7XG4gICAgdGhpcy5waWVEYXRhID0gW107XG4gICAgdGhpcy5oaWRkZW5TZWdtZW50cy5jbGVhcigpO1xuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldChmYWxzZSk7XG4gICAgdGhpcy5fY3VycmVudGx5SGlnaGxpZ2h0ZWRTZWdtZW50LnNldChudWxsKTtcbiAgfVxuXG4gIC8vID09PT09IEhlbHBlciB1dGlsaXRpZXMgZm9yIG1vZHVsYXJpdHkgYW5kIG1haW50YWluYWJpbGl0eSA9PT09PVxuXG4gIHByaXZhdGUgcmVuZGVyTWVzc2FnZShcbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgIGljb25DbGFzczogc3RyaW5nLFxuICAgIG1lc3NhZ2VUZXh0OiBzdHJpbmcsXG4gICAgaGVscFRleHQ6IHN0cmluZyxcbiAgICBzcGVjaWZpY0NsYXNzOiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIC8vIENsZWFyIGNvbnRhaW5lciBhcmVhIGZpcnN0IChwcmVzZXJ2ZSB0b29sdGlwIGNvbXBvbmVudClcbiAgICB0aGlzLmQzLnNlbGVjdChjb250YWluZXIpLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtbWVzc2FnZS1jb250YWluZXIsIC5heC1kb251dC1jaGFydC1uby1kYXRhLW1lc3NhZ2UnKS5yZW1vdmUoKTtcblxuICAgIGNvbnN0IG1lc3NhZ2VDb250YWluZXIgPSB0aGlzLmQzXG4gICAgICAuc2VsZWN0KGNvbnRhaW5lcilcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAuYXR0cignY2xhc3MnLCBgYXgtY2hhcnQtbWVzc2FnZS1jb250YWluZXIgYXgtZG9udXQtY2hhcnQtbWVzc2FnZS1iYWNrZ3JvdW5kICR7c3BlY2lmaWNDbGFzc31gKTtcblxuICAgIG1lc3NhZ2VDb250YWluZXJcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtY2hhcnQtbWVzc2FnZS1pY29uIGF4LWRvbnV0LWNoYXJ0LW5vLWRhdGEtaWNvbicpXG4gICAgICAuaHRtbChgPGkgY2xhc3M9XCIke2ljb25DbGFzc30gZmEtMnhcIj48L2k+YCk7XG5cbiAgICBtZXNzYWdlQ29udGFpbmVyLmFwcGVuZCgnZGl2JykuYXR0cignY2xhc3MnLCAnYXgtY2hhcnQtbWVzc2FnZS10ZXh0IGF4LWRvbnV0LWNoYXJ0LW5vLWRhdGEtdGV4dCcpLnRleHQobWVzc2FnZVRleHQpO1xuXG4gICAgbWVzc2FnZUNvbnRhaW5lci5hcHBlbmQoJ2RpdicpLmF0dHIoJ2NsYXNzJywgJ2F4LWNoYXJ0LW1lc3NhZ2UtaGVscCBheC1kb251dC1jaGFydC1uby1kYXRhLWhlbHAnKS50ZXh0KGhlbHBUZXh0KTtcbiAgfVxuXG4gIC8vIGNvbXB1dGVUb29sdGlwUG9zaXRpb24gbW92ZWQgdG8gc2hhcmVkIGNoYXJ0IHV0aWxzXG5cbiAgLyoqXG4gICAqIEdldHMgYW4gYWNjZXNzaWJpbGl0eSBsYWJlbCBkZXNjcmliaW5nIHRoZSBkb251dCBjaGFydCBmb3Igc2NyZWVuIHJlYWRlcnNcbiAgICogQHJldHVybnMgRGVzY3JpcHRpdmUgc3RyaW5nIGZvciBzY3JlZW4gcmVhZGVyc1xuICAgKi9cbiAgcHJvdGVjdGVkIGdldEFjY2Vzc2liaWxpdHlMYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNoYXJ0RGF0YUFycmF5KCk7XG5cbiAgICBpZiAoIWRhdGEgfHwgZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnRW1wdHkgZG9udXQgY2hhcnQuIE5vIGRhdGEgYXZhaWxhYmxlLic7XG4gICAgfVxuXG4gICAgY29uc3QgdG90YWwgPSBkYXRhLnJlZHVjZSgoc3VtLCBpdGVtKSA9PiBzdW0gKyBpdGVtLnZhbHVlLCAwKTtcbiAgICBjb25zdCBzZWdtZW50RGVzY3JpcHRpb25zID0gZGF0YVxuICAgICAgLm1hcCgoc2VnbWVudCkgPT4ge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gdG90YWwgPiAwID8gKChzZWdtZW50LnZhbHVlIC8gdG90YWwpICogMTAwKS50b0ZpeGVkKDEpIDogJzAnO1xuICAgICAgICByZXR1cm4gYCR7c2VnbWVudC5sYWJlbH06ICR7c2VnbWVudC52YWx1ZX0gKCR7cGVyY2VudGFnZX0lKWA7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJzsgJyk7XG5cbiAgICByZXR1cm4gYERvbnV0IGNoYXJ0IHdpdGggJHtkYXRhLmxlbmd0aH0gc2VnbWVudHMuIFRvdGFsIHZhbHVlOiAke3RvdGFsfS4gJHtzZWdtZW50RGVzY3JpcHRpb25zfWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGF0YSBpdGVtcyBmb3IgdGhlIGxlZ2VuZFxuICAgKiBAaW1wbGVtZW50cyBBWENoYXJ0TGVnZW5kQ29tcGF0aWJsZVxuICAgKi9cbiAgZ2V0TGVnZW5kSXRlbXMoKTogQVhDaGFydExlZ2VuZEl0ZW1bXSB7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLmRhdGEoKS5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4gc3VtICsgaXRlbS52YWx1ZSwgMCk7XG4gICAgXG4gICAgcmV0dXJuIHRoaXMuY2hhcnREYXRhQXJyYXkoKS5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoe1xuICAgICAgaWQ6IGl0ZW0uaWQsXG4gICAgICBuYW1lOiBpdGVtLmxhYmVsIHx8IGBTZWdtZW50ICR7aW5kZXggKyAxfWAsXG4gICAgICB2YWx1ZTogaXRlbS52YWx1ZSxcbiAgICAgIGNvbG9yOiB0aGlzLmdldFNlZ21lbnRDb2xvcihpdGVtKSxcbiAgICAgIHBlcmNlbnRhZ2U6IHRvdGFsID4gMCA/IChpdGVtLnZhbHVlIC8gdG90YWwpICogMTAwIDogMCxcbiAgICAgIGhpZGRlbjogdGhpcy5pc1NlZ21lbnRIaWRkZW4oaXRlbS5pZCksXG4gICAgfSkpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYXgtZG9udXQtY2hhcnRcIiAjY2hhcnRDb250YWluZXIgcm9sZT1cImltZ1wiIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0QWNjZXNzaWJpbGl0eUxhYmVsKClcIj5cbiAgPCEtLSBUb29sdGlwIGNvbXBvbmVudCAtLT5cbiAgPGF4LWNoYXJ0LXRvb2x0aXBcbiAgICBbdmlzaWJsZV09XCJ0b29sdGlwVmlzaWJsZSgpXCJcbiAgICBbcG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uKClcIlxuICAgIFtkYXRhXT1cInRvb2x0aXBEYXRhKClcIlxuICAgIFtzaG93UGVyY2VudGFnZV09XCJ0cnVlXCJcbiAgPjwvYXgtY2hhcnQtdG9vbHRpcD5cbjwvZGl2PlxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1kb251dC1jaGFydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9kb251dC1jaGFydC9zcmMvYWNvcmV4LWNoYXJ0cy1kb251dC1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acorex-charts-donut-chart.mjs","sources":["../tmp-esm2022/donut-chart/lib/donut-chart.config.js","../tmp-esm2022/donut-chart/lib/donut-chart.component.js","../tmp-esm2022/donut-chart/acorex-charts-donut-chart.js"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nexport const AXDonutChartDefaultConfig = {\n showTooltip: true,\n showDataLabels: true,\n donutWidth: 35,\n cornerRadius: 4,\n animationDuration: 800,\n animationEasing: 'cubic-out',\n messages: {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All segments are hidden',\n allHiddenHelp: 'Please toggle visibility of at least one segment',\n noDataIcon: 'fa-light fa-chart-pie',\n allHiddenIcon: 'fa-light fa-eye-slash',\n },\n};\nexport const AX_DONUT_CHART_CONFIG = new InjectionToken('AX_DONUT_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXDonutChartDefaultConfig,\n});\nexport function donutChartConfig(config = {}) {\n const result = {\n ...AXDonutChartDefaultConfig,\n ...config,\n };\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9udXQtY2hhcnQuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2RvbnV0LWNoYXJ0L3NyYy9saWIvZG9udXQtY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQXVCO0lBQzNELFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGNBQWMsRUFBRSxJQUFJO0lBQ3BCLFVBQVUsRUFBRSxFQUFFO0lBQ2QsWUFBWSxFQUFFLENBQUM7SUFDZixpQkFBaUIsRUFBRSxHQUFHO0lBQ3RCLGVBQWUsRUFBRSxXQUFXO0lBQzVCLFFBQVEsRUFBRTtRQUNSLE1BQU0sRUFBRSxtQkFBbUI7UUFDM0IsVUFBVSxFQUFFLDBDQUEwQztRQUN0RCxTQUFTLEVBQUUseUJBQXlCO1FBQ3BDLGFBQWEsRUFBRSxrREFBa0Q7UUFDakUsVUFBVSxFQUFFLHVCQUF1QjtRQUNuQyxhQUFhLEVBQUUsdUJBQXVCO0tBQ3ZDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLElBQUksY0FBYyxDQUFxQix1QkFBdUIsRUFBRTtJQUNuRyxVQUFVLEVBQUUsTUFBTTtJQUNsQixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMseUJBQXlCO0NBQ3pDLENBQUMsQ0FBQztBQUlILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxTQUFrQyxFQUFFO0lBQ25FLE1BQU0sTUFBTSxHQUFHO1FBQ2IsR0FBRyx5QkFBeUI7UUFDNUIsR0FBRyxNQUFNO0tBQ1YsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhEb251dENoYXJ0T3B0aW9uIH0gZnJvbSAnLi9kb251dC1jaGFydC50eXBlJztcblxuZXhwb3J0IGNvbnN0IEFYRG9udXRDaGFydERlZmF1bHRDb25maWc6IEFYRG9udXRDaGFydE9wdGlvbiA9IHtcbiAgc2hvd1Rvb2x0aXA6IHRydWUsXG4gIHNob3dEYXRhTGFiZWxzOiB0cnVlLFxuICBkb251dFdpZHRoOiAzNSxcbiAgY29ybmVyUmFkaXVzOiA0LFxuICBhbmltYXRpb25EdXJhdGlvbjogODAwLFxuICBhbmltYXRpb25FYXNpbmc6ICdjdWJpYy1vdXQnLFxuICBtZXNzYWdlczoge1xuICAgIG5vRGF0YTogJ05vIGRhdGEgYXZhaWxhYmxlJyxcbiAgICBub0RhdGFIZWxwOiAnUGxlYXNlIHByb3ZpZGUgZGF0YSB0byBkaXNwbGF5IHRoZSBjaGFydCcsXG4gICAgYWxsSGlkZGVuOiAnQWxsIHNlZ21lbnRzIGFyZSBoaWRkZW4nLFxuICAgIGFsbEhpZGRlbkhlbHA6ICdQbGVhc2UgdG9nZ2xlIHZpc2liaWxpdHkgb2YgYXQgbGVhc3Qgb25lIHNlZ21lbnQnLFxuICAgIG5vRGF0YUljb246ICdmYS1saWdodCBmYS1jaGFydC1waWUnLFxuICAgIGFsbEhpZGRlbkljb246ICdmYS1saWdodCBmYS1leWUtc2xhc2gnLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEFYX0RPTlVUX0NIQVJUX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxBWERvbnV0Q2hhcnRPcHRpb24+KCdBWF9ET05VVF9DSEFSVF9DT05GSUcnLCB7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgZmFjdG9yeTogKCkgPT4gQVhEb251dENoYXJ0RGVmYXVsdENvbmZpZyxcbn0pO1xuXG5leHBvcnQgdHlwZSBQYXJ0aWFsRG9udXRDaGFydENvbmZpZyA9IFBhcnRpYWw8QVhEb251dENoYXJ0T3B0aW9uPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGRvbnV0Q2hhcnRDb25maWcoY29uZmlnOiBQYXJ0aWFsRG9udXRDaGFydENvbmZpZyA9IHt9KTogQVhEb251dENoYXJ0T3B0aW9uIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIC4uLkFYRG9udXRDaGFydERlZmF1bHRDb25maWcsXG4gICAgLi4uY29uZmlnLFxuICB9O1xuICByZXR1cm4gcmVzdWx0O1xufVxuIl19","import { AX_CHART_COLOR_PALETTE, AXChartComponent, computeTooltipPosition, getChartColor, getEasingFunction, } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { afterNextRender, ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, effect, inject, input, output, signal, untracked, viewChild, ViewEncapsulation, } from '@angular/core';\nimport { AX_DONUT_CHART_CONFIG } from './donut-chart.config';\nimport * as i0 from \"@angular/core\";\n/**\n * Donut Chart Component\n * Displays data in a circular donut chart with interactive segments\n */\nexport class AXDonutChartComponent extends AXChartComponent {\n // Dependency Injection\n cdr = inject(ChangeDetectorRef);\n // Inputs\n /** Chart data input */\n data = input([], ...(ngDevMode ? [{ debugName: \"data\" }] : []));\n /** Chart options input */\n options = input({}, ...(ngDevMode ? [{ debugName: \"options\" }] : []));\n // Outputs\n /** Emitted when a segment is clicked */\n segmentClick = output();\n /** Emitted when a segment has mouse hover\n * Can be used by external elements to highlight this segment\n */\n segmentHover = output();\n // Chart container reference\n chartContainerEl = viewChild.required('chartContainer');\n // D3 reference - loaded asynchronously\n d3;\n // Chart SVG reference (using 'any' since D3 is loaded dynamically at runtime)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n svg = null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pieData = [];\n // State management\n hiddenSegments = new Set();\n _initialized = signal(false, ...(ngDevMode ? [{ debugName: \"_initialized\" }] : []));\n _rendered = signal(false, ...(ngDevMode ? [{ debugName: \"_rendered\" }] : []));\n _isInitialAnimating = signal(false, ...(ngDevMode ? [{ debugName: \"_isInitialAnimating\" }] : []));\n _currentlyHighlightedSegment = signal(null, ...(ngDevMode ? [{ debugName: \"_currentlyHighlightedSegment\" }] : []));\n // Tooltip state\n _tooltipVisible = signal(false, ...(ngDevMode ? [{ debugName: \"_tooltipVisible\" }] : []));\n _tooltipPosition = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: \"_tooltipPosition\" }] : []));\n _tooltipData = signal({\n title: '',\n value: 0,\n percentage: '0%',\n color: '',\n }, ...(ngDevMode ? [{ debugName: \"_tooltipData\" }] : []));\n _tooltipRafId = null;\n _pendingTooltipCoords = null;\n // Public computed properties for the template\n tooltipVisible = this._tooltipVisible.asReadonly();\n tooltipPosition = this._tooltipPosition.asReadonly();\n tooltipData = this._tooltipData.asReadonly();\n // Inject configuration\n configToken = inject(AX_DONUT_CHART_CONFIG);\n // Inject the chart colors\n chartColors = inject(AX_CHART_COLOR_PALETTE);\n // Computed configuration options\n effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\n // Constants\n TOOLTIP_GAP = 10;\n HIGHLIGHT_TRANSITION_DURATION = 150;\n HIGHLIGHT_TRANSITION_NAME = 'highlight';\n SEGMENT_ANIMATION_DELAY = 50;\n LABEL_ANIMATION_DELAY = 200;\n MIN_CHART_DIMENSION = 200;\n MIN_CHART_FOR_LABELS = 260;\n CHART_INSET = 12;\n DIMMED_OPACITY = 0.5;\n VISIBLE_OPACITY = 1;\n // Messages with defaults\n effectiveMessages = computed(() => {\n const defaultMessages = {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All segments are hidden',\n allHiddenHelp: 'Please toggle visibility of at least one segment',\n noDataIcon: 'fa-light fa-chart-pie',\n allHiddenIcon: 'fa-light fa-eye-slash',\n };\n return {\n ...defaultMessages,\n ...this.effectiveOptions().messages,\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveMessages\" }] : []));\n // Data accessor for handling different incoming data formats\n chartDataArray = computed(() => {\n return this.data() || [];\n }, ...(ngDevMode ? [{ debugName: \"chartDataArray\" }] : []));\n // Color accessor method\n getColor(index) {\n return getChartColor(index, this.chartColors);\n }\n // Segment visibility check\n isSegmentHidden(id) {\n return this.hiddenSegments.has(id);\n }\n constructor() {\n super();\n // Dynamically load D3 and initialize the chart when the component is ready\n afterNextRender(() => {\n this._initialized.set(true);\n this.loadD3();\n });\n }\n dataChangeEffect = effect(() => {\n // Track data and options changes\n this.data();\n this.effectiveOptions();\n // Only update if already rendered\n untracked(() => {\n if (this._rendered()) {\n this.updateChart();\n }\n });\n }, ...(ngDevMode ? [{ debugName: \"dataChangeEffect\" }] : []));\n /**\n * Highlights a specific segment by ID\n * @param id The segment ID to highlight, or null to clear highlight\n */\n highlightSegment(id) {\n if (this._isInitialAnimating() || !this.svg)\n return;\n if (this._currentlyHighlightedSegment() === id)\n return;\n this._currentlyHighlightedSegment.set(id);\n // Only interrupt ongoing HIGHLIGHT transitions (not initial animations)\n this.svg.selectAll('path').interrupt(this.HIGHLIGHT_TRANSITION_NAME);\n if (id === null) {\n this.clearAllHighlights();\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const targetSegment = this.svg.selectAll('path').filter((d) => d?.data?.id === id);\n if (targetSegment.empty()) {\n this._currentlyHighlightedSegment.set(null);\n this.highlightSegment(null);\n return;\n }\n this.dimNonTargetSegments(id);\n this.highlightTargetSegment(targetSegment);\n this.segmentHover.emit(this.getSegmentDataById(id));\n }\n clearAllHighlights() {\n if (!this.svg)\n return;\n this.svg\n .selectAll('path')\n .classed('ax-donut-chart-highlighted', false)\n .classed('ax-donut-chart-dimmed', false)\n .transition(this.HIGHLIGHT_TRANSITION_NAME)\n .duration(this.HIGHLIGHT_TRANSITION_DURATION)\n .attr('transform', null)\n .style('filter', null)\n .style('opacity', this.VISIBLE_OPACITY);\n this.segmentHover.emit(null);\n }\n dimNonTargetSegments(targetId) {\n if (!this.svg)\n return;\n this.svg\n .selectAll('path')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .filter((d) => d?.data?.id !== targetId)\n .classed('ax-donut-chart-highlighted', false)\n .classed('ax-donut-chart-dimmed', true)\n .transition(this.HIGHLIGHT_TRANSITION_NAME)\n .duration(this.HIGHLIGHT_TRANSITION_DURATION)\n .attr('transform', null)\n .style('filter', null)\n .style('opacity', this.DIMMED_OPACITY);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n highlightTargetSegment(targetSegment) {\n targetSegment\n .classed('ax-donut-chart-dimmed', false)\n .classed('ax-donut-chart-highlighted', true)\n .transition(this.HIGHLIGHT_TRANSITION_NAME)\n .duration(this.HIGHLIGHT_TRANSITION_DURATION)\n .style('filter', 'url(#ax-donut-chart-segment-shadow)')\n .style('opacity', this.VISIBLE_OPACITY);\n }\n getSegmentDataById(segmentId) {\n return untracked(() => this.chartDataArray()).find((d) => d.id === segmentId) || null;\n }\n /**\n * Toggles visibility of a segment by ID\n * @param id Segment ID to toggle\n * @returns New visibility state (true = visible, false = hidden)\n */\n toggleSegment(id) {\n const chartData = this.chartDataArray();\n const wasAllHidden = chartData.length > 0 && chartData.every((d) => this.isSegmentHidden(d.id));\n if (this.hiddenSegments.has(id)) {\n // Making a segment visible\n this.hiddenSegments.delete(id);\n // If all segments were previously hidden, we need to ensure the message is cleared\n if (wasAllHidden) {\n // Force complete DOM cleanup and redraw\n if (this.chartContainerEl()?.nativeElement) {\n // Clear only chart SVG and message containers (preserve tooltip component)\n this.d3\n ?.select(this.chartContainerEl().nativeElement)\n .selectAll('svg, .ax-chart-message-container, .ax-donut-chart-no-data-message')\n .remove();\n // Force full redraw\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n }\n else {\n this.updateChart();\n }\n }\n else {\n // Hiding a segment\n this.hiddenSegments.add(id);\n this.updateChart();\n }\n return !this.isSegmentHidden(id);\n }\n ngOnDestroy() {\n this.cleanupChart();\n }\n /**\n * Loads D3.js dynamically\n */\n async loadD3() {\n try {\n this.d3 = await import('d3');\n // If container is ready, create chart\n if (this._initialized() && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n }\n catch (error) {\n console.error('Failed to load D3.js:', error);\n }\n }\n onSegmentClick(item) {\n this.segmentClick.emit(item);\n }\n /**\n * Creates the donut chart from current data\n */\n createChart() {\n if (!this.d3 || !this.chartContainerEl()?.nativeElement)\n return;\n try {\n const containerElement = this.chartContainerEl().nativeElement;\n this.clearChart(containerElement);\n const data = this.chartDataArray();\n if (!data || data.length === 0) {\n this.showNoDataMessage();\n return;\n }\n const visibleData = data.filter((item) => !this.hiddenSegments.has(item.id));\n if (visibleData.length === 0) {\n this.showAllSegmentsHiddenMessage();\n return;\n }\n const options = this.effectiveOptions();\n const { width, height } = this.setupDimensions(containerElement, options);\n this.renderDonutChart(containerElement, width, height, visibleData);\n }\n catch (error) {\n console.error('Error creating donut chart:', error);\n this.handleChartError();\n }\n }\n /**\n * Updates the chart with new data\n */\n updateChart() {\n // Reset highlighted segment state when updating\n this._currentlyHighlightedSegment.set(null);\n this.createChart(); // Recreate the chart with updated data\n }\n /**\n * Clears the chart container\n */\n clearChart(container) {\n this.d3.select(container).selectAll('svg, .ax-chart-message-container, .ax-donut-chart-no-data-message').remove();\n this._tooltipVisible.set(false);\n }\n /**\n * Shows a message when no data is available\n */\n showNoDataMessage() {\n if (!this.chartContainerEl()?.nativeElement)\n return;\n const container = this.chartContainerEl().nativeElement;\n this.renderMessage(container, this.effectiveMessages().noDataIcon, this.effectiveMessages().noData, this.effectiveMessages().noDataHelp, 'ax-donut-chart-no-data-message');\n }\n /**\n * Shows a message when all segments are hidden\n */\n showAllSegmentsHiddenMessage() {\n if (!this.chartContainerEl()?.nativeElement)\n return;\n const container = this.chartContainerEl().nativeElement;\n this.renderMessage(container, this.effectiveMessages().allHiddenIcon, this.effectiveMessages().allHidden, this.effectiveMessages().allHiddenHelp, 'ax-donut-chart-no-data-message');\n }\n /**\n * Setups chart dimensions based on container and options\n */\n setupDimensions(container, options) {\n const containerWidth = container.clientWidth || 400;\n const containerHeight = container.clientHeight || 400;\n const desiredWidth = options?.width || containerWidth;\n const desiredHeight = options?.height || containerHeight;\n const boundedWidth = Math.max(this.MIN_CHART_DIMENSION, desiredWidth);\n const boundedHeight = Math.max(this.MIN_CHART_DIMENSION, desiredHeight);\n // Keep donut geometry square so side spacing stays visually balanced.\n const chartSize = Math.max(this.MIN_CHART_DIMENSION, Math.min(boundedWidth, boundedHeight));\n const width = chartSize;\n const height = chartSize;\n return { width, height };\n }\n /**\n * Renders the donut chart with visible data\n */\n renderDonutChart(container, width, height, visibleData) {\n const total = visibleData.reduce((sum, item) => sum + item.value, 0);\n // Create SVG container with filters\n const svg = this.createSvgWithFilters(container, width, height);\n // Create main chart group\n this.svg = svg.append('g').attr('transform', `translate(${width / 2}, ${height / 2})`);\n // Create donut segments\n this.createDonutSegments(width, height, visibleData, total);\n // Add total in center\n this.addCenterDisplay(total);\n }\n /**\n * Create SVG element with filter definitions for shadows\n * @returns D3 SVG selection (any type due to dynamic D3 loading)\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n createSvgWithFilters(container, width, height) {\n const svg = this.d3\n .select(container)\n .append('svg')\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${width} ${height}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n // Add drop shadow filter\n const defs = svg.append('defs');\n const filter = defs.append('filter').attr('id', 'ax-donut-chart-segment-shadow').attr('height', '130%');\n filter.append('feGaussianBlur').attr('in', 'SourceAlpha').attr('stdDeviation', 2).attr('result', 'blur');\n filter.append('feOffset').attr('in', 'blur').attr('dx', 1).attr('dy', 1).attr('result', 'offsetBlur');\n const feComponentTransfer = filter\n .append('feComponentTransfer')\n .attr('in', 'offsetBlur')\n .attr('result', 'offsetBlur');\n feComponentTransfer.append('feFuncA').attr('type', 'linear').attr('slope', 0.3);\n const feMerge = filter.append('feMerge');\n feMerge.append('feMergeNode').attr('in', 'offsetBlur');\n feMerge.append('feMergeNode').attr('in', 'SourceGraphic');\n return svg;\n }\n /**\n * Create and render the donut segments with animations\n */\n createDonutSegments(chartWidth, chartHeight, data, total) {\n this._isInitialAnimating.set(true);\n // Create pie layout\n const pie = this.d3\n .pie()\n .value((d) => d.value)\n .sort(null)\n .padAngle(0.02);\n // Calculate the radius of the donut chart\n const maxRadius = Math.min(chartWidth, chartHeight) / 2;\n const radius = Math.max(0, maxRadius - this.CHART_INSET);\n // Calculate inner radius based on donutWidth percentage\n const donutWidthPercent = this.effectiveOptions().donutWidth / 100;\n const innerRadius = radius * (1 - donutWidthPercent);\n const outerRadius = radius * 0.95;\n const ringWidth = outerRadius - innerRadius;\n const arc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius)\n .cornerRadius(this.effectiveOptions().cornerRadius);\n const labelArc = this.d3\n .arc()\n .innerRadius(innerRadius + ringWidth / 2)\n .outerRadius(innerRadius + ringWidth / 2);\n // Get animation options\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n // Generate pie data\n this.pieData = pie(data);\n // Add segments with animation\n const segments = this.svg\n .selectAll('path')\n .data(this.pieData)\n .enter()\n .append('path')\n .attr('class', 'ax-donut-chart-segment')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .attr('fill', (d) => this.getSegmentColor(d.data))\n .style('opacity', 0)\n .style('cursor', 'pointer')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('mouseenter', (event, d) => {\n if (this.effectiveOptions().showTooltip) {\n this.handleSliceHover(event, d.data);\n }\n })\n .on('mouseleave', () => this.handleSegmentLeave())\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('click', (_event, d) => {\n this.onSegmentClick(d.data);\n });\n // Animate segments\n const numSegments = this.pieData.length;\n let completed = 0;\n segments\n .transition()\n .duration(animationDuration)\n .ease(animationEasing)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .delay((_d, i) => i * this.SEGMENT_ANIMATION_DELAY)\n .style('opacity', this.VISIBLE_OPACITY)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .attrTween('d', (d) => {\n const interpolate = this.d3.interpolate({ startAngle: d.startAngle, endAngle: d.startAngle }, d);\n return (t) => arc(interpolate(t));\n })\n .on('end', () => {\n completed++;\n if (completed >= numSegments) {\n this._isInitialAnimating.set(false);\n this.cdr.detectChanges();\n }\n })\n .on('interrupt', () => {\n // Treat interrupts as completion to avoid getting stuck in animating state\n completed++;\n if (completed >= numSegments) {\n this._isInitialAnimating.set(false);\n this.cdr.detectChanges();\n }\n });\n // Add data labels if enabled and chart size is sufficient\n if (this.effectiveOptions().showDataLabels && this.isChartLargeEnoughForLabels(chartWidth, chartHeight)) {\n this.addDataLabels(labelArc, outerRadius, innerRadius, total, animationDuration);\n }\n // Determine when all segment animations are complete (handle empty case)\n if (numSegments === 0) {\n this._isInitialAnimating.set(false);\n this.cdr.detectChanges();\n }\n }\n isChartLargeEnoughForLabels(width, height) {\n return Math.min(width, height) >= this.MIN_CHART_FOR_LABELS;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n addDataLabels(labelArc, outerRadius, innerRadius, total, animationDuration) {\n if (!this.svg)\n return;\n const dataWithLabels = this.pieData.filter((d) => {\n return this.calculateLabelFontSize(d, outerRadius, innerRadius, total) > 0;\n });\n const labels = this.svg\n .selectAll('.ax-donut-chart-data-label')\n .data(dataWithLabels)\n .enter()\n .append('text')\n .attr('class', 'ax-donut-chart-data-label')\n .style('opacity', 0)\n .style('pointer-events', 'none')\n .style('fill', 'rgb(var(--ax-comp-donut-chart-data-labels-color))')\n .attr('transform', (d) => {\n const centroid = labelArc.centroid(d);\n return `translate(${centroid[0]}, ${centroid[1]})`;\n })\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .style('font-size', (d) => `${this.calculateLabelFontSize(d, outerRadius, innerRadius, total)}px`)\n .style('font-weight', (d) => ((d.data.value / total) * 100 >= 15 ? '600' : '500'))\n .text((d) => this.getTruncatedLabelText(d, outerRadius, innerRadius, total));\n labels\n .transition()\n .duration(animationDuration)\n .delay((_d, i) => i * this.SEGMENT_ANIMATION_DELAY + this.LABEL_ANIMATION_DELAY)\n .style('opacity', this.VISIBLE_OPACITY);\n }\n /**\n * Calculates font size for data labels using the donut ring's physical dimensions.\n *\n * Primary driver is the ring width (radial space), with chord length as an\n * overflow guard and a gentle scale-down for smaller segments to create\n * visual hierarchy.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n calculateLabelFontSize(d, outerRadius, innerRadius, total) {\n const angle = d.endAngle - d.startAngle;\n const segmentPercentage = (d.data.value / total) * 100;\n if (segmentPercentage < 2)\n return 0;\n const ringWidth = outerRadius - innerRadius;\n const labelRadius = innerRadius + ringWidth / 2;\n const chordLength = 2 * labelRadius * Math.sin(angle / 2);\n const MIN_CHORD = 22;\n const MIN_RING = 16;\n if (chordLength < MIN_CHORD || ringWidth < MIN_RING)\n return 0;\n const ringBasedSize = ringWidth * 0.48;\n // Segments >= 20% get full size; smaller ones scale from 0.75 → 1.0\n const segmentScale = Math.min(1, 0.75 + 0.25 * (segmentPercentage / 20));\n // At least 2 characters (\"X%\") must fit horizontally\n const maxByChord = chordLength / (2 * 0.65);\n const fontSize = Math.min(ringBasedSize * segmentScale, maxByChord);\n const MIN_FONT_SIZE = 11;\n const MAX_FONT_SIZE = 20;\n return Math.round(Math.max(MIN_FONT_SIZE, Math.min(fontSize, MAX_FONT_SIZE)) * 2) / 2;\n }\n formatPercentage(value) {\n if (value < 1)\n return '<1%';\n if (value < 10)\n return `${value.toFixed(1)}%`;\n return `${Math.round(value)}%`;\n }\n /**\n * Returns the best-fit label text for a segment, progressively truncating\n * from \"Label (XX%)\" → \"Label\" → \"XX%\" → truncated label → truncated percentage.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getTruncatedLabelText(d, outerRadius, innerRadius, total) {\n const fontSize = this.calculateLabelFontSize(d, outerRadius, innerRadius, total);\n if (fontSize === 0)\n return '';\n const ringWidth = outerRadius - innerRadius;\n const labelRadius = innerRadius + ringWidth / 2;\n const angle = d.endAngle - d.startAngle;\n const chordLength = 2 * labelRadius * Math.sin(angle / 2);\n const availableWidth = chordLength * 0.8;\n const percentage = (d.data.value / total) * 100;\n if (percentage < 2)\n return '';\n const label = d.data.label || '';\n const percentageText = this.formatPercentage(percentage);\n const fullText = label ? `${label} (${percentageText})` : percentageText;\n if (this.doesTextFit(fullText, fontSize, availableWidth))\n return fullText;\n if (label && this.doesTextFit(label, fontSize, availableWidth))\n return label;\n if (this.doesTextFit(percentageText, fontSize, availableWidth))\n return percentageText;\n if (label)\n return this.truncateTextToFit(label, fontSize, availableWidth);\n return this.truncateTextToFit(percentageText, fontSize, availableWidth);\n }\n /**\n * Checks if text fits within available width using conservative estimation\n * Uses 0.65em per character to account for font variations\n */\n doesTextFit(text, fontSize, availableWidth) {\n if (!text)\n return false;\n // Use conservative character width (0.65em for safety)\n // Wider fonts like bold text need more space\n const estimatedWidth = text.length * fontSize * 0.65;\n return estimatedWidth <= availableWidth;\n }\n /**\n * Truncates text to fit within available width with ellipsis\n * Uses conservative character width to prevent overflow\n * Adapts character width estimation based on font size\n */\n truncateTextToFit(text, fontSize, availableWidth) {\n if (!text)\n return '';\n // Adaptive character width: smaller fonts are relatively wider\n // Larger fonts: ~0.6em, Smaller fonts: ~0.7em\n const charWidthRatio = fontSize <= 10 ? 0.7 : 0.65;\n const charWidth = fontSize * charWidthRatio;\n // Reserve space for ellipsis\n const ellipsisWidth = fontSize * 0.7;\n const availableForText = availableWidth - ellipsisWidth;\n if (availableForText <= 0)\n return '';\n const maxChars = Math.floor(availableForText / charWidth);\n if (maxChars <= 0)\n return '';\n if (text.length <= maxChars)\n return text;\n // Ensure at least 1 character before ellipsis\n return text.substring(0, Math.max(1, maxChars)) + '…';\n }\n getSegmentColor(data) {\n if (data.color)\n return data.color;\n const originalFullData = untracked(() => this.chartDataArray());\n const originalIndex = originalFullData.findIndex((item) => item.id === data.id);\n return this.getColor(originalIndex !== -1 ? originalIndex : 0);\n }\n /**\n * Handle hover effects on a segment\n */\n handleSliceHover(event, datum) {\n if (this._isInitialAnimating())\n return;\n if (this.effectiveOptions().showTooltip !== false) {\n this.showTooltip(event, datum);\n }\n this.highlightSegment(datum.id);\n }\n showTooltip(event, datum) {\n const total = untracked(() => this.data()).reduce((sum, item) => sum + item.value, 0);\n const percentage = total > 0 ? ((datum.value / total) * 100).toFixed(1) : '0';\n const color = this.getSegmentColor(datum);\n this._tooltipData.set({\n title: datum.tooltipLabel || datum.label,\n value: datum.value.toString(),\n percentage: `${percentage}%`,\n color,\n });\n this.updateTooltipPosition(event);\n this._tooltipVisible.set(true);\n }\n /**\n * Handles mouse leave from segments\n */\n handleSegmentLeave() {\n if (this._isInitialAnimating())\n return;\n this._tooltipVisible.set(false);\n this.highlightSegment(null);\n }\n updateTooltipPosition(event) {\n this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };\n if (this._tooltipRafId != null)\n return;\n this._tooltipRafId = requestAnimationFrame(() => {\n this._tooltipRafId = null;\n const coords = this._pendingTooltipCoords;\n if (!coords)\n return;\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl)\n return;\n const containerRect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip');\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = computeTooltipPosition(containerRect, tooltipRect, coords.x, coords.y, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n });\n }\n /**\n * Adds center display with total value\n */\n addCenterDisplay(total) {\n if (!this.svg)\n return;\n const chartContainerWidth = this.chartContainerEl().nativeElement.clientWidth;\n // Improved font scaling: better minimum for small sizes, better ratio for scaling\n const baseFontSize = Math.max(1.8, Math.min(3.2, chartContainerWidth / 150));\n const subTextFontSize = baseFontSize * 0.5;\n // Create group for the total display\n const totalDisplay = this.svg\n .append('g')\n .attr('class', 'ax-donut-chart-total-display')\n .attr('text-anchor', 'middle');\n // Add total value\n totalDisplay\n .append('text')\n .attr('class', 'ax-donut-chart-total-value')\n .style('font-size', `${baseFontSize}rem`)\n .style('font-weight', '600')\n .style('fill', 'rgb(var(--ax-comp-donut-chart-value-color))')\n .text(total.toLocaleString());\n // Add label\n totalDisplay\n .append('text')\n .attr('class', 'ax-donut-chart-total-label')\n .attr('dy', '1.4em')\n .style('font-size', `${subTextFontSize}rem`)\n .style('fill', 'rgb(var(--ax-comp-donut-chart-value-color))')\n .style('opacity', '0.8')\n .text(this.effectiveOptions().totalLabel || 'Total');\n }\n /**\n * Handles chart rendering errors\n */\n handleChartError() {\n const container = this.chartContainerEl()?.nativeElement;\n if (container) {\n this.showNoDataMessage();\n }\n }\n /**\n * Cleans up chart resources\n */\n cleanupChart() {\n if (this._tooltipRafId != null) {\n cancelAnimationFrame(this._tooltipRafId);\n this._tooltipRafId = null;\n }\n this._pendingTooltipCoords = null;\n if (!this.svg)\n return;\n this.d3.select(this.chartContainerEl()?.nativeElement).selectAll('svg').remove();\n this.svg = null;\n this.pieData = [];\n this.hiddenSegments.clear();\n this._tooltipVisible.set(false);\n this._currentlyHighlightedSegment.set(null);\n }\n // ===== Helper utilities for modularity and maintainability =====\n renderMessage(container, iconClass, messageText, helpText, specificClass) {\n // Clear container area first (preserve tooltip component)\n this.d3.select(container).selectAll('svg, .ax-chart-message-container, .ax-donut-chart-no-data-message').remove();\n const messageContainer = this.d3\n .select(container)\n .append('div')\n .attr('class', `ax-chart-message-container ax-donut-chart-message-background ${specificClass}`);\n messageContainer\n .append('div')\n .attr('class', 'ax-chart-message-icon ax-donut-chart-no-data-icon')\n .html(`<i class=\"${iconClass} fa-2x\"></i>`);\n messageContainer.append('div').attr('class', 'ax-chart-message-text ax-donut-chart-no-data-text').text(messageText);\n messageContainer.append('div').attr('class', 'ax-chart-message-help ax-donut-chart-no-data-help').text(helpText);\n }\n // computeTooltipPosition moved to shared chart utils\n /**\n * Gets an accessibility label describing the donut chart for screen readers\n * @returns Descriptive string for screen readers\n */\n getAccessibilityLabel() {\n const data = this.chartDataArray();\n if (!data || data.length === 0) {\n return 'Empty donut chart. No data available.';\n }\n const total = data.reduce((sum, item) => sum + item.value, 0);\n const segmentDescriptions = data\n .map((segment) => {\n const percentage = total > 0 ? ((segment.value / total) * 100).toFixed(1) : '0';\n return `${segment.label}: ${segment.value} (${percentage}%)`;\n })\n .join('; ');\n return `Donut chart with ${data.length} segments. Total value: ${total}. ${segmentDescriptions}`;\n }\n /**\n * Returns the data items for the legend\n * @implements AXChartLegendCompatible\n */\n getLegendItems() {\n const total = this.data().reduce((sum, item) => sum + item.value, 0);\n return this.chartDataArray().map((item, index) => ({\n id: item.id,\n name: item.label || `Segment ${index + 1}`,\n value: item.value,\n color: this.getSegmentColor(item),\n percentage: total > 0 ? (item.value / total) * 100 : 0,\n hidden: this.isSegmentHidden(item.id),\n }));\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXDonutChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.3.3\", type: AXDonutChartComponent, isStandalone: true, selector: \"ax-donut-chart\", inputs: { data: { classPropertyName: \"data\", publicName: \"data\", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: \"options\", publicName: \"options\", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { segmentClick: \"segmentClick\", segmentHover: \"segmentHover\" }, viewQueries: [{ propertyName: \"chartContainerEl\", first: true, predicate: [\"chartContainer\"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: \"<div class=\\\"ax-donut-chart\\\" #chartContainer role=\\\"img\\\" [attr.aria-label]=\\\"getAccessibilityLabel()\\\">\\n <!-- Tooltip component -->\\n <ax-chart-tooltip\\n [visible]=\\\"tooltipVisible()\\\"\\n [position]=\\\"tooltipPosition()\\\"\\n [data]=\\\"tooltipData()\\\"\\n [showPercentage]=\\\"true\\\"\\n ></ax-chart-tooltip>\\n</div>\\n\", styles: [\"ax-donut-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);--ax-comp-donut-chart-bg-color: 0, 0, 0, 0;--ax-comp-donut-chart-value-color: var(--ax-sys-color-on-lightest-surface)}ax-donut-chart .ax-donut-chart{width:100%;height:100%;position:relative;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);border-radius:.5rem;overflow:hidden;background-color:rgba(var(--ax-comp-donut-chart-bg-color))}ax-donut-chart .ax-donut-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-donut-chart .ax-donut-chart svg g:has(text){font-family:inherit}ax-donut-chart .ax-donut-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-donut-chart-bg-color));border:1px solid rgba(var(--ax-sys-color-surface));padding:1.5rem;border-radius:.5rem;width:80%;max-width:300px}ax-donut-chart .ax-donut-chart-no-data-message .ax-donut-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-donut-chart .ax-donut-chart-no-data-message .ax-donut-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-donut-chart .ax-donut-chart-no-data-message .ax-donut-chart-no-data-help{font-size:.8rem;opacity:.6}\\n\"], dependencies: [{ kind: \"component\", type: AXChartTooltipComponent, selector: \"ax-chart-tooltip\", inputs: [\"data\", \"position\", \"visible\", \"showPercentage\", \"style\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXDonutChartComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-donut-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"ax-donut-chart\\\" #chartContainer role=\\\"img\\\" [attr.aria-label]=\\\"getAccessibilityLabel()\\\">\\n <!-- Tooltip component -->\\n <ax-chart-tooltip\\n [visible]=\\\"tooltipVisible()\\\"\\n [position]=\\\"tooltipPosition()\\\"\\n [data]=\\\"tooltipData()\\\"\\n [showPercentage]=\\\"true\\\"\\n ></ax-chart-tooltip>\\n</div>\\n\", styles: [\"ax-donut-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);--ax-comp-donut-chart-bg-color: 0, 0, 0, 0;--ax-comp-donut-chart-value-color: var(--ax-sys-color-on-lightest-surface)}ax-donut-chart .ax-donut-chart{width:100%;height:100%;position:relative;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);border-radius:.5rem;overflow:hidden;background-color:rgba(var(--ax-comp-donut-chart-bg-color))}ax-donut-chart .ax-donut-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-donut-chart .ax-donut-chart svg g:has(text){font-family:inherit}ax-donut-chart .ax-donut-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-donut-chart-bg-color));border:1px solid rgba(var(--ax-sys-color-surface));padding:1.5rem;border-radius:.5rem;width:80%;max-width:300px}ax-donut-chart .ax-donut-chart-no-data-message .ax-donut-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-donut-chart .ax-donut-chart-no-data-message .ax-donut-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-donut-chart .ax-donut-chart-no-data-message .ax-donut-chart-no-data-help{font-size:.8rem;opacity:.6}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9udXQtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2RvbnV0LWNoYXJ0L3NyYy9saWIvZG9udXQtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2RvbnV0LWNoYXJ0L3NyYy9saWIvZG9udXQtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFFaEIsc0JBQXNCLEVBQ3RCLGFBQWEsRUFDYixpQkFBaUIsR0FDbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsdUJBQXVCLEVBQXNCLE1BQU0sOEJBQThCLENBQUM7QUFFM0YsT0FBTyxFQUNMLGVBQWUsRUFDZix1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsTUFBTSxFQUVOLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFHN0Q7OztHQUdHO0FBU0gsTUFBTSxPQUFPLHFCQUNYLFNBQVEsZ0JBQWdCO0lBR3hCLHVCQUF1QjtJQUNmLEdBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUV4QyxTQUFTO0lBQ1QsdUJBQXVCO0lBQ3ZCLElBQUksR0FBRyxLQUFLLENBQW9CLEVBQUUsZ0RBQUMsQ0FBQztJQUVwQywwQkFBMEI7SUFDMUIsT0FBTyxHQUFHLEtBQUssQ0FBcUIsRUFBRSxtREFBQyxDQUFDO0lBRXhDLFVBQVU7SUFDVix3Q0FBd0M7SUFDeEMsWUFBWSxHQUFHLE1BQU0sRUFBb0IsQ0FBQztJQUUxQzs7T0FFRztJQUNILFlBQVksR0FBRyxNQUFNLEVBQTJCLENBQUM7SUFFakQsNEJBQTRCO0lBQ1gsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBNkIsZ0JBQWdCLENBQUMsQ0FBQztJQUVyRyx1Q0FBdUM7SUFDN0IsRUFBRSxDQUF1QjtJQUVuQyw4RUFBOEU7SUFDOUUsOERBQThEO0lBQ3RELEdBQUcsR0FBUSxJQUFJLENBQUM7SUFDeEIsOERBQThEO0lBQ3RELE9BQU8sR0FBVSxFQUFFLENBQUM7SUFFNUIsbUJBQW1CO0lBQ1gsY0FBYyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDbkMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLHdEQUFDLENBQUM7SUFDN0IsU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLHFEQUFDLENBQUM7SUFDMUIsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLEtBQUssK0RBQUMsQ0FBQztJQUNwQyw0QkFBNEIsR0FBRyxNQUFNLENBQWdCLElBQUksd0VBQUMsQ0FBQztJQUVuRSxnQkFBZ0I7SUFDUixlQUFlLEdBQUcsTUFBTSxDQUFDLEtBQUssMkRBQUMsQ0FBQztJQUNoQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsNERBQUMsQ0FBQztJQUMxQyxZQUFZLEdBQUcsTUFBTSxDQUFxQjtRQUNoRCxLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDO1FBQ1IsVUFBVSxFQUFFLElBQUk7UUFDaEIsS0FBSyxFQUFFLEVBQUU7S0FDVix3REFBQyxDQUFDO0lBQ0ssYUFBYSxHQUFrQixJQUFJLENBQUM7SUFDcEMscUJBQXFCLEdBQW9DLElBQUksQ0FBQztJQUV0RSw4Q0FBOEM7SUFDcEMsY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDbkQsZUFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNyRCxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUV2RCx1QkFBdUI7SUFDZixXQUFXLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFFcEQsMEJBQTBCO0lBQ2xCLFdBQVcsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUVyRCxpQ0FBaUM7SUFDdkIsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUN6QyxPQUFPO1lBQ0wsR0FBRyxJQUFJLENBQUMsV0FBVztZQUNuQixHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7U0FDbEIsQ0FBQztJQUNKLENBQUMsNERBQUMsQ0FBQztJQUVILFlBQVk7SUFDSyxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLDZCQUE2QixHQUFHLEdBQUcsQ0FBQztJQUNwQyx5QkFBeUIsR0FBRyxXQUFXLENBQUM7SUFDeEMsdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0lBQzdCLHFCQUFxQixHQUFHLEdBQUcsQ0FBQztJQUM1QixtQkFBbUIsR0FBRyxHQUFHLENBQUM7SUFDMUIsb0JBQW9CLEdBQUcsR0FBRyxDQUFDO0lBQzNCLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFDakIsY0FBYyxHQUFHLEdBQUcsQ0FBQztJQUNyQixlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBRXJDLHlCQUF5QjtJQUNmLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDMUMsTUFBTSxlQUFlLEdBQUc7WUFDdEIsTUFBTSxFQUFFLG1CQUFtQjtZQUMzQixVQUFVLEVBQUUsMENBQTBDO1lBQ3RELFNBQVMsRUFBRSx5QkFBeUI7WUFDcEMsYUFBYSxFQUFFLGtEQUFrRDtZQUNqRSxVQUFVLEVBQUUsdUJBQXVCO1lBQ25DLGFBQWEsRUFBRSx1QkFBdUI7U0FDdkMsQ0FBQztRQUNGLE9BQU87WUFDTCxHQUFHLGVBQWU7WUFDbEIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRO1NBQ3BDLENBQUM7SUFDSixDQUFDLDZEQUFDLENBQUM7SUFFSCw2REFBNkQ7SUFDbkQsY0FBYyxHQUFHLFFBQVEsQ0FBQyxHQUF1QixFQUFFO1FBQzNELE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUMzQixDQUFDLDBEQUFDLENBQUM7SUFFSCx3QkFBd0I7SUFDZCxRQUFRLENBQUMsS0FBYTtRQUM5QixPQUFPLGFBQWEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCwyQkFBMkI7SUFDakIsZUFBZSxDQUFDLEVBQVU7UUFDbEMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQUNSLDJFQUEyRTtRQUMzRSxlQUFlLENBQUMsR0FBRyxFQUFFO1lBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFZ0IsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRTtRQUM5QyxpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFeEIsa0NBQWtDO1FBQ2xDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDYixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyw0REFBQyxDQUFDO0lBRUg7OztPQUdHO0lBQ0gsZ0JBQWdCLENBQUMsRUFBaUI7UUFDaEMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTztRQUVwRCxJQUFJLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLEVBQUU7WUFBRSxPQUFPO1FBRXZELElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFMUMsd0VBQXdFO1FBQ3hFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUVyRSxJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMxQixPQUFPO1FBQ1QsQ0FBQztRQUVELDhEQUE4RDtRQUM5RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRXhGLElBQUksYUFBYSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTztRQUV0QixJQUFJLENBQUMsR0FBRzthQUNMLFNBQVMsQ0FBQyxNQUFNLENBQUM7YUFDakIsT0FBTyxDQUFDLDRCQUE0QixFQUFFLEtBQUssQ0FBQzthQUM1QyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsS0FBSyxDQUFDO2FBQ3ZDLFVBQVUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUM7YUFDMUMsUUFBUSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQzthQUM1QyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQzthQUN2QixLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQzthQUNyQixLQUFLLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUUxQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU8sb0JBQW9CLENBQUMsUUFBZ0I7UUFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTztRQUV0QixJQUFJLENBQUMsR0FBRzthQUNMLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDbEIsOERBQThEO2FBQzdELE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssUUFBUSxDQUFDO2FBQzVDLE9BQU8sQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLENBQUM7YUFDNUMsT0FBTyxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQzthQUN0QyxVQUFVLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDO2FBQzFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUM7YUFDNUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUM7YUFDdkIsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUM7YUFDckIsS0FBSyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELDhEQUE4RDtJQUN0RCxzQkFBc0IsQ0FBQyxhQUFrQjtRQUMvQyxhQUFhO2FBQ1YsT0FBTyxDQUFDLHVCQUF1QixFQUFFLEtBQUssQ0FBQzthQUN2QyxPQUFPLENBQUMsNEJBQTRCLEVBQUUsSUFBSSxDQUFDO2FBQzNDLFVBQVUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUM7YUFDMUMsUUFBUSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQzthQUM1QyxLQUFLLENBQUMsUUFBUSxFQUFFLHFDQUFxQyxDQUFDO2FBQ3RELEtBQUssQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxTQUFpQjtRQUMxQyxPQUFPLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ3hGLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsYUFBYSxDQUFDLEVBQVU7UUFDdEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFaEcsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2hDLDJCQUEyQjtZQUMzQixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUUvQixtRkFBbUY7WUFDbkYsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDakIsd0NBQXdDO2dCQUN4QyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDO29CQUMzQywyRUFBMkU7b0JBQzNFLElBQUksQ0FBQyxFQUFFO3dCQUNMLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLGFBQWEsQ0FBQzt5QkFDOUMsU0FBUyxDQUFDLG1FQUFtRSxDQUFDO3lCQUM5RSxNQUFNLEVBQUUsQ0FBQztvQkFFWixvQkFBb0I7b0JBQ3BCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7d0JBQ2QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNyQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ1IsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sbUJBQW1CO1lBQ25CLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDO1FBRUQsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOztPQUVHO0lBQ08sS0FBSyxDQUFDLE1BQU07UUFDcEIsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QixzQ0FBc0M7WUFDdEMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hELENBQUM7SUFDSCxDQUFDO0lBRVMsY0FBYyxDQUFDLElBQXNCO1FBQzdDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNJLFdBQVc7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxhQUFhO1lBQUUsT0FBTztRQUVoRSxJQUFJLENBQUM7WUFDSCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLGFBQWEsQ0FBQztZQUMvRCxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFFbEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3pCLE9BQU87WUFDVCxDQUFDO1lBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM3RSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO2dCQUNwQyxPQUFPO1lBQ1QsQ0FBQztZQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLFdBQVc7UUFDaEIsZ0RBQWdEO1FBQ2hELElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsdUNBQXVDO0lBQzdELENBQUM7SUFFRDs7T0FFRztJQUNLLFVBQVUsQ0FBQyxTQUFzQjtRQUN2QyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsbUVBQW1FLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsSCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLGFBQWE7WUFBRSxPQUFPO1FBQ3BELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLGFBQWEsQ0FBQztRQUN4RCxJQUFJLENBQUMsYUFBYSxDQUNoQixTQUFTLEVBQ1QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsVUFBVSxFQUNuQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxNQUFNLEVBQy9CLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLFVBQVUsRUFDbkMsZ0NBQWdDLENBQ2pDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSyw0QkFBNEI7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLGFBQWE7WUFBRSxPQUFPO1FBQ3BELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLGFBQWEsQ0FBQztRQUN4RCxJQUFJLENBQUMsYUFBYSxDQUNoQixTQUFTLEVBQ1QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsYUFBYSxFQUN0QyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxTQUFTLEVBQ2xDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLGFBQWEsRUFDdEMsZ0NBQWdDLENBQ2pDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSyxlQUFlLENBQUMsU0FBc0IsRUFBRSxPQUEyQjtRQUN6RSxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsV0FBVyxJQUFJLEdBQUcsQ0FBQztRQUNwRCxNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsWUFBWSxJQUFJLEdBQUcsQ0FBQztRQUV0RCxNQUFNLFlBQVksR0FBRyxPQUFPLEVBQUUsS0FBSyxJQUFJLGNBQWMsQ0FBQztRQUN0RCxNQUFNLGFBQWEsR0FBRyxPQUFPLEVBQUUsTUFBTSxJQUFJLGVBQWUsQ0FBQztRQUN6RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN0RSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUN4RSxzRUFBc0U7UUFDdEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUU1RixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUM7UUFDeEIsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBRXpCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZ0JBQWdCLENBQ3RCLFNBQXNCLEVBQ3RCLEtBQWEsRUFDYixNQUFjLEVBQ2QsV0FBK0I7UUFFL0IsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXJFLG9DQUFvQztRQUNwQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVoRSwwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsYUFBYSxLQUFLLEdBQUcsQ0FBQyxLQUFLLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXZGLHdCQUF3QjtRQUN4QixJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFNUQsc0JBQXNCO1FBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsOERBQThEO0lBQ3RELG9CQUFvQixDQUFDLFNBQXNCLEVBQUUsS0FBYSxFQUFFLE1BQWM7UUFDaEYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUU7YUFDaEIsTUFBTSxDQUFDLFNBQVMsQ0FBQzthQUNqQixNQUFNLENBQUMsS0FBSyxDQUFDO2FBQ2IsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUM7YUFDckIsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUM7YUFDdEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQzthQUN6QyxJQUFJLENBQUMscUJBQXFCLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFaEQseUJBQXlCO1FBQ3pCLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLCtCQUErQixDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV4RyxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDekcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRXRHLE1BQU0sbUJBQW1CLEdBQUcsTUFBTTthQUMvQixNQUFNLENBQUMscUJBQXFCLENBQUM7YUFDN0IsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUM7YUFDeEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUVoQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRWhGLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztRQUUxRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7T0FFRztJQUNLLG1CQUFtQixDQUFDLFVBQWtCLEVBQUUsV0FBbUIsRUFBRSxJQUF3QixFQUFFLEtBQWE7UUFDMUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVuQyxvQkFBb0I7UUFDcEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUU7YUFDaEIsR0FBRyxFQUFvQjthQUN2QixLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7YUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQzthQUNWLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVsQiwwQ0FBMEM7UUFDMUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFekQsd0RBQXdEO1FBQ3hELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQztRQUNuRSxNQUFNLFdBQVcsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsQ0FBQztRQUVyRCxNQUFNLFdBQVcsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLE1BQU0sU0FBUyxHQUFHLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFFNUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUU7YUFDaEIsR0FBRyxFQUFFO2FBQ0wsV0FBVyxDQUFDLFdBQVcsQ0FBQzthQUN4QixXQUFXLENBQUMsV0FBVyxDQUFDO2FBQ3hCLFlBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUV0RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRTthQUNyQixHQUFHLEVBQUU7YUFDTCxXQUFXLENBQUMsV0FBVyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUM7YUFDeEMsV0FBVyxDQUFDLFdBQVcsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFNUMsd0JBQXdCO1FBQ3hCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsaUJBQWlCLENBQUM7UUFDcEUsTUFBTSxlQUFlLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUU1RixvQkFBb0I7UUFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFekIsOEJBQThCO1FBQzlCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHO2FBQ3RCLFNBQVMsQ0FBQyxNQUFNLENBQUM7YUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7YUFDbEIsS0FBSyxFQUFFO2FBQ1AsTUFBTSxDQUFDLE1BQU0sQ0FBQzthQUNkLElBQUksQ0FBQyxPQUFPLEVBQUUsd0JBQXdCLENBQUM7WUFDeEMsOERBQThEO2FBQzdELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3RELEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO2FBQ25CLEtBQUssQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDO1lBQzNCLDhEQUE4RDthQUM3RCxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUMsS0FBaUIsRUFBRSxDQUFNLEVBQUUsRUFBRTtZQUM5QyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QyxDQUFDO1FBQ0gsQ0FBQyxDQUFDO2FBQ0QsRUFBRSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzthQUNqRCxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBaUIsRUFBRSxFQUFFO1lBQ3JDLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDO1lBQ0YsOERBQThEO2FBQzdELEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFrQixFQUFFLENBQU0sRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO1FBRUwsbUJBQW1CO1FBQ25CLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ3hDLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixRQUFRO2FBQ0wsVUFBVSxFQUFFO2FBQ1osUUFBUSxDQUFDLGlCQUFpQixDQUFDO2FBQzNCLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDdEIsOERBQThEO2FBQzdELEtBQUssQ0FBQyxDQUFDLEVBQU8sRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7YUFDL0QsS0FBSyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ3ZDLDhEQUE4RDthQUM3RCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBTSxFQUFFLEVBQUU7WUFDekIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2pHLE9BQU8sQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQVcsQ0FBQztRQUN0RCxDQUFDLENBQUM7YUFDRCxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRTtZQUNkLFNBQVMsRUFBRSxDQUFDO1lBQ1osSUFBSSxTQUFTLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUMsQ0FBQzthQUNELEVBQUUsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO1lBQ3BCLDJFQUEyRTtZQUMzRSxTQUFTLEVBQUUsQ0FBQztZQUNaLElBQUksU0FBUyxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUM3QixJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzNCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVMLDBEQUEwRDtRQUMxRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsMkJBQTJCLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDeEcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNuRixDQUFDO1FBRUQseUVBQXlFO1FBQ3pFLElBQUksV0FBVyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVPLDJCQUEyQixDQUFDLEtBQWEsRUFBRSxNQUFjO1FBQy9ELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQzlELENBQUM7SUFFRCw4REFBOEQ7SUFDdEQsYUFBYSxDQUNuQixRQUFhLEVBQ2IsV0FBbUIsRUFDbkIsV0FBbUIsRUFDbkIsS0FBYSxFQUNiLGlCQUF5QjtRQUV6QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPO1FBRXRCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDL0MsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdFLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUc7YUFDcEIsU0FBUyxDQUFDLDRCQUE0QixDQUFDO2FBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUM7YUFDcEIsS0FBSyxFQUFFO2FBQ1AsTUFBTSxDQUFDLE1BQU0sQ0FBQzthQUNkLElBQUksQ0FBQyxPQUFPLEVBQUUsMkJBQTJCLENBQUM7YUFDMUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7YUFDbkIsS0FBSyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQzthQUMvQixLQUFLLENBQUMsTUFBTSxFQUFFLG1EQUFtRCxDQUFDO2FBQ2xFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUN2QixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sYUFBYSxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDckQsQ0FBQyxDQUFDO2FBQ0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUM7YUFDN0IsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFFBQVEsQ0FBQzthQUNuQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDO2FBQ2pHLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2pGLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFL0UsTUFBTTthQUNILFVBQVUsRUFBRTthQUNaLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQzthQUMzQixLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQzthQUN2RixLQUFLLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsOERBQThEO0lBQ3RELHNCQUFzQixDQUFDLENBQU0sRUFBRSxXQUFtQixFQUFFLFdBQW1CLEVBQUUsS0FBYTtRQUM1RixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDeEMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUV2RCxJQUFJLGlCQUFpQixHQUFHLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUVwQyxNQUFNLFNBQVMsR0FBRyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQzVDLE1BQU0sV0FBVyxHQUFHLFdBQVcsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFMUQsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLFdBQVcsR0FBRyxTQUFTLElBQUksU0FBUyxHQUFHLFFBQVE7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUU5RCxNQUFNLGFBQWEsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBRXZDLG9FQUFvRTtRQUNwRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV6RSxxREFBcUQ7UUFDckQsTUFBTSxVQUFVLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBRTVDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFHLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUVwRSxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDekIsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBRXpCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsS0FBYTtRQUNwQyxJQUFJLEtBQUssR0FBRyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDNUIsSUFBSSxLQUFLLEdBQUcsRUFBRTtZQUFFLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDOUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsOERBQThEO0lBQ3RELHFCQUFxQixDQUFDLENBQU0sRUFBRSxXQUFtQixFQUFFLFdBQW1CLEVBQUUsS0FBYTtRQUMzRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakYsSUFBSSxRQUFRLEtBQUssQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRTlCLE1BQU0sU0FBUyxHQUFHLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDNUMsTUFBTSxXQUFXLEdBQUcsV0FBVyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDaEQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQ3hDLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUQsTUFBTSxjQUFjLEdBQUcsV0FBVyxHQUFHLEdBQUcsQ0FBQztRQUV6QyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNoRCxJQUFJLFVBQVUsR0FBRyxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFOUIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ2pDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6RCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxLQUFLLGNBQWMsR0FBRyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7UUFFekUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsY0FBYyxDQUFDO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFDMUUsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLGNBQWMsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzdFLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsUUFBUSxFQUFFLGNBQWMsQ0FBQztZQUFFLE9BQU8sY0FBYyxDQUFDO1FBQ3RGLElBQUksS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDMUUsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxFQUFFLFFBQVEsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssV0FBVyxDQUFDLElBQVksRUFBRSxRQUFnQixFQUFFLGNBQXNCO1FBQ3hFLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFeEIsdURBQXVEO1FBQ3ZELDZDQUE2QztRQUM3QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckQsT0FBTyxjQUFjLElBQUksY0FBYyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssaUJBQWlCLENBQUMsSUFBWSxFQUFFLFFBQWdCLEVBQUUsY0FBc0I7UUFDOUUsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUVyQiwrREFBK0Q7UUFDL0QsOENBQThDO1FBQzlDLE1BQU0sY0FBYyxHQUFHLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ25ELE1BQU0sU0FBUyxHQUFHLFFBQVEsR0FBRyxjQUFjLENBQUM7UUFFNUMsNkJBQTZCO1FBQzdCLE1BQU0sYUFBYSxHQUFHLFFBQVEsR0FBRyxHQUFHLENBQUM7UUFDckMsTUFBTSxnQkFBZ0IsR0FBRyxjQUFjLEdBQUcsYUFBYSxDQUFDO1FBRXhELElBQUksZ0JBQWdCLElBQUksQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRXJDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLENBQUM7UUFFMUQsSUFBSSxRQUFRLElBQUksQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzdCLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFekMsOENBQThDO1FBQzlDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDeEQsQ0FBQztJQUVPLGVBQWUsQ0FBQyxJQUFzQjtRQUM1QyxJQUFJLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRWxDLE1BQU0sZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFaEYsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7O09BRUc7SUFDSyxnQkFBZ0IsQ0FBQyxLQUFpQixFQUFFLEtBQXVCO1FBQ2pFLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQUUsT0FBTztRQUV2QyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFdBQVcsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNsRCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU8sV0FBVyxDQUFDLEtBQWlCLEVBQUUsS0FBdUI7UUFDNUQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLE1BQU0sVUFBVSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQzlFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7WUFDcEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLEtBQUs7WUFDeEMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO1lBQzdCLFVBQVUsRUFBRSxHQUFHLFVBQVUsR0FBRztZQUM1QixLQUFLO1NBQ04sQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNLLGtCQUFrQjtRQUN4QixJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUFFLE9BQU87UUFFdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxLQUFpQjtRQUM3QyxJQUFJLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BFLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJO1lBQUUsT0FBTztRQUN2QyxJQUFJLENBQUMsYUFBYSxHQUFHLHFCQUFxQixDQUFDLEdBQUcsRUFBRTtZQUM5QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUMxQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7WUFDMUMsSUFBSSxDQUFDLE1BQU07Z0JBQUUsT0FBTztZQUNwQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxhQUFhLENBQUM7WUFDM0QsSUFBSSxDQUFDLFdBQVc7Z0JBQUUsT0FBTztZQUN6QixNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMxRCxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUF1QixDQUFDO1lBQ3BGLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUN6RSxNQUFNLEdBQUcsR0FBRyxzQkFBc0IsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDckcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQixDQUFDLEtBQWE7UUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTztRQUV0QixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7UUFDOUUsa0ZBQWtGO1FBQ2xGLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLG1CQUFtQixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0UsTUFBTSxlQUFlLEdBQUcsWUFBWSxHQUFHLEdBQUcsQ0FBQztRQUUzQyxxQ0FBcUM7UUFDckMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUc7YUFDMUIsTUFBTSxDQUFDLEdBQUcsQ0FBQzthQUNYLElBQUksQ0FBQyxPQUFPLEVBQUUsOEJBQThCLENBQUM7YUFDN0MsSUFBSSxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVqQyxrQkFBa0I7UUFDbEIsWUFBWTthQUNULE1BQU0sQ0FBQyxNQUFNLENBQUM7YUFDZCxJQUFJLENBQUMsT0FBTyxFQUFFLDRCQUE0QixDQUFDO2FBQzNDLEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQzthQUN4QyxLQUFLLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQzthQUMzQixLQUFLLENBQUMsTUFBTSxFQUFFLDZDQUE2QyxDQUFDO2FBQzVELElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUVoQyxZQUFZO1FBQ1osWUFBWTthQUNULE1BQU0sQ0FBQyxNQUFNLENBQUM7YUFDZCxJQUFJLENBQUMsT0FBTyxFQUFFLDRCQUE0QixDQUFDO2FBQzNDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDO2FBQ25CLEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxlQUFlLEtBQUssQ0FBQzthQUMzQyxLQUFLLENBQUMsTUFBTSxFQUFFLDZDQUE2QyxDQUFDO2FBQzVELEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDO2FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZ0JBQWdCO1FBQ3RCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLGFBQWEsQ0FBQztRQUN6RCxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLFlBQVk7UUFDakIsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQy9CLG9CQUFvQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztRQUVsQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPO1FBRXRCLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNqRixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztRQUNoQixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELGtFQUFrRTtJQUUxRCxhQUFhLENBQ25CLFNBQXNCLEVBQ3RCLFNBQWlCLEVBQ2pCLFdBQW1CLEVBQ25CLFFBQWdCLEVBQ2hCLGFBQXFCO1FBRXJCLDBEQUEwRDtRQUMxRCxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsbUVBQW1FLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUVsSCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxFQUFFO2FBQzdCLE1BQU0sQ0FBQyxTQUFTLENBQUM7YUFDakIsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNiLElBQUksQ0FBQyxPQUFPLEVBQUUsZ0VBQWdFLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFFbEcsZ0JBQWdCO2FBQ2IsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNiLElBQUksQ0FBQyxPQUFPLEVBQUUsbURBQW1ELENBQUM7YUFDbEUsSUFBSSxDQUFDLGFBQWEsU0FBUyxjQUFjLENBQUMsQ0FBQztRQUU5QyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxtREFBbUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVwSCxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxtREFBbUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuSCxDQUFDO0lBRUQscURBQXFEO0lBRXJEOzs7T0FHRztJQUNPLHFCQUFxQjtRQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFbkMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sdUNBQXVDLENBQUM7UUFDakQsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5RCxNQUFNLG1CQUFtQixHQUFHLElBQUk7YUFDN0IsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDZixNQUFNLFVBQVUsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNoRixPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsS0FBSyxLQUFLLFVBQVUsSUFBSSxDQUFDO1FBQy9ELENBQUMsQ0FBQzthQUNELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVkLE9BQU8sb0JBQW9CLElBQUksQ0FBQyxNQUFNLDJCQUEyQixLQUFLLEtBQUssbUJBQW1CLEVBQUUsQ0FBQztJQUNuRyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYztRQUNaLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVyRSxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLFdBQVcsS0FBSyxHQUFHLENBQUMsRUFBRTtZQUMxQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO1lBQ2pDLFVBQVUsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7U0FDdEMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO3VHQTU0QlUscUJBQXFCOzJGQUFyQixxQkFBcUIsNmlCQzNDbEMsdVVBU0EsZ3VDRCtCWSx1QkFBdUI7OzJGQUd0QixxQkFBcUI7a0JBUmpDLFNBQVM7K0JBQ0UsZ0JBQWdCLGlCQUdYLGlCQUFpQixDQUFDLElBQUksV0FDNUIsQ0FBQyx1QkFBdUIsQ0FBQyxtQkFDakIsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFYX0NIQVJUX0NPTE9SX1BBTEVUVEUsXG4gIEFYQ2hhcnRDb21wb25lbnQsXG4gIEFYQ2hhcnRDb21wb25lbnRCYXNlLFxuICBjb21wdXRlVG9vbHRpcFBvc2l0aW9uLFxuICBnZXRDaGFydENvbG9yLFxuICBnZXRFYXNpbmdGdW5jdGlvbixcbn0gZnJvbSAnQGFjb3JleC9jaGFydHMnO1xuaW1wb3J0IHsgQVhDaGFydExlZ2VuZENvbXBhdGlibGUsIEFYQ2hhcnRMZWdlbmRJdGVtIH0gZnJvbSAnQGFjb3JleC9jaGFydHMvY2hhcnQtbGVnZW5kJztcbmltcG9ydCB7IEFYQ2hhcnRUb29sdGlwQ29tcG9uZW50LCBBWENoYXJ0VG9vbHRpcERhdGEgfSBmcm9tICdAYWNvcmV4L2NoYXJ0cy9jaGFydC10b29sdGlwJztcblxuaW1wb3J0IHtcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgRWxlbWVudFJlZixcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgT25EZXN0cm95LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgdW50cmFja2VkLFxuICB2aWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYX0RPTlVUX0NIQVJUX0NPTkZJRyB9IGZyb20gJy4vZG9udXQtY2hhcnQuY29uZmlnJztcbmltcG9ydCB7IEFYRG9udXRDaGFydERhdGEsIEFYRG9udXRDaGFydE9wdGlvbiwgQVhEb251dENoYXJ0VmFsdWUgfSBmcm9tICcuL2RvbnV0LWNoYXJ0LnR5cGUnO1xuXG4vKipcbiAqIERvbnV0IENoYXJ0IENvbXBvbmVudFxuICogRGlzcGxheXMgZGF0YSBpbiBhIGNpcmN1bGFyIGRvbnV0IGNoYXJ0IHdpdGggaW50ZXJhY3RpdmUgc2VnbWVudHNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXgtZG9udXQtY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZG9udXQtY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kb251dC1jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBpbXBvcnRzOiBbQVhDaGFydFRvb2x0aXBDb21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQVhEb251dENoYXJ0Q29tcG9uZW50XG4gIGV4dGVuZHMgQVhDaGFydENvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQVhDaGFydExlZ2VuZENvbXBhdGlibGUsIEFYQ2hhcnRDb21wb25lbnRCYXNlXG57XG4gIC8vIERlcGVuZGVuY3kgSW5qZWN0aW9uXG4gIHByaXZhdGUgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAvLyBJbnB1dHNcbiAgLyoqIENoYXJ0IGRhdGEgaW5wdXQgKi9cbiAgZGF0YSA9IGlucHV0PEFYRG9udXRDaGFydFZhbHVlPihbXSk7XG5cbiAgLyoqIENoYXJ0IG9wdGlvbnMgaW5wdXQgKi9cbiAgb3B0aW9ucyA9IGlucHV0PEFYRG9udXRDaGFydE9wdGlvbj4oe30pO1xuXG4gIC8vIE91dHB1dHNcbiAgLyoqIEVtaXR0ZWQgd2hlbiBhIHNlZ21lbnQgaXMgY2xpY2tlZCAqL1xuICBzZWdtZW50Q2xpY2sgPSBvdXRwdXQ8QVhEb251dENoYXJ0RGF0YT4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIGEgc2VnbWVudCBoYXMgbW91c2UgaG92ZXJcbiAgICogQ2FuIGJlIHVzZWQgYnkgZXh0ZXJuYWwgZWxlbWVudHMgdG8gaGlnaGxpZ2h0IHRoaXMgc2VnbWVudFxuICAgKi9cbiAgc2VnbWVudEhvdmVyID0gb3V0cHV0PEFYRG9udXRDaGFydERhdGEgfCBudWxsPigpO1xuXG4gIC8vIENoYXJ0IGNvbnRhaW5lciByZWZlcmVuY2VcbiAgcHJpdmF0ZSByZWFkb25seSBjaGFydENvbnRhaW5lckVsID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignY2hhcnRDb250YWluZXInKTtcblxuICAvLyBEMyByZWZlcmVuY2UgLSBsb2FkZWQgYXN5bmNocm9ub3VzbHlcbiAgcHJvdGVjdGVkIGQzITogdHlwZW9mIGltcG9ydCgnZDMnKTtcblxuICAvLyBDaGFydCBTVkcgcmVmZXJlbmNlICh1c2luZyAnYW55JyBzaW5jZSBEMyBpcyBsb2FkZWQgZHluYW1pY2FsbHkgYXQgcnVudGltZSlcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBzdmc6IGFueSA9IG51bGw7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgcGllRGF0YTogYW55W10gPSBbXTtcblxuICAvLyBTdGF0ZSBtYW5hZ2VtZW50XG4gIHByaXZhdGUgaGlkZGVuU2VnbWVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9yZW5kZXJlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX2lzSW5pdGlhbEFuaW1hdGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX2N1cnJlbnRseUhpZ2hsaWdodGVkU2VnbWVudCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvLyBUb29sdGlwIHN0YXRlXG4gIHByaXZhdGUgX3Rvb2x0aXBWaXNpYmxlID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfdG9vbHRpcFBvc2l0aW9uID0gc2lnbmFsKHsgeDogMCwgeTogMCB9KTtcbiAgcHJpdmF0ZSBfdG9vbHRpcERhdGEgPSBzaWduYWw8QVhDaGFydFRvb2x0aXBEYXRhPih7XG4gICAgdGl0bGU6ICcnLFxuICAgIHZhbHVlOiAwLFxuICAgIHBlcmNlbnRhZ2U6ICcwJScsXG4gICAgY29sb3I6ICcnLFxuICB9KTtcbiAgcHJpdmF0ZSBfdG9vbHRpcFJhZklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfcGVuZGluZ1Rvb2x0aXBDb29yZHM6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFB1YmxpYyBjb21wdXRlZCBwcm9wZXJ0aWVzIGZvciB0aGUgdGVtcGxhdGVcbiAgcHJvdGVjdGVkIHRvb2x0aXBWaXNpYmxlID0gdGhpcy5fdG9vbHRpcFZpc2libGUuYXNSZWFkb25seSgpO1xuICBwcm90ZWN0ZWQgdG9vbHRpcFBvc2l0aW9uID0gdGhpcy5fdG9vbHRpcFBvc2l0aW9uLmFzUmVhZG9ubHkoKTtcbiAgcHJvdGVjdGVkIHRvb2x0aXBEYXRhID0gdGhpcy5fdG9vbHRpcERhdGEuYXNSZWFkb25seSgpO1xuXG4gIC8vIEluamVjdCBjb25maWd1cmF0aW9uXG4gIHByaXZhdGUgY29uZmlnVG9rZW4gPSBpbmplY3QoQVhfRE9OVVRfQ0hBUlRfQ09ORklHKTtcblxuICAvLyBJbmplY3QgdGhlIGNoYXJ0IGNvbG9yc1xuICBwcml2YXRlIGNoYXJ0Q29sb3JzID0gaW5qZWN0KEFYX0NIQVJUX0NPTE9SX1BBTEVUVEUpO1xuXG4gIC8vIENvbXB1dGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICBwcm90ZWN0ZWQgZWZmZWN0aXZlT3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25maWdUb2tlbixcbiAgICAgIC4uLnRoaXMub3B0aW9ucygpLFxuICAgIH07XG4gIH0pO1xuXG4gIC8vIENvbnN0YW50c1xuICBwcml2YXRlIHJlYWRvbmx5IFRPT0xUSVBfR0FQID0gMTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgSElHSExJR0hUX1RSQU5TSVRJT05fRFVSQVRJT04gPSAxNTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgSElHSExJR0hUX1RSQU5TSVRJT05fTkFNRSA9ICdoaWdobGlnaHQnO1xuICBwcml2YXRlIHJlYWRvbmx5IFNFR01FTlRfQU5JTUFUSU9OX0RFTEFZID0gNTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgTEFCRUxfQU5JTUFUSU9OX0RFTEFZID0gMjAwO1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9DSEFSVF9ESU1FTlNJT04gPSAyMDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX0NIQVJUX0ZPUl9MQUJFTFMgPSAyNjA7XG4gIHByaXZhdGUgcmVhZG9ubHkgQ0hBUlRfSU5TRVQgPSAxMjtcbiAgcHJpdmF0ZSByZWFkb25seSBESU1NRURfT1BBQ0lUWSA9IDAuNTtcbiAgcHJpdmF0ZSByZWFkb25seSBWSVNJQkxFX09QQUNJVFkgPSAxO1xuXG4gIC8vIE1lc3NhZ2VzIHdpdGggZGVmYXVsdHNcbiAgcHJvdGVjdGVkIGVmZmVjdGl2ZU1lc3NhZ2VzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHRNZXNzYWdlcyA9IHtcbiAgICAgIG5vRGF0YTogJ05vIGRhdGEgYXZhaWxhYmxlJyxcbiAgICAgIG5vRGF0YUhlbHA6ICdQbGVhc2UgcHJvdmlkZSBkYXRhIHRvIGRpc3BsYXkgdGhlIGNoYXJ0JyxcbiAgICAgIGFsbEhpZGRlbjogJ0FsbCBzZWdtZW50cyBhcmUgaGlkZGVuJyxcbiAgICAgIGFsbEhpZGRlbkhlbHA6ICdQbGVhc2UgdG9nZ2xlIHZpc2liaWxpdHkgb2YgYXQgbGVhc3Qgb25lIHNlZ21lbnQnLFxuICAgICAgbm9EYXRhSWNvbjogJ2ZhLWxpZ2h0IGZhLWNoYXJ0LXBpZScsXG4gICAgICBhbGxIaWRkZW5JY29uOiAnZmEtbGlnaHQgZmEtZXllLXNsYXNoJyxcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWZhdWx0TWVzc2FnZXMsXG4gICAgICAuLi50aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5tZXNzYWdlcyxcbiAgICB9O1xuICB9KTtcblxuICAvLyBEYXRhIGFjY2Vzc29yIGZvciBoYW5kbGluZyBkaWZmZXJlbnQgaW5jb21pbmcgZGF0YSBmb3JtYXRzXG4gIHByb3RlY3RlZCBjaGFydERhdGFBcnJheSA9IGNvbXB1dGVkKCgpOiBBWERvbnV0Q2hhcnREYXRhW10gPT4ge1xuICAgIHJldHVybiB0aGlzLmRhdGEoKSB8fCBbXTtcbiAgfSk7XG5cbiAgLy8gQ29sb3IgYWNjZXNzb3IgbWV0aG9kXG4gIHByb3RlY3RlZCBnZXRDb2xvcihpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0Q2hhcnRDb2xvcihpbmRleCwgdGhpcy5jaGFydENvbG9ycyk7XG4gIH1cblxuICAvLyBTZWdtZW50IHZpc2liaWxpdHkgY2hlY2tcbiAgcHJvdGVjdGVkIGlzU2VnbWVudEhpZGRlbihpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGlkZGVuU2VnbWVudHMuaGFzKGlkKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gRHluYW1pY2FsbHkgbG9hZCBEMyBhbmQgaW5pdGlhbGl6ZSB0aGUgY2hhcnQgd2hlbiB0aGUgY29tcG9uZW50IGlzIHJlYWR5XG4gICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICAgIHRoaXMuX2luaXRpYWxpemVkLnNldCh0cnVlKTtcbiAgICAgIHRoaXMubG9hZEQzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFDaGFuZ2VFZmZlY3QgPSBlZmZlY3QoKCkgPT4ge1xuICAgIC8vIFRyYWNrIGRhdGEgYW5kIG9wdGlvbnMgY2hhbmdlc1xuICAgIHRoaXMuZGF0YSgpO1xuICAgIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuXG4gICAgLy8gT25seSB1cGRhdGUgaWYgYWxyZWFkeSByZW5kZXJlZFxuICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fcmVuZGVyZWQoKSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBIaWdobGlnaHRzIGEgc3BlY2lmaWMgc2VnbWVudCBieSBJRFxuICAgKiBAcGFyYW0gaWQgVGhlIHNlZ21lbnQgSUQgdG8gaGlnaGxpZ2h0LCBvciBudWxsIHRvIGNsZWFyIGhpZ2hsaWdodFxuICAgKi9cbiAgaGlnaGxpZ2h0U2VnbWVudChpZDogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcoKSB8fCAhdGhpcy5zdmcpIHJldHVybjtcblxuICAgIGlmICh0aGlzLl9jdXJyZW50bHlIaWdobGlnaHRlZFNlZ21lbnQoKSA9PT0gaWQpIHJldHVybjtcblxuICAgIHRoaXMuX2N1cnJlbnRseUhpZ2hsaWdodGVkU2VnbWVudC5zZXQoaWQpO1xuXG4gICAgLy8gT25seSBpbnRlcnJ1cHQgb25nb2luZyBISUdITElHSFQgdHJhbnNpdGlvbnMgKG5vdCBpbml0aWFsIGFuaW1hdGlvbnMpXG4gICAgdGhpcy5zdmcuc2VsZWN0QWxsKCdwYXRoJykuaW50ZXJydXB0KHRoaXMuSElHSExJR0hUX1RSQU5TSVRJT05fTkFNRSk7XG5cbiAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuY2xlYXJBbGxIaWdobGlnaHRzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCB0YXJnZXRTZWdtZW50ID0gdGhpcy5zdmcuc2VsZWN0QWxsKCdwYXRoJykuZmlsdGVyKChkOiBhbnkpID0+IGQ/LmRhdGE/LmlkID09PSBpZCk7XG5cbiAgICBpZiAodGFyZ2V0U2VnbWVudC5lbXB0eSgpKSB7XG4gICAgICB0aGlzLl9jdXJyZW50bHlIaWdobGlnaHRlZFNlZ21lbnQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5oaWdobGlnaHRTZWdtZW50KG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGltTm9uVGFyZ2V0U2VnbWVudHMoaWQpO1xuICAgIHRoaXMuaGlnaGxpZ2h0VGFyZ2V0U2VnbWVudCh0YXJnZXRTZWdtZW50KTtcbiAgICB0aGlzLnNlZ21lbnRIb3Zlci5lbWl0KHRoaXMuZ2V0U2VnbWVudERhdGFCeUlkKGlkKSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyQWxsSGlnaGxpZ2h0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICB0aGlzLnN2Z1xuICAgICAgLnNlbGVjdEFsbCgncGF0aCcpXG4gICAgICAuY2xhc3NlZCgnYXgtZG9udXQtY2hhcnQtaGlnaGxpZ2h0ZWQnLCBmYWxzZSlcbiAgICAgIC5jbGFzc2VkKCdheC1kb251dC1jaGFydC1kaW1tZWQnLCBmYWxzZSlcbiAgICAgIC50cmFuc2l0aW9uKHRoaXMuSElHSExJR0hUX1RSQU5TSVRJT05fTkFNRSlcbiAgICAgIC5kdXJhdGlvbih0aGlzLkhJR0hMSUdIVF9UUkFOU0lUSU9OX0RVUkFUSU9OKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIG51bGwpXG4gICAgICAuc3R5bGUoJ2ZpbHRlcicsIG51bGwpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCB0aGlzLlZJU0lCTEVfT1BBQ0lUWSk7XG5cbiAgICB0aGlzLnNlZ21lbnRIb3Zlci5lbWl0KG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaW1Ob25UYXJnZXRTZWdtZW50cyh0YXJnZXRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN2ZykgcmV0dXJuO1xuXG4gICAgdGhpcy5zdmdcbiAgICAgIC5zZWxlY3RBbGwoJ3BhdGgnKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIC5maWx0ZXIoKGQ6IGFueSkgPT4gZD8uZGF0YT8uaWQgIT09IHRhcmdldElkKVxuICAgICAgLmNsYXNzZWQoJ2F4LWRvbnV0LWNoYXJ0LWhpZ2hsaWdodGVkJywgZmFsc2UpXG4gICAgICAuY2xhc3NlZCgnYXgtZG9udXQtY2hhcnQtZGltbWVkJywgdHJ1ZSlcbiAgICAgIC50cmFuc2l0aW9uKHRoaXMuSElHSExJR0hUX1RSQU5TSVRJT05fTkFNRSlcbiAgICAgIC5kdXJhdGlvbih0aGlzLkhJR0hMSUdIVF9UUkFOU0lUSU9OX0RVUkFUSU9OKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIG51bGwpXG4gICAgICAuc3R5bGUoJ2ZpbHRlcicsIG51bGwpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCB0aGlzLkRJTU1FRF9PUEFDSVRZKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgaGlnaGxpZ2h0VGFyZ2V0U2VnbWVudCh0YXJnZXRTZWdtZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0YXJnZXRTZWdtZW50XG4gICAgICAuY2xhc3NlZCgnYXgtZG9udXQtY2hhcnQtZGltbWVkJywgZmFsc2UpXG4gICAgICAuY2xhc3NlZCgnYXgtZG9udXQtY2hhcnQtaGlnaGxpZ2h0ZWQnLCB0cnVlKVxuICAgICAgLnRyYW5zaXRpb24odGhpcy5ISUdITElHSFRfVFJBTlNJVElPTl9OQU1FKVxuICAgICAgLmR1cmF0aW9uKHRoaXMuSElHSExJR0hUX1RSQU5TSVRJT05fRFVSQVRJT04pXG4gICAgICAuc3R5bGUoJ2ZpbHRlcicsICd1cmwoI2F4LWRvbnV0LWNoYXJ0LXNlZ21lbnQtc2hhZG93KScpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCB0aGlzLlZJU0lCTEVfT1BBQ0lUWSk7XG4gIH1cblxuICBwcml2YXRlIGdldFNlZ21lbnREYXRhQnlJZChzZWdtZW50SWQ6IHN0cmluZyk6IEFYRG9udXRDaGFydERhdGEgfCBudWxsIHtcbiAgICByZXR1cm4gdW50cmFja2VkKCgpID0+IHRoaXMuY2hhcnREYXRhQXJyYXkoKSkuZmluZCgoZCkgPT4gZC5pZCA9PT0gc2VnbWVudElkKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgdmlzaWJpbGl0eSBvZiBhIHNlZ21lbnQgYnkgSURcbiAgICogQHBhcmFtIGlkIFNlZ21lbnQgSUQgdG8gdG9nZ2xlXG4gICAqIEByZXR1cm5zIE5ldyB2aXNpYmlsaXR5IHN0YXRlICh0cnVlID0gdmlzaWJsZSwgZmFsc2UgPSBoaWRkZW4pXG4gICAqL1xuICB0b2dnbGVTZWdtZW50KGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBjaGFydERhdGEgPSB0aGlzLmNoYXJ0RGF0YUFycmF5KCk7XG4gICAgY29uc3Qgd2FzQWxsSGlkZGVuID0gY2hhcnREYXRhLmxlbmd0aCA+IDAgJiYgY2hhcnREYXRhLmV2ZXJ5KChkKSA9PiB0aGlzLmlzU2VnbWVudEhpZGRlbihkLmlkKSk7XG5cbiAgICBpZiAodGhpcy5oaWRkZW5TZWdtZW50cy5oYXMoaWQpKSB7XG4gICAgICAvLyBNYWtpbmcgYSBzZWdtZW50IHZpc2libGVcbiAgICAgIHRoaXMuaGlkZGVuU2VnbWVudHMuZGVsZXRlKGlkKTtcblxuICAgICAgLy8gSWYgYWxsIHNlZ21lbnRzIHdlcmUgcHJldmlvdXNseSBoaWRkZW4sIHdlIG5lZWQgdG8gZW5zdXJlIHRoZSBtZXNzYWdlIGlzIGNsZWFyZWRcbiAgICAgIGlmICh3YXNBbGxIaWRkZW4pIHtcbiAgICAgICAgLy8gRm9yY2UgY29tcGxldGUgRE9NIGNsZWFudXAgYW5kIHJlZHJhd1xuICAgICAgICBpZiAodGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBDbGVhciBvbmx5IGNoYXJ0IFNWRyBhbmQgbWVzc2FnZSBjb250YWluZXJzIChwcmVzZXJ2ZSB0b29sdGlwIGNvbXBvbmVudClcbiAgICAgICAgICB0aGlzLmQzXG4gICAgICAgICAgICA/LnNlbGVjdCh0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50KVxuICAgICAgICAgICAgLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtbWVzc2FnZS1jb250YWluZXIsIC5heC1kb251dC1jaGFydC1uby1kYXRhLW1lc3NhZ2UnKVxuICAgICAgICAgICAgLnJlbW92ZSgpO1xuXG4gICAgICAgICAgLy8gRm9yY2UgZnVsbCByZWRyYXdcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIaWRpbmcgYSBzZWdtZW50XG4gICAgICB0aGlzLmhpZGRlblNlZ21lbnRzLmFkZChpZCk7XG4gICAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuICF0aGlzLmlzU2VnbWVudEhpZGRlbihpZCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXBDaGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIEQzLmpzIGR5bmFtaWNhbGx5XG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgbG9hZEQzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmQzID0gYXdhaXQgaW1wb3J0KCdkMycpO1xuICAgICAgLy8gSWYgY29udGFpbmVyIGlzIHJlYWR5LCBjcmVhdGUgY2hhcnRcbiAgICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCgpICYmIHRoaXMuY2hhcnRDb250YWluZXJFbCgpKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZWQuc2V0KHRydWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBEMy5qczonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uU2VnbWVudENsaWNrKGl0ZW06IEFYRG9udXRDaGFydERhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnNlZ21lbnRDbGljay5lbWl0KGl0ZW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGRvbnV0IGNoYXJ0IGZyb20gY3VycmVudCBkYXRhXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmQzIHx8ICF0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50O1xuICAgICAgdGhpcy5jbGVhckNoYXJ0KGNvbnRhaW5lckVsZW1lbnQpO1xuXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5jaGFydERhdGFBcnJheSgpO1xuICAgICAgaWYgKCFkYXRhIHx8IGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuc2hvd05vRGF0YU1lc3NhZ2UoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2aXNpYmxlRGF0YSA9IGRhdGEuZmlsdGVyKChpdGVtKSA9PiAhdGhpcy5oaWRkZW5TZWdtZW50cy5oYXMoaXRlbS5pZCkpO1xuICAgICAgaWYgKHZpc2libGVEYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnNob3dBbGxTZWdtZW50c0hpZGRlbk1lc3NhZ2UoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCk7XG4gICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuc2V0dXBEaW1lbnNpb25zKGNvbnRhaW5lckVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgdGhpcy5yZW5kZXJEb251dENoYXJ0KGNvbnRhaW5lckVsZW1lbnQsIHdpZHRoLCBoZWlnaHQsIHZpc2libGVEYXRhKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY3JlYXRpbmcgZG9udXQgY2hhcnQ6JywgZXJyb3IpO1xuICAgICAgdGhpcy5oYW5kbGVDaGFydEVycm9yKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGNoYXJ0IHdpdGggbmV3IGRhdGFcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVDaGFydCgpOiB2b2lkIHtcbiAgICAvLyBSZXNldCBoaWdobGlnaHRlZCBzZWdtZW50IHN0YXRlIHdoZW4gdXBkYXRpbmdcbiAgICB0aGlzLl9jdXJyZW50bHlIaWdobGlnaHRlZFNlZ21lbnQuc2V0KG51bGwpO1xuICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTsgLy8gUmVjcmVhdGUgdGhlIGNoYXJ0IHdpdGggdXBkYXRlZCBkYXRhXG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIHRoZSBjaGFydCBjb250YWluZXJcbiAgICovXG4gIHByaXZhdGUgY2xlYXJDaGFydChjb250YWluZXI6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5kMy5zZWxlY3QoY29udGFpbmVyKS5zZWxlY3RBbGwoJ3N2ZywgLmF4LWNoYXJ0LW1lc3NhZ2UtY29udGFpbmVyLCAuYXgtZG9udXQtY2hhcnQtbm8tZGF0YS1tZXNzYWdlJykucmVtb3ZlKCk7XG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG1lc3NhZ2Ugd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZVxuICAgKi9cbiAgcHJpdmF0ZSBzaG93Tm9EYXRhTWVzc2FnZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLnJlbmRlck1lc3NhZ2UoXG4gICAgICBjb250YWluZXIsXG4gICAgICB0aGlzLmVmZmVjdGl2ZU1lc3NhZ2VzKCkubm9EYXRhSWNvbixcbiAgICAgIHRoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKS5ub0RhdGEsXG4gICAgICB0aGlzLmVmZmVjdGl2ZU1lc3NhZ2VzKCkubm9EYXRhSGVscCxcbiAgICAgICdheC1kb251dC1jaGFydC1uby1kYXRhLW1lc3NhZ2UnLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSBtZXNzYWdlIHdoZW4gYWxsIHNlZ21lbnRzIGFyZSBoaWRkZW5cbiAgICovXG4gIHByaXZhdGUgc2hvd0FsbFNlZ21lbnRzSGlkZGVuTWVzc2FnZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLnJlbmRlck1lc3NhZ2UoXG4gICAgICBjb250YWluZXIsXG4gICAgICB0aGlzLmVmZmVjdGl2ZU1lc3NhZ2VzKCkuYWxsSGlkZGVuSWNvbixcbiAgICAgIHRoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKS5hbGxIaWRkZW4sXG4gICAgICB0aGlzLmVmZmVjdGl2ZU1lc3NhZ2VzKCkuYWxsSGlkZGVuSGVscCxcbiAgICAgICdheC1kb251dC1jaGFydC1uby1kYXRhLW1lc3NhZ2UnLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0dXBzIGNoYXJ0IGRpbWVuc2lvbnMgYmFzZWQgb24gY29udGFpbmVyIGFuZCBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIHNldHVwRGltZW5zaW9ucyhjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zOiBBWERvbnV0Q2hhcnRPcHRpb24pOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gY29udGFpbmVyLmNsaWVudFdpZHRoIHx8IDQwMDtcbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSBjb250YWluZXIuY2xpZW50SGVpZ2h0IHx8IDQwMDtcblxuICAgIGNvbnN0IGRlc2lyZWRXaWR0aCA9IG9wdGlvbnM/LndpZHRoIHx8IGNvbnRhaW5lcldpZHRoO1xuICAgIGNvbnN0IGRlc2lyZWRIZWlnaHQgPSBvcHRpb25zPy5oZWlnaHQgfHwgY29udGFpbmVySGVpZ2h0O1xuICAgIGNvbnN0IGJvdW5kZWRXaWR0aCA9IE1hdGgubWF4KHRoaXMuTUlOX0NIQVJUX0RJTUVOU0lPTiwgZGVzaXJlZFdpZHRoKTtcbiAgICBjb25zdCBib3VuZGVkSGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5NSU5fQ0hBUlRfRElNRU5TSU9OLCBkZXNpcmVkSGVpZ2h0KTtcbiAgICAvLyBLZWVwIGRvbnV0IGdlb21ldHJ5IHNxdWFyZSBzbyBzaWRlIHNwYWNpbmcgc3RheXMgdmlzdWFsbHkgYmFsYW5jZWQuXG4gICAgY29uc3QgY2hhcnRTaXplID0gTWF0aC5tYXgodGhpcy5NSU5fQ0hBUlRfRElNRU5TSU9OLCBNYXRoLm1pbihib3VuZGVkV2lkdGgsIGJvdW5kZWRIZWlnaHQpKTtcblxuICAgIGNvbnN0IHdpZHRoID0gY2hhcnRTaXplO1xuICAgIGNvbnN0IGhlaWdodCA9IGNoYXJ0U2l6ZTtcblxuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBkb251dCBjaGFydCB3aXRoIHZpc2libGUgZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJEb251dENoYXJ0KFxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICB2aXNpYmxlRGF0YTogQVhEb251dENoYXJ0RGF0YVtdLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB0b3RhbCA9IHZpc2libGVEYXRhLnJlZHVjZSgoc3VtLCBpdGVtKSA9PiBzdW0gKyBpdGVtLnZhbHVlLCAwKTtcblxuICAgIC8vIENyZWF0ZSBTVkcgY29udGFpbmVyIHdpdGggZmlsdGVyc1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuY3JlYXRlU3ZnV2l0aEZpbHRlcnMoY29udGFpbmVyLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgIC8vIENyZWF0ZSBtYWluIGNoYXJ0IGdyb3VwXG4gICAgdGhpcy5zdmcgPSBzdmcuYXBwZW5kKCdnJykuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3dpZHRoIC8gMn0sICR7aGVpZ2h0IC8gMn0pYCk7XG5cbiAgICAvLyBDcmVhdGUgZG9udXQgc2VnbWVudHNcbiAgICB0aGlzLmNyZWF0ZURvbnV0U2VnbWVudHMod2lkdGgsIGhlaWdodCwgdmlzaWJsZURhdGEsIHRvdGFsKTtcblxuICAgIC8vIEFkZCB0b3RhbCBpbiBjZW50ZXJcbiAgICB0aGlzLmFkZENlbnRlckRpc3BsYXkodG90YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBTVkcgZWxlbWVudCB3aXRoIGZpbHRlciBkZWZpbml0aW9ucyBmb3Igc2hhZG93c1xuICAgKiBAcmV0dXJucyBEMyBTVkcgc2VsZWN0aW9uIChhbnkgdHlwZSBkdWUgdG8gZHluYW1pYyBEMyBsb2FkaW5nKVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBjcmVhdGVTdmdXaXRoRmlsdGVycyhjb250YWluZXI6IEhUTUxFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IGFueSB7XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5kM1xuICAgICAgLnNlbGVjdChjb250YWluZXIpXG4gICAgICAuYXBwZW5kKCdzdmcnKVxuICAgICAgLmF0dHIoJ3dpZHRoJywgJzEwMCUnKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsICcxMDAlJylcbiAgICAgIC5hdHRyKCd2aWV3Qm94JywgYDAgMCAke3dpZHRofSAke2hlaWdodH1gKVxuICAgICAgLmF0dHIoJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLCAneE1pZFlNaWQgbWVldCcpO1xuXG4gICAgLy8gQWRkIGRyb3Agc2hhZG93IGZpbHRlclxuICAgIGNvbnN0IGRlZnMgPSBzdmcuYXBwZW5kKCdkZWZzJyk7XG4gICAgY29uc3QgZmlsdGVyID0gZGVmcy5hcHBlbmQoJ2ZpbHRlcicpLmF0dHIoJ2lkJywgJ2F4LWRvbnV0LWNoYXJ0LXNlZ21lbnQtc2hhZG93JykuYXR0cignaGVpZ2h0JywgJzEzMCUnKTtcblxuICAgIGZpbHRlci5hcHBlbmQoJ2ZlR2F1c3NpYW5CbHVyJykuYXR0cignaW4nLCAnU291cmNlQWxwaGEnKS5hdHRyKCdzdGREZXZpYXRpb24nLCAyKS5hdHRyKCdyZXN1bHQnLCAnYmx1cicpO1xuICAgIGZpbHRlci5hcHBlbmQoJ2ZlT2Zmc2V0JykuYXR0cignaW4nLCAnYmx1cicpLmF0dHIoJ2R4JywgMSkuYXR0cignZHknLCAxKS5hdHRyKCdyZXN1bHQnLCAnb2Zmc2V0Qmx1cicpO1xuXG4gICAgY29uc3QgZmVDb21wb25lbnRUcmFuc2ZlciA9IGZpbHRlclxuICAgICAgLmFwcGVuZCgnZmVDb21wb25lbnRUcmFuc2ZlcicpXG4gICAgICAuYXR0cignaW4nLCAnb2Zmc2V0Qmx1cicpXG4gICAgICAuYXR0cigncmVzdWx0JywgJ29mZnNldEJsdXInKTtcblxuICAgIGZlQ29tcG9uZW50VHJhbnNmZXIuYXBwZW5kKCdmZUZ1bmNBJykuYXR0cigndHlwZScsICdsaW5lYXInKS5hdHRyKCdzbG9wZScsIDAuMyk7XG5cbiAgICBjb25zdCBmZU1lcmdlID0gZmlsdGVyLmFwcGVuZCgnZmVNZXJnZScpO1xuICAgIGZlTWVyZ2UuYXBwZW5kKCdmZU1lcmdlTm9kZScpLmF0dHIoJ2luJywgJ29mZnNldEJsdXInKTtcbiAgICBmZU1lcmdlLmFwcGVuZCgnZmVNZXJnZU5vZGUnKS5hdHRyKCdpbicsICdTb3VyY2VHcmFwaGljJyk7XG5cbiAgICByZXR1cm4gc3ZnO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbmQgcmVuZGVyIHRoZSBkb251dCBzZWdtZW50cyB3aXRoIGFuaW1hdGlvbnNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRG9udXRTZWdtZW50cyhjaGFydFdpZHRoOiBudW1iZXIsIGNoYXJ0SGVpZ2h0OiBudW1iZXIsIGRhdGE6IEFYRG9udXRDaGFydERhdGFbXSwgdG90YWw6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2lzSW5pdGlhbEFuaW1hdGluZy5zZXQodHJ1ZSk7XG5cbiAgICAvLyBDcmVhdGUgcGllIGxheW91dFxuICAgIGNvbnN0IHBpZSA9IHRoaXMuZDNcbiAgICAgIC5waWU8QVhEb251dENoYXJ0RGF0YT4oKVxuICAgICAgLnZhbHVlKChkKSA9PiBkLnZhbHVlKVxuICAgICAgLnNvcnQobnVsbClcbiAgICAgIC5wYWRBbmdsZSgwLjAyKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgcmFkaXVzIG9mIHRoZSBkb251dCBjaGFydFxuICAgIGNvbnN0IG1heFJhZGl1cyA9IE1hdGgubWluKGNoYXJ0V2lkdGgsIGNoYXJ0SGVpZ2h0KSAvIDI7XG4gICAgY29uc3QgcmFkaXVzID0gTWF0aC5tYXgoMCwgbWF4UmFkaXVzIC0gdGhpcy5DSEFSVF9JTlNFVCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgaW5uZXIgcmFkaXVzIGJhc2VkIG9uIGRvbnV0V2lkdGggcGVyY2VudGFnZVxuICAgIGNvbnN0IGRvbnV0V2lkdGhQZXJjZW50ID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuZG9udXRXaWR0aCAvIDEwMDtcbiAgICBjb25zdCBpbm5lclJhZGl1cyA9IHJhZGl1cyAqICgxIC0gZG9udXRXaWR0aFBlcmNlbnQpO1xuXG4gICAgY29uc3Qgb3V0ZXJSYWRpdXMgPSByYWRpdXMgKiAwLjk1O1xuICAgIGNvbnN0IHJpbmdXaWR0aCA9IG91dGVyUmFkaXVzIC0gaW5uZXJSYWRpdXM7XG5cbiAgICBjb25zdCBhcmMgPSB0aGlzLmQzXG4gICAgICAuYXJjKClcbiAgICAgIC5pbm5lclJhZGl1cyhpbm5lclJhZGl1cylcbiAgICAgIC5vdXRlclJhZGl1cyhvdXRlclJhZGl1cylcbiAgICAgIC5jb3JuZXJSYWRpdXModGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuY29ybmVyUmFkaXVzKTtcblxuICAgIGNvbnN0IGxhYmVsQXJjID0gdGhpcy5kM1xuICAgICAgLmFyYygpXG4gICAgICAuaW5uZXJSYWRpdXMoaW5uZXJSYWRpdXMgKyByaW5nV2lkdGggLyAyKVxuICAgICAgLm91dGVyUmFkaXVzKGlubmVyUmFkaXVzICsgcmluZ1dpZHRoIC8gMik7XG5cbiAgICAvLyBHZXQgYW5pbWF0aW9uIG9wdGlvbnNcbiAgICBjb25zdCBhbmltYXRpb25EdXJhdGlvbiA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkR1cmF0aW9uO1xuICAgIGNvbnN0IGFuaW1hdGlvbkVhc2luZyA9IGdldEVhc2luZ0Z1bmN0aW9uKHRoaXMuZDMsIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkVhc2luZyk7XG5cbiAgICAvLyBHZW5lcmF0ZSBwaWUgZGF0YVxuICAgIHRoaXMucGllRGF0YSA9IHBpZShkYXRhKTtcblxuICAgIC8vIEFkZCBzZWdtZW50cyB3aXRoIGFuaW1hdGlvblxuICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy5zdmdcbiAgICAgIC5zZWxlY3RBbGwoJ3BhdGgnKVxuICAgICAgLmRhdGEodGhpcy5waWVEYXRhKVxuICAgICAgLmVudGVyKClcbiAgICAgIC5hcHBlbmQoJ3BhdGgnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWRvbnV0LWNoYXJ0LXNlZ21lbnQnKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIC5hdHRyKCdmaWxsJywgKGQ6IGFueSkgPT4gdGhpcy5nZXRTZWdtZW50Q29sb3IoZC5kYXRhKSlcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApXG4gICAgICAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJylcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAub24oJ21vdXNlZW50ZXInLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd1Rvb2x0aXApIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZVNsaWNlSG92ZXIoZXZlbnQsIGQuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAub24oJ21vdXNlbGVhdmUnLCAoKSA9PiB0aGlzLmhhbmRsZVNlZ21lbnRMZWF2ZSgpKVxuICAgICAgLm9uKCdtb3VzZW1vdmUnLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3Rvb2x0aXBWaXNpYmxlKCkpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgLm9uKCdjbGljaycsIChfZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uU2VnbWVudENsaWNrKGQuZGF0YSk7XG4gICAgICB9KTtcblxuICAgIC8vIEFuaW1hdGUgc2VnbWVudHNcbiAgICBjb25zdCBudW1TZWdtZW50cyA9IHRoaXMucGllRGF0YS5sZW5ndGg7XG4gICAgbGV0IGNvbXBsZXRlZCA9IDA7XG4gICAgc2VnbWVudHNcbiAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgIC5kdXJhdGlvbihhbmltYXRpb25EdXJhdGlvbilcbiAgICAgIC5lYXNlKGFuaW1hdGlvbkVhc2luZylcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAuZGVsYXkoKF9kOiBhbnksIGk6IG51bWJlcikgPT4gaSAqIHRoaXMuU0VHTUVOVF9BTklNQVRJT05fREVMQVkpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCB0aGlzLlZJU0lCTEVfT1BBQ0lUWSlcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAuYXR0clR3ZWVuKCdkJywgKGQ6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZSA9IHRoaXMuZDMuaW50ZXJwb2xhdGUoeyBzdGFydEFuZ2xlOiBkLnN0YXJ0QW5nbGUsIGVuZEFuZ2xlOiBkLnN0YXJ0QW5nbGUgfSwgZCk7XG4gICAgICAgIHJldHVybiAodDogbnVtYmVyKSA9PiBhcmMoaW50ZXJwb2xhdGUodCkpIGFzIHN0cmluZztcbiAgICAgIH0pXG4gICAgICAub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgY29tcGxldGVkKys7XG4gICAgICAgIGlmIChjb21wbGV0ZWQgPj0gbnVtU2VnbWVudHMpIHtcbiAgICAgICAgICB0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAub24oJ2ludGVycnVwdCcsICgpID0+IHtcbiAgICAgICAgLy8gVHJlYXQgaW50ZXJydXB0cyBhcyBjb21wbGV0aW9uIHRvIGF2b2lkIGdldHRpbmcgc3R1Y2sgaW4gYW5pbWF0aW5nIHN0YXRlXG4gICAgICAgIGNvbXBsZXRlZCsrO1xuICAgICAgICBpZiAoY29tcGxldGVkID49IG51bVNlZ21lbnRzKSB7XG4gICAgICAgICAgdGhpcy5faXNJbml0aWFsQW5pbWF0aW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIC8vIEFkZCBkYXRhIGxhYmVscyBpZiBlbmFibGVkIGFuZCBjaGFydCBzaXplIGlzIHN1ZmZpY2llbnRcbiAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd0RhdGFMYWJlbHMgJiYgdGhpcy5pc0NoYXJ0TGFyZ2VFbm91Z2hGb3JMYWJlbHMoY2hhcnRXaWR0aCwgY2hhcnRIZWlnaHQpKSB7XG4gICAgICB0aGlzLmFkZERhdGFMYWJlbHMobGFiZWxBcmMsIG91dGVyUmFkaXVzLCBpbm5lclJhZGl1cywgdG90YWwsIGFuaW1hdGlvbkR1cmF0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgd2hlbiBhbGwgc2VnbWVudCBhbmltYXRpb25zIGFyZSBjb21wbGV0ZSAoaGFuZGxlIGVtcHR5IGNhc2UpXG4gICAgaWYgKG51bVNlZ21lbnRzID09PSAwKSB7XG4gICAgICB0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzQ2hhcnRMYXJnZUVub3VnaEZvckxhYmVscyh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KSA+PSB0aGlzLk1JTl9DSEFSVF9GT1JfTEFCRUxTO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBhZGREYXRhTGFiZWxzKFxuICAgIGxhYmVsQXJjOiBhbnksXG4gICAgb3V0ZXJSYWRpdXM6IG51bWJlcixcbiAgICBpbm5lclJhZGl1czogbnVtYmVyLFxuICAgIHRvdGFsOiBudW1iZXIsXG4gICAgYW5pbWF0aW9uRHVyYXRpb246IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN2ZykgcmV0dXJuO1xuXG4gICAgY29uc3QgZGF0YVdpdGhMYWJlbHMgPSB0aGlzLnBpZURhdGEuZmlsdGVyKChkKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVMYWJlbEZvbnRTaXplKGQsIG91dGVyUmFkaXVzLCBpbm5lclJhZGl1cywgdG90YWwpID4gMDtcbiAgICB9KTtcblxuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuc3ZnXG4gICAgICAuc2VsZWN0QWxsKCcuYXgtZG9udXQtY2hhcnQtZGF0YS1sYWJlbCcpXG4gICAgICAuZGF0YShkYXRhV2l0aExhYmVscylcbiAgICAgIC5lbnRlcigpXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1kb251dC1jaGFydC1kYXRhLWxhYmVsJylcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApXG4gICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWRvbnV0LWNoYXJ0LWRhdGEtbGFiZWxzLWNvbG9yKSknKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIChkKSA9PiB7XG4gICAgICAgIGNvbnN0IGNlbnRyb2lkID0gbGFiZWxBcmMuY2VudHJvaWQoZCk7XG4gICAgICAgIHJldHVybiBgdHJhbnNsYXRlKCR7Y2VudHJvaWRbMF19LCAke2NlbnRyb2lkWzFdfSlgO1xuICAgICAgfSlcbiAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ21pZGRsZScpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIChkKSA9PiBgJHt0aGlzLmNhbGN1bGF0ZUxhYmVsRm9udFNpemUoZCwgb3V0ZXJSYWRpdXMsIGlubmVyUmFkaXVzLCB0b3RhbCl9cHhgKVxuICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsIChkKSA9PiAoKGQuZGF0YS52YWx1ZSAvIHRvdGFsKSAqIDEwMCA+PSAxNSA/ICc2MDAnIDogJzUwMCcpKVxuICAgICAgLnRleHQoKGQpID0+IHRoaXMuZ2V0VHJ1bmNhdGVkTGFiZWxUZXh0KGQsIG91dGVyUmFkaXVzLCBpbm5lclJhZGl1cywgdG90YWwpKTtcblxuICAgIGxhYmVsc1xuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgLmRlbGF5KChfZCwgaTogbnVtYmVyKSA9PiBpICogdGhpcy5TRUdNRU5UX0FOSU1BVElPTl9ERUxBWSArIHRoaXMuTEFCRUxfQU5JTUFUSU9OX0RFTEFZKVxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgdGhpcy5WSVNJQkxFX09QQUNJVFkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgZm9udCBzaXplIGZvciBkYXRhIGxhYmVscyB1c2luZyB0aGUgZG9udXQgcmluZydzIHBoeXNpY2FsIGRpbWVuc2lvbnMuXG4gICAqXG4gICAqIFByaW1hcnkgZHJpdmVyIGlzIHRoZSByaW5nIHdpZHRoIChyYWRpYWwgc3BhY2UpLCB3aXRoIGNob3JkIGxlbmd0aCBhcyBhblxuICAgKiBvdmVyZmxvdyBndWFyZCBhbmQgYSBnZW50bGUgc2NhbGUtZG93biBmb3Igc21hbGxlciBzZWdtZW50cyB0byBjcmVhdGVcbiAgICogdmlzdWFsIGhpZXJhcmNoeS5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgY2FsY3VsYXRlTGFiZWxGb250U2l6ZShkOiBhbnksIG91dGVyUmFkaXVzOiBudW1iZXIsIGlubmVyUmFkaXVzOiBudW1iZXIsIHRvdGFsOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGFuZ2xlID0gZC5lbmRBbmdsZSAtIGQuc3RhcnRBbmdsZTtcbiAgICBjb25zdCBzZWdtZW50UGVyY2VudGFnZSA9IChkLmRhdGEudmFsdWUgLyB0b3RhbCkgKiAxMDA7XG5cbiAgICBpZiAoc2VnbWVudFBlcmNlbnRhZ2UgPCAyKSByZXR1cm4gMDtcblxuICAgIGNvbnN0IHJpbmdXaWR0aCA9IG91dGVyUmFkaXVzIC0gaW5uZXJSYWRpdXM7XG4gICAgY29uc3QgbGFiZWxSYWRpdXMgPSBpbm5lclJhZGl1cyArIHJpbmdXaWR0aCAvIDI7XG4gICAgY29uc3QgY2hvcmRMZW5ndGggPSAyICogbGFiZWxSYWRpdXMgKiBNYXRoLnNpbihhbmdsZSAvIDIpO1xuXG4gICAgY29uc3QgTUlOX0NIT1JEID0gMjI7XG4gICAgY29uc3QgTUlOX1JJTkcgPSAxNjtcbiAgICBpZiAoY2hvcmRMZW5ndGggPCBNSU5fQ0hPUkQgfHwgcmluZ1dpZHRoIDwgTUlOX1JJTkcpIHJldHVybiAwO1xuXG4gICAgY29uc3QgcmluZ0Jhc2VkU2l6ZSA9IHJpbmdXaWR0aCAqIDAuNDg7XG5cbiAgICAvLyBTZWdtZW50cyA+PSAyMCUgZ2V0IGZ1bGwgc2l6ZTsgc21hbGxlciBvbmVzIHNjYWxlIGZyb20gMC43NSDihpIgMS4wXG4gICAgY29uc3Qgc2VnbWVudFNjYWxlID0gTWF0aC5taW4oMSwgMC43NSArIDAuMjUgKiAoc2VnbWVudFBlcmNlbnRhZ2UgLyAyMCkpO1xuXG4gICAgLy8gQXQgbGVhc3QgMiBjaGFyYWN0ZXJzIChcIlglXCIpIG11c3QgZml0IGhvcml6b250YWxseVxuICAgIGNvbnN0IG1heEJ5Q2hvcmQgPSBjaG9yZExlbmd0aCAvICgyICogMC42NSk7XG5cbiAgICBjb25zdCBmb250U2l6ZSA9IE1hdGgubWluKHJpbmdCYXNlZFNpemUgKiBzZWdtZW50U2NhbGUsIG1heEJ5Q2hvcmQpO1xuXG4gICAgY29uc3QgTUlOX0ZPTlRfU0laRSA9IDExO1xuICAgIGNvbnN0IE1BWF9GT05UX1NJWkUgPSAyMDtcblxuICAgIHJldHVybiBNYXRoLnJvdW5kKE1hdGgubWF4KE1JTl9GT05UX1NJWkUsIE1hdGgubWluKGZvbnRTaXplLCBNQVhfRk9OVF9TSVpFKSkgKiAyKSAvIDI7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFBlcmNlbnRhZ2UodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlIDwgMSkgcmV0dXJuICc8MSUnO1xuICAgIGlmICh2YWx1ZSA8IDEwKSByZXR1cm4gYCR7dmFsdWUudG9GaXhlZCgxKX0lYDtcbiAgICByZXR1cm4gYCR7TWF0aC5yb3VuZCh2YWx1ZSl9JWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYmVzdC1maXQgbGFiZWwgdGV4dCBmb3IgYSBzZWdtZW50LCBwcm9ncmVzc2l2ZWx5IHRydW5jYXRpbmdcbiAgICogZnJvbSBcIkxhYmVsIChYWCUpXCIg4oaSIFwiTGFiZWxcIiDihpIgXCJYWCVcIiDihpIgdHJ1bmNhdGVkIGxhYmVsIOKGkiB0cnVuY2F0ZWQgcGVyY2VudGFnZS5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgZ2V0VHJ1bmNhdGVkTGFiZWxUZXh0KGQ6IGFueSwgb3V0ZXJSYWRpdXM6IG51bWJlciwgaW5uZXJSYWRpdXM6IG51bWJlciwgdG90YWw6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgZm9udFNpemUgPSB0aGlzLmNhbGN1bGF0ZUxhYmVsRm9udFNpemUoZCwgb3V0ZXJSYWRpdXMsIGlubmVyUmFkaXVzLCB0b3RhbCk7XG4gICAgaWYgKGZvbnRTaXplID09PSAwKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCByaW5nV2lkdGggPSBvdXRlclJhZGl1cyAtIGlubmVyUmFkaXVzO1xuICAgIGNvbnN0IGxhYmVsUmFkaXVzID0gaW5uZXJSYWRpdXMgKyByaW5nV2lkdGggLyAyO1xuICAgIGNvbnN0IGFuZ2xlID0gZC5lbmRBbmdsZSAtIGQuc3RhcnRBbmdsZTtcbiAgICBjb25zdCBjaG9yZExlbmd0aCA9IDIgKiBsYWJlbFJhZGl1cyAqIE1hdGguc2luKGFuZ2xlIC8gMik7XG4gICAgY29uc3QgYXZhaWxhYmxlV2lkdGggPSBjaG9yZExlbmd0aCAqIDAuODtcblxuICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSAoZC5kYXRhLnZhbHVlIC8gdG90YWwpICogMTAwO1xuICAgIGlmIChwZXJjZW50YWdlIDwgMikgcmV0dXJuICcnO1xuXG4gICAgY29uc3QgbGFiZWwgPSBkLmRhdGEubGFiZWwgfHwgJyc7XG4gICAgY29uc3QgcGVyY2VudGFnZVRleHQgPSB0aGlzLmZvcm1hdFBlcmNlbnRhZ2UocGVyY2VudGFnZSk7XG4gICAgY29uc3QgZnVsbFRleHQgPSBsYWJlbCA/IGAke2xhYmVsfSAoJHtwZXJjZW50YWdlVGV4dH0pYCA6IHBlcmNlbnRhZ2VUZXh0O1xuXG4gICAgaWYgKHRoaXMuZG9lc1RleHRGaXQoZnVsbFRleHQsIGZvbnRTaXplLCBhdmFpbGFibGVXaWR0aCkpIHJldHVybiBmdWxsVGV4dDtcbiAgICBpZiAobGFiZWwgJiYgdGhpcy5kb2VzVGV4dEZpdChsYWJlbCwgZm9udFNpemUsIGF2YWlsYWJsZVdpZHRoKSkgcmV0dXJuIGxhYmVsO1xuICAgIGlmICh0aGlzLmRvZXNUZXh0Rml0KHBlcmNlbnRhZ2VUZXh0LCBmb250U2l6ZSwgYXZhaWxhYmxlV2lkdGgpKSByZXR1cm4gcGVyY2VudGFnZVRleHQ7XG4gICAgaWYgKGxhYmVsKSByZXR1cm4gdGhpcy50cnVuY2F0ZVRleHRUb0ZpdChsYWJlbCwgZm9udFNpemUsIGF2YWlsYWJsZVdpZHRoKTtcbiAgICByZXR1cm4gdGhpcy50cnVuY2F0ZVRleHRUb0ZpdChwZXJjZW50YWdlVGV4dCwgZm9udFNpemUsIGF2YWlsYWJsZVdpZHRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGV4dCBmaXRzIHdpdGhpbiBhdmFpbGFibGUgd2lkdGggdXNpbmcgY29uc2VydmF0aXZlIGVzdGltYXRpb25cbiAgICogVXNlcyAwLjY1ZW0gcGVyIGNoYXJhY3RlciB0byBhY2NvdW50IGZvciBmb250IHZhcmlhdGlvbnNcbiAgICovXG4gIHByaXZhdGUgZG9lc1RleHRGaXQodGV4dDogc3RyaW5nLCBmb250U2l6ZTogbnVtYmVyLCBhdmFpbGFibGVXaWR0aDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gZmFsc2U7XG4gICAgXG4gICAgLy8gVXNlIGNvbnNlcnZhdGl2ZSBjaGFyYWN0ZXIgd2lkdGggKDAuNjVlbSBmb3Igc2FmZXR5KVxuICAgIC8vIFdpZGVyIGZvbnRzIGxpa2UgYm9sZCB0ZXh0IG5lZWQgbW9yZSBzcGFjZVxuICAgIGNvbnN0IGVzdGltYXRlZFdpZHRoID0gdGV4dC5sZW5ndGggKiBmb250U2l6ZSAqIDAuNjU7XG4gICAgcmV0dXJuIGVzdGltYXRlZFdpZHRoIDw9IGF2YWlsYWJsZVdpZHRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFRydW5jYXRlcyB0ZXh0IHRvIGZpdCB3aXRoaW4gYXZhaWxhYmxlIHdpZHRoIHdpdGggZWxsaXBzaXNcbiAgICogVXNlcyBjb25zZXJ2YXRpdmUgY2hhcmFjdGVyIHdpZHRoIHRvIHByZXZlbnQgb3ZlcmZsb3dcbiAgICogQWRhcHRzIGNoYXJhY3RlciB3aWR0aCBlc3RpbWF0aW9uIGJhc2VkIG9uIGZvbnQgc2l6ZVxuICAgKi9cbiAgcHJpdmF0ZSB0cnVuY2F0ZVRleHRUb0ZpdCh0ZXh0OiBzdHJpbmcsIGZvbnRTaXplOiBudW1iZXIsIGF2YWlsYWJsZVdpZHRoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICghdGV4dCkgcmV0dXJuICcnO1xuICAgIFxuICAgIC8vIEFkYXB0aXZlIGNoYXJhY3RlciB3aWR0aDogc21hbGxlciBmb250cyBhcmUgcmVsYXRpdmVseSB3aWRlclxuICAgIC8vIExhcmdlciBmb250czogfjAuNmVtLCBTbWFsbGVyIGZvbnRzOiB+MC43ZW1cbiAgICBjb25zdCBjaGFyV2lkdGhSYXRpbyA9IGZvbnRTaXplIDw9IDEwID8gMC43IDogMC42NTtcbiAgICBjb25zdCBjaGFyV2lkdGggPSBmb250U2l6ZSAqIGNoYXJXaWR0aFJhdGlvO1xuICAgIFxuICAgIC8vIFJlc2VydmUgc3BhY2UgZm9yIGVsbGlwc2lzXG4gICAgY29uc3QgZWxsaXBzaXNXaWR0aCA9IGZvbnRTaXplICogMC43O1xuICAgIGNvbnN0IGF2YWlsYWJsZUZvclRleHQgPSBhdmFpbGFibGVXaWR0aCAtIGVsbGlwc2lzV2lkdGg7XG4gICAgXG4gICAgaWYgKGF2YWlsYWJsZUZvclRleHQgPD0gMCkgcmV0dXJuICcnO1xuICAgIFxuICAgIGNvbnN0IG1heENoYXJzID0gTWF0aC5mbG9vcihhdmFpbGFibGVGb3JUZXh0IC8gY2hhcldpZHRoKTtcbiAgICBcbiAgICBpZiAobWF4Q2hhcnMgPD0gMCkgcmV0dXJuICcnO1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA8PSBtYXhDaGFycykgcmV0dXJuIHRleHQ7XG4gICAgXG4gICAgLy8gRW5zdXJlIGF0IGxlYXN0IDEgY2hhcmFjdGVyIGJlZm9yZSBlbGxpcHNpc1xuICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZygwLCBNYXRoLm1heCgxLCBtYXhDaGFycykpICsgJ+KApic7XG4gIH1cblxuICBwcml2YXRlIGdldFNlZ21lbnRDb2xvcihkYXRhOiBBWERvbnV0Q2hhcnREYXRhKTogc3RyaW5nIHtcbiAgICBpZiAoZGF0YS5jb2xvcikgcmV0dXJuIGRhdGEuY29sb3I7XG5cbiAgICBjb25zdCBvcmlnaW5hbEZ1bGxEYXRhID0gdW50cmFja2VkKCgpID0+IHRoaXMuY2hhcnREYXRhQXJyYXkoKSk7XG4gICAgY29uc3Qgb3JpZ2luYWxJbmRleCA9IG9yaWdpbmFsRnVsbERhdGEuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09PSBkYXRhLmlkKTtcbiAgICBcbiAgICByZXR1cm4gdGhpcy5nZXRDb2xvcihvcmlnaW5hbEluZGV4ICE9PSAtMSA/IG9yaWdpbmFsSW5kZXggOiAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgaG92ZXIgZWZmZWN0cyBvbiBhIHNlZ21lbnRcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlU2xpY2VIb3ZlcihldmVudDogTW91c2VFdmVudCwgZGF0dW06IEFYRG9udXRDaGFydERhdGEpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faXNJbml0aWFsQW5pbWF0aW5nKCkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93VG9vbHRpcCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuc2hvd1Rvb2x0aXAoZXZlbnQsIGRhdHVtKTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5oaWdobGlnaHRTZWdtZW50KGRhdHVtLmlkKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd1Rvb2x0aXAoZXZlbnQ6IE1vdXNlRXZlbnQsIGRhdHVtOiBBWERvbnV0Q2hhcnREYXRhKTogdm9pZCB7XG4gICAgY29uc3QgdG90YWwgPSB1bnRyYWNrZWQoKCkgPT4gdGhpcy5kYXRhKCkpLnJlZHVjZSgoc3VtLCBpdGVtKSA9PiBzdW0gKyBpdGVtLnZhbHVlLCAwKTtcbiAgICBjb25zdCBwZXJjZW50YWdlID0gdG90YWwgPiAwID8gKChkYXR1bS52YWx1ZSAvIHRvdGFsKSAqIDEwMCkudG9GaXhlZCgxKSA6ICcwJztcbiAgICBjb25zdCBjb2xvciA9IHRoaXMuZ2V0U2VnbWVudENvbG9yKGRhdHVtKTtcblxuICAgIHRoaXMuX3Rvb2x0aXBEYXRhLnNldCh7XG4gICAgICB0aXRsZTogZGF0dW0udG9vbHRpcExhYmVsIHx8IGRhdHVtLmxhYmVsLFxuICAgICAgdmFsdWU6IGRhdHVtLnZhbHVlLnRvU3RyaW5nKCksXG4gICAgICBwZXJjZW50YWdlOiBgJHtwZXJjZW50YWdlfSVgLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgbW91c2UgbGVhdmUgZnJvbSBzZWdtZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVTZWdtZW50TGVhdmUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzSW5pdGlhbEFuaW1hdGluZygpKSByZXR1cm47XG5cbiAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuaGlnaGxpZ2h0U2VnbWVudChudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5fcGVuZGluZ1Rvb2x0aXBDb29yZHMgPSB7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfTtcbiAgICBpZiAodGhpcy5fdG9vbHRpcFJhZklkICE9IG51bGwpIHJldHVybjtcbiAgICB0aGlzLl90b29sdGlwUmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGhpcy5fdG9vbHRpcFJhZklkID0gbnVsbDtcbiAgICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzO1xuICAgICAgaWYgKCFjb29yZHMpIHJldHVybjtcbiAgICAgIGNvbnN0IGNvbnRhaW5lckVsID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWNvbnRhaW5lckVsKSByZXR1cm47XG4gICAgICBjb25zdCBjb250YWluZXJSZWN0ID0gY29udGFpbmVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCB0b29sdGlwRWwgPSBjb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCcuY2hhcnQtdG9vbHRpcCcpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgIGNvbnN0IHRvb2x0aXBSZWN0ID0gdG9vbHRpcEVsID8gdG9vbHRpcEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogbnVsbDtcbiAgICAgIGNvbnN0IHBvcyA9IGNvbXB1dGVUb29sdGlwUG9zaXRpb24oY29udGFpbmVyUmVjdCwgdG9vbHRpcFJlY3QsIGNvb3Jkcy54LCBjb29yZHMueSwgdGhpcy5UT09MVElQX0dBUCk7XG4gICAgICB0aGlzLl90b29sdGlwUG9zaXRpb24uc2V0KHBvcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBjZW50ZXIgZGlzcGxheSB3aXRoIHRvdGFsIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGFkZENlbnRlckRpc3BsYXkodG90YWw6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdmcpIHJldHVybjtcblxuICAgIGNvbnN0IGNoYXJ0Q29udGFpbmVyV2lkdGggPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIC8vIEltcHJvdmVkIGZvbnQgc2NhbGluZzogYmV0dGVyIG1pbmltdW0gZm9yIHNtYWxsIHNpemVzLCBiZXR0ZXIgcmF0aW8gZm9yIHNjYWxpbmdcbiAgICBjb25zdCBiYXNlRm9udFNpemUgPSBNYXRoLm1heCgxLjgsIE1hdGgubWluKDMuMiwgY2hhcnRDb250YWluZXJXaWR0aCAvIDE1MCkpO1xuICAgIGNvbnN0IHN1YlRleHRGb250U2l6ZSA9IGJhc2VGb250U2l6ZSAqIDAuNTtcblxuICAgIC8vIENyZWF0ZSBncm91cCBmb3IgdGhlIHRvdGFsIGRpc3BsYXlcbiAgICBjb25zdCB0b3RhbERpc3BsYXkgPSB0aGlzLnN2Z1xuICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtZG9udXQtY2hhcnQtdG90YWwtZGlzcGxheScpXG4gICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJyk7XG5cbiAgICAvLyBBZGQgdG90YWwgdmFsdWVcbiAgICB0b3RhbERpc3BsYXlcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWRvbnV0LWNoYXJ0LXRvdGFsLXZhbHVlJylcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgYCR7YmFzZUZvbnRTaXplfXJlbWApXG4gICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJzYwMCcpXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtZG9udXQtY2hhcnQtdmFsdWUtY29sb3IpKScpXG4gICAgICAudGV4dCh0b3RhbC50b0xvY2FsZVN0cmluZygpKTtcblxuICAgIC8vIEFkZCBsYWJlbFxuICAgIHRvdGFsRGlzcGxheVxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtZG9udXQtY2hhcnQtdG90YWwtbGFiZWwnKVxuICAgICAgLmF0dHIoJ2R5JywgJzEuNGVtJylcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgYCR7c3ViVGV4dEZvbnRTaXplfXJlbWApXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtZG9udXQtY2hhcnQtdmFsdWUtY29sb3IpKScpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCAnMC44JylcbiAgICAgIC50ZXh0KHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnRvdGFsTGFiZWwgfHwgJ1RvdGFsJyk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBjaGFydCByZW5kZXJpbmcgZXJyb3JzXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUNoYXJ0RXJyb3IoKTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgdGhpcy5zaG93Tm9EYXRhTWVzc2FnZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbnMgdXAgY2hhcnQgcmVzb3VyY2VzXG4gICAqL1xuICBwdWJsaWMgY2xlYW51cENoYXJ0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl90b29sdGlwUmFmSWQgIT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdG9vbHRpcFJhZklkKTtcbiAgICAgIHRoaXMuX3Rvb2x0aXBSYWZJZCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzID0gbnVsbDtcblxuICAgIGlmICghdGhpcy5zdmcpIHJldHVybjtcblxuICAgIHRoaXMuZDMuc2VsZWN0KHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50KS5zZWxlY3RBbGwoJ3N2ZycpLnJlbW92ZSgpO1xuICAgIHRoaXMuc3ZnID0gbnVsbDtcbiAgICB0aGlzLnBpZURhdGEgPSBbXTtcbiAgICB0aGlzLmhpZGRlblNlZ21lbnRzLmNsZWFyKCk7XG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgICB0aGlzLl9jdXJyZW50bHlIaWdobGlnaHRlZFNlZ21lbnQuc2V0KG51bGwpO1xuICB9XG5cbiAgLy8gPT09PT0gSGVscGVyIHV0aWxpdGllcyBmb3IgbW9kdWxhcml0eSBhbmQgbWFpbnRhaW5hYmlsaXR5ID09PT09XG5cbiAgcHJpdmF0ZSByZW5kZXJNZXNzYWdlKFxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgaWNvbkNsYXNzOiBzdHJpbmcsXG4gICAgbWVzc2FnZVRleHQ6IHN0cmluZyxcbiAgICBoZWxwVGV4dDogc3RyaW5nLFxuICAgIHNwZWNpZmljQ2xhc3M6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgY29udGFpbmVyIGFyZWEgZmlyc3QgKHByZXNlcnZlIHRvb2x0aXAgY29tcG9uZW50KVxuICAgIHRoaXMuZDMuc2VsZWN0KGNvbnRhaW5lcikuc2VsZWN0QWxsKCdzdmcsIC5heC1jaGFydC1tZXNzYWdlLWNvbnRhaW5lciwgLmF4LWRvbnV0LWNoYXJ0LW5vLWRhdGEtbWVzc2FnZScpLnJlbW92ZSgpO1xuXG4gICAgY29uc3QgbWVzc2FnZUNvbnRhaW5lciA9IHRoaXMuZDNcbiAgICAgIC5zZWxlY3QoY29udGFpbmVyKVxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC5hdHRyKCdjbGFzcycsIGBheC1jaGFydC1tZXNzYWdlLWNvbnRhaW5lciBheC1kb251dC1jaGFydC1tZXNzYWdlLWJhY2tncm91bmQgJHtzcGVjaWZpY0NsYXNzfWApO1xuXG4gICAgbWVzc2FnZUNvbnRhaW5lclxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1jaGFydC1tZXNzYWdlLWljb24gYXgtZG9udXQtY2hhcnQtbm8tZGF0YS1pY29uJylcbiAgICAgIC5odG1sKGA8aSBjbGFzcz1cIiR7aWNvbkNsYXNzfSBmYS0yeFwiPjwvaT5gKTtcblxuICAgIG1lc3NhZ2VDb250YWluZXIuYXBwZW5kKCdkaXYnKS5hdHRyKCdjbGFzcycsICdheC1jaGFydC1tZXNzYWdlLXRleHQgYXgtZG9udXQtY2hhcnQtbm8tZGF0YS10ZXh0JykudGV4dChtZXNzYWdlVGV4dCk7XG5cbiAgICBtZXNzYWdlQ29udGFpbmVyLmFwcGVuZCgnZGl2JykuYXR0cignY2xhc3MnLCAnYXgtY2hhcnQtbWVzc2FnZS1oZWxwIGF4LWRvbnV0LWNoYXJ0LW5vLWRhdGEtaGVscCcpLnRleHQoaGVscFRleHQpO1xuICB9XG5cbiAgLy8gY29tcHV0ZVRvb2x0aXBQb3NpdGlvbiBtb3ZlZCB0byBzaGFyZWQgY2hhcnQgdXRpbHNcblxuICAvKipcbiAgICogR2V0cyBhbiBhY2Nlc3NpYmlsaXR5IGxhYmVsIGRlc2NyaWJpbmcgdGhlIGRvbnV0IGNoYXJ0IGZvciBzY3JlZW4gcmVhZGVyc1xuICAgKiBAcmV0dXJucyBEZXNjcmlwdGl2ZSBzdHJpbmcgZm9yIHNjcmVlbiByZWFkZXJzXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0QWNjZXNzaWJpbGl0eUxhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuY2hhcnREYXRhQXJyYXkoKTtcblxuICAgIGlmICghZGF0YSB8fCBkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICdFbXB0eSBkb251dCBjaGFydC4gTm8gZGF0YSBhdmFpbGFibGUuJztcbiAgICB9XG5cbiAgICBjb25zdCB0b3RhbCA9IGRhdGEucmVkdWNlKChzdW0sIGl0ZW0pID0+IHN1bSArIGl0ZW0udmFsdWUsIDApO1xuICAgIGNvbnN0IHNlZ21lbnREZXNjcmlwdGlvbnMgPSBkYXRhXG4gICAgICAubWFwKChzZWdtZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSB0b3RhbCA+IDAgPyAoKHNlZ21lbnQudmFsdWUgLyB0b3RhbCkgKiAxMDApLnRvRml4ZWQoMSkgOiAnMCc7XG4gICAgICAgIHJldHVybiBgJHtzZWdtZW50LmxhYmVsfTogJHtzZWdtZW50LnZhbHVlfSAoJHtwZXJjZW50YWdlfSUpYDtcbiAgICAgIH0pXG4gICAgICAuam9pbignOyAnKTtcblxuICAgIHJldHVybiBgRG9udXQgY2hhcnQgd2l0aCAke2RhdGEubGVuZ3RofSBzZWdtZW50cy4gVG90YWwgdmFsdWU6ICR7dG90YWx9LiAke3NlZ21lbnREZXNjcmlwdGlvbnN9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkYXRhIGl0ZW1zIGZvciB0aGUgbGVnZW5kXG4gICAqIEBpbXBsZW1lbnRzIEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlXG4gICAqL1xuICBnZXRMZWdlbmRJdGVtcygpOiBBWENoYXJ0TGVnZW5kSXRlbVtdIHtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMuZGF0YSgpLnJlZHVjZSgoc3VtLCBpdGVtKSA9PiBzdW0gKyBpdGVtLnZhbHVlLCAwKTtcbiAgICBcbiAgICByZXR1cm4gdGhpcy5jaGFydERhdGFBcnJheSgpLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XG4gICAgICBpZDogaXRlbS5pZCxcbiAgICAgIG5hbWU6IGl0ZW0ubGFiZWwgfHwgYFNlZ21lbnQgJHtpbmRleCArIDF9YCxcbiAgICAgIHZhbHVlOiBpdGVtLnZhbHVlLFxuICAgICAgY29sb3I6IHRoaXMuZ2V0U2VnbWVudENvbG9yKGl0ZW0pLFxuICAgICAgcGVyY2VudGFnZTogdG90YWwgPiAwID8gKGl0ZW0udmFsdWUgLyB0b3RhbCkgKiAxMDAgOiAwLFxuICAgICAgaGlkZGVuOiB0aGlzLmlzU2VnbWVudEhpZGRlbihpdGVtLmlkKSxcbiAgICB9KSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJheC1kb251dC1jaGFydFwiICNjaGFydENvbnRhaW5lciByb2xlPVwiaW1nXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJnZXRBY2Nlc3NpYmlsaXR5TGFiZWwoKVwiPlxuICA8IS0tIFRvb2x0aXAgY29tcG9uZW50IC0tPlxuICA8YXgtY2hhcnQtdG9vbHRpcFxuICAgIFt2aXNpYmxlXT1cInRvb2x0aXBWaXNpYmxlKClcIlxuICAgIFtwb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24oKVwiXG4gICAgW2RhdGFdPVwidG9vbHRpcERhdGEoKVwiXG4gICAgW3Nob3dQZXJjZW50YWdlXT1cInRydWVcIlxuICA+PC9heC1jaGFydC10b29sdGlwPlxuPC9kaXY+XG4iXX0=","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1kb251dC1jaGFydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9kb251dC1jaGFydC9zcmMvYWNvcmV4LWNoYXJ0cy1kb251dC1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}