@acorex/charts 20.1.29 → 20.1.32

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-bar-chart.mjs","sources":["../tmp-esm2022/bar-chart/lib/bar-chart.config.js","../tmp-esm2022/bar-chart/lib/bar-chart.component.js","../tmp-esm2022/bar-chart/acorex-charts-bar-chart.js"],"sourcesContent":["import { AX_GLOBAL_CONFIG } from '@acorex/core/config';\nimport { InjectionToken, inject } from '@angular/core';\nimport { set } from 'lodash-es';\nexport const AXBarChartDefaultConfig = {\n showXAxis: true,\n showYAxis: true,\n showGrid: true,\n showDataLabels: true,\n showTooltip: true,\n rotateXAxisLabels: 'auto',\n barWidth: 80,\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 bars are hidden',\n allHiddenHelp: 'Click on legend items to show bars',\n noDataIcon: 'fa-light fa-chart-column',\n allHiddenIcon: 'fa-light fa-eye-slash',\n },\n};\nexport const AX_BAR_CHART_CONFIG = new InjectionToken('AX_BAR_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => {\n const global = inject(AX_GLOBAL_CONFIG);\n set(global, 'chart.barChart', AXBarChartDefaultConfig);\n return AXBarChartDefaultConfig;\n },\n});\nexport function barChartConfig(config = {}) {\n const result = {\n ...AXBarChartDefaultConfig,\n ...config,\n };\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWNoYXJ0LmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9iYXItY2hhcnQvc3JjL2xpYi9iYXItY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHaEMsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQXFCO0lBQ3ZELFNBQVMsRUFBRSxJQUFJO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixRQUFRLEVBQUUsSUFBSTtJQUNkLGNBQWMsRUFBRSxJQUFJO0lBQ3BCLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGlCQUFpQixFQUFFLE1BQU07SUFDekIsUUFBUSxFQUFFLEVBQUU7SUFDWixZQUFZLEVBQUUsQ0FBQztJQUNmLGlCQUFpQixFQUFFLEdBQUc7SUFDdEIsZUFBZSxFQUFFLFdBQVc7SUFDNUIsUUFBUSxFQUFFO1FBQ1IsTUFBTSxFQUFFLG1CQUFtQjtRQUMzQixVQUFVLEVBQUUsMENBQTBDO1FBQ3RELFNBQVMsRUFBRSxxQkFBcUI7UUFDaEMsYUFBYSxFQUFFLG9DQUFvQztRQUNuRCxVQUFVLEVBQUUsMEJBQTBCO1FBQ3RDLGFBQWEsRUFBRSx1QkFBdUI7S0FDdkM7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxjQUFjLENBQW1CLHFCQUFxQixFQUFFO0lBQzdGLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDWixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN4QyxHQUFHLENBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFDdkQsT0FBTyx1QkFBdUIsQ0FBQztJQUNqQyxDQUFDO0NBQ0YsQ0FBQyxDQUFDO0FBSUgsTUFBTSxVQUFVLGNBQWMsQ0FBQyxTQUFnQyxFQUFFO0lBQy9ELE1BQU0sTUFBTSxHQUFHO1FBQ2IsR0FBRyx1QkFBdUI7UUFDMUIsR0FBRyxNQUFNO0tBQ1YsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWF9HTE9CQUxfQ09ORklHIH0gZnJvbSAnQGFjb3JleC9jb3JlL2NvbmZpZyc7XG5pbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQVhCYXJDaGFydE9wdGlvbiB9IGZyb20gJy4vYmFyLWNoYXJ0LnR5cGUnO1xuXG5leHBvcnQgY29uc3QgQVhCYXJDaGFydERlZmF1bHRDb25maWc6IEFYQmFyQ2hhcnRPcHRpb24gPSB7XG4gIHNob3dYQXhpczogdHJ1ZSxcbiAgc2hvd1lBeGlzOiB0cnVlLFxuICBzaG93R3JpZDogdHJ1ZSxcbiAgc2hvd0RhdGFMYWJlbHM6IHRydWUsXG4gIHNob3dUb29sdGlwOiB0cnVlLFxuICByb3RhdGVYQXhpc0xhYmVsczogJ2F1dG8nLFxuICBiYXJXaWR0aDogODAsXG4gIGNvcm5lclJhZGl1czogNCxcbiAgYW5pbWF0aW9uRHVyYXRpb246IDgwMCxcbiAgYW5pbWF0aW9uRWFzaW5nOiAnY3ViaWMtb3V0JyxcbiAgbWVzc2FnZXM6IHtcbiAgICBub0RhdGE6ICdObyBkYXRhIGF2YWlsYWJsZScsXG4gICAgbm9EYXRhSGVscDogJ1BsZWFzZSBwcm92aWRlIGRhdGEgdG8gZGlzcGxheSB0aGUgY2hhcnQnLFxuICAgIGFsbEhpZGRlbjogJ0FsbCBiYXJzIGFyZSBoaWRkZW4nLFxuICAgIGFsbEhpZGRlbkhlbHA6ICdDbGljayBvbiBsZWdlbmQgaXRlbXMgdG8gc2hvdyBiYXJzJyxcbiAgICBub0RhdGFJY29uOiAnZmEtbGlnaHQgZmEtY2hhcnQtY29sdW1uJyxcbiAgICBhbGxIaWRkZW5JY29uOiAnZmEtbGlnaHQgZmEtZXllLXNsYXNoJyxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBBWF9CQVJfQ0hBUlRfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPEFYQmFyQ2hhcnRPcHRpb24+KCdBWF9CQVJfQ0hBUlRfQ09ORklHJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6ICgpID0+IHtcbiAgICBjb25zdCBnbG9iYWwgPSBpbmplY3QoQVhfR0xPQkFMX0NPTkZJRyk7XG4gICAgc2V0KGdsb2JhbCwgJ2NoYXJ0LmJhckNoYXJ0JywgQVhCYXJDaGFydERlZmF1bHRDb25maWcpO1xuICAgIHJldHVybiBBWEJhckNoYXJ0RGVmYXVsdENvbmZpZztcbiAgfSxcbn0pO1xuXG5leHBvcnQgdHlwZSBQYXJ0aWFsQmFyQ2hhcnRDb25maWcgPSBQYXJ0aWFsPEFYQmFyQ2hhcnRPcHRpb24+O1xuXG5leHBvcnQgZnVuY3Rpb24gYmFyQ2hhcnRDb25maWcoY29uZmlnOiBQYXJ0aWFsQmFyQ2hhcnRDb25maWcgPSB7fSk6IEFYQmFyQ2hhcnRPcHRpb24ge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgLi4uQVhCYXJDaGFydERlZmF1bHRDb25maWcsXG4gICAgLi4uY29uZmlnLFxuICB9O1xuICByZXR1cm4gcmVzdWx0O1xufVxuIl19","import { NXComponent } from '@acorex/cdk/common';\nimport { AX_CHART_COLOR_PALETTE, computeTooltipPosition, getChartColor, getEasingFunction } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { afterNextRender, ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal, viewChild, ViewEncapsulation, } from '@angular/core';\nimport { AX_BAR_CHART_CONFIG } from './bar-chart.config';\nimport * as i0 from \"@angular/core\";\n/**\n * Bar Chart Component\n * Renders data as vertical bars with interactive hover effects and animations\n */\nexport class AXBarChartComponent extends NXComponent {\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 bar is clicked */\n barClick = output();\n // Chart container reference\n chartContainerEl = viewChild.required('chartContainer');\n // D3 reference - loaded asynchronously\n d3;\n // Chart elements\n svg;\n chart;\n xScale;\n yScale;\n xSubScale;\n xAxis;\n yAxis;\n // Chart dimensions\n width;\n height;\n margin = { top: 0, right: 0, bottom: 0, left: 0 };\n // Character width ratio heuristic for mixed Latin/Persian texts\n CHAR_WIDTH_RATIO = 0.65;\n // Tooltip gap in pixels for consistent spacing\n TOOLTIP_GAP = 10;\n // Animation state\n _initialAnimationComplete = signal(false, ...(ngDevMode ? [{ debugName: \"_initialAnimationComplete\" }] : []));\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 // Signals for component state\n _initialized = signal(false, ...(ngDevMode ? [{ debugName: \"_initialized\" }] : []));\n _rendered = signal(false, ...(ngDevMode ? [{ debugName: \"_rendered\" }] : []));\n // Tooltip accessors\n tooltipVisible = this._tooltipVisible.asReadonly();\n tooltipPosition = this._tooltipPosition.asReadonly();\n tooltipData = this._tooltipData.asReadonly();\n // Inject configuration\n configToken = inject(AX_BAR_CHART_CONFIG);\n // Inject the chart colors\n chartColors = inject(AX_CHART_COLOR_PALETTE);\n // Inject AXPlatform\n // Removed unused AXPlatform injection\n // Configuration with defaults\n effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\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 bars are hidden',\n allHiddenHelp: 'Click on legend items to show bars',\n noDataIcon: 'fa-light fa-chart-column',\n allHiddenIcon: 'fa-light fa-eye-slash',\n };\n return {\n ...defaultMessages,\n ...this.effectiveOptions().messages,\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveMessages\" }] : []));\n // Track hidden bars\n hiddenBars = new Set();\n // Track hidden series for clustered charts (by series label)\n hiddenSeries = new Set();\n // Helpers\n isClusteredData(value) {\n return Array.isArray(value) && value.length > 0 && value[0] && 'chartData' in value[0];\n }\n getClusterSeriesLabels(groups) {\n const first = groups[0]?.chartData ?? [];\n return first.map((d) => d.label);\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 // Create chart after D3 is loaded and container is available\n if (this.d3 && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n });\n // Watch for changes to redraw the chart\n effect(() => {\n // Access inputs to track them\n this.data();\n this.effectiveOptions();\n // Only update if already rendered\n if (this._rendered()) {\n this.updateChart();\n }\n });\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 /**\n * Creates the bar chart SVG and renders all elements\n */\n createChart() {\n if (!this.d3 || !this.chartContainerEl()?.nativeElement)\n return;\n const containerElement = this.chartContainerEl().nativeElement;\n const inputValue = (this.data() || []);\n const isClustered = this.isClusteredData(inputValue);\n // Visibility calculation\n let hasAnyVisible = false;\n let visibleSingleData = [];\n let groupedData = [];\n if (isClustered) {\n groupedData = inputValue;\n const seriesLabels = groupedData.length > 0 ? this.getClusterSeriesLabels(groupedData) : [];\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n hasAnyVisible = groupedData.some((g) => visibleSeries.some((_, idx) => !!g.chartData[idx]));\n }\n else {\n const single = inputValue || [];\n visibleSingleData = single.filter((d) => !this.isBarHidden(d.id));\n hasAnyVisible = visibleSingleData.length > 0;\n }\n // Clear existing chart SVG and messages (do not remove tooltip component)\n this.d3.select(containerElement).selectAll('svg, .ax-chart-message-container').remove();\n // Early return if no data\n if (!inputValue.length) {\n this.showNoDataMessage(containerElement);\n return;\n }\n // Early return if all bars are hidden\n if (!hasAnyVisible) {\n this.showAllBarsHiddenMessage(containerElement);\n return;\n }\n // Get options and setup dimensions\n const chartOptions = this.effectiveOptions();\n this.setupDimensions(containerElement, chartOptions);\n // Create scales and axes and render based on mode\n if (isClustered) {\n this.setupScalesClustered(groupedData);\n this.createAxesClustered(chartOptions, groupedData);\n this.renderBarsClustered(groupedData);\n }\n else {\n this.setupScales(visibleSingleData);\n this.createAxes(chartOptions);\n this.renderBars(visibleSingleData);\n }\n }\n /**\n * Updates the chart when inputs change\n */\n updateChart() {\n this.createChart();\n }\n /**\n * Cleans up chart resources\n */\n cleanupChart() {\n const container = this.chartContainerEl()?.nativeElement;\n if (container) {\n // Only remove chart SVG and message containers to preserve tooltip component\n this.d3?.select(container).selectAll('svg, .ax-chart-message-container').remove();\n }\n this.svg = null;\n this.chart = null;\n this._tooltipVisible.set(false);\n }\n /**\n * Sets up chart dimensions and creates SVG with responsive attributes\n */\n setupDimensions(containerElement, options) {\n // Remove outer margins; calculate only internal paddings for axes and labels\n this.margin = { top: 0, right: 0, bottom: 0, left: 0 };\n // Get container dimensions\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n // Axis visibility\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n // Internal left padding for Y-axis ticks/labels/title\n const axisAndTickPadding = 10;\n const yAxisTitleThickness = options.yAxisLabel ? 14 : 0; // rotated label thickness along X\n const yAxisTitlePadding = options.yAxisLabel ? 14 : 0; // gap between ticks and title\n const leftPaddingForYAxis = showYAxis\n ? this.calculateMaxYAxisTickLabelWidth() + axisAndTickPadding + yAxisTitlePadding + yAxisTitleThickness\n : 0;\n // Estimate internal bottom padding for X-axis ticks/labels/title\n let bottomPaddingForXAxis = 0;\n if (showXAxis) {\n const raw = (this.data() || []);\n const isClustered = this.isClusteredData(raw);\n const barCount = isClustered ? raw.length : raw.length;\n const longestLabel = (() => {\n if (isClustered) {\n const groups = raw;\n return groups.reduce((acc, g) => (acc.length > (g.label?.length ?? 0) ? acc : (g.label ?? '')), '');\n }\n const flat = raw || [];\n return flat.reduce((a, b) => (a.length > b.label.length ? a : b.label), '');\n })();\n const baseWidth = options.width ?? containerWidth;\n const workingWidth = Math.max(1, baseWidth - leftPaddingForYAxis);\n const dynamicFontSize = Math.max(10, Math.min(14, Math.round(workingWidth / 50)));\n const estimatedLongestLabelWidth = longestLabel.length * dynamicFontSize * 0.65;\n const availableWidthPerBar = barCount > 0 ? workingWidth / barCount : workingWidth;\n const willRotate = options.rotateXAxisLabels === true\n ? true\n : options.rotateXAxisLabels === false\n ? false\n : estimatedLongestLabelWidth > availableWidthPerBar;\n const tickAreaHeight = willRotate\n ? estimatedLongestLabelWidth * Math.SQRT1_2 + dynamicFontSize * Math.SQRT1_2 + 6\n : dynamicFontSize + 8;\n const gapBelowTicks = options.xAxisLabel && !willRotate ? 14 : 0; // matches renderer\n const titleBlockHeight = options.xAxisLabel && !willRotate ? 24 : 0; // 14px font + ~10px gap\n bottomPaddingForXAxis = tickAreaHeight + gapBelowTicks + titleBlockHeight;\n }\n // Determine plotting dimensions with sensible fallbacks\n const fallbackPlotHeight = 240; // ensures visible plot when container has no height\n const baseWidth = options.width ?? containerWidth;\n const totalWidth = Math.max(200, baseWidth > 0 ? baseWidth : 200);\n const plotWidth = Math.max(0, totalWidth - leftPaddingForYAxis);\n let plotHeight;\n if (options.height && options.height > 0) {\n plotHeight = Math.max(120, options.height - bottomPaddingForXAxis);\n }\n else if (containerHeight > 0) {\n plotHeight = Math.max(120, containerHeight - bottomPaddingForXAxis, fallbackPlotHeight);\n }\n else {\n plotHeight = fallbackPlotHeight;\n }\n this.width = plotWidth;\n this.height = plotHeight;\n // Create SVG with explicit pixel dimensions to avoid collapse\n // Add a small internal top padding to avoid clipping the top-most Y-axis label\n const topPaddingForTopEdge = 6;\n const totalHeight = this.height + bottomPaddingForXAxis + topPaddingForTopEdge;\n const svg = this.d3\n .select(containerElement)\n .append('svg')\n .attr('width', '100%')\n .attr('height', String(totalHeight))\n .attr('viewBox', `0 0 ${totalWidth} ${totalHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n this.svg = svg;\n // Create chart group translated by internal paddings (no external margins)\n this.chart = this.svg\n .append('g')\n .attr('class', 'chart-content')\n .attr('transform', `translate(${leftPaddingForYAxis},${topPaddingForTopEdge})`);\n }\n // calculateMargins was unused; removed to simplify and reduce maintenance surface\n /**\n * Creates x and y scales for the chart\n */\n setupScales(data) {\n // Get the bar width percentage (default 80%)\n const barWidthPercent = this.effectiveOptions().barWidth ?? 60 / 100;\n // Calculate padding based on barWidth (inverse relationship)\n const padding = Math.max(0.1, 1 - barWidthPercent);\n // Create x scale (band scale for categorical data)\n this.xScale = this.d3\n .scaleBand()\n .domain(data.map((d) => d.id))\n .range([0, this.width])\n .padding(padding);\n // Create y scale (linear scale for values)\n this.yScale = this.d3\n .scaleLinear()\n .domain([0, this.d3.max(data, (d) => d.value) || 0])\n .nice()\n .range([this.height, 0]);\n }\n /**\n * Creates x and y scales for clustered charts\n */\n setupScalesClustered(groups) {\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n // Outer band for clusters\n const outerPadding = 0.2;\n this.xScale = this.d3\n .scaleBand()\n .domain(groups.map((g) => g.id))\n .range([0, this.width])\n .padding(outerPadding);\n // Inner band for series\n this.xSubScale = this.d3.scaleBand().domain(visibleSeries).range([0, this.xScale.bandwidth()]).padding(0.1);\n // Y scale across all visible values\n const allVisibleValues = [];\n for (const g of groups) {\n visibleSeries.forEach((_, idx) => {\n const item = g.chartData[idx];\n if (item && typeof item.value === 'number')\n allVisibleValues.push(item.value);\n });\n }\n const yMax = this.d3.max(allVisibleValues) || 0;\n this.yScale = this.d3.scaleLinear().domain([0, yMax]).nice().range([this.height, 0]);\n }\n /**\n * Creates x and y axes with grid lines\n */\n createAxes(options) {\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n const axesGroup = this.chart.append('g').attr('class', 'ax-bar-chart-axes');\n if (showXAxis) {\n this.createXAxis(axesGroup, options);\n }\n if (showYAxis) {\n this.createYAxis(axesGroup, options);\n }\n if (showGrid) {\n this.createGridLines();\n }\n }\n createXAxis(axesGroup, options) {\n const visibleDataForTicks = (this.data() || []).filter((d) => !this.isBarHidden(d.id));\n const idToLabel = new Map(visibleDataForTicks.map((d) => [d.id, d.label]));\n this.buildXAxisCommon(axesGroup, idToLabel, options);\n }\n createYAxis(axesGroup, options) {\n // Create Y axis\n this.yAxis = axesGroup.append('g').attr('class', 'ax-bar-chart-axis-y').call(this.d3.axisLeft(this.yScale));\n // Style the axis text\n const dynamicFontSize = this.getYAxisTickFontSizeBasedOnHeight();\n this.yAxis\n .selectAll('text')\n .style('font-size', `${dynamicFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)')\n .attr('text-anchor', 'end')\n .attr('direction', 'ltr');\n // Style axis lines\n this.yAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n // Add Y axis title\n if (options.yAxisLabel) {\n this.createYAxisTitle(axesGroup, options.yAxisLabel);\n }\n }\n shouldRotateXAxisLabels(idToLabel, fontSize) {\n const options = this.effectiveOptions();\n // Check if user explicitly set rotation option\n if (options.rotateXAxisLabels === true)\n return true;\n if (options.rotateXAxisLabels === false)\n return false;\n // If 'auto' or undefined, use intelligent calculation\n if (this.xScale.domain().length === 0)\n return false;\n const step = this.xScale.step();\n const labels = Array.from(idToLabel.values());\n const longestLabel = labels.reduce((a, b) => (a.length > b.length ? a : b), '');\n const estimatedWidth = longestLabel.length * fontSize * this.CHAR_WIDTH_RATIO;\n // Heuristic: avoid rotation when there are few categories (<= 6) even if estimation is slightly larger\n const domainCount = this.xScale.domain().length;\n if (domainCount <= 6) {\n return estimatedWidth > step * 1.4; // be more tolerant for small datasets\n }\n return estimatedWidth > step;\n }\n createXAxisTitle(axesGroup, title, tickAreaHeight, gapBelowTicks = 8) {\n // Title positioned directly below tick area with a consistent gap\n const labelY = this.height + tickAreaHeight + gapBelowTicks;\n axesGroup\n .append('text')\n .attr('class', 'ax-bar-chart-axis-label ax-x-axis-label')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'hanging') // Align to top of text for better positioning\n .attr('x', this.width / 2)\n .attr('y', labelY)\n .attr('direction', 'ltr')\n .style('font-size', '14px')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n .text(title);\n }\n createYAxisTitle(axesGroup, title) {\n // Calculate the exact position for Y-axis title\n // Y-axis tick labels use text-anchor: end, so they extend LEFT of the Y-axis line\n // Y-axis is at X = 0 within the chart group\n // Chart group is translated by (margin.left, margin.top)\n // So Y-axis is at X = margin.left in SVG coordinates\n const maxTickLabelWidth = this.calculateMaxYAxisTickLabelWidth();\n const padding = 20; // Increased padding between tick labels and axis title\n // Position title to the left of the tick labels\n // Since text-anchor: end aligns the text to the Y-axis, we need to go further left\n const labelY = -maxTickLabelWidth - padding;\n // Center the title vertically\n const labelX = -this.height / 2;\n axesGroup\n .append('text')\n .attr('class', 'ax-bar-chart-axis-label ax-y-axis-label')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr('transform', 'rotate(-90)')\n .attr('x', labelX)\n .attr('y', labelY)\n .attr('direction', 'ltr')\n .style('font-size', '14px')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n .text(title);\n }\n calculateMaxYAxisTickLabelWidth() {\n // Calculate the maximum width needed for Y-axis tick labels\n const raw = (this.data() || []);\n const isClustered = this.isClusteredData(raw);\n let maxValue = 0;\n if (isClustered) {\n const groups = raw;\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n for (const g of groups) {\n visibleSeries.forEach((_, idx) => {\n const item = g.chartData[idx];\n if (item && typeof item.value === 'number')\n maxValue = Math.max(maxValue, item.value);\n });\n }\n }\n else {\n const visibleData = raw.filter((d) => !this.isBarHidden(d.id));\n maxValue = visibleData.reduce((acc, d) => (d.value > acc ? d.value : acc), 0);\n }\n const tickLabelText = Number.isFinite(maxValue) ? maxValue.toLocaleString() : '00000';\n const fontSize = 13; // Approximate font size for Y-axis tick labels\n return tickLabelText.length * fontSize * 0.6 + 8; // Character width + padding\n }\n createGridLines() {\n this.chart\n .append('g')\n .attr('class', 'ax-bar-chart-grid')\n .call(this.d3\n .axisLeft(this.yScale)\n .tickSize(-this.width)\n .tickFormat(() => ''))\n .selectAll('line')\n .style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))')\n .style('stroke-opacity', 0.2);\n // Remove unneeded elements from grid\n this.chart.select('.ax-bar-chart-grid').selectAll('path, text').remove();\n }\n /**\n * Creates axes for clustered charts\n */\n createAxesClustered(options, groups) {\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n const axesGroup = this.chart.append('g').attr('class', 'ax-bar-chart-axes');\n if (showXAxis) {\n this.createXAxisClustered(axesGroup, options, groups);\n }\n if (showYAxis) {\n this.createYAxis(axesGroup, options);\n }\n if (showGrid) {\n this.createGridLines();\n }\n }\n createXAxisClustered(axesGroup, options, groups) {\n const idToLabel = new Map(groups.map((g) => [g.id, g.label]));\n this.buildXAxisCommon(axesGroup, idToLabel, options);\n }\n /**\n * Renders the bars with animations\n */\n renderBars(data) {\n // Filter out hidden bars\n const visibleData = data.filter((d) => !this.isBarHidden(d.id));\n const originalFullData = this.data() || [];\n // Reset animation state\n this._initialAnimationComplete.set(false);\n // Get corner radius from options\n const radius = this.effectiveOptions().cornerRadius;\n // Get animation options\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n // Create a container for all bars\n const barsContainer = this.chart.append('g').attr('class', 'ax-bar-chart-bars-container');\n // Create groups for each bar to handle transformations\n const barGroups = barsContainer\n .selectAll('.ax-bar-chart-bar-group')\n .data(visibleData)\n .enter()\n .append('g')\n .style('cursor', 'pointer')\n .attr('class', 'ax-bar-chart-bar-group');\n // Add bars inside groups\n const bars = barGroups\n .append('path')\n .attr('class', 'ax-bar-chart-bar')\n .attr('d', (d) => {\n const x = this.xScale(d.id);\n const width = this.xScale.bandwidth();\n const y = this.height - 0.5; // initial height is zero\n return `M${x},${y} L${x},${y} L${x + width},${y} L${x + width},${y} Z`;\n })\n .attr('fill', (d) => {\n // Find the index of the current bar (d) in the original data array\n const originalIndex = originalFullData.findIndex((item) => item.id === d.id);\n // Use the original color if provided, otherwise get color from palette using original index\n // Fallback to index 0 if not found, though this shouldn't happen with valid data.\n return d.color || this.getColor(originalIndex !== -1 ? originalIndex : 0);\n });\n // Add data labels if they're enabled\n if (this.effectiveOptions().showDataLabels !== false) {\n barGroups\n .append('text')\n .attr('class', 'ax-bar-chart-data-label')\n .attr('text-anchor', 'middle')\n .attr('x', (d) => this.xScale(d.id) + this.xScale.bandwidth() / 2)\n .attr('y', this.height) // Start from bottom for animation\n .style('font-size', 'clamp(8px, 2vmin, 12px)')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-data-labels-color))')\n .style('opacity', 0) // Start invisible for animation\n .text((d) => d.value);\n // Animate data labels\n barGroups\n .selectAll('.ax-bar-chart-data-label')\n .transition()\n .duration(animationDuration)\n .delay((d, i) => i * 50 + 100) // Slightly delayed after bar animation\n .attr('y', (d) => this.yScale(d.value) - 8) // Position above bar\n .style('opacity', 1)\n .ease(animationEasing);\n }\n // Set up event handlers on each group\n barGroups\n .on('mouseenter', (event, d) => {\n // Only apply hover effects if initial animation is complete\n if (!this._initialAnimationComplete())\n return;\n const barEl = this.d3.select(event.currentTarget).select('path');\n // Standard hover effect - darken the bar slightly and add a subtle shadow\n barEl.transition().duration(150).style('filter', 'brightness(0.7) drop-shadow(0 0 2px rgba(0,0,0,0.1))');\n this.handleBarHover(event, d);\n })\n .on('mousemove', (event) => {\n // Only update tooltip if initial animation is complete\n if (this._initialAnimationComplete()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', (event) => {\n // Only apply hover effects if initial animation is complete\n if (!this._initialAnimationComplete())\n return;\n const barEl = this.d3.select(event.currentTarget).select('path');\n // Remove hover effect\n barEl.transition().duration(150).style('filter', null);\n this._tooltipVisible.set(false);\n })\n .on('click', (event, d) => {\n // Only trigger click events if initial animation is complete\n if (this._initialAnimationComplete()) {\n this.handleBarClick(event, d);\n }\n });\n // Add animation\n bars\n .transition()\n .duration(animationDuration)\n .delay((d, i) => i * 50) // Stagger each bar animation\n .attrTween('d', (d) => {\n const x = this.xScale(d.id);\n const width = this.xScale.bandwidth();\n const finalHeight = this.height - this.yScale(d.value);\n return (t) => {\n const currentHeight = finalHeight * t;\n const currentY = this.height - currentHeight;\n const bottomY = this.height - 0.5; // Add small gap to prevent overlap with x-axis\n if (radius > 0 && currentHeight > 0) {\n // Limit radius to prevent it from exceeding half the bar width\n const effectiveRadius = Math.min(radius, width / 2);\n return `M${x},${bottomY} L${x},${currentY + effectiveRadius} Q${x},${currentY} ${x + effectiveRadius},${currentY} L${x + width - effectiveRadius},${currentY} Q${x + width},${currentY} ${x + width},${currentY + effectiveRadius} L${x + width},${bottomY} Z`;\n }\n else {\n return `M${x},${bottomY} L${x},${currentY} L${x + width},${currentY} L${x + width},${bottomY} Z`;\n }\n };\n })\n .ease(animationEasing) // Use the configured easing function\n .end() // Wait for all animations to complete\n .then(() => {\n // Mark animation as complete to enable hover effects\n this._initialAnimationComplete.set(true);\n });\n }\n /**\n * Renders bars for clustered charts\n */\n renderBarsClustered(groups) {\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n this._initialAnimationComplete.set(false);\n const radius = this.effectiveOptions().cornerRadius;\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n const barsContainer = this.chart.append('g').attr('class', 'ax-bar-chart-bars-container');\n const groupSel = barsContainer\n .selectAll('.ax-bar-chart-group')\n .data(groups)\n .enter()\n .append('g')\n .attr('class', 'ax-bar-chart-group')\n .attr('transform', (g) => `translate(${this.xScale(g.id)},0)`);\n const barGroups = groupSel\n .selectAll('.ax-bar-chart-bar-group')\n .data((g) => visibleSeries.map((label, idx) => ({ group: g, seriesLabel: label, seriesIndex: idx })))\n .enter()\n .append('g')\n .style('cursor', 'pointer')\n .attr('class', 'ax-bar-chart-bar-group');\n const bars = barGroups\n .append('path')\n .attr('class', 'ax-bar-chart-bar')\n .attr('data-series', (d) => d.seriesLabel)\n .attr('d', (d) => {\n const x = this.xSubScale(d.seriesLabel);\n const width = this.xSubScale.bandwidth();\n const y = this.height - 0.5; // initial height is zero\n return `M${x},${y} L${x},${y} L${x + width},${y} L${x + width},${y} Z`;\n })\n .attr('fill', (d) => {\n const item = d.group.chartData[d.seriesIndex];\n const colorIndex = d.seriesIndex;\n return item?.color || this.getColor(colorIndex);\n });\n if (this.effectiveOptions().showDataLabels !== false) {\n barGroups\n .append('text')\n .attr('class', 'ax-bar-chart-data-label')\n .attr('text-anchor', 'middle')\n .attr('x', (d) => (this.xSubScale(d.seriesLabel) || 0) + this.xSubScale.bandwidth() / 2)\n .attr('y', this.height)\n .style('font-size', 'clamp(8px, 2vmin, 12px)')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-data-labels-color))')\n .style('opacity', 0)\n .text((d) => {\n const item = d.group.chartData[d.seriesIndex];\n return item ? item.value : '';\n });\n barGroups\n .selectAll('.ax-bar-chart-data-label')\n .transition()\n .duration(animationDuration)\n .delay((_, i) => i * 50 + 100)\n .attr('y', (d) => {\n const item = d.group.chartData[d.seriesIndex];\n return item ? this.yScale(item.value) - 8 : this.height;\n })\n .style('opacity', 1)\n .ease(animationEasing);\n }\n barGroups\n .on('mouseenter', (event, d) => {\n if (!this._initialAnimationComplete())\n return;\n const barEl = this.d3.select(event.currentTarget).select('path');\n barEl.transition().duration(150).style('filter', 'brightness(0.7) drop-shadow(0 0 2px rgba(0,0,0,0.1))');\n const item = d.group.chartData[d.seriesIndex];\n if (item)\n this.handleBarHover(event, item, d.group);\n })\n .on('mousemove', (event) => {\n if (this._initialAnimationComplete())\n this.updateTooltipPosition(event);\n })\n .on('mouseleave', (event) => {\n if (!this._initialAnimationComplete())\n return;\n const barEl = this.d3.select(event.currentTarget).select('path');\n barEl.transition().duration(150).style('filter', null);\n this._tooltipVisible.set(false);\n })\n .on('click', (event, d) => {\n if (!this._initialAnimationComplete())\n return;\n const item = d.group.chartData[d.seriesIndex];\n if (item)\n this.handleBarClick(event, item);\n });\n bars\n .transition()\n .duration(animationDuration)\n .delay((_, i) => i * 50)\n .attrTween('d', (d) => {\n const x = this.xSubScale(d.seriesLabel);\n const width = this.xSubScale.bandwidth();\n const item = d.group.chartData[d.seriesIndex];\n const finalHeight = item ? this.height - this.yScale(item.value) : 0;\n return (t) => {\n const currentHeight = finalHeight * t;\n const currentY = this.height - currentHeight;\n const bottomY = this.height - 0.5; // Add small gap to prevent overlap with x-axis\n if (radius > 0 && currentHeight > 0) {\n // Limit radius to prevent it from exceeding half the bar width\n const effectiveRadius = Math.min(radius, width / 2);\n return `M${x},${bottomY} L${x},${currentY + effectiveRadius} Q${x},${currentY} ${x + effectiveRadius},${currentY} L${x + width - effectiveRadius},${currentY} Q${x + width},${currentY} ${x + width},${currentY + effectiveRadius} L${x + width},${bottomY} Z`;\n }\n else {\n return `M${x},${bottomY} L${x},${currentY} L${x + width},${currentY} L${x + width},${bottomY} Z`;\n }\n };\n })\n .ease(animationEasing)\n .end()\n .then(() => this._initialAnimationComplete.set(true));\n }\n /**\n * Gets the appropriate D3 easing function based on the option string\n */\n // getEasingFunction moved to shared chart utils\n /**\n * Handles bar hover event and shows tooltip\n */\n handleBarHover(event, datum, group) {\n if (this.effectiveOptions().showTooltip !== false) {\n const dataValue = this.data();\n const isClustered = this.isClusteredData(dataValue);\n const flatData = isClustered\n ? dataValue.flatMap((g) => g.chartData)\n : dataValue || [];\n const index = flatData.findIndex((item) => item.id === datum.id && item.label === datum.label);\n const color = datum.color || this.getColor(index !== -1 ? index : 0);\n // Calculate percentage of total\n const total = isClustered\n ? dataValue.reduce((sum, g) => sum + g.chartData.reduce((s, it) => s + it.value, 0), 0)\n : flatData.reduce((sum, item) => sum + item.value, 0);\n const percentage = total > 0 ? ((datum.value / total) * 100).toFixed(1) : '0';\n this._tooltipData.set({\n title: group ? `${datum.tooltipLabel || datum.label} — ${group.label}` : datum.tooltipLabel || datum.label,\n value: datum.value.toString(),\n percentage: `${percentage}%`,\n color: color,\n });\n this.updateTooltipPosition(event);\n this._tooltipVisible.set(true);\n }\n }\n /**\n * Updates tooltip position based on mouse coordinates\n */\n updateTooltipPosition(event) {\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl)\n return;\n const containerRect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip');\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = computeTooltipPosition(containerRect, tooltipRect, event.clientX, event.clientY, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n }\n /**\n * Handles bar click event\n */\n handleBarClick(event, datum) {\n this.barClick.emit({ item: datum, event: { nativeEvent: event, sender: this } });\n }\n /**\n * Shows a message when no data is available\n */\n showNoDataMessage(containerElement) {\n this.clearChartArea(containerElement);\n this.showMessage(containerElement, this.effectiveMessages().noDataIcon, this.effectiveMessages().noData, this.effectiveMessages().noDataHelp, 'ax-bar-chart-no-data-message');\n }\n /**\n * Shows a message when all bars are hidden\n */\n showAllBarsHiddenMessage(containerElement) {\n this.clearChartArea(containerElement);\n this.showMessage(containerElement, this.effectiveMessages().allHiddenIcon, this.effectiveMessages().allHidden, this.effectiveMessages().allHiddenHelp, 'ax-bar-chart-no-data-message');\n }\n /**\n * Gets the color for a bar based on its index\n */\n getColor(index) {\n return getChartColor(index, this.chartColors);\n }\n /**\n * Checks if a bar is hidden\n */\n isBarHidden(id) {\n return this.hiddenBars.has(id);\n }\n /**\n * Implementation of AXChartLegendCompatible interface\n * Returns legend items based on the chart data\n */\n getLegendItems() {\n const value = (this.data() || []);\n if (this.isClusteredData(value)) {\n const groups = value;\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const total = groups.reduce((sum, g) => sum + g.chartData.reduce((s, it) => s + (typeof it.value === 'number' ? it.value : 0), 0), 0);\n return seriesLabels.map((label, index) => {\n const seriesTotal = groups.reduce((s, g) => {\n const item = g.chartData[index];\n const v = item && typeof item.value === 'number' ? item.value : 0;\n return s + v;\n }, 0);\n const percentage = total > 0 ? (seriesTotal / total) * 100 : 0;\n const firstItem = groups[0]?.chartData[index];\n return {\n id: label,\n name: label || `Series ${index + 1}`,\n value: seriesTotal,\n percentage,\n color: firstItem?.color || this.getColor(index),\n hidden: this.hiddenSeries.has(label),\n };\n });\n }\n const flat = value;\n const total = flat.reduce((sum, item) => sum + (typeof item.value === 'number' ? item.value : 0), 0);\n return flat.map((item, index) => {\n const val = typeof item.value === 'number' ? item.value : 0;\n const percentage = total > 0 ? (val / total) * 100 : 0;\n return {\n id: item.id,\n name: item.label || `Item ${index + 1}`,\n value: item.value,\n percentage,\n color: item.color || this.getColor(index),\n hidden: this.isBarHidden(item.id),\n };\n });\n }\n /**\n * Implementation of AXChartLegendCompatible interface\n * Highlights a specific bar by ID\n */\n highlightSegment(id) {\n if (!this.svg)\n return;\n const value = (this.data() || []);\n const isClustered = this.isClusteredData(value);\n const resetAll = () => {\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .classed('ax-bar-chart-highlighted', false)\n .classed('ax-bar-chart-dimmed', false)\n .attr('opacity', 1)\n .attr('filter', null)\n .attr('stroke', null)\n .attr('stroke-width', null)\n .attr('stroke-opacity', null);\n };\n if (id === null) {\n resetAll();\n return;\n }\n if (!isClustered) {\n if (this.isBarHidden(id)) {\n resetAll();\n return;\n }\n const targetBar = this.svg.selectAll('.ax-bar-chart-bar').filter((d) => d?.id === id);\n if (targetBar.empty())\n return;\n const isCurrentlyHighlighted = targetBar.classed('ax-bar-chart-highlighted');\n if (isCurrentlyHighlighted) {\n resetAll();\n }\n else {\n resetAll();\n targetBar\n .classed('ax-bar-chart-highlighted', true)\n .attr('filter', 'drop-shadow(0 0 4px rgba(0, 0, 0, 0.3))')\n .attr('stroke', '#000')\n .attr('stroke-width', '1px')\n .attr('stroke-opacity', '0.3')\n .style('transition', 'all 0.2s ease-in-out');\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((d) => d?.id !== id)\n .classed('ax-bar-chart-dimmed', true)\n .attr('opacity', 0.5)\n .style('transition', 'opacity 0.2s ease-in-out');\n }\n return;\n }\n const targetBars = this.svg.selectAll('.ax-bar-chart-bar').filter((_, i, nodes) => {\n const node = nodes[i];\n return node.getAttribute('data-series') === id;\n });\n if (targetBars.empty())\n return;\n const isHighlighted = targetBars.classed('ax-bar-chart-highlighted');\n if (isHighlighted) {\n resetAll();\n }\n else {\n resetAll();\n targetBars\n .classed('ax-bar-chart-highlighted', true)\n .attr('filter', 'drop-shadow(0 0 4px rgba(0, 0, 0, 0.3))')\n .attr('stroke', '#000')\n .attr('stroke-width', '1px')\n .attr('stroke-opacity', '0.3')\n .style('transition', 'all 0.2s ease-in-out');\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((_, i, nodes) => nodes[i].getAttribute('data-series') !== id)\n .classed('ax-bar-chart-dimmed', true)\n .attr('opacity', 0.5)\n .style('transition', 'opacity 0.2s ease-in-out');\n }\n }\n /**\n * Implementation of AXChartLegendCompatible interface\n * Toggles visibility of a bar by ID\n * @returns New visibility state (true = visible, false = hidden)\n */\n toggleSegment(id) {\n const value = (this.data() || []);\n const isClustered = this.isClusteredData(value);\n if (!isClustered) {\n const wasAllHidden = value.length > 0 && value.every((d) => this.isBarHidden(d.id));\n if (this.hiddenBars.has(id)) {\n this.hiddenBars.delete(id);\n if (wasAllHidden) {\n if (this.chartContainerEl()?.nativeElement) {\n this.d3\n ?.select(this.chartContainerEl().nativeElement)\n .selectAll('svg, .ax-chart-message-container')\n .remove();\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n }\n else {\n this.updateChart();\n }\n }\n else {\n this.hiddenBars.add(id);\n this.updateChart();\n }\n return !this.hiddenBars.has(id);\n }\n // Clustered mode: toggle series by label\n const groups = value;\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const seriesCount = seriesLabels.length;\n const wasAllHidden = seriesCount > 0 && this.hiddenSeries.size >= seriesCount;\n if (this.hiddenSeries.has(id)) {\n this.hiddenSeries.delete(id);\n if (wasAllHidden) {\n if (this.chartContainerEl()?.nativeElement) {\n this.d3?.select(this.chartContainerEl().nativeElement).selectAll('svg, .ax-chart-message-container').remove();\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n }\n else {\n this.updateChart();\n }\n }\n else {\n this.hiddenSeries.add(id);\n this.updateChart();\n }\n return !this.hiddenSeries.has(id);\n }\n // ===== Helper utilities for modularity and maintainability =====\n getContainerElement() {\n return this.chartContainerEl()?.nativeElement ?? null;\n }\n clearChartArea(containerElement) {\n this.d3.select(containerElement).selectAll('svg, .ax-chart-message-container').remove();\n }\n getXAxisTickFontSizeBasedOnWidth() {\n return Math.max(10, Math.min(14, Math.round(this.width / 50)));\n }\n getYAxisTickFontSizeBasedOnHeight() {\n return Math.max(11, Math.min(15, Math.round(this.height / 30)));\n }\n buildXAxisCommon(axesGroup, idToLabel, options) {\n this.xAxis = axesGroup\n .append('g')\n .attr('class', 'ax-bar-chart-axis-x')\n .attr('transform', `translate(0,${this.height})`)\n .call(this.d3.axisBottom(this.xScale).tickFormat((id) => idToLabel.get(id) ?? String(id)));\n const dynamicFontSize = this.getXAxisTickFontSizeBasedOnWidth();\n const xAxisTicks = this.xAxis\n .selectAll('text')\n .style('font-size', `${dynamicFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)')\n .attr('direction', 'ltr');\n const isRotated = this.shouldRotateXAxisLabels(idToLabel, dynamicFontSize);\n if (isRotated) {\n xAxisTicks.attr('transform', 'rotate(-45)').style('text-anchor', 'end').attr('dx', '-0.8em').attr('dy', '0.15em');\n }\n this.xAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n if (options.xAxisLabel && !isRotated) {\n const tickNodes = (this.xAxis.selectAll('text').nodes() || []);\n const measuredTickHeight = tickNodes.length > 0\n ? Math.max(...tickNodes.map((n) => (n && n.getBBox ? n.getBBox().height : dynamicFontSize)))\n : dynamicFontSize;\n const tickAreaHeight = measuredTickHeight + 6;\n const gapBelowTicks = 14;\n this.createXAxisTitle(axesGroup, options.xAxisLabel, tickAreaHeight, gapBelowTicks);\n }\n }\n // computeTooltipPosition moved to shared chart utils\n showMessage(containerElement, iconClass, text, helpText, specificClass) {\n const container = this.d3\n .select(containerElement)\n .append('div')\n .attr('class', `ax-chart-message-container ax-bar-chart-message-background ${specificClass}`);\n container\n .append('div')\n .attr('class', 'ax-chart-message-icon ax-bar-chart-no-data-icon')\n .html(`<i class=\"${iconClass} fa-2x\"></i>`);\n container.append('div').attr('class', 'ax-chart-message-text ax-bar-chart-no-data-text').text(text);\n container.append('div').attr('class', 'ax-chart-message-help ax-bar-chart-no-data-help').text(helpText);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.8\", ngImport: i0, type: AXBarChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.1.8\", type: AXBarChartComponent, isStandalone: true, selector: \"ax-bar-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: { barClick: \"barClick\" }, viewQueries: [{ propertyName: \"chartContainerEl\", first: true, predicate: [\"chartContainer\"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: \"<div class=\\\"ax-bar-chart\\\" #chartContainer>\\n <!-- Shared 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-bar-chart{display:block;width:100%;height:100%;min-height:200px;--ax-comp-bar-chart-axis-label-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-data-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-grid-lines-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-bg-color: var(--ax-sys-color-lightest-surface)}ax-bar-chart .ax-bar-chart{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;border-radius:.5rem;overflow:hidden;color:rgb(var(--ax-sys-color-on-lightest-surface));background-color:rgb(var(--ax-comp-bar-chart-bg-color))}ax-bar-chart .ax-bar-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-bar-chart .ax-bar-chart svg g:has(text){font-family:inherit}ax-bar-chart .ax-bar-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-bar-chart-bg-color));padding:1.5rem;border-radius:.5rem;box-shadow:0 2px 12px #00000014;width:80%;max-width:300px}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-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.1.8\", ngImport: i0, type: AXBarChartComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-bar-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"ax-bar-chart\\\" #chartContainer>\\n <!-- Shared 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-bar-chart{display:block;width:100%;height:100%;min-height:200px;--ax-comp-bar-chart-axis-label-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-data-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-grid-lines-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-bg-color: var(--ax-sys-color-lightest-surface)}ax-bar-chart .ax-bar-chart{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;border-radius:.5rem;overflow:hidden;color:rgb(var(--ax-sys-color-on-lightest-surface));background-color:rgb(var(--ax-comp-bar-chart-bg-color))}ax-bar-chart .ax-bar-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-bar-chart .ax-bar-chart svg g:has(text){font-family:inherit}ax-bar-chart .ax-bar-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-bar-chart-bg-color));padding:1.5rem;border-radius:.5rem;box-shadow:0 2px 12px #00000014;width:80%;max-width:300px}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-chart-no-data-help{font-size:.8rem;opacity:.6}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9iYXItY2hhcnQvc3JjL2xpYi9iYXItY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2Jhci1jaGFydC9zcmMvbGliL2Jhci1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxILE9BQU8sRUFBRSx1QkFBdUIsRUFBc0IsTUFBTSw4QkFBOEIsQ0FBQztBQUUzRixPQUFPLEVBQ0wsZUFBZSxFQUNmLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFFTixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFTekQ7OztHQUdHO0FBU0gsTUFBTSxPQUFPLG1CQUFvQixTQUFRLFdBQVc7SUFDbEQsU0FBUztJQUNULHVCQUF1QjtJQUN2QixJQUFJLEdBQUcsS0FBSyxDQUFrQixFQUFxQixnREFBQyxDQUFDO0lBRXJELDBCQUEwQjtJQUMxQixPQUFPLEdBQUcsS0FBSyxDQUFtQixFQUFFLG1EQUFDLENBQUM7SUFFdEMsVUFBVTtJQUNWLG9DQUFvQztJQUNwQyxRQUFRLEdBQUcsTUFBTSxFQUF3QixDQUFDO0lBRTFDLDRCQUE0QjtJQUNYLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQTZCLGdCQUFnQixDQUFDLENB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QUFNLENBQUMsS0FBSyxDQUFDO2FBQ2IsSUFBSSxDQUFDLE9BQU8sRUFBRSxpREFBaUQsQ0FBQzthQUNoRSxJQUFJLENBQUMsYUFBYSxTQUFTLGNBQWMsQ0FBQyxDQUFDO1FBRTlDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxpREFBaUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVwRyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsaURBQWlELENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUcsQ0FBQzt1R0Fwc0NVLG1CQUFtQjsyRkFBbkIsbUJBQW1CLHFnQkN6Q2hDLGlSQVNBLHU3Q0Q2QlksdUJBQXVCOzsyRkFHdEIsbUJBQW1CO2tCQVIvQixTQUFTOytCQUNFLGNBQWMsaUJBR1QsaUJBQWlCLENBQUMsSUFBSSxXQUM1QixDQUFDLHVCQUF1QixDQUFDLG1CQUNqQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTlhDb21wb25lbnQgfSBmcm9tICdAYWNvcmV4L2Nkay9jb21tb24nO1xuaW1wb3J0IHsgQVhfQ0hBUlRfQ09MT1JfUEFMRVRURSwgY29tcHV0ZVRvb2x0aXBQb3NpdGlvbiwgZ2V0Q2hhcnRDb2xvciwgZ2V0RWFzaW5nRnVuY3Rpb24gfSBmcm9tICdAYWNvcmV4L2NoYXJ0cyc7XG5pbXBvcnQgeyBBWENoYXJ0TGVnZW5kQ29tcGF0aWJsZSwgQVhDaGFydExlZ2VuZEl0ZW0gfSBmcm9tICdAYWNvcmV4L2NoYXJ0cy9jaGFydC1sZWdlbmQnO1xuaW1wb3J0IHsgQVhDaGFydFRvb2x0aXBDb21wb25lbnQsIEFYQ2hhcnRUb29sdGlwRGF0YSB9IGZyb20gJ0BhY29yZXgvY2hhcnRzL2NoYXJ0LXRvb2x0aXAnO1xuXG5pbXBvcnQge1xuICBhZnRlck5leHRSZW5kZXIsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIEVsZW1lbnRSZWYsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG4gIHZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhfQkFSX0NIQVJUX0NPTkZJRyB9IGZyb20gJy4vYmFyLWNoYXJ0LmNvbmZpZyc7XG5pbXBvcnQge1xuICBBWEJhckNoYXJ0Q2xpY2tFdmVudCxcbiAgQVhCYXJDaGFydENsdXN0ZXJlZERhdGEsXG4gIEFYQmFyQ2hhcnREYXRhLFxuICBBWEJhckNoYXJ0T3B0aW9uLFxuICBBWEJhckNoYXJ0VmFsdWUsXG59IGZyb20gJy4vYmFyLWNoYXJ0LnR5cGUnO1xuXG4vKipcbiAqIEJhciBDaGFydCBDb21wb25lbnRcbiAqIFJlbmRlcnMgZGF0YSBhcyB2ZXJ0aWNhbCBiYXJzIHdpdGggaW50ZXJhY3RpdmUgaG92ZXIgZWZmZWN0cyBhbmQgYW5pbWF0aW9uc1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdheC1iYXItY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vYmFyLWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYmFyLWNoYXJ0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGltcG9ydHM6IFtBWENoYXJ0VG9vbHRpcENvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBWEJhckNoYXJ0Q29tcG9uZW50IGV4dGVuZHMgTlhDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlIHtcbiAgLy8gSW5wdXRzXG4gIC8qKiBDaGFydCBkYXRhIGlucHV0ICovXG4gIGRhdGEgPSBpbnB1dDxBWEJhckNoYXJ0VmFsdWU+KFtdIGFzIEFYQmFyQ2hhcnRWYWx1ZSk7XG5cbiAgLyoqIENoYXJ0IG9wdGlvbnMgaW5wdXQgKi9cbiAgb3B0aW9ucyA9IGlucHV0PEFYQmFyQ2hhcnRPcHRpb24+KHt9KTtcblxuICAvLyBPdXRwdXRzXG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBiYXIgaXMgY2xpY2tlZCAqL1xuICBiYXJDbGljayA9IG91dHB1dDxBWEJhckNoYXJ0Q2xpY2tFdmVudD4oKTtcblxuICAvLyBDaGFydCBjb250YWluZXIgcmVmZXJlbmNlXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnRDb250YWluZXJFbCA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ2NoYXJ0Q29udGFpbmVyJyk7XG5cbiAgLy8gRDMgcmVmZXJlbmNlIC0gbG9hZGVkIGFzeW5jaHJvbm91c2x5XG4gIHByb3RlY3RlZCBkMyE6IHR5cGVvZiBpbXBvcnQoJ2QzJyk7XG5cbiAgLy8gQ2hhcnQgZWxlbWVudHNcbiAgcHJpdmF0ZSBzdmchOiBhbnk7XG4gIHByaXZhdGUgY2hhcnQhOiBhbnk7XG4gIHByaXZhdGUgeFNjYWxlITogYW55O1xuICBwcml2YXRlIHlTY2FsZSE6IGFueTtcbiAgcHJpdmF0ZSB4U3ViU2NhbGUhOiBhbnk7XG4gIHByaXZhdGUgeEF4aXMhOiBhbnk7XG4gIHByaXZhdGUgeUF4aXMhOiBhbnk7XG5cbiAgLy8gQ2hhcnQgZGltZW5zaW9uc1xuICBwcml2YXRlIHdpZHRoITogbnVtYmVyO1xuICBwcml2YXRlIGhlaWdodCE6IG51bWJlcjtcbiAgcHJpdmF0ZSBtYXJnaW4gPSB7IHRvcDogMCwgcmlnaHQ6IDAsIGJvdHRvbTogMCwgbGVmdDogMCB9O1xuXG4gIC8vIENoYXJhY3RlciB3aWR0aCByYXRpbyBoZXVyaXN0aWMgZm9yIG1peGVkIExhdGluL1BlcnNpYW4gdGV4dHNcbiAgcHJpdmF0ZSByZWFkb25seSBDSEFSX1dJRFRIX1JBVElPID0gMC42NTtcbiAgLy8gVG9vbHRpcCBnYXAgaW4gcGl4ZWxzIGZvciBjb25zaXN0ZW50IHNwYWNpbmdcbiAgcHJpdmF0ZSByZWFkb25seSBUT09MVElQX0dBUCA9IDEwO1xuXG4gIC8vIEFuaW1hdGlvbiBzdGF0ZVxuICBwcml2YXRlIF9pbml0aWFsQW5pbWF0aW9uQ29tcGxldGUgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIFRvb2x0aXAgc3RhdGVcbiAgcHJpdmF0ZSBfdG9vbHRpcFZpc2libGUgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF90b29sdGlwUG9zaXRpb24gPSBzaWduYWwoeyB4OiAwLCB5OiAwIH0pO1xuICBwcml2YXRlIF90b29sdGlwRGF0YSA9IHNpZ25hbDxBWENoYXJ0VG9vbHRpcERhdGE+KHtcbiAgICB0aXRsZTogJycsXG4gICAgdmFsdWU6ICcwJyxcbiAgICBwZXJjZW50YWdlOiAnMCUnLFxuICAgIGNvbG9yOiAnJyxcbiAgfSk7XG5cbiAgLy8gU2lnbmFscyBmb3IgY29tcG9uZW50IHN0YXRlXG4gIHByaXZhdGUgX2luaXRpYWxpemVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfcmVuZGVyZWQgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIFRvb2x0aXAgYWNjZXNzb3JzXG4gIHByb3RlY3RlZCB0b29sdGlwVmlzaWJsZSA9IHRoaXMuX3Rvb2x0aXBWaXNpYmxlLmFzUmVhZG9ubHkoKTtcbiAgcHJvdGVjdGVkIHRvb2x0aXBQb3NpdGlvbiA9IHRoaXMuX3Rvb2x0aXBQb3NpdGlvbi5hc1JlYWRvbmx5KCk7XG4gIHByb3RlY3RlZCB0b29sdGlwRGF0YSA9IHRoaXMuX3Rvb2x0aXBEYXRhLmFzUmVhZG9ubHkoKTtcblxuICAvLyBJbmplY3QgY29uZmlndXJhdGlvblxuICBwcml2YXRlIGNvbmZpZ1Rva2VuID0gaW5qZWN0KEFYX0JBUl9DSEFSVF9DT05GSUcpO1xuXG4gIC8vIEluamVjdCB0aGUgY2hhcnQgY29sb3JzXG4gIHByaXZhdGUgY2hhcnRDb2xvcnMgPSBpbmplY3QoQVhfQ0hBUlRfQ09MT1JfUEFMRVRURSk7XG5cbiAgLy8gSW5qZWN0IEFYUGxhdGZvcm1cbiAgLy8gUmVtb3ZlZCB1bnVzZWQgQVhQbGF0Zm9ybSBpbmplY3Rpb25cblxuICAvLyBDb25maWd1cmF0aW9uIHdpdGggZGVmYXVsdHNcbiAgcHJvdGVjdGVkIGVmZmVjdGl2ZU9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uZmlnVG9rZW4sXG4gICAgICAuLi50aGlzLm9wdGlvbnMoKSxcbiAgICB9O1xuICB9KTtcblxuICAvLyBNZXNzYWdlcyB3aXRoIGRlZmF1bHRzXG4gIHByb3RlY3RlZCBlZmZlY3RpdmVNZXNzYWdlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0TWVzc2FnZXMgPSB7XG4gICAgICBub0RhdGE6ICdObyBkYXRhIGF2YWlsYWJsZScsXG4gICAgICBub0RhdGFIZWxwOiAnUGxlYXNlIHByb3ZpZGUgZGF0YSB0byBkaXNwbGF5IHRoZSBjaGFydCcsXG4gICAgICBhbGxIaWRkZW46ICdBbGwgYmFycyBhcmUgaGlkZGVuJyxcbiAgICAgIGFsbEhpZGRlbkhlbHA6ICdDbGljayBvbiBsZWdlbmQgaXRlbXMgdG8gc2hvdyBiYXJzJyxcbiAgICAgIG5vRGF0YUljb246ICdmYS1saWdodCBmYS1jaGFydC1jb2x1bW4nLFxuICAgICAgYWxsSGlkZGVuSWNvbjogJ2ZhLWxpZ2h0IGZhLWV5ZS1zbGFzaCcsXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmYXVsdE1lc3NhZ2VzLFxuICAgICAgLi4udGhpcy5lZmZlY3RpdmVPcHRpb25zKCkubWVzc2FnZXMsXG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gVHJhY2sgaGlkZGVuIGJhcnNcbiAgcHJpdmF0ZSBoaWRkZW5CYXJzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8vIFRyYWNrIGhpZGRlbiBzZXJpZXMgZm9yIGNsdXN0ZXJlZCBjaGFydHMgKGJ5IHNlcmllcyBsYWJlbClcbiAgcHJpdmF0ZSBoaWRkZW5TZXJpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvLyBIZWxwZXJzXG4gIHByaXZhdGUgaXNDbHVzdGVyZWREYXRhKHZhbHVlOiBBWEJhckNoYXJ0VmFsdWUpOiB2YWx1ZSBpcyBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiAodmFsdWUgYXMgYW55KVswXSAmJiAnY2hhcnREYXRhJyBpbiAodmFsdWUgYXMgYW55KVswXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2x1c3RlclNlcmllc0xhYmVscyhncm91cHM6IEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZmlyc3QgPSBncm91cHNbMF0/LmNoYXJ0RGF0YSA/PyBbXTtcbiAgICByZXR1cm4gZmlyc3QubWFwKChkKSA9PiBkLmxhYmVsKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gRHluYW1pY2FsbHkgbG9hZCBEMyBhbmQgaW5pdGlhbGl6ZSB0aGUgY2hhcnQgd2hlbiB0aGUgY29tcG9uZW50IGlzIHJlYWR5XG4gICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICAgIHRoaXMuX2luaXRpYWxpemVkLnNldCh0cnVlKTtcbiAgICAgIHRoaXMubG9hZEQzKCk7XG4gICAgICAvLyBDcmVhdGUgY2hhcnQgYWZ0ZXIgRDMgaXMgbG9hZGVkIGFuZCBjb250YWluZXIgaXMgYXZhaWxhYmxlXG4gICAgICBpZiAodGhpcy5kMyAmJiB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKSkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkLnNldCh0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFdhdGNoIGZvciBjaGFuZ2VzIHRvIHJlZHJhdyB0aGUgY2hhcnRcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgLy8gQWNjZXNzIGlucHV0cyB0byB0cmFjayB0aGVtXG4gICAgICB0aGlzLmRhdGEoKTtcbiAgICAgIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuXG4gICAgICAvLyBPbmx5IHVwZGF0ZSBpZiBhbHJlYWR5IHJlbmRlcmVkXG4gICAgICBpZiAodGhpcy5fcmVuZGVyZWQoKSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXBDaGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIEQzLmpzIGR5bmFtaWNhbGx5XG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgbG9hZEQzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmQzID0gYXdhaXQgaW1wb3J0KCdkMycpO1xuICAgICAgLy8gSWYgY29udGFpbmVyIGlzIHJlYWR5LCBjcmVhdGUgY2hhcnRcbiAgICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCgpICYmIHRoaXMuY2hhcnRDb250YWluZXJFbCgpKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZWQuc2V0KHRydWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBEMy5qczonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGJhciBjaGFydCBTVkcgYW5kIHJlbmRlcnMgYWxsIGVsZW1lbnRzXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmQzIHx8ICF0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgaW5wdXRWYWx1ZSA9ICh0aGlzLmRhdGEoKSB8fCBbXSkgYXMgQVhCYXJDaGFydFZhbHVlO1xuICAgIGNvbnN0IGlzQ2x1c3RlcmVkID0gdGhpcy5pc0NsdXN0ZXJlZERhdGEoaW5wdXRWYWx1ZSk7XG5cbiAgICAvLyBWaXNpYmlsaXR5IGNhbGN1bGF0aW9uXG4gICAgbGV0IGhhc0FueVZpc2libGUgPSBmYWxzZTtcbiAgICBsZXQgdmlzaWJsZVNpbmdsZURhdGE6IEFYQmFyQ2hhcnREYXRhW10gPSBbXTtcbiAgICBsZXQgZ3JvdXBlZERhdGE6IEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10gPSBbXTtcbiAgICBpZiAoaXNDbHVzdGVyZWQpIHtcbiAgICAgIGdyb3VwZWREYXRhID0gaW5wdXRWYWx1ZSBhcyBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdO1xuICAgICAgY29uc3Qgc2VyaWVzTGFiZWxzID0gZ3JvdXBlZERhdGEubGVuZ3RoID4gMCA/IHRoaXMuZ2V0Q2x1c3RlclNlcmllc0xhYmVscyhncm91cGVkRGF0YSkgOiBbXTtcbiAgICAgIGNvbnN0IHZpc2libGVTZXJpZXMgPSBzZXJpZXNMYWJlbHMuZmlsdGVyKChzKSA9PiAhdGhpcy5oaWRkZW5TZXJpZXMuaGFzKHMpKTtcbiAgICAgIGhhc0FueVZpc2libGUgPSBncm91cGVkRGF0YS5zb21lKChnKSA9PiB2aXNpYmxlU2VyaWVzLnNvbWUoKF8sIGlkeCkgPT4gISFnLmNoYXJ0RGF0YVtpZHhdKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNpbmdsZSA9IChpbnB1dFZhbHVlIGFzIEFYQmFyQ2hhcnREYXRhW10pIHx8IFtdO1xuICAgICAgdmlzaWJsZVNpbmdsZURhdGEgPSBzaW5nbGUuZmlsdGVyKChkKSA9PiAhdGhpcy5pc0JhckhpZGRlbihkLmlkKSk7XG4gICAgICBoYXNBbnlWaXNpYmxlID0gdmlzaWJsZVNpbmdsZURhdGEubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvLyBDbGVhciBleGlzdGluZyBjaGFydCBTVkcgYW5kIG1lc3NhZ2VzIChkbyBub3QgcmVtb3ZlIHRvb2x0aXAgY29tcG9uZW50KVxuICAgIHRoaXMuZDMuc2VsZWN0KGNvbnRhaW5lckVsZW1lbnQpLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtbWVzc2FnZS1jb250YWluZXInKS5yZW1vdmUoKTtcblxuICAgIC8vIEVhcmx5IHJldHVybiBpZiBubyBkYXRhXG4gICAgaWYgKCEoaW5wdXRWYWx1ZSBhcyBhbnlbXSkubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNob3dOb0RhdGFNZXNzYWdlKGNvbnRhaW5lckVsZW1lbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEVhcmx5IHJldHVybiBpZiBhbGwgYmFycyBhcmUgaGlkZGVuXG4gICAgaWYgKCFoYXNBbnlWaXNpYmxlKSB7XG4gICAgICB0aGlzLnNob3dBbGxCYXJzSGlkZGVuTWVzc2FnZShjb250YWluZXJFbGVtZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHZXQgb3B0aW9ucyBhbmQgc2V0dXAgZGltZW5zaW9uc1xuICAgIGNvbnN0IGNoYXJ0T3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuICAgIHRoaXMuc2V0dXBEaW1lbnNpb25zKGNvbnRhaW5lckVsZW1lbnQsIGNoYXJ0T3B0aW9ucyk7XG5cbiAgICAvLyBDcmVhdGUgc2NhbGVzIGFuZCBheGVzIGFuZCByZW5kZXIgYmFzZWQgb24gbW9kZVxuICAgIGlmIChpc0NsdXN0ZXJlZCkge1xuICAgICAgdGhpcy5zZXR1cFNjYWxlc0NsdXN0ZXJlZChncm91cGVkRGF0YSk7XG4gICAgICB0aGlzLmNyZWF0ZUF4ZXNDbHVzdGVyZWQoY2hhcnRPcHRpb25zLCBncm91cGVkRGF0YSk7XG4gICAgICB0aGlzLnJlbmRlckJhcnNDbHVzdGVyZWQoZ3JvdXBlZERhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldHVwU2NhbGVzKHZpc2libGVTaW5nbGVEYXRhKTtcbiAgICAgIHRoaXMuY3JlYXRlQXhlcyhjaGFydE9wdGlvbnMpO1xuICAgICAgdGhpcy5yZW5kZXJCYXJzKHZpc2libGVTaW5nbGVEYXRhKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY2hhcnQgd2hlbiBpbnB1dHMgY2hhbmdlXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyB1cCBjaGFydCByZXNvdXJjZXNcbiAgICovXG4gIHB1YmxpYyBjbGVhbnVwQ2hhcnQoKTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgLy8gT25seSByZW1vdmUgY2hhcnQgU1ZHIGFuZCBtZXNzYWdlIGNvbnRhaW5lcnMgdG8gcHJlc2VydmUgdG9vbHRpcCBjb21wb25lbnRcbiAgICAgIHRoaXMuZDM/LnNlbGVjdChjb250YWluZXIpLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtbWVzc2FnZS1jb250YWluZXInKS5yZW1vdmUoKTtcbiAgICB9XG4gICAgdGhpcy5zdmcgPSBudWxsIGFzIGFueTtcbiAgICB0aGlzLmNoYXJ0ID0gbnVsbCBhcyBhbnk7XG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIGNoYXJ0IGRpbWVuc2lvbnMgYW5kIGNyZWF0ZXMgU1ZHIHdpdGggcmVzcG9uc2l2ZSBhdHRyaWJ1dGVzXG4gICAqL1xuICBwcml2YXRlIHNldHVwRGltZW5zaW9ucyhjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9uczogQVhCYXJDaGFydE9wdGlvbik6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBvdXRlciBtYXJnaW5zOyBjYWxjdWxhdGUgb25seSBpbnRlcm5hbCBwYWRkaW5ncyBmb3IgYXhlcyBhbmQgbGFiZWxzXG4gICAgdGhpcy5tYXJnaW4gPSB7IHRvcDogMCwgcmlnaHQ6IDAsIGJvdHRvbTogMCwgbGVmdDogMCB9O1xuXG4gICAgLy8gR2V0IGNvbnRhaW5lciBkaW1lbnNpb25zXG4gICAgY29uc3QgY29udGFpbmVyV2lkdGggPSBjb250YWluZXJFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lckVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuXG4gICAgLy8gQXhpcyB2aXNpYmlsaXR5XG4gICAgY29uc3Qgc2hvd1hBeGlzID0gb3B0aW9ucy5zaG93WEF4aXMgIT09IGZhbHNlO1xuICAgIGNvbnN0IHNob3dZQXhpcyA9IG9wdGlvbnMuc2hvd1lBeGlzICE9PSBmYWxzZTtcblxuICAgIC8vIEludGVybmFsIGxlZnQgcGFkZGluZyBmb3IgWS1heGlzIHRpY2tzL2xhYmVscy90aXRsZVxuICAgIGNvbnN0IGF4aXNBbmRUaWNrUGFkZGluZyA9IDEwO1xuICAgIGNvbnN0IHlBeGlzVGl0bGVUaGlja25lc3MgPSBvcHRpb25zLnlBeGlzTGFiZWwgPyAxNCA6IDA7IC8vIHJvdGF0ZWQgbGFiZWwgdGhpY2tuZXNzIGFsb25nIFhcbiAgICBjb25zdCB5QXhpc1RpdGxlUGFkZGluZyA9IG9wdGlvbnMueUF4aXNMYWJlbCA/IDE0IDogMDsgLy8gZ2FwIGJldHdlZW4gdGlja3MgYW5kIHRpdGxlXG4gICAgY29uc3QgbGVmdFBhZGRpbmdGb3JZQXhpcyA9IHNob3dZQXhpc1xuICAgICAgPyB0aGlzLmNhbGN1bGF0ZU1heFlBeGlzVGlja0xhYmVsV2lkdGgoKSArIGF4aXNBbmRUaWNrUGFkZGluZyArIHlBeGlzVGl0bGVQYWRkaW5nICsgeUF4aXNUaXRsZVRoaWNrbmVzc1xuICAgICAgOiAwO1xuXG4gICAgLy8gRXN0aW1hdGUgaW50ZXJuYWwgYm90dG9tIHBhZGRpbmcgZm9yIFgtYXhpcyB0aWNrcy9sYWJlbHMvdGl0bGVcbiAgICBsZXQgYm90dG9tUGFkZGluZ0ZvclhBeGlzID0gMDtcbiAgICBpZiAoc2hvd1hBeGlzKSB7XG4gICAgICBjb25zdCByYXcgPSAodGhpcy5kYXRhKCkgfHwgW10pIGFzIEFYQmFyQ2hhcnRWYWx1ZTtcbiAgICAgIGNvbnN0IGlzQ2x1c3RlcmVkID0gdGhpcy5pc0NsdXN0ZXJlZERhdGEocmF3KTtcbiAgICAgIGNvbnN0IGJhckNvdW50ID0gaXNDbHVzdGVyZWQgPyAocmF3IGFzIEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10pLmxlbmd0aCA6IChyYXcgYXMgQVhCYXJDaGFydERhdGFbXSkubGVuZ3RoO1xuICAgICAgY29uc3QgbG9uZ2VzdExhYmVsID0gKCgpID0+IHtcbiAgICAgICAgaWYgKGlzQ2x1c3RlcmVkKSB7XG4gICAgICAgICAgY29uc3QgZ3JvdXBzID0gcmF3IGFzIEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW107XG4gICAgICAgICAgcmV0dXJuIGdyb3Vwcy5yZWR1Y2UoKGFjYywgZykgPT4gKGFjYy5sZW5ndGggPiAoZy5sYWJlbD8ubGVuZ3RoID8/IDApID8gYWNjIDogKGcubGFiZWwgPz8gJycpKSwgJycpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZsYXQgPSAocmF3IGFzIEFYQmFyQ2hhcnREYXRhW10pIHx8IFtdO1xuICAgICAgICByZXR1cm4gZmxhdC5yZWR1Y2UoKGEsIGIpID0+IChhLmxlbmd0aCA+IGIubGFiZWwubGVuZ3RoID8gYSA6IGIubGFiZWwpLCAnJyk7XG4gICAgICB9KSgpO1xuXG4gICAgICBjb25zdCBiYXNlV2lkdGggPSBvcHRpb25zLndpZHRoID8/IGNvbnRhaW5lcldpZHRoO1xuICAgICAgY29uc3Qgd29ya2luZ1dpZHRoID0gTWF0aC5tYXgoMSwgYmFzZVdpZHRoIC0gbGVmdFBhZGRpbmdGb3JZQXhpcyk7XG4gICAgICBjb25zdCBkeW5hbWljRm9udFNpemUgPSBNYXRoLm1heCgxMCwgTWF0aC5taW4oMTQsIE1hdGgucm91bmQod29ya2luZ1dpZHRoIC8gNTApKSk7XG4gICAgICBjb25zdCBlc3RpbWF0ZWRMb25nZXN0TGFiZWxXaWR0aCA9IGxvbmdlc3RMYWJlbC5sZW5ndGggKiBkeW5hbWljRm9udFNpemUgKiAwLjY1O1xuICAgICAgY29uc3QgYXZhaWxhYmxlV2lkdGhQZXJCYXIgPSBiYXJDb3VudCA+IDAgPyB3b3JraW5nV2lkdGggLyBiYXJDb3VudCA6IHdvcmtpbmdXaWR0aDtcbiAgICAgIGNvbnN0IHdpbGxSb3RhdGUgPVxuICAgICAgICBvcHRpb25zLnJvdGF0ZVhBeGlzTGFiZWxzID09PSB0cnVlXG4gICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgOiBvcHRpb25zLnJvdGF0ZVhBeGlzTGFiZWxzID09PSBmYWxzZVxuICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgOiBlc3RpbWF0ZWRMb25nZXN0TGFiZWxXaWR0aCA+IGF2YWlsYWJsZVdpZHRoUGVyQmFyO1xuXG4gICAgICBjb25zdCB0aWNrQXJlYUhlaWdodCA9IHdpbGxSb3RhdGVcbiAgICAgICAgPyBlc3RpbWF0ZWRMb25nZXN0TGFiZWxXaWR0aCAqIE1hdGguU1FSVDFfMiArIGR5bmFtaWNGb250U2l6ZSAqIE1hdGguU1FSVDFfMiArIDZcbiAgICAgICAgOiBkeW5hbWljRm9udFNpemUgKyA4O1xuICAgICAgY29uc3QgZ2FwQmVsb3dUaWNrcyA9IG9wdGlvbnMueEF4aXNMYWJlbCAmJiAhd2lsbFJvdGF0ZSA/IDE0IDogMDsgLy8gbWF0Y2hlcyByZW5kZXJlclxuICAgICAgY29uc3QgdGl0bGVCbG9ja0hlaWdodCA9IG9wdGlvbnMueEF4aXNMYWJlbCAmJiAhd2lsbFJvdGF0ZSA/IDI0IDogMDsgLy8gMTRweCBmb250ICsgfjEwcHggZ2FwXG4gICAgICBib3R0b21QYWRkaW5nRm9yWEF4aXMgPSB0aWNrQXJlYUhlaWdodCArIGdhcEJlbG93VGlja3MgKyB0aXRsZUJsb2NrSGVpZ2h0O1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSBwbG90dGluZyBkaW1lbnNpb25zIHdpdGggc2Vuc2libGUgZmFsbGJhY2tzXG4gICAgY29uc3QgZmFsbGJhY2tQbG90SGVpZ2h0ID0gMjQwOyAvLyBlbnN1cmVzIHZpc2libGUgcGxvdCB3aGVuIGNvbnRhaW5lciBoYXMgbm8gaGVpZ2h0XG4gICAgY29uc3QgYmFzZVdpZHRoID0gb3B0aW9ucy53aWR0aCA/PyBjb250YWluZXJXaWR0aDtcbiAgICBjb25zdCB0b3RhbFdpZHRoID0gTWF0aC5tYXgoMjAwLCBiYXNlV2lkdGggPiAwID8gYmFzZVdpZHRoIDogMjAwKTtcbiAgICBjb25zdCBwbG90V2lkdGggPSBNYXRoLm1heCgwLCB0b3RhbFdpZHRoIC0gbGVmdFBhZGRpbmdGb3JZQXhpcyk7XG5cbiAgICBsZXQgcGxvdEhlaWdodDogbnVtYmVyO1xuICAgIGlmIChvcHRpb25zLmhlaWdodCAmJiBvcHRpb25zLmhlaWdodCA+IDApIHtcbiAgICAgIHBsb3RIZWlnaHQgPSBNYXRoLm1heCgxMjAsIG9wdGlvbnMuaGVpZ2h0IC0gYm90dG9tUGFkZGluZ0ZvclhBeGlzKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRhaW5lckhlaWdodCA+IDApIHtcbiAgICAgIHBsb3RIZWlnaHQgPSBNYXRoLm1heCgxMjAsIGNvbnRhaW5lckhlaWdodCAtIGJvdHRvbVBhZGRpbmdGb3JYQXhpcywgZmFsbGJhY2tQbG90SGVpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGxvdEhlaWdodCA9IGZhbGxiYWNrUGxvdEhlaWdodDtcbiAgICB9XG5cbiAgICB0aGlzLndpZHRoID0gcGxvdFdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gcGxvdEhlaWdodDtcblxuICAgIC8vIENyZWF0ZSBTVkcgd2l0aCBleHBsaWNpdCBwaXhlbCBkaW1lbnNpb25zIHRvIGF2b2lkIGNvbGxhcHNlXG4gICAgLy8gQWRkIGEgc21hbGwgaW50ZXJuYWwgdG9wIHBhZGRpbmcgdG8gYXZvaWQgY2xpcHBpbmcgdGhlIHRvcC1tb3N0IFktYXhpcyBsYWJlbFxuICAgIGNvbnN0IHRvcFBhZGRpbmdGb3JUb3BFZGdlID0gNjtcbiAgICBjb25zdCB0b3RhbEhlaWdodCA9IHRoaXMuaGVpZ2h0ICsgYm90dG9tUGFkZGluZ0ZvclhBeGlzICsgdG9wUGFkZGluZ0ZvclRvcEVkZ2U7XG5cbiAgICBjb25zdCBzdmcgPSB0aGlzLmQzXG4gICAgICAuc2VsZWN0KGNvbnRhaW5lckVsZW1lbnQpXG4gICAgICAuYXBwZW5kKCdzdmcnKVxuICAgICAgLmF0dHIoJ3dpZHRoJywgJzEwMCUnKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsIFN0cmluZyh0b3RhbEhlaWdodCkpXG4gICAgICAuYXR0cigndmlld0JveCcsIGAwIDAgJHt0b3RhbFdpZHRofSAke3RvdGFsSGVpZ2h0fWApXG4gICAgICAuYXR0cigncHJlc2VydmVBc3BlY3RSYXRpbycsICd4TWlkWU1pZCBtZWV0Jyk7XG5cbiAgICB0aGlzLnN2ZyA9IHN2ZztcblxuICAgIC8vIENyZWF0ZSBjaGFydCBncm91cCB0cmFuc2xhdGVkIGJ5IGludGVybmFsIHBhZGRpbmdzIChubyBleHRlcm5hbCBtYXJnaW5zKVxuICAgIHRoaXMuY2hhcnQgPSB0aGlzLnN2Z1xuICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAuYXR0cignY2xhc3MnLCAnY2hhcnQtY29udGVudCcpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke2xlZnRQYWRkaW5nRm9yWUF4aXN9LCR7dG9wUGFkZGluZ0ZvclRvcEVkZ2V9KWApO1xuICB9XG5cbiAgLy8gY2FsY3VsYXRlTWFyZ2lucyB3YXMgdW51c2VkOyByZW1vdmVkIHRvIHNpbXBsaWZ5IGFuZCByZWR1Y2UgbWFpbnRlbmFuY2Ugc3VyZmFjZVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHggYW5kIHkgc2NhbGVzIGZvciB0aGUgY2hhcnRcbiAgICovXG4gIHByaXZhdGUgc2V0dXBTY2FsZXMoZGF0YTogQVhCYXJDaGFydERhdGFbXSk6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgYmFyIHdpZHRoIHBlcmNlbnRhZ2UgKGRlZmF1bHQgODAlKVxuICAgIGNvbnN0IGJhcldpZHRoUGVyY2VudCA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmJhcldpZHRoID8/IDYwIC8gMTAwO1xuICAgIC8vIENhbGN1bGF0ZSBwYWRkaW5nIGJhc2VkIG9uIGJhcldpZHRoIChpbnZlcnNlIHJlbGF0aW9uc2hpcClcbiAgICBjb25zdCBwYWRkaW5nID0gTWF0aC5tYXgoMC4xLCAxIC0gYmFyV2lkdGhQZXJjZW50KTtcblxuICAgIC8vIENyZWF0ZSB4IHNjYWxlIChiYW5kIHNjYWxlIGZvciBjYXRlZ29yaWNhbCBkYXRhKVxuICAgIHRoaXMueFNjYWxlID0gdGhpcy5kM1xuICAgICAgLnNjYWxlQmFuZCgpXG4gICAgICAuZG9tYWluKGRhdGEubWFwKChkKSA9PiBkLmlkKSlcbiAgICAgIC5yYW5nZShbMCwgdGhpcy53aWR0aF0pXG4gICAgICAucGFkZGluZyhwYWRkaW5nKTtcblxuICAgIC8vIENyZWF0ZSB5IHNjYWxlIChsaW5lYXIgc2NhbGUgZm9yIHZhbHVlcylcbiAgICB0aGlzLnlTY2FsZSA9IHRoaXMuZDNcbiAgICAgIC5zY2FsZUxpbmVhcigpXG4gICAgICAuZG9tYWluKFswLCB0aGlzLmQzLm1heChkYXRhLCAoZCkgPT4gZC52YWx1ZSkgfHwgMF0pXG4gICAgICAubmljZSgpXG4gICAgICAucmFuZ2UoW3RoaXMuaGVpZ2h0LCAwXSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB4IGFuZCB5IHNjYWxlcyBmb3IgY2x1c3RlcmVkIGNoYXJ0c1xuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cFNjYWxlc0NsdXN0ZXJlZChncm91cHM6IEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10pOiB2b2lkIHtcbiAgICBjb25zdCBzZXJpZXNMYWJlbHMgPSBncm91cHMubGVuZ3RoID4gMCA/IHRoaXMuZ2V0Q2x1c3RlclNlcmllc0xhYmVscyhncm91cHMpIDogW107XG4gICAgY29uc3QgdmlzaWJsZVNlcmllcyA9IHNlcmllc0xhYmVscy5maWx0ZXIoKHMpID0+ICF0aGlzLmhpZGRlblNlcmllcy5oYXMocykpO1xuXG4gICAgLy8gT3V0ZXIgYmFuZCBmb3IgY2x1c3RlcnNcbiAgICBjb25zdCBvdXRlclBhZGRpbmcgPSAwLjI7XG4gICAgdGhpcy54U2NhbGUgPSB0aGlzLmQzXG4gICAgICAuc2NhbGVCYW5kKClcbiAgICAgIC5kb21haW4oZ3JvdXBzLm1hcCgoZykgPT4gZy5pZCkpXG4gICAgICAucmFuZ2UoWzAsIHRoaXMud2lkdGhdKVxuICAgICAgLnBhZGRpbmcob3V0ZXJQYWRkaW5nKTtcblxuICAgIC8vIElubmVyIGJhbmQgZm9yIHNlcmllc1xuICAgIHRoaXMueFN1YlNjYWxlID0gdGhpcy5kMy5zY2FsZUJhbmQoKS5kb21haW4odmlzaWJsZVNlcmllcykucmFuZ2UoWzAsIHRoaXMueFNjYWxlLmJhbmR3aWR0aCgpXSkucGFkZGluZygwLjEpO1xuXG4gICAgLy8gWSBzY2FsZSBhY3Jvc3MgYWxsIHZpc2libGUgdmFsdWVzXG4gICAgY29uc3QgYWxsVmlzaWJsZVZhbHVlczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGcgb2YgZ3JvdXBzKSB7XG4gICAgICB2aXNpYmxlU2VyaWVzLmZvckVhY2goKF8sIGlkeCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gZy5jaGFydERhdGFbaWR4XTtcbiAgICAgICAgaWYgKGl0ZW0gJiYgdHlwZW9mIGl0ZW0udmFsdWUgPT09ICdudW1iZXInKSBhbGxWaXNpYmxlVmFsdWVzLnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgeU1heCA9IHRoaXMuZDMubWF4KGFsbFZpc2libGVWYWx1ZXMpIHx8IDA7XG4gICAgdGhpcy55U2NhbGUgPSB0aGlzLmQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLCB5TWF4XSkubmljZSgpLnJhbmdlKFt0aGlzLmhlaWdodCwgMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgeCBhbmQgeSBheGVzIHdpdGggZ3JpZCBsaW5lc1xuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVBeGVzKG9wdGlvbnM6IEFYQmFyQ2hhcnRPcHRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBzaG93WEF4aXMgPSBvcHRpb25zLnNob3dYQXhpcyAhPT0gZmFsc2U7XG4gICAgY29uc3Qgc2hvd1lBeGlzID0gb3B0aW9ucy5zaG93WUF4aXMgIT09IGZhbHNlO1xuICAgIGNvbnN0IHNob3dHcmlkID0gb3B0aW9ucy5zaG93R3JpZCAhPT0gZmFsc2U7XG5cbiAgICBjb25zdCBheGVzR3JvdXAgPSB0aGlzLmNoYXJ0LmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1heGVzJyk7XG5cbiAgICBpZiAoc2hvd1hBeGlzKSB7XG4gICAgICB0aGlzLmNyZWF0ZVhBeGlzKGF4ZXNHcm91cCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKHNob3dZQXhpcykge1xuICAgICAgdGhpcy5jcmVhdGVZQXhpcyhheGVzR3JvdXAsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChzaG93R3JpZCkge1xuICAgICAgdGhpcy5jcmVhdGVHcmlkTGluZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVhBeGlzKGF4ZXNHcm91cDogYW55LCBvcHRpb25zOiBBWEJhckNoYXJ0T3B0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgdmlzaWJsZURhdGFGb3JUaWNrcyA9ICh0aGlzLmRhdGEoKSB8fCBbXSkuZmlsdGVyKChkKSA9PiAhdGhpcy5pc0JhckhpZGRlbihkLmlkKSk7XG4gICAgY29uc3QgaWRUb0xhYmVsID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4odmlzaWJsZURhdGFGb3JUaWNrcy5tYXAoKGQpID0+IFtkLmlkLCBkLmxhYmVsXSkpO1xuICAgIHRoaXMuYnVpbGRYQXhpc0NvbW1vbihheGVzR3JvdXAsIGlkVG9MYWJlbCwgb3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVlBeGlzKGF4ZXNHcm91cDogYW55LCBvcHRpb25zOiBBWEJhckNoYXJ0T3B0aW9uKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIFkgYXhpc1xuICAgIHRoaXMueUF4aXMgPSBheGVzR3JvdXAuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWF4aXMteScpLmNhbGwodGhpcy5kMy5heGlzTGVmdCh0aGlzLnlTY2FsZSkpO1xuXG4gICAgLy8gU3R5bGUgdGhlIGF4aXMgdGV4dFxuICAgIGNvbnN0IGR5bmFtaWNGb250U2l6ZSA9IHRoaXMuZ2V0WUF4aXNUaWNrRm9udFNpemVCYXNlZE9uSGVpZ2h0KCk7XG4gICAgdGhpcy55QXhpc1xuICAgICAgLnNlbGVjdEFsbCgndGV4dCcpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGAke2R5bmFtaWNGb250U2l6ZX1weGApXG4gICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJzQwMCcpXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiYSh2YXIoLS1heC1jb21wLWJhci1jaGFydC1sYWJlbHMtY29sb3IpLCAwLjcpJylcbiAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdlbmQnKVxuICAgICAgLmF0dHIoJ2RpcmVjdGlvbicsICdsdHInKTtcblxuICAgIC8vIFN0eWxlIGF4aXMgbGluZXNcbiAgICB0aGlzLnlBeGlzLnNlbGVjdEFsbCgnbGluZSwgcGF0aCcpLnN0eWxlKCdzdHJva2UnLCAncmdiKHZhcigtLWF4LWNvbXAtYmFyLWNoYXJ0LWdyaWQtbGluZXMtY29sb3IpKScpO1xuXG4gICAgLy8gQWRkIFkgYXhpcyB0aXRsZVxuICAgIGlmIChvcHRpb25zLnlBeGlzTGFiZWwpIHtcbiAgICAgIHRoaXMuY3JlYXRlWUF4aXNUaXRsZShheGVzR3JvdXAsIG9wdGlvbnMueUF4aXNMYWJlbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRSb3RhdGVYQXhpc0xhYmVscyhpZFRvTGFiZWw6IE1hcDxzdHJpbmcsIHN0cmluZz4sIGZvbnRTaXplOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCk7XG5cbiAgICAvLyBDaGVjayBpZiB1c2VyIGV4cGxpY2l0bHkgc2V0IHJvdGF0aW9uIG9wdGlvblxuICAgIGlmIChvcHRpb25zLnJvdGF0ZVhBeGlzTGFiZWxzID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAob3B0aW9ucy5yb3RhdGVYQXhpc0xhYmVscyA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIElmICdhdXRvJyBvciB1bmRlZmluZWQsIHVzZSBpbnRlbGxpZ2VudCBjYWxjdWxhdGlvblxuICAgIGlmICh0aGlzLnhTY2FsZS5kb21haW4oKS5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnhTY2FsZS5zdGVwKCk7XG4gICAgY29uc3QgbGFiZWxzID0gQXJyYXkuZnJvbShpZFRvTGFiZWwudmFsdWVzKCkpO1xuICAgIGNvbnN0IGxvbmdlc3RMYWJlbCA9IGxhYmVscy5yZWR1Y2UoKGEsIGIpID0+IChhLmxlbmd0aCA+IGIubGVuZ3RoID8gYSA6IGIpLCAnJyk7XG4gICAgY29uc3QgZXN0aW1hdGVkV2lkdGggPSBsb25nZXN0TGFiZWwubGVuZ3RoICogZm9udFNpemUgKiB0aGlzLkNIQVJfV0lEVEhfUkFUSU87XG5cbiAgICAvLyBIZXVyaXN0aWM6IGF2b2lkIHJvdGF0aW9uIHdoZW4gdGhlcmUgYXJlIGZldyBjYXRlZ29yaWVzICg8PSA2KSBldmVuIGlmIGVzdGltYXRpb24gaXMgc2xpZ2h0bHkgbGFyZ2VyXG4gICAgY29uc3QgZG9tYWluQ291bnQgPSB0aGlzLnhTY2FsZS5kb21haW4oKS5sZW5ndGg7XG4gICAgaWYgKGRvbWFpbkNvdW50IDw9IDYpIHtcbiAgICAgIHJldHVybiBlc3RpbWF0ZWRXaWR0aCA+IHN0ZXAgKiAxLjQ7IC8vIGJlIG1vcmUgdG9sZXJhbnQgZm9yIHNtYWxsIGRhdGFzZXRzXG4gICAgfVxuXG4gICAgcmV0dXJuIGVzdGltYXRlZFdpZHRoID4gc3RlcDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlWEF4aXNUaXRsZShheGVzR3JvdXA6IGFueSwgdGl0bGU6IHN0cmluZywgdGlja0FyZWFIZWlnaHQ6IG51bWJlciwgZ2FwQmVsb3dUaWNrcyA9IDgpOiB2b2lkIHtcbiAgICAvLyBUaXRsZSBwb3NpdGlvbmVkIGRpcmVjdGx5IGJlbG93IHRpY2sgYXJlYSB3aXRoIGEgY29uc2lzdGVudCBnYXBcbiAgICBjb25zdCBsYWJlbFkgPSB0aGlzLmhlaWdodCArIHRpY2tBcmVhSGVpZ2h0ICsgZ2FwQmVsb3dUaWNrcztcblxuICAgIGF4ZXNHcm91cFxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWF4aXMtbGFiZWwgYXgteC1heGlzLWxhYmVsJylcbiAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ2hhbmdpbmcnKSAvLyBBbGlnbiB0byB0b3Agb2YgdGV4dCBmb3IgYmV0dGVyIHBvc2l0aW9uaW5nXG4gICAgICAuYXR0cigneCcsIHRoaXMud2lkdGggLyAyKVxuICAgICAgLmF0dHIoJ3knLCBsYWJlbFkpXG4gICAgICAuYXR0cignZGlyZWN0aW9uJywgJ2x0cicpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcxNHB4JylcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNTAwJylcbiAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtYXhpcy1sYWJlbC1jb2xvcikpJylcbiAgICAgIC50ZXh0KHRpdGxlKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlWUF4aXNUaXRsZShheGVzR3JvdXA6IGFueSwgdGl0bGU6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgZXhhY3QgcG9zaXRpb24gZm9yIFktYXhpcyB0aXRsZVxuICAgIC8vIFktYXhpcyB0aWNrIGxhYmVscyB1c2UgdGV4dC1hbmNob3I6IGVuZCwgc28gdGhleSBleHRlbmQgTEVGVCBvZiB0aGUgWS1heGlzIGxpbmVcbiAgICAvLyBZLWF4aXMgaXMgYXQgWCA9IDAgd2l0aGluIHRoZSBjaGFydCBncm91cFxuICAgIC8vIENoYXJ0IGdyb3VwIGlzIHRyYW5zbGF0ZWQgYnkgKG1hcmdpbi5sZWZ0LCBtYXJnaW4udG9wKVxuICAgIC8vIFNvIFktYXhpcyBpcyBhdCBYID0gbWFyZ2luLmxlZnQgaW4gU1ZHIGNvb3JkaW5hdGVzXG5cbiAgICBjb25zdCBtYXhUaWNrTGFiZWxXaWR0aCA9IHRoaXMuY2FsY3VsYXRlTWF4WUF4aXNUaWNrTGFiZWxXaWR0aCgpO1xuICAgIGNvbnN0IHBhZGRpbmcgPSAyMDsgLy8gSW5jcmVhc2VkIHBhZGRpbmcgYmV0d2VlbiB0aWNrIGxhYmVscyBhbmQgYXhpcyB0aXRsZVxuXG4gICAgLy8gUG9zaXRpb24gdGl0bGUgdG8gdGhlIGxlZnQgb2YgdGhlIHRpY2sgbGFiZWxzXG4gICAgLy8gU2luY2UgdGV4dC1hbmNob3I6IGVuZCBhbGlnbnMgdGhlIHRleHQgdG8gdGhlIFktYXhpcywgd2UgbmVlZCB0byBnbyBmdXJ0aGVyIGxlZnRcbiAgICBjb25zdCBsYWJlbFkgPSAtbWF4VGlja0xhYmVsV2lkdGggLSBwYWRkaW5nO1xuXG4gICAgLy8gQ2VudGVyIHRoZSB0aXRsZSB2ZXJ0aWNhbGx5XG4gICAgY29uc3QgbGFiZWxYID0gLXRoaXMuaGVpZ2h0IC8gMjtcblxuICAgIGF4ZXNHcm91cFxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWF4aXMtbGFiZWwgYXgteS1heGlzLWxhYmVsJylcbiAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ21pZGRsZScpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3JvdGF0ZSgtOTApJylcbiAgICAgIC5hdHRyKCd4JywgbGFiZWxYKVxuICAgICAgLmF0dHIoJ3knLCBsYWJlbFkpXG4gICAgICAuYXR0cignZGlyZWN0aW9uJywgJ2x0cicpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcxNHB4JylcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNTAwJylcbiAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtYXhpcy1sYWJlbC1jb2xvcikpJylcbiAgICAgIC50ZXh0KHRpdGxlKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlTWF4WUF4aXNUaWNrTGFiZWxXaWR0aCgpOiBudW1iZXIge1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgbWF4aW11bSB3aWR0aCBuZWVkZWQgZm9yIFktYXhpcyB0aWNrIGxhYmVsc1xuICAgIGNvbnN0IHJhdyA9ICh0aGlzLmRhdGEoKSB8fCBbXSkgYXMgQVhCYXJDaGFydFZhbHVlO1xuICAgIGNvbnN0IGlzQ2x1c3RlcmVkID0gdGhpcy5pc0NsdXN0ZXJlZERhdGEocmF3KTtcblxuICAgIGxldCBtYXhWYWx1ZSA9IDA7XG4gICAgaWYgKGlzQ2x1c3RlcmVkKSB7XG4gICAgICBjb25zdCBncm91cHMgPSByYXcgYXMgQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXTtcbiAgICAgIGNvbnN0IHNlcmllc0xhYmVscyA9IGdyb3Vwcy5sZW5ndGggPiAwID8gdGhpcy5nZXRDbHVzdGVyU2VyaWVzTGFiZWxzKGdyb3VwcykgOiBbXTtcbiAgICAgIGNvbnN0IHZpc2libGVTZXJpZXMgPSBzZXJpZXNMYWJlbHMuZmlsdGVyKChzKSA9PiAhdGhpcy5oaWRkZW5TZXJpZXMuaGFzKHMpKTtcblxuICAgICAgZm9yIChjb25zdCBnIG9mIGdyb3Vwcykge1xuICAgICAgICB2aXNpYmxlU2VyaWVzLmZvckVhY2goKF8sIGlkeCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW0gPSBnLmNoYXJ0RGF0YVtpZHhdO1xuICAgICAgICAgIGlmIChpdGVtICYmIHR5cGVvZiBpdGVtLnZhbHVlID09PSAnbnVtYmVyJykgbWF4VmFsdWUgPSBNYXRoLm1heChtYXhWYWx1ZSwgaXRlbS52YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2aXNpYmxlRGF0YSA9IChyYXcgYXMgQVhCYXJDaGFydERhdGFbXSkuZmlsdGVyKChkKSA9PiAhdGhpcy5pc0JhckhpZGRlbihkLmlkKSk7XG4gICAgICBtYXhWYWx1ZSA9IHZpc2libGVEYXRhLnJlZHVjZSgoYWNjLCBkKSA9PiAoZC52YWx1ZSA+IGFjYyA/IGQudmFsdWUgOiBhY2MpLCAwKTtcbiAgICB9XG5cbiAgICBjb25zdCB0aWNrTGFiZWxUZXh0ID0gTnVtYmVyLmlzRmluaXRlKG1heFZhbHVlKSA/IG1heFZhbHVlLnRvTG9jYWxlU3RyaW5nKCkgOiAnMDAwMDAnO1xuICAgIGNvbnN0IGZvbnRTaXplID0gMTM7IC8vIEFwcHJveGltYXRlIGZvbnQgc2l6ZSBmb3IgWS1heGlzIHRpY2sgbGFiZWxzXG4gICAgcmV0dXJuIHRpY2tMYWJlbFRleHQubGVuZ3RoICogZm9udFNpemUgKiAwLjYgKyA4OyAvLyBDaGFyYWN0ZXIgd2lkdGggKyBwYWRkaW5nXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUdyaWRMaW5lcygpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXJ0XG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtZ3JpZCcpXG4gICAgICAuY2FsbChcbiAgICAgICAgdGhpcy5kM1xuICAgICAgICAgIC5heGlzTGVmdCh0aGlzLnlTY2FsZSlcbiAgICAgICAgICAudGlja1NpemUoLXRoaXMud2lkdGgpXG4gICAgICAgICAgLnRpY2tGb3JtYXQoKCkgPT4gJycpLFxuICAgICAgKVxuICAgICAgLnNlbGVjdEFsbCgnbGluZScpXG4gICAgICAuc3R5bGUoJ3N0cm9rZScsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtZ3JpZC1saW5lcy1jb2xvcikpJylcbiAgICAgIC5zdHlsZSgnc3Ryb2tlLW9wYWNpdHknLCAwLjIpO1xuXG4gICAgLy8gUmVtb3ZlIHVubmVlZGVkIGVsZW1lbnRzIGZyb20gZ3JpZFxuICAgIHRoaXMuY2hhcnQuc2VsZWN0KCcuYXgtYmFyLWNoYXJ0LWdyaWQnKS5zZWxlY3RBbGwoJ3BhdGgsIHRleHQnKS5yZW1vdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGF4ZXMgZm9yIGNsdXN0ZXJlZCBjaGFydHNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQXhlc0NsdXN0ZXJlZChvcHRpb25zOiBBWEJhckNoYXJ0T3B0aW9uLCBncm91cHM6IEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10pOiB2b2lkIHtcbiAgICBjb25zdCBzaG93WEF4aXMgPSBvcHRpb25zLnNob3dYQXhpcyAhPT0gZmFsc2U7XG4gICAgY29uc3Qgc2hvd1lBeGlzID0gb3B0aW9ucy5zaG93WUF4aXMgIT09IGZhbHNlO1xuICAgIGNvbnN0IHNob3dHcmlkID0gb3B0aW9ucy5zaG93R3JpZCAhPT0gZmFsc2U7XG5cbiAgICBjb25zdCBheGVzR3JvdXAgPSB0aGlzLmNoYXJ0LmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1heGVzJyk7XG5cbiAgICBpZiAoc2hvd1hBeGlzKSB7XG4gICAgICB0aGlzLmNyZWF0ZVhBeGlzQ2x1c3RlcmVkKGF4ZXNHcm91cCwgb3B0aW9ucywgZ3JvdXBzKTtcbiAgICB9XG5cbiAgICBpZiAoc2hvd1lBeGlzKSB7XG4gICAgICB0aGlzLmNyZWF0ZVlBeGlzKGF4ZXNHcm91cCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKHNob3dHcmlkKSB7XG4gICAgICB0aGlzLmNyZWF0ZUdyaWRMaW5lcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlWEF4aXNDbHVzdGVyZWQoYXhlc0dyb3VwOiBhbnksIG9wdGlvbnM6IEFYQmFyQ2hhcnRPcHRpb24sIGdyb3VwczogQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXSk6IHZvaWQge1xuICAgIGNvbnN0IGlkVG9MYWJlbCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KGdyb3Vwcy5tYXAoKGcpID0+IFtnLmlkLCBnLmxhYmVsXSkpO1xuICAgIHRoaXMuYnVpbGRYQXhpc0NvbW1vbihheGVzR3JvdXAsIGlkVG9MYWJlbCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgYmFycyB3aXRoIGFuaW1hdGlvbnNcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQmFycyhkYXRhOiBBWEJhckNoYXJ0RGF0YVtdKTogdm9pZCB7XG4gICAgLy8gRmlsdGVyIG91dCBoaWRkZW4gYmFyc1xuICAgIGNvbnN0IHZpc2libGVEYXRhID0gZGF0YS5maWx0ZXIoKGQpID0+ICF0aGlzLmlzQmFySGlkZGVuKGQuaWQpKTtcbiAgICBjb25zdCBvcmlnaW5hbEZ1bGxEYXRhID0gKHRoaXMuZGF0YSgpIGFzIEFYQmFyQ2hhcnREYXRhW10pIHx8IFtdO1xuXG4gICAgLy8gUmVzZXQgYW5pbWF0aW9uIHN0YXRlXG4gICAgdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlLnNldChmYWxzZSk7XG5cbiAgICAvLyBHZXQgY29ybmVyIHJhZGl1cyBmcm9tIG9wdGlvbnNcbiAgICBjb25zdCByYWRpdXMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5jb3JuZXJSYWRpdXM7XG5cbiAgICAvLyBHZXQgYW5pbWF0aW9uIG9wdGlvbnNcbiAgICBjb25zdCBhbmltYXRpb25EdXJhdGlvbiA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkR1cmF0aW9uO1xuICAgIGNvbnN0IGFuaW1hdGlvbkVhc2luZyA9IGdldEVhc2luZ0Z1bmN0aW9uKHRoaXMuZDMsIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkVhc2luZyk7XG5cbiAgICAvLyBDcmVhdGUgYSBjb250YWluZXIgZm9yIGFsbCBiYXJzXG4gICAgY29uc3QgYmFyc0NvbnRhaW5lciA9IHRoaXMuY2hhcnQuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWJhcnMtY29udGFpbmVyJyk7XG5cbiAgICAvLyBDcmVhdGUgZ3JvdXBzIGZvciBlYWNoIGJhciB0byBoYW5kbGUgdHJhbnNmb3JtYXRpb25zXG4gICAgY29uc3QgYmFyR3JvdXBzID0gYmFyc0NvbnRhaW5lclxuICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1iYXItZ3JvdXAnKVxuICAgICAgLmRhdGEodmlzaWJsZURhdGEpXG4gICAgICAuZW50ZXIoKVxuICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYmFyLWdyb3VwJyk7XG5cbiAgICAvLyBBZGQgYmFycyBpbnNpZGUgZ3JvdXBzXG4gICAgY29uc3QgYmFycyA9IGJhckdyb3Vwc1xuICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWJhcicpXG4gICAgICAuYXR0cignZCcsIChkOiBBWEJhckNoYXJ0RGF0YSkgPT4ge1xuICAgICAgICBjb25zdCB4ID0gdGhpcy54U2NhbGUoZC5pZCk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy54U2NhbGUuYmFuZHdpZHRoKCk7XG4gICAgICAgIGNvbnN0IHkgPSB0aGlzLmhlaWdodCAtIDAuNTsgLy8gaW5pdGlhbCBoZWlnaHQgaXMgemVyb1xuICAgICAgICByZXR1cm4gYE0ke3h9LCR7eX0gTCR7eH0sJHt5fSBMJHt4ICsgd2lkdGh9LCR7eX0gTCR7eCArIHdpZHRofSwke3l9IFpgO1xuICAgICAgfSlcbiAgICAgIC5hdHRyKCdmaWxsJywgKGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB7XG4gICAgICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGJhciAoZCkgaW4gdGhlIG9yaWdpbmFsIGRhdGEgYXJyYXlcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxJbmRleCA9IG9yaWdpbmFsRnVsbERhdGEuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09PSBkLmlkKTtcbiAgICAgICAgLy8gVXNlIHRoZSBvcmlnaW5hbCBjb2xvciBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIGdldCBjb2xvciBmcm9tIHBhbGV0dGUgdXNpbmcgb3JpZ2luYWwgaW5kZXhcbiAgICAgICAgLy8gRmFsbGJhY2sgdG8gaW5kZXggMCBpZiBub3QgZm91bmQsIHRob3VnaCB0aGlzIHNob3VsZG4ndCBoYXBwZW4gd2l0aCB2YWxpZCBkYXRhLlxuICAgICAgICByZXR1cm4gZC5jb2xvciB8fCB0aGlzLmdldENvbG9yKG9yaWdpbmFsSW5kZXggIT09IC0xID8gb3JpZ2luYWxJbmRleCA6IDApO1xuICAgICAgfSk7XG5cbiAgICAvLyBBZGQgZGF0YSBsYWJlbHMgaWYgdGhleSdyZSBlbmFibGVkXG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dEYXRhTGFiZWxzICE9PSBmYWxzZSkge1xuICAgICAgYmFyR3JvdXBzXG4gICAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWRhdGEtbGFiZWwnKVxuICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgICAgLmF0dHIoJ3gnLCAoZDogQVhCYXJDaGFydERhdGEpID0+IHRoaXMueFNjYWxlKGQuaWQpICsgdGhpcy54U2NhbGUuYmFuZHdpZHRoKCkgLyAyKVxuICAgICAgICAuYXR0cigneScsIHRoaXMuaGVpZ2h0KSAvLyBTdGFydCBmcm9tIGJvdHRvbSBmb3IgYW5pbWF0aW9uXG4gICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJ2NsYW1wKDhweCwgMnZtaW4sIDEycHgpJylcbiAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc1MDAnKVxuICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtYmFyLWNoYXJ0LWRhdGEtbGFiZWxzLWNvbG9yKSknKVxuICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKSAvLyBTdGFydCBpbnZpc2libGUgZm9yIGFuaW1hdGlvblxuICAgICAgICAudGV4dCgoZDogQVhCYXJDaGFydERhdGEpID0+IGQudmFsdWUpO1xuXG4gICAgICAvLyBBbmltYXRlIGRhdGEgbGFiZWxzXG4gICAgICBiYXJHcm91cHNcbiAgICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1kYXRhLWxhYmVsJylcbiAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAuZHVyYXRpb24oYW5pbWF0aW9uRHVyYXRpb24pXG4gICAgICAgIC5kZWxheSgoZDogQVhCYXJDaGFydERhdGEsIGk6IG51bWJlcikgPT4gaSAqIDUwICsgMTAwKSAvLyBTbGlnaHRseSBkZWxheWVkIGFmdGVyIGJhciBhbmltYXRpb25cbiAgICAgICAgLmF0dHIoJ3knLCAoZDogQVhCYXJDaGFydERhdGEpID0+IHRoaXMueVNjYWxlKGQudmFsdWUpIC0gOCkgLy8gUG9zaXRpb24gYWJvdmUgYmFyXG4gICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgIC5lYXNlKGFuaW1hdGlvbkVhc2luZyk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHVwIGV2ZW50IGhhbmRsZXJzIG9uIGVhY2ggZ3JvdXBcbiAgICBiYXJHcm91cHNcbiAgICAgIC5vbignbW91c2VlbnRlcicsIChldmVudDogTW91c2VFdmVudCwgZDogQVhCYXJDaGFydERhdGEpID0+IHtcbiAgICAgICAgLy8gT25seSBhcHBseSBob3ZlciBlZmZlY3RzIGlmIGluaXRpYWwgYW5pbWF0aW9uIGlzIGNvbXBsZXRlXG4gICAgICAgIGlmICghdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlKCkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBiYXJFbCA9IHRoaXMuZDMuc2VsZWN0KGV2ZW50LmN1cnJlbnRUYXJnZXQpLnNlbGVjdCgncGF0aCcpO1xuXG4gICAgICAgIC8vIFN0YW5kYXJkIGhvdmVyIGVmZmVjdCAtIGRhcmtlbiB0aGUgYmFyIHNsaWdodGx5IGFuZCBhZGQgYSBzdWJ0bGUgc2hhZG93XG4gICAgICAgIGJhckVsLnRyYW5zaXRpb24oKS5kdXJhdGlvbigxNTApLnN0eWxlKCdmaWx0ZXInLCAnYnJpZ2h0bmVzcygwLjcpIGRyb3Atc2hhZG93KDAgMCAycHggcmdiYSgwLDAsMCwwLjEpKScpO1xuXG4gICAgICAgIHRoaXMuaGFuZGxlQmFySG92ZXIoZXZlbnQsIGQpO1xuICAgICAgfSlcbiAgICAgIC5vbignbW91c2Vtb3ZlJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIC8vIE9ubHkgdXBkYXRlIHRvb2x0aXAgaWYgaW5pdGlhbCBhbmltYXRpb24gaXMgY29tcGxldGVcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIC8vIE9ubHkgYXBwbHkgaG92ZXIgZWZmZWN0cyBpZiBpbml0aWFsIGFuaW1hdGlvbiBpcyBjb21wbGV0ZVxuICAgICAgICBpZiAoIXRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgYmFyRWwgPSB0aGlzLmQzLnNlbGVjdChldmVudC5jdXJyZW50VGFyZ2V0KS5zZWxlY3QoJ3BhdGgnKTtcblxuICAgICAgICAvLyBSZW1vdmUgaG92ZXIgZWZmZWN0XG4gICAgICAgIGJhckVsLnRyYW5zaXRpb24oKS5kdXJhdGlvbigxNTApLnN0eWxlKCdmaWx0ZXInLCBudWxsKTtcblxuICAgICAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICAgICAgfSlcbiAgICAgIC5vbignY2xpY2snLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB7XG4gICAgICAgIC8vIE9ubHkgdHJpZ2dlciBjbGljayBldmVudHMgaWYgaW5pdGlhbCBhbmltYXRpb24gaXMgY29tcGxldGVcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVCYXJDbGljayhldmVudCwgZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgLy8gQWRkIGFuaW1hdGlvblxuICAgIGJhcnNcbiAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgIC5kdXJhdGlvbihhbmltYXRpb25EdXJhdGlvbilcbiAgICAgIC5kZWxheSgoZDogQVhCYXJDaGFydERhdGEsIGk6IG51bWJlcikgPT4gaSAqIDUwKSAvLyBTdGFnZ2VyIGVhY2ggYmFyIGFuaW1hdGlvblxuICAgICAgLmF0dHJUd2VlbignZCcsIChkOiBBWEJhckNoYXJ0RGF0YSkgPT4ge1xuICAgICAgICBjb25zdCB4ID0gdGhpcy54U2NhbGUoZC5pZCk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy54U2NhbGUuYmFuZHdpZHRoKCk7XG4gICAgICAgIGNvbnN0IGZpbmFsSGVpZ2h0ID0gdGhpcy5oZWlnaHQgLSB0aGlzLnlTY2FsZShkLnZhbHVlKTtcblxuICAgICAgICByZXR1cm4gKHQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRIZWlnaHQgPSBmaW5hbEhlaWdodCAqIHQ7XG4gICAgICAgICAgY29uc3QgY3VycmVudFkgPSB0aGlzLmhlaWdodCAtIGN1cnJlbnRIZWlnaHQ7XG4gICAgICAgICAgY29uc3QgYm90dG9tWSA9IHRoaXMuaGVpZ2h0IC0gMC41OyAvLyBBZGQgc21hbGwgZ2FwIHRvIHByZXZlbnQgb3ZlcmxhcCB3aXRoIHgtYXhpc1xuXG4gICAgICAgICAgaWYgKHJhZGl1cyA+IDAgJiYgY3VycmVudEhlaWdodCA+IDApIHtcbiAgICAgICAgICAgIC8vIExpbWl0IHJhZGl1cyB0byBwcmV2ZW50IGl0IGZyb20gZXhjZWVkaW5nIGhhbGYgdGhlIGJhciB3aWR0aFxuICAgICAgICAgICAgY29uc3QgZWZmZWN0aXZlUmFkaXVzID0gTWF0aC5taW4ocmFkaXVzLCB3aWR0aCAvIDIpO1xuICAgICAgICAgICAgcmV0dXJuIGBNJHt4fSwke2JvdHRvbVl9IEwke3h9LCR7Y3VycmVudFkgKyBlZmZlY3RpdmVSYWRpdXN9IFEke3h9LCR7Y3VycmVudFl9ICR7eCArIGVmZmVjdGl2ZVJhZGl1c30sJHtjdXJyZW50WX0gTCR7eCArIHdpZHRoIC0gZWZmZWN0aXZlUmFkaXVzfSwke2N1cnJlbnRZfSBRJHt4ICsgd2lkdGh9LCR7Y3VycmVudFl9ICR7eCArIHdpZHRofSwke2N1cnJlbnRZICsgZWZmZWN0aXZlUmFkaXVzfSBMJHt4ICsgd2lkdGh9LCR7Ym90dG9tWX0gWmA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgTSR7eH0sJHtib3R0b21ZfSBMJHt4fSwke2N1cnJlbnRZfSBMJHt4ICsgd2lkdGh9LCR7Y3VycmVudFl9IEwke3ggKyB3aWR0aH0sJHtib3R0b21ZfSBaYDtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLmVhc2UoYW5pbWF0aW9uRWFzaW5nKSAvLyBVc2UgdGhlIGNvbmZpZ3VyZWQgZWFzaW5nIGZ1bmN0aW9uXG4gICAgICAuZW5kKCkgLy8gV2FpdCBmb3IgYWxsIGFuaW1hdGlvbnMgdG8gY29tcGxldGVcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gTWFyayBhbmltYXRpb24gYXMgY29tcGxldGUgdG8gZW5hYmxlIGhvdmVyIGVmZmVjdHNcbiAgICAgICAgdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlLnNldCh0cnVlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgYmFycyBmb3IgY2x1c3RlcmVkIGNoYXJ0c1xuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJCYXJzQ2x1c3RlcmVkKGdyb3VwczogQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXSk6IHZvaWQge1xuICAgIGNvbnN0IHNlcmllc0xhYmVscyA9IGdyb3Vwcy5sZW5ndGggPiAwID8gdGhpcy5nZXRDbHVzdGVyU2VyaWVzTGFiZWxzKGdyb3VwcykgOiBbXTtcbiAgICBjb25zdCB2aXNpYmxlU2VyaWVzID0gc2VyaWVzTGFiZWxzLmZpbHRlcigocykgPT4gIXRoaXMuaGlkZGVuU2VyaWVzLmhhcyhzKSk7XG5cbiAgICB0aGlzLl9pbml0aWFsQW5pbWF0aW9uQ29tcGxldGUuc2V0KGZhbHNlKTtcblxuICAgIGNvbnN0IHJhZGl1cyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmNvcm5lclJhZGl1cztcbiAgICBjb25zdCBhbmltYXRpb25EdXJhdGlvbiA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkR1cmF0aW9uO1xuICAgIGNvbnN0IGFuaW1hdGlvbkVhc2luZyA9IGdldEVhc2luZ0Z1bmN0aW9uKHRoaXMuZDMsIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkVhc2luZyk7XG5cbiAgICBjb25zdCBiYXJzQ29udGFpbmVyID0gdGhpcy5jaGFydC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYmFycy1jb250YWluZXInKTtcblxuICAgIGNvbnN0IGdyb3VwU2VsID0gYmFyc0NvbnRhaW5lclxuICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1ncm91cCcpXG4gICAgICAuZGF0YShncm91cHMpXG4gICAgICAuZW50ZXIoKVxuICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWdyb3VwJylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoZzogQVhCYXJDaGFydENsdXN0ZXJlZERhdGEpID0+IGB0cmFuc2xhdGUoJHt0aGlzLnhTY2FsZShnLmlkKX0sMClgKTtcblxuICAgIGNvbnN0IGJhckdyb3VwcyA9IGdyb3VwU2VsXG4gICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhci1ncm91cCcpXG4gICAgICAuZGF0YSgoZzogQVhCYXJDaGFydENsdXN0ZXJlZERhdGEpID0+XG4gICAgICAgIHZpc2libGVTZXJpZXMubWFwKChsYWJlbCwgaWR4KSA9PiAoeyBncm91cDogZywgc2VyaWVzTGFiZWw6IGxhYmVsLCBzZXJpZXNJbmRleDogaWR4IH0pKSxcbiAgICAgIClcbiAgICAgIC5lbnRlcigpXG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1iYXItZ3JvdXAnKTtcblxuICAgIGNvbnN0IGJhcnMgPSBiYXJHcm91cHNcbiAgICAgIC5hcHBlbmQoJ3BhdGgnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1iYXInKVxuICAgICAgLmF0dHIoJ2RhdGEtc2VyaWVzJywgKGQ6IGFueSkgPT4gZC5zZXJpZXNMYWJlbClcbiAgICAgIC5hdHRyKCdkJywgKGQ6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB4ID0gdGhpcy54U3ViU2NhbGUoZC5zZXJpZXNMYWJlbCk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy54U3ViU2NhbGUuYmFuZHdpZHRoKCk7XG4gICAgICAgIGNvbnN0IHkgPSB0aGlzLmhlaWdodCAtIDAuNTsgLy8gaW5pdGlhbCBoZWlnaHQgaXMgemVyb1xuICAgICAgICByZXR1cm4gYE0ke3h9LCR7eX0gTCR7eH0sJHt5fSBMJHt4ICsgd2lkdGh9LCR7eX0gTCR7eCArIHdpZHRofSwke3l9IFpgO1xuICAgICAgfSlcbiAgICAgIC5hdHRyKCdmaWxsJywgKGQ6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gZC5ncm91cC5jaGFydERhdGFbZC5zZXJpZXNJbmRleF0gYXMgQVhCYXJDaGFydERhdGEgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGNvbG9ySW5kZXggPSBkLnNlcmllc0luZGV4O1xuICAgICAgICByZXR1cm4gaXRlbT8uY29sb3IgfHwgdGhpcy5nZXRDb2xvcihjb2xvckluZGV4KTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dEYXRhTGFiZWxzICE9PSBmYWxzZSkge1xuICAgICAgYmFyR3JvdXBzXG4gICAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWRhdGEtbGFiZWwnKVxuICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgICAgLmF0dHIoJ3gnLCAoZDogYW55KSA9PiAodGhpcy54U3ViU2NhbGUoZC5zZXJpZXNMYWJlbCkgfHwgMCkgKyB0aGlzLnhTdWJTY2FsZS5iYW5kd2lkdGgoKSAvIDIpXG4gICAgICAgIC5hdHRyKCd5JywgdGhpcy5oZWlnaHQpXG4gICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJ2NsYW1wKDhweCwgMnZtaW4sIDEycHgpJylcbiAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc1MDAnKVxuICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtYmFyLWNoYXJ0LWRhdGEtbGFiZWxzLWNvbG9yKSknKVxuICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgICAgICAudGV4dCgoZDogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlbSA9IGQuZ3JvdXAuY2hhcnREYXRhW2Quc2VyaWVzSW5kZXhdIGFzIEFYQmFyQ2hhcnREYXRhIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIHJldHVybiBpdGVtID8gaXRlbS52YWx1ZSA6ICcnO1xuICAgICAgICB9KTtcblxuICAgICAgYmFyR3JvdXBzXG4gICAgICAgIC5zZWxlY3RBbGwoJy5heC1iYXItY2hhcnQtZGF0YS1sYWJlbCcpXG4gICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgICAuZGVsYXkoKF86IGFueSwgaTogbnVtYmVyKSA9PiBpICogNTAgKyAxMDApXG4gICAgICAgIC5hdHRyKCd5JywgKGQ6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW0gPSBkLmdyb3VwLmNoYXJ0RGF0YVtkLnNlcmllc0luZGV4XSBhcyBBWEJhckNoYXJ0RGF0YSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICByZXR1cm4gaXRlbSA/IHRoaXMueVNjYWxlKGl0ZW0udmFsdWUpIC0gOCA6IHRoaXMuaGVpZ2h0O1xuICAgICAgICB9KVxuICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAxKVxuICAgICAgICAuZWFzZShhbmltYXRpb25FYXNpbmcpO1xuICAgIH1cblxuICAgIGJhckdyb3Vwc1xuICAgICAgLm9uKCdtb3VzZWVudGVyJywgKGV2ZW50OiBNb3VzZUV2ZW50LCBkOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLl9pbml0aWFsQW5pbWF0aW9uQ29tcGxldGUoKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBiYXJFbCA9IHRoaXMuZDMuc2VsZWN0KGV2ZW50LmN1cnJlbnRUYXJnZXQpLnNlbGVjdCgncGF0aCcpO1xuICAgICAgICBiYXJFbC50cmFuc2l0aW9uKCkuZHVyYXRpb24oMTUwKS5zdHlsZSgnZmlsdGVyJywgJ2JyaWdodG5lc3MoMC43KSBkcm9wLXNoYWRvdygwIDAgMnB4IHJnYmEoMCwwLDAsMC4xKSknKTtcbiAgICAgICAgY29uc3QgaXRlbSA9IGQuZ3JvdXAuY2hhcnREYXRhW2Quc2VyaWVzSW5kZXhdIGFzIEFYQmFyQ2hhcnREYXRhIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaXRlbSkgdGhpcy5oYW5kbGVCYXJIb3ZlcihldmVudCwgaXRlbSwgZC5ncm91cCk7XG4gICAgICB9KVxuICAgICAgLm9uKCdtb3VzZW1vdmUnLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gICAgICB9KVxuICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlKCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgYmFyRWwgPSB0aGlzLmQzLnNlbGVjdChldmVudC5jdXJyZW50VGFyZ2V0KS5zZWxlY3QoJ3BhdGgnKTtcbiAgICAgICAgYmFyRWwudHJhbnNpdGlvbigpLmR1cmF0aW9uKDE1MCkuc3R5bGUoJ2ZpbHRlcicsIG51bGwpO1xuICAgICAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICAgICAgfSlcbiAgICAgIC5vbignY2xpY2snLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBkLmdyb3VwLmNoYXJ0RGF0YVtkLnNlcmllc0luZGV4XSBhcyBBWEJhckNoYXJ0RGF0YSB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGl0ZW0pIHRoaXMuaGFuZGxlQmFyQ2xpY2soZXZlbnQsIGl0ZW0pO1xuICAgICAgfSk7XG5cbiAgICBiYXJzXG4gICAgICAudHJhbnNpdGlvbigpXG4gICAgICAuZHVyYXRpb24oYW5pbWF0aW9uRHVyYXRpb24pXG4gICAgICAuZGVsYXkoKF86IGFueSwgaTogbnVtYmVyKSA9PiBpICogNTApXG4gICAgICAuYXR0clR3ZWVuKCdkJywgKGQ6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB4ID0gdGhpcy54U3ViU2NhbGUoZC5zZXJpZXNMYWJlbCk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy54U3ViU2NhbGUuYmFuZHdpZHRoKCk7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBkLmdyb3VwLmNoYXJ0RGF0YVtkLnNlcmllc0luZGV4XSBhcyBBWEJhckNoYXJ0RGF0YSB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgZmluYWxIZWlnaHQgPSBpdGVtID8gdGhpcy5oZWlnaHQgLSB0aGlzLnlTY2FsZShpdGVtLnZhbHVlKSA6IDA7XG5cbiAgICAgICAgcmV0dXJuICh0OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50SGVpZ2h0ID0gZmluYWxIZWlnaHQgKiB0O1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRZID0gdGhpcy5oZWlnaHQgLSBjdXJyZW50SGVpZ2h0O1xuICAgICAgICAgIGNvbnN0IGJvdHRvbVkgPSB0aGlzLmhlaWdodCAtIDAuNTsgLy8gQWRkIHNtYWxsIGdhcCB0byBwcmV2ZW50IG92ZXJsYXAgd2l0aCB4LWF4aXNcblxuICAgICAgICAgIGlmIChyYWRpdXMgPiAwICYmIGN1cnJlbnRIZWlnaHQgPiAwKSB7XG4gICAgICAgICAgICAvLyBMaW1pdCByYWRpdXMgdG8gcHJldmVudCBpdCBmcm9tIGV4Y2VlZGluZyBoYWxmIHRoZSBiYXIgd2lkdGhcbiAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZVJhZGl1cyA9IE1hdGgubWluKHJhZGl1cywgd2lkdGggLyAyKTtcbiAgICAgICAgICAgIHJldHVybiBgTSR7eH0sJHtib3R0b21ZfSBMJHt4fSwke2N1cnJlbnRZICsgZWZmZWN0aXZlUmFkaXVzfSBRJHt4fSwke2N1cnJlbnRZfSAke3ggKyBlZmZlY3RpdmVSYWRpdXN9LCR7Y3VycmVudFl9IEwke3ggKyB3aWR0aCAtIGVmZmVjdGl2ZVJhZGl1c30sJHtjdXJyZW50WX0gUSR7eCArIHdpZHRofSwke2N1cnJlbnRZfSAke3ggKyB3aWR0aH0sJHtjdXJyZW50WSArIGVmZmVjdGl2ZVJhZGl1c30gTCR7eCArIHdpZHRofSwke2JvdHRvbVl9IFpgO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYE0ke3h9LCR7Ym90dG9tWX0gTCR7eH0sJHtjdXJyZW50WX0gTCR7eCArIHdpZHRofSwke2N1cnJlbnRZfSBMJHt4ICsgd2lkdGh9LCR7Ym90dG9tWX0gWmA7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICAgIC5lYXNlKGFuaW1hdGlvbkVhc2luZylcbiAgICAgIC5lbmQoKVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlLnNldCh0cnVlKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgYXBwcm9wcmlhdGUgRDMgZWFzaW5nIGZ1bmN0aW9uIGJhc2VkIG9uIHRoZSBvcHRpb24gc3RyaW5nXG4gICAqL1xuICAvLyBnZXRFYXNpbmdGdW5jdGlvbiBtb3ZlZCB0byBzaGFyZWQgY2hhcnQgdXRpbHNcblxuICAvKipcbiAgICogSGFuZGxlcyBiYXIgaG92ZXIgZXZlbnQgYW5kIHNob3dzIHRvb2x0aXBcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlQmFySG92ZXIoZXZlbnQ6IE1vdXNlRXZlbnQsIGRhdHVtOiBBWEJhckNoYXJ0RGF0YSwgZ3JvdXA/OiB7IGlkOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93VG9vbHRpcCAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IGRhdGFWYWx1ZSA9IHRoaXMuZGF0YSgpIGFzIEFYQmFyQ2hhcnRWYWx1ZTtcbiAgICAgIGNvbnN0IGlzQ2x1c3RlcmVkID0gdGhpcy5pc0NsdXN0ZXJlZERhdGEoZGF0YVZhbHVlKTtcbiAgICAgIGNvbnN0IGZsYXREYXRhOiBBWEJhckNoYXJ0RGF0YVtdID0gaXNDbHVzdGVyZWRcbiAgICAgICAgPyAoZGF0YVZhbHVlIGFzIEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10pLmZsYXRNYXAoKGcpID0+IGcuY2hhcnREYXRhKVxuICAgICAgICA6IChkYXRhVmFsdWUgYXMgQVhCYXJDaGFydERhdGFbXSkgfHwgW107XG4gICAgICBjb25zdCBpbmRleCA9IGZsYXREYXRhLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZGF0dW0uaWQgJiYgaXRlbS5sYWJlbCA9PT0gZGF0dW0ubGFiZWwpO1xuICAgICAgY29uc3QgY29sb3IgPSBkYXR1bS5jb2xvciB8fCB0aGlzLmdldENvbG9yKGluZGV4ICE9PSAtMSA/IGluZGV4IDogMCk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBwZXJjZW50YWdlIG9mIHRvdGFsXG4gICAgICBjb25zdCB0b3RhbCA9IGlzQ2x1c3RlcmVkXG4gICAgICAgID8gKGRhdGFWYWx1ZSBhcyBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdKS5yZWR1Y2UoXG4gICAgICAgICAgICAoc3VtLCBnKSA9PiBzdW0gKyBnLmNoYXJ0RGF0YS5yZWR1Y2UoKHMsIGl0KSA9PiBzICsgaXQudmFsdWUsIDApLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICApXG4gICAgICAgIDogKGZsYXREYXRhIGFzIEFYQmFyQ2hhcnREYXRhW10pLnJlZHVjZSgoc3VtLCBpdGVtKSA9PiBzdW0gKyBpdGVtLnZhbHVlLCAwKTtcbiAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSB0b3RhbCA+IDAgPyAoKGRhdHVtLnZhbHVlIC8gdG90YWwpICogMTAwKS50b0ZpeGVkKDEpIDogJzAnO1xuXG4gICAgICB0aGlzLl90b29sdGlwRGF0YS5zZXQoe1xuICAgICAgICB0aXRsZTogZ3JvdXAgPyBgJHtkYXR1bS50b29sdGlwTGFiZWwgfHwgZGF0dW0ubGFiZWx9IOKAlCAke2dyb3VwLmxhYmVsfWAgOiBkYXR1bS50b29sdGlwTGFiZWwgfHwgZGF0dW0ubGFiZWwsXG4gICAgICAgIHZhbHVlOiBkYXR1bS52YWx1ZS50b1N0cmluZygpLFxuICAgICAgICBwZXJjZW50YWdlOiBgJHtwZXJjZW50YWdlfSVgLFxuICAgICAgICBjb2xvcjogY29sb3IsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICAgICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRvb2x0aXAgcG9zaXRpb24gYmFzZWQgb24gbW91c2UgY29vcmRpbmF0ZXNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyRWwgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWNvbnRhaW5lckVsKSByZXR1cm47XG4gICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHRvb2x0aXBFbCA9IGNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoJy5jaGFydC10b29sdGlwJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGNvbnN0IHRvb2x0aXBSZWN0ID0gdG9vbHRpcEVsID8gdG9vbHRpcEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogbnVsbDtcbiAgICBjb25zdCBwb3MgPSBjb21wdXRlVG9vbHRpcFBvc2l0aW9uKGNvbnRhaW5lclJlY3QsIHRvb2x0aXBSZWN0LCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCB0aGlzLlRPT0xUSVBfR0FQKTtcbiAgICB0aGlzLl90b29sdGlwUG9zaXRpb24uc2V0KHBvcyk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBiYXIgY2xpY2sgZXZlbnRcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlQmFyQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQsIGRhdHVtOiBBWEJhckNoYXJ0RGF0YSk6IHZvaWQge1xuICAgIHRoaXMuYmFyQ2xpY2suZW1pdCh7IGl0ZW06IGRhdHVtLCBldmVudDogeyBuYXRpdmVFdmVudDogZXZlbnQsIHNlbmRlcjogdGhpcyB9IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGEgbWVzc2FnZSB3aGVuIG5vIGRhdGEgaXMgYXZhaWxhYmxlXG4gICAqL1xuICBwcml2YXRlIHNob3dOb0RhdGFNZXNzYWdlKGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckNoYXJ0QXJlYShjb250YWluZXJFbGVtZW50KTtcbiAgICB0aGlzLnNob3dNZXNzYWdlKFxuICAgICAgY29udGFpbmVyRWxlbWVudCxcbiAgICAgIHRoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKS5ub0RhdGFJY29uLFxuICAgICAgdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLm5vRGF0YSxcbiAgICAgIHRoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKS5ub0RhdGFIZWxwLFxuICAgICAgJ2F4LWJhci1jaGFydC1uby1kYXRhLW1lc3NhZ2UnLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSBtZXNzYWdlIHdoZW4gYWxsIGJhcnMgYXJlIGhpZGRlblxuICAgKi9cbiAgcHJpdmF0ZSBzaG93QWxsQmFyc0hpZGRlbk1lc3NhZ2UoY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyQ2hhcnRBcmVhKGNvbnRhaW5lckVsZW1lbnQpO1xuICAgIHRoaXMuc2hvd01lc3NhZ2UoXG4gICAgICBjb250YWluZXJFbGVtZW50LFxuICAgICAgdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLmFsbEhpZGRlbkljb24sXG4gICAgICB0aGlzLmVmZmVjdGl2ZU1lc3NhZ2VzKCkuYWxsSGlkZGVuLFxuICAgICAgdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLmFsbEhpZGRlbkhlbHAsXG4gICAgICAnYXgtYmFyLWNoYXJ0LW5vLWRhdGEtbWVzc2FnZScsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb2xvciBmb3IgYSBiYXIgYmFzZWQgb24gaXRzIGluZGV4XG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Q29sb3IoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdldENoYXJ0Q29sb3IoaW5kZXgsIHRoaXMuY2hhcnRDb2xvcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGJhciBpcyBoaWRkZW5cbiAgICovXG4gIHByb3RlY3RlZCBpc0JhckhpZGRlbihpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGlkZGVuQmFycy5oYXMoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIG9mIEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlIGludGVyZmFjZVxuICAgKiBSZXR1cm5zIGxlZ2VuZCBpdGVtcyBiYXNlZCBvbiB0aGUgY2hhcnQgZGF0YVxuICAgKi9cbiAgZ2V0TGVnZW5kSXRlbXMoKTogQVhDaGFydExlZ2VuZEl0ZW1bXSB7XG4gICAgY29uc3QgdmFsdWUgPSAodGhpcy5kYXRhKCkgfHwgW10pIGFzIEFYQmFyQ2hhcnRWYWx1ZTtcbiAgICBpZiAodGhpcy5pc0NsdXN0ZXJlZERhdGEodmFsdWUpKSB7XG4gICAgICBjb25zdCBncm91cHMgPSB2YWx1ZSBhcyBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdO1xuICAgICAgY29uc3Qgc2VyaWVzTGFiZWxzID0gZ3JvdXBzLmxlbmd0aCA+IDAgPyB0aGlzLmdldENsdXN0ZXJTZXJpZXNMYWJlbHMoZ3JvdXBzKSA6IFtdO1xuICAgICAgY29uc3QgdG90YWwgPSBncm91cHMucmVkdWNlKFxuICAgICAgICAoc3VtLCBnKSA9PiBzdW0gKyBnLmNoYXJ0RGF0YS5yZWR1Y2UoKHMsIGl0KSA9PiBzICsgKHR5cGVvZiBpdC52YWx1ZSA9PT0gJ251bWJlcicgPyBpdC52YWx1ZSA6IDApLCAwKSxcbiAgICAgICAgMCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gc2VyaWVzTGFiZWxzLm1hcCgobGFiZWwsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlcmllc1RvdGFsID0gZ3JvdXBzLnJlZHVjZSgocywgZykgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW0gPSBnLmNoYXJ0RGF0YVtpbmRleF07XG4gICAgICAgICAgY29uc3QgdiA9IGl0ZW0gJiYgdHlwZW9mIGl0ZW0udmFsdWUgPT09ICdudW1iZXInID8gaXRlbS52YWx1ZSA6IDA7XG4gICAgICAgICAgcmV0dXJuIHMgKyB2O1xuICAgICAgICB9LCAwKTtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9IHRvdGFsID4gMCA/IChzZXJpZXNUb3RhbCAvIHRvdGFsKSAqIDEwMCA6IDA7XG4gICAgICAgIGNvbnN0IGZpcnN0SXRlbSA9IGdyb3Vwc1swXT8uY2hhcnREYXRhW2luZGV4XTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogbGFiZWwsXG4gICAgICAgICAgbmFtZTogbGFiZWwgfHwgYFNlcmllcyAke2luZGV4ICsgMX1gLFxuICAgICAgICAgIHZhbHVlOiBzZXJpZXNUb3RhbCxcbiAgICAgICAgICBwZXJjZW50YWdlLFxuICAgICAgICAgIGNvbG9yOiBmaXJzdEl0ZW0/LmNvbG9yIHx8IHRoaXMuZ2V0Q29sb3IoaW5kZXgpLFxuICAgICAgICAgIGhpZGRlbjogdGhpcy5oaWRkZW5TZXJpZXMuaGFzKGxhYmVsKSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZsYXQgPSB2YWx1ZSBhcyBBWEJhckNoYXJ0RGF0YVtdO1xuICAgIGNvbnN0IHRvdGFsID0gZmxhdC5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4gc3VtICsgKHR5cGVvZiBpdGVtLnZhbHVlID09PSAnbnVtYmVyJyA/IGl0ZW0udmFsdWUgOiAwKSwgMCk7XG4gICAgcmV0dXJuIGZsYXQubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gdHlwZW9mIGl0ZW0udmFsdWUgPT09ICdudW1iZXInID8gaXRlbS52YWx1ZSA6IDA7XG4gICAgICBjb25zdCBwZXJjZW50YWdlID0gdG90YWwgPiAwID8gKHZhbCAvIHRvdGFsKSAqIDEwMCA6IDA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogaXRlbS5pZCxcbiAgICAgICAgbmFtZTogaXRlbS5sYWJlbCB8fCBgSXRlbSAke2luZGV4ICsgMX1gLFxuICAgICAgICB2YWx1ZTogaXRlbS52YWx1ZSxcbiAgICAgICAgcGVyY2VudGFnZSxcbiAgICAgICAgY29sb3I6IGl0ZW0uY29sb3IgfHwgdGhpcy5nZXRDb2xvcihpbmRleCksXG4gICAgICAgIGhpZGRlbjogdGhpcy5pc0JhckhpZGRlbihpdGVtLmlkKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gb2YgQVhDaGFydExlZ2VuZENvbXBhdGlibGUgaW50ZXJmYWNlXG4gICAqIEhpZ2hsaWdodHMgYSBzcGVjaWZpYyBiYXIgYnkgSURcbiAgICovXG4gIGhpZ2hsaWdodFNlZ21lbnQoaWQ6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICBjb25zdCB2YWx1ZSA9ICh0aGlzLmRhdGEoKSB8fCBbXSkgYXMgQVhCYXJDaGFydFZhbHVlO1xuICAgIGNvbnN0IGlzQ2x1c3RlcmVkID0gdGhpcy5pc0NsdXN0ZXJlZERhdGEodmFsdWUpO1xuXG4gICAgY29uc3QgcmVzZXRBbGwgPSAoKSA9PiB7XG4gICAgICB0aGlzLnN2Z1xuICAgICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhcicpXG4gICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtaGlnaGxpZ2h0ZWQnLCBmYWxzZSlcbiAgICAgICAgLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1kaW1tZWQnLCBmYWxzZSlcbiAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAxKVxuICAgICAgICAuYXR0cignZmlsdGVyJywgbnVsbClcbiAgICAgICAgLmF0dHIoJ3N0cm9rZScsIG51bGwpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBudWxsKVxuICAgICAgICAuYXR0cignc3Ryb2tlLW9wYWNpdHknLCBudWxsKTtcbiAgICB9O1xuXG4gICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICByZXNldEFsbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghaXNDbHVzdGVyZWQpIHtcbiAgICAgIGlmICh0aGlzLmlzQmFySGlkZGVuKGlkIGFzIHN0cmluZykpIHtcbiAgICAgICAgcmVzZXRBbGwoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0QmFyID0gdGhpcy5zdmcuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhcicpLmZpbHRlcigoZDogYW55KSA9PiBkPy5pZCA9PT0gaWQpO1xuICAgICAgaWYgKHRhcmdldEJhci5lbXB0eSgpKSByZXR1cm47XG4gICAgICBjb25zdCBpc0N1cnJlbnRseUhpZ2hsaWdodGVkID0gdGFyZ2V0QmFyLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1oaWdobGlnaHRlZCcpO1xuICAgICAgaWYgKGlzQ3VycmVudGx5SGlnaGxpZ2h0ZWQpIHtcbiAgICAgICAgcmVzZXRBbGwoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc2V0QWxsKCk7XG4gICAgICAgIHRhcmdldEJhclxuICAgICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtaGlnaGxpZ2h0ZWQnLCB0cnVlKVxuICAgICAgICAgIC5hdHRyKCdmaWx0ZXInLCAnZHJvcC1zaGFkb3coMCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMykpJylcbiAgICAgICAgICAuYXR0cignc3Ryb2tlJywgJyMwMDAnKVxuICAgICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAnMXB4JylcbiAgICAgICAgICAuYXR0cignc3Ryb2tlLW9wYWNpdHknLCAnMC4zJylcbiAgICAgICAgICAuc3R5bGUoJ3RyYW5zaXRpb24nLCAnYWxsIDAuMnMgZWFzZS1pbi1vdXQnKTtcbiAgICAgICAgdGhpcy5zdmdcbiAgICAgICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhcicpXG4gICAgICAgICAgLmZpbHRlcigoZDogYW55KSA9PiBkPy5pZCAhPT0gaWQpXG4gICAgICAgICAgLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1kaW1tZWQnLCB0cnVlKVxuICAgICAgICAgIC5hdHRyKCdvcGFjaXR5JywgMC41KVxuICAgICAgICAgIC5zdHlsZSgndHJhbnNpdGlvbicsICdvcGFjaXR5IDAuMnMgZWFzZS1pbi1vdXQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRCYXJzID0gdGhpcy5zdmcuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhcicpLmZpbHRlcigoXzogYW55LCBpOiBudW1iZXIsIG5vZGVzOiBhbnlbXSkgPT4ge1xuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldIGFzIFNWR1BhdGhFbGVtZW50O1xuICAgICAgcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXNlcmllcycpID09PSBpZDtcbiAgICB9KTtcbiAgICBpZiAodGFyZ2V0QmFycy5lbXB0eSgpKSByZXR1cm47XG4gICAgY29uc3QgaXNIaWdobGlnaHRlZCA9IHRhcmdldEJhcnMuY2xhc3NlZCgnYXgtYmFyLWNoYXJ0LWhpZ2hsaWdodGVkJyk7XG4gICAgaWYgKGlzSGlnaGxpZ2h0ZWQpIHtcbiAgICAgIHJlc2V0QWxsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc2V0QWxsKCk7XG4gICAgICB0YXJnZXRCYXJzXG4gICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtaGlnaGxpZ2h0ZWQnLCB0cnVlKVxuICAgICAgICAuYXR0cignZmlsdGVyJywgJ2Ryb3Atc2hhZG93KDAgMCA0cHggcmdiYSgwLCAwLCAwLCAwLjMpKScpXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCAnIzAwMCcpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAnMXB4JylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS1vcGFjaXR5JywgJzAuMycpXG4gICAgICAgIC5zdHlsZSgndHJhbnNpdGlvbicsICdhbGwgMC4ycyBlYXNlLWluLW91dCcpO1xuICAgICAgdGhpcy5zdmdcbiAgICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1iYXInKVxuICAgICAgICAuZmlsdGVyKChfOiBhbnksIGk6IG51bWJlciwgbm9kZXM6IGFueVtdKSA9PiAobm9kZXNbaV0gYXMgU1ZHUGF0aEVsZW1lbnQpLmdldEF0dHJpYnV0ZSgnZGF0YS1zZXJpZXMnKSAhPT0gaWQpXG4gICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtZGltbWVkJywgdHJ1ZSlcbiAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAwLjUpXG4gICAgICAgIC5zdHlsZSgndHJhbnNpdGlvbicsICdvcGFjaXR5IDAuMnMgZWFzZS1pbi1vdXQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gb2YgQVhDaGFydExlZ2VuZENvbXBhdGlibGUgaW50ZXJmYWNlXG4gICAqIFRvZ2dsZXMgdmlzaWJpbGl0eSBvZiBhIGJhciBieSBJRFxuICAgKiBAcmV0dXJucyBOZXcgdmlzaWJpbGl0eSBzdGF0ZSAodHJ1ZSA9IHZpc2libGUsIGZhbHNlID0gaGlkZGVuKVxuICAgKi9cbiAgdG9nZ2xlU2VnbWVudChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmFsdWUgPSAodGhpcy5kYXRhKCkgfHwgW10pIGFzIEFYQmFyQ2hhcnRWYWx1ZTtcbiAgICBjb25zdCBpc0NsdXN0ZXJlZCA9IHRoaXMuaXNDbHVzdGVyZWREYXRhKHZhbHVlKTtcblxuICAgIGlmICghaXNDbHVzdGVyZWQpIHtcbiAgICAgIGNvbnN0IHdhc0FsbEhpZGRlbiA9XG4gICAgICAgICh2YWx1ZSBhcyBBWEJhckNoYXJ0RGF0YVtdKS5sZW5ndGggPiAwICYmICh2YWx1ZSBhcyBBWEJhckNoYXJ0RGF0YVtdKS5ldmVyeSgoZCkgPT4gdGhpcy5pc0JhckhpZGRlbihkLmlkKSk7XG4gICAgICBpZiAodGhpcy5oaWRkZW5CYXJzLmhhcyhpZCkpIHtcbiAgICAgICAgdGhpcy5oaWRkZW5CYXJzLmRlbGV0ZShpZCk7XG4gICAgICAgIGlmICh3YXNBbGxIaWRkZW4pIHtcbiAgICAgICAgICBpZiAodGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZDNcbiAgICAgICAgICAgICAgPy5zZWxlY3QodGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAgICAgLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtbWVzc2FnZS1jb250YWluZXInKVxuICAgICAgICAgICAgICAucmVtb3ZlKCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oaWRkZW5CYXJzLmFkZChpZCk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhdGhpcy5oaWRkZW5CYXJzLmhhcyhpZCk7XG4gICAgfVxuXG4gICAgLy8gQ2x1c3RlcmVkIG1vZGU6IHRvZ2dsZSBzZXJpZXMgYnkgbGFiZWxcbiAgICBjb25zdCBncm91cHMgPSB2YWx1ZSBhcyBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdO1xuICAgIGNvbnN0IHNlcmllc0xhYmVscyA9IGdyb3Vwcy5sZW5ndGggPiAwID8gdGhpcy5nZXRDbHVzdGVyU2VyaWVzTGFiZWxzKGdyb3VwcykgOiBbXTtcbiAgICBjb25zdCBzZXJpZXNDb3VudCA9IHNlcmllc0xhYmVscy5sZW5ndGg7XG4gICAgY29uc3Qgd2FzQWxsSGlkZGVuID0gc2VyaWVzQ291bnQgPiAwICYmIHRoaXMuaGlkZGVuU2VyaWVzLnNpemUgPj0gc2VyaWVzQ291bnQ7XG5cbiAgICBpZiAodGhpcy5oaWRkZW5TZXJpZXMuaGFzKGlkKSkge1xuICAgICAgdGhpcy5oaWRkZW5TZXJpZXMuZGVsZXRlKGlkKTtcbiAgICAgIGlmICh3YXNBbGxIaWRkZW4pIHtcbiAgICAgICAgaWYgKHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy5kMz8uc2VsZWN0KHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQpLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtbWVzc2FnZS1jb250YWluZXInKS5yZW1vdmUoKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhpZGRlblNlcmllcy5hZGQoaWQpO1xuICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgIH1cblxuICAgIHJldHVybiAhdGhpcy5oaWRkZW5TZXJpZXMuaGFzKGlkKTtcbiAgfVxuXG4gIC8vID09PT09IEhlbHBlciB1dGlsaXRpZXMgZm9yIG1vZHVsYXJpdHkgYW5kIG1haW50YWluYWJpbGl0eSA9PT09PVxuXG4gIHByaXZhdGUgZ2V0Q29udGFpbmVyRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckNoYXJ0QXJlYShjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMuZDMuc2VsZWN0KGNvbnRhaW5lckVsZW1lbnQpLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtbWVzc2FnZS1jb250YWluZXInKS5yZW1vdmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0WEF4aXNUaWNrRm9udFNpemVCYXNlZE9uV2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMTAsIE1hdGgubWluKDE0LCBNYXRoLnJvdW5kKHRoaXMud2lkdGggLyA1MCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0WUF4aXNUaWNrRm9udFNpemVCYXNlZE9uSGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDExLCBNYXRoLm1pbigxNSwgTWF0aC5yb3VuZCh0aGlzLmhlaWdodCAvIDMwKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFhBeGlzQ29tbW9uKGF4ZXNHcm91cDogYW55LCBpZFRvTGFiZWw6IE1hcDxzdHJpbmcsIHN0cmluZz4sIG9wdGlvbnM6IEFYQmFyQ2hhcnRPcHRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnhBeGlzID0gYXhlc0dyb3VwXG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYXhpcy14JylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHt0aGlzLmhlaWdodH0pYClcbiAgICAgIC5jYWxsKHRoaXMuZDMuYXhpc0JvdHRvbSh0aGlzLnhTY2FsZSkudGlja0Zvcm1hdCgoaWQ6IHN0cmluZykgPT4gaWRUb0xhYmVsLmdldChpZCkgPz8gU3RyaW5nKGlkKSkgYXMgYW55KTtcblxuICAgIGNvbnN0IGR5bmFtaWNGb250U2l6ZSA9IHRoaXMuZ2V0WEF4aXNUaWNrRm9udFNpemVCYXNlZE9uV2lkdGgoKTtcbiAgICBjb25zdCB4QXhpc1RpY2tzID0gdGhpcy54QXhpc1xuICAgICAgLnNlbGVjdEFsbCgndGV4dCcpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGAke2R5bmFtaWNGb250U2l6ZX1weGApXG4gICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJzQwMCcpXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiYSh2YXIoLS1heC1jb21wLWJhci1jaGFydC1sYWJlbHMtY29sb3IpLCAwLjcpJylcbiAgICAgIC5hdHRyKCdkaXJlY3Rpb24nLCAnbHRyJyk7XG5cbiAgICBjb25zdCBpc1JvdGF0ZWQgPSB0aGlzLnNob3VsZFJvdGF0ZVhBeGlzTGFiZWxzKGlkVG9MYWJlbCwgZHluYW1pY0ZvbnRTaXplKTtcbiAgICBpZiAoaXNSb3RhdGVkKSB7XG4gICAgICB4QXhpc1RpY2tzLmF0dHIoJ3RyYW5zZm9ybScsICdyb3RhdGUoLTQ1KScpLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdlbmQnKS5hdHRyKCdkeCcsICctMC44ZW0nKS5hdHRyKCdkeScsICcwLjE1ZW0nKTtcbiAgICB9XG5cbiAgICB0aGlzLnhBeGlzLnNlbGVjdEFsbCgnbGluZSwgcGF0aCcpLnN0eWxlKCdzdHJva2UnLCAncmdiKHZhcigtLWF4LWNvbXAtYmFyLWNoYXJ0LWdyaWQtbGluZXMtY29sb3IpKScpO1xuXG4gICAgaWYgKG9wdGlvbnMueEF4aXNMYWJlbCAmJiAhaXNSb3RhdGVkKSB7XG4gICAgICBjb25zdCB0aWNrTm9kZXMgPSAodGhpcy54QXhpcy5zZWxlY3RBbGwoJ3RleHQnKS5ub2RlcygpIHx8IFtdKSBhcyBTVkdUZXh0RWxlbWVudFtdO1xuICAgICAgY29uc3QgbWVhc3VyZWRUaWNrSGVpZ2h0ID1cbiAgICAgICAgdGlja05vZGVzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IE1hdGgubWF4KC4uLnRpY2tOb2Rlcy5tYXAoKG4pID0+IChuICYmIChuIGFzIGFueSkuZ2V0QkJveCA/IChuIGFzIGFueSkuZ2V0QkJveCgpLmhlaWdodCA6IGR5bmFtaWNGb250U2l6ZSkpKVxuICAgICAgICAgIDogZHluYW1pY0ZvbnRTaXplO1xuICAgICAgY29uc3QgdGlja0FyZWFIZWlnaHQgPSBtZWFzdXJlZFRpY2tIZWlnaHQgKyA2O1xuICAgICAgY29uc3QgZ2FwQmVsb3dUaWNrcyA9IDE0O1xuICAgICAgdGhpcy5jcmVhdGVYQXhpc1RpdGxlKGF4ZXNHcm91cCwgb3B0aW9ucy54QXhpc0xhYmVsLCB0aWNrQXJlYUhlaWdodCwgZ2FwQmVsb3dUaWNrcyk7XG4gICAgfVxuICB9XG5cbiAgLy8gY29tcHV0ZVRvb2x0aXBQb3NpdGlvbiBtb3ZlZCB0byBzaGFyZWQgY2hhcnQgdXRpbHNcblxuICBwcml2YXRlIHNob3dNZXNzYWdlKFxuICAgIGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIGljb25DbGFzczogc3RyaW5nLFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBoZWxwVGV4dDogc3RyaW5nLFxuICAgIHNwZWNpZmljQ2xhc3M6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5kM1xuICAgICAgLnNlbGVjdChjb250YWluZXJFbGVtZW50KVxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC5hdHRyKCdjbGFzcycsIGBheC1jaGFydC1tZXNzYWdlLWNvbnRhaW5lciBheC1iYXItY2hhcnQtbWVzc2FnZS1iYWNrZ3JvdW5kICR7c3BlY2lmaWNDbGFzc31gKTtcblxuICAgIGNvbnRhaW5lclxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1jaGFydC1tZXNzYWdlLWljb24gYXgtYmFyLWNoYXJ0LW5vLWRhdGEtaWNvbicpXG4gICAgICAuaHRtbChgPGkgY2xhc3M9XCIke2ljb25DbGFzc30gZmEtMnhcIj48L2k+YCk7XG5cbiAgICBjb250YWluZXIuYXBwZW5kKCdkaXYnKS5hdHRyKCdjbGFzcycsICdheC1jaGFydC1tZXNzYWdlLXRleHQgYXgtYmFyLWNoYXJ0LW5vLWRhdGEtdGV4dCcpLnRleHQodGV4dCk7XG5cbiAgICBjb250YWluZXIuYXBwZW5kKCdkaXYnKS5hdHRyKCdjbGFzcycsICdheC1jaGFydC1tZXNzYWdlLWhlbHAgYXgtYmFyLWNoYXJ0LW5vLWRhdGEtaGVscCcpLnRleHQoaGVscFRleHQpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYXgtYmFyLWNoYXJ0XCIgI2NoYXJ0Q29udGFpbmVyPlxuICA8IS0tIFNoYXJlZCB0b29sdGlwIGNvbXBvbmVudCAtLT5cbiAgPGF4LWNoYXJ0LXRvb2x0aXBcbiAgICBbdmlzaWJsZV09XCJ0b29sdGlwVmlzaWJsZSgpXCJcbiAgICBbcG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uKClcIlxuICAgIFtkYXRhXT1cInRvb2x0aXBEYXRhKClcIlxuICAgIFtzaG93UGVyY2VudGFnZV09XCJ0cnVlXCJcbiAgPjwvYXgtY2hhcnQtdG9vbHRpcD5cbjwvZGl2PlxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1iYXItY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jaGFydHMvYmFyLWNoYXJ0L3NyYy9hY29yZXgtY2hhcnRzLWJhci1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acorex-charts-bar-chart.mjs","sources":["../tmp-esm2022/bar-chart/lib/bar-chart.config.js","../tmp-esm2022/bar-chart/lib/bar-chart.component.js","../tmp-esm2022/bar-chart/acorex-charts-bar-chart.js"],"sourcesContent":["import { AX_GLOBAL_CONFIG } from '@acorex/core/config';\nimport { InjectionToken, inject } from '@angular/core';\nimport { set } from 'lodash-es';\nexport const AXBarChartDefaultConfig = {\n showXAxis: true,\n showYAxis: true,\n showGrid: true,\n showDataLabels: true,\n showTooltip: true,\n rotateXAxisLabels: 'auto',\n barWidth: 80,\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 bars are hidden',\n allHiddenHelp: 'Click on legend items to show bars',\n noDataIcon: 'fa-light fa-chart-column',\n allHiddenIcon: 'fa-light fa-eye-slash',\n },\n};\nexport const AX_BAR_CHART_CONFIG = new InjectionToken('AX_BAR_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => {\n const global = inject(AX_GLOBAL_CONFIG);\n set(global, 'chart.barChart', AXBarChartDefaultConfig);\n return AXBarChartDefaultConfig;\n },\n});\nexport function barChartConfig(config = {}) {\n const result = {\n ...AXBarChartDefaultConfig,\n ...config,\n };\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWNoYXJ0LmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9iYXItY2hhcnQvc3JjL2xpYi9iYXItY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHaEMsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQXFCO0lBQ3ZELFNBQVMsRUFBRSxJQUFJO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixRQUFRLEVBQUUsSUFBSTtJQUNkLGNBQWMsRUFBRSxJQUFJO0lBQ3BCLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGlCQUFpQixFQUFFLE1BQU07SUFDekIsUUFBUSxFQUFFLEVBQUU7SUFDWixZQUFZLEVBQUUsQ0FBQztJQUNmLGlCQUFpQixFQUFFLEdBQUc7SUFDdEIsZUFBZSxFQUFFLFdBQVc7SUFDNUIsUUFBUSxFQUFFO1FBQ1IsTUFBTSxFQUFFLG1CQUFtQjtRQUMzQixVQUFVLEVBQUUsMENBQTBDO1FBQ3RELFNBQVMsRUFBRSxxQkFBcUI7UUFDaEMsYUFBYSxFQUFFLG9DQUFvQztRQUNuRCxVQUFVLEVBQUUsMEJBQTBCO1FBQ3RDLGFBQWEsRUFBRSx1QkFBdUI7S0FDdkM7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxjQUFjLENBQW1CLHFCQUFxQixFQUFFO0lBQzdGLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDWixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN4QyxHQUFHLENBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFDdkQsT0FBTyx1QkFBdUIsQ0FBQztJQUNqQyxDQUFDO0NBQ0YsQ0FBQyxDQUFDO0FBSUgsTUFBTSxVQUFVLGNBQWMsQ0FBQyxTQUFnQyxFQUFFO0lBQy9ELE1BQU0sTUFBTSxHQUFHO1FBQ2IsR0FBRyx1QkFBdUI7UUFDMUIsR0FBRyxNQUFNO0tBQ1YsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWF9HTE9CQUxfQ09ORklHIH0gZnJvbSAnQGFjb3JleC9jb3JlL2NvbmZpZyc7XG5pbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQVhCYXJDaGFydE9wdGlvbiB9IGZyb20gJy4vYmFyLWNoYXJ0LnR5cGUnO1xuXG5leHBvcnQgY29uc3QgQVhCYXJDaGFydERlZmF1bHRDb25maWc6IEFYQmFyQ2hhcnRPcHRpb24gPSB7XG4gIHNob3dYQXhpczogdHJ1ZSxcbiAgc2hvd1lBeGlzOiB0cnVlLFxuICBzaG93R3JpZDogdHJ1ZSxcbiAgc2hvd0RhdGFMYWJlbHM6IHRydWUsXG4gIHNob3dUb29sdGlwOiB0cnVlLFxuICByb3RhdGVYQXhpc0xhYmVsczogJ2F1dG8nLFxuICBiYXJXaWR0aDogODAsXG4gIGNvcm5lclJhZGl1czogNCxcbiAgYW5pbWF0aW9uRHVyYXRpb246IDgwMCxcbiAgYW5pbWF0aW9uRWFzaW5nOiAnY3ViaWMtb3V0JyxcbiAgbWVzc2FnZXM6IHtcbiAgICBub0RhdGE6ICdObyBkYXRhIGF2YWlsYWJsZScsXG4gICAgbm9EYXRhSGVscDogJ1BsZWFzZSBwcm92aWRlIGRhdGEgdG8gZGlzcGxheSB0aGUgY2hhcnQnLFxuICAgIGFsbEhpZGRlbjogJ0FsbCBiYXJzIGFyZSBoaWRkZW4nLFxuICAgIGFsbEhpZGRlbkhlbHA6ICdDbGljayBvbiBsZWdlbmQgaXRlbXMgdG8gc2hvdyBiYXJzJyxcbiAgICBub0RhdGFJY29uOiAnZmEtbGlnaHQgZmEtY2hhcnQtY29sdW1uJyxcbiAgICBhbGxIaWRkZW5JY29uOiAnZmEtbGlnaHQgZmEtZXllLXNsYXNoJyxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBBWF9CQVJfQ0hBUlRfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPEFYQmFyQ2hhcnRPcHRpb24+KCdBWF9CQVJfQ0hBUlRfQ09ORklHJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6ICgpID0+IHtcbiAgICBjb25zdCBnbG9iYWwgPSBpbmplY3QoQVhfR0xPQkFMX0NPTkZJRyk7XG4gICAgc2V0KGdsb2JhbCwgJ2NoYXJ0LmJhckNoYXJ0JywgQVhCYXJDaGFydERlZmF1bHRDb25maWcpO1xuICAgIHJldHVybiBBWEJhckNoYXJ0RGVmYXVsdENvbmZpZztcbiAgfSxcbn0pO1xuXG5leHBvcnQgdHlwZSBQYXJ0aWFsQmFyQ2hhcnRDb25maWcgPSBQYXJ0aWFsPEFYQmFyQ2hhcnRPcHRpb24+O1xuXG5leHBvcnQgZnVuY3Rpb24gYmFyQ2hhcnRDb25maWcoY29uZmlnOiBQYXJ0aWFsQmFyQ2hhcnRDb25maWcgPSB7fSk6IEFYQmFyQ2hhcnRPcHRpb24ge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgLi4uQVhCYXJDaGFydERlZmF1bHRDb25maWcsXG4gICAgLi4uY29uZmlnLFxuICB9O1xuICByZXR1cm4gcmVzdWx0O1xufVxuIl19","import { NXComponent } from '@acorex/cdk/common';\nimport { AX_CHART_COLOR_PALETTE, computeTooltipPosition, getChartColor, getEasingFunction } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { afterNextRender, ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal, viewChild, ViewEncapsulation, } from '@angular/core';\nimport { AX_BAR_CHART_CONFIG } from './bar-chart.config';\nimport * as i0 from \"@angular/core\";\n/**\n * Bar Chart Component\n * Renders data as vertical bars with interactive hover effects and animations\n */\nexport class AXBarChartComponent extends NXComponent {\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 bar is clicked */\n barClick = output();\n // Chart container reference\n chartContainerEl = viewChild.required('chartContainer');\n // D3 reference - loaded asynchronously\n d3;\n // Chart elements\n svg;\n chart;\n xScale;\n yScale;\n xSubScale;\n xAxis;\n yAxis;\n // Chart dimensions\n width;\n height;\n margin = { top: 0, right: 0, bottom: 0, left: 0 };\n // Character width ratio heuristic for mixed Latin/Persian texts\n CHAR_WIDTH_RATIO = 0.65;\n // Tooltip gap in pixels for consistent spacing\n TOOLTIP_GAP = 10;\n // Animation state\n _initialAnimationComplete = signal(false, ...(ngDevMode ? [{ debugName: \"_initialAnimationComplete\" }] : []));\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 // Signals for component state\n _initialized = signal(false, ...(ngDevMode ? [{ debugName: \"_initialized\" }] : []));\n _rendered = signal(false, ...(ngDevMode ? [{ debugName: \"_rendered\" }] : []));\n // Tooltip accessors\n tooltipVisible = this._tooltipVisible.asReadonly();\n tooltipPosition = this._tooltipPosition.asReadonly();\n tooltipData = this._tooltipData.asReadonly();\n // Inject configuration\n configToken = inject(AX_BAR_CHART_CONFIG);\n // Inject the chart colors\n chartColors = inject(AX_CHART_COLOR_PALETTE);\n // Inject AXPlatform\n // Removed unused AXPlatform injection\n // Configuration with defaults\n effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\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 bars are hidden',\n allHiddenHelp: 'Click on legend items to show bars',\n noDataIcon: 'fa-light fa-chart-column',\n allHiddenIcon: 'fa-light fa-eye-slash',\n };\n return {\n ...defaultMessages,\n ...this.effectiveOptions().messages,\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveMessages\" }] : []));\n // Track hidden bars\n hiddenBars = new Set();\n // Track hidden series for clustered charts (by series label)\n hiddenSeries = new Set();\n // Helpers\n isClusteredData(value) {\n return Array.isArray(value) && value.length > 0 && value[0] && 'chartData' in value[0];\n }\n getClusterSeriesLabels(groups) {\n const first = groups[0]?.chartData ?? [];\n return first.map((d) => d.label);\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 // Create chart after D3 is loaded and container is available\n if (this.d3 && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n });\n // Watch for changes to redraw the chart\n effect(() => {\n // Access inputs to track them\n this.data();\n this.effectiveOptions();\n // Only update if already rendered\n if (this._rendered()) {\n this.updateChart();\n }\n });\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 /**\n * Creates the bar chart SVG and renders all elements\n */\n createChart() {\n if (!this.d3 || !this.chartContainerEl()?.nativeElement)\n return;\n const containerElement = this.chartContainerEl().nativeElement;\n const inputValue = (this.data() || []);\n const isClustered = this.isClusteredData(inputValue);\n // Visibility calculation\n let hasAnyVisible = false;\n let visibleSingleData = [];\n let groupedData = [];\n if (isClustered) {\n groupedData = inputValue;\n const seriesLabels = groupedData.length > 0 ? this.getClusterSeriesLabels(groupedData) : [];\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n hasAnyVisible = groupedData.some((g) => visibleSeries.some((_, idx) => !!g.chartData[idx]));\n }\n else {\n const single = inputValue || [];\n visibleSingleData = single.filter((d) => !this.isBarHidden(d.id));\n hasAnyVisible = visibleSingleData.length > 0;\n }\n // Clear existing chart SVG and messages (do not remove tooltip component)\n this.d3.select(containerElement).selectAll('svg, .ax-chart-message-container').remove();\n // Early return if no data\n if (!inputValue.length) {\n this.showNoDataMessage(containerElement);\n return;\n }\n // Early return if all bars are hidden\n if (!hasAnyVisible) {\n this.showAllBarsHiddenMessage(containerElement);\n return;\n }\n // Get options and setup dimensions\n const chartOptions = this.effectiveOptions();\n this.setupDimensions(containerElement, chartOptions);\n // Create scales and axes and render based on mode\n if (isClustered) {\n this.setupScalesClustered(groupedData);\n this.createAxesClustered(chartOptions, groupedData);\n this.renderBarsClustered(groupedData);\n }\n else {\n this.setupScales(visibleSingleData);\n this.createAxes(chartOptions);\n this.renderBars(visibleSingleData);\n }\n }\n /**\n * Updates the chart when inputs change\n */\n updateChart() {\n this.createChart();\n }\n /**\n * Cleans up chart resources\n */\n cleanupChart() {\n const container = this.chartContainerEl()?.nativeElement;\n if (container) {\n // Only remove chart SVG and message containers to preserve tooltip component\n this.d3?.select(container).selectAll('svg, .ax-chart-message-container').remove();\n }\n this.svg = null;\n this.chart = null;\n this._tooltipVisible.set(false);\n }\n /**\n * Sets up chart dimensions and creates SVG with responsive attributes\n */\n setupDimensions(containerElement, options) {\n // Remove outer margins; calculate only internal paddings for axes and labels\n this.margin = { top: 0, right: 0, bottom: 0, left: 0 };\n // Get container dimensions\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n // Axis visibility\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n // Internal left padding for Y-axis ticks/labels/title\n const axisAndTickPadding = 10;\n const yAxisTitleThickness = options.yAxisLabel ? 14 : 0; // rotated label thickness along X\n const yAxisTitlePadding = options.yAxisLabel ? 14 : 0; // gap between ticks and title\n const leftPaddingForYAxis = showYAxis\n ? this.calculateMaxYAxisTickLabelWidth() + axisAndTickPadding + yAxisTitlePadding + yAxisTitleThickness\n : 0;\n // Estimate internal bottom padding for X-axis ticks/labels/title\n let bottomPaddingForXAxis = 0;\n if (showXAxis) {\n const raw = (this.data() || []);\n const isClustered = this.isClusteredData(raw);\n const barCount = isClustered ? raw.length : raw.length;\n const longestLabel = (() => {\n if (isClustered) {\n const groups = raw;\n return groups.reduce((acc, g) => (acc.length > (g.label?.length ?? 0) ? acc : (g.label ?? '')), '');\n }\n const flat = raw || [];\n return flat.reduce((a, b) => (a.length > b.label.length ? a : b.label), '');\n })();\n const baseWidth = options.width ?? containerWidth;\n const workingWidth = Math.max(1, baseWidth - leftPaddingForYAxis);\n const dynamicFontSize = Math.max(10, Math.min(14, Math.round(workingWidth / 50)));\n const estimatedLongestLabelWidth = longestLabel.length * dynamicFontSize * 0.65;\n const availableWidthPerBar = barCount > 0 ? workingWidth / barCount : workingWidth;\n const willRotate = options.rotateXAxisLabels === true\n ? true\n : options.rotateXAxisLabels === false\n ? false\n : estimatedLongestLabelWidth > availableWidthPerBar;\n const tickAreaHeight = willRotate\n ? estimatedLongestLabelWidth * Math.SQRT1_2 + dynamicFontSize * Math.SQRT1_2 + 6\n : dynamicFontSize + 8;\n const gapBelowTicks = options.xAxisLabel && !willRotate ? 14 : 0; // matches renderer\n const titleBlockHeight = options.xAxisLabel && !willRotate ? 24 : 0; // 14px font + ~10px gap\n bottomPaddingForXAxis = tickAreaHeight + gapBelowTicks + titleBlockHeight;\n }\n // Determine plotting dimensions with sensible fallbacks\n const fallbackPlotHeight = 240; // ensures visible plot when container has no height\n const baseWidth = options.width ?? containerWidth;\n const totalWidth = Math.max(200, baseWidth > 0 ? baseWidth : 200);\n const plotWidth = Math.max(0, totalWidth - leftPaddingForYAxis);\n let plotHeight;\n if (options.height && options.height > 0) {\n plotHeight = Math.max(120, options.height - bottomPaddingForXAxis);\n }\n else if (containerHeight > 0) {\n plotHeight = Math.max(120, containerHeight - bottomPaddingForXAxis, fallbackPlotHeight);\n }\n else {\n plotHeight = fallbackPlotHeight;\n }\n this.width = plotWidth;\n this.height = plotHeight;\n // Create SVG with explicit pixel dimensions to avoid collapse\n // Add a small internal top padding to avoid clipping the top-most Y-axis label\n const topPaddingForTopEdge = 6;\n const totalHeight = this.height + bottomPaddingForXAxis + topPaddingForTopEdge;\n const svg = this.d3\n .select(containerElement)\n .append('svg')\n .attr('width', '100%')\n .attr('height', String(totalHeight))\n .attr('viewBox', `0 0 ${totalWidth} ${totalHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n this.svg = svg;\n // Create chart group translated by internal paddings (no external margins)\n this.chart = this.svg\n .append('g')\n .attr('class', 'chart-content')\n .attr('transform', `translate(${leftPaddingForYAxis},${topPaddingForTopEdge})`);\n }\n // calculateMargins was unused; removed to simplify and reduce maintenance surface\n /**\n * Creates x and y scales for the chart\n */\n setupScales(data) {\n // Get the bar width percentage (default 80%)\n const barWidthPercent = this.effectiveOptions().barWidth ?? 60 / 100;\n // Calculate padding based on barWidth (inverse relationship)\n const padding = Math.max(0.1, 1 - barWidthPercent);\n // Create x scale (band scale for categorical data)\n this.xScale = this.d3\n .scaleBand()\n .domain(data.map((d) => d.id))\n .range([0, this.width])\n .padding(padding);\n // Create y scale (linear scale for values)\n this.yScale = this.d3\n .scaleLinear()\n .domain([0, this.d3.max(data, (d) => d.value) || 0])\n .nice()\n .range([this.height, 0]);\n }\n /**\n * Creates x and y scales for clustered charts\n */\n setupScalesClustered(groups) {\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n // Outer band for clusters\n const outerPadding = 0.2;\n this.xScale = this.d3\n .scaleBand()\n .domain(groups.map((g) => g.id))\n .range([0, this.width])\n .padding(outerPadding);\n // Inner band for series\n this.xSubScale = this.d3.scaleBand().domain(visibleSeries).range([0, this.xScale.bandwidth()]).padding(0.1);\n // Y scale across all visible values\n const allVisibleValues = [];\n for (const g of groups) {\n visibleSeries.forEach((_, idx) => {\n const item = g.chartData[idx];\n if (item && typeof item.value === 'number')\n allVisibleValues.push(item.value);\n });\n }\n const yMax = this.d3.max(allVisibleValues) || 0;\n this.yScale = this.d3.scaleLinear().domain([0, yMax]).nice().range([this.height, 0]);\n }\n /**\n * Creates x and y axes with grid lines\n */\n createAxes(options) {\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n const axesGroup = this.chart.append('g').attr('class', 'ax-bar-chart-axes');\n if (showXAxis) {\n this.createXAxis(axesGroup, options);\n }\n if (showYAxis) {\n this.createYAxis(axesGroup, options);\n }\n if (showGrid) {\n this.createGridLines();\n }\n }\n createXAxis(axesGroup, options) {\n const visibleDataForTicks = (this.data() || []).filter((d) => !this.isBarHidden(d.id));\n const idToLabel = new Map(visibleDataForTicks.map((d) => [d.id, d.label]));\n this.buildXAxisCommon(axesGroup, idToLabel, options);\n }\n createYAxis(axesGroup, options) {\n // Create Y axis\n this.yAxis = axesGroup.append('g').attr('class', 'ax-bar-chart-axis-y').call(this.d3.axisLeft(this.yScale));\n // Style the axis text\n const dynamicFontSize = this.getYAxisTickFontSizeBasedOnHeight();\n this.yAxis\n .selectAll('text')\n .style('font-size', `${dynamicFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)')\n .attr('text-anchor', 'end')\n .attr('direction', 'ltr');\n // Style axis lines\n this.yAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n // Add Y axis title\n if (options.yAxisLabel) {\n this.createYAxisTitle(axesGroup, options.yAxisLabel);\n }\n }\n shouldRotateXAxisLabels(idToLabel, fontSize) {\n const options = this.effectiveOptions();\n // Check if user explicitly set rotation option\n if (options.rotateXAxisLabels === true)\n return true;\n if (options.rotateXAxisLabels === false)\n return false;\n // If 'auto' or undefined, use intelligent calculation\n if (this.xScale.domain().length === 0)\n return false;\n const step = this.xScale.step();\n const labels = Array.from(idToLabel.values());\n const longestLabel = labels.reduce((a, b) => (a.length > b.length ? a : b), '');\n const estimatedWidth = longestLabel.length * fontSize * this.CHAR_WIDTH_RATIO;\n // Heuristic: avoid rotation when there are few categories (<= 6) even if estimation is slightly larger\n const domainCount = this.xScale.domain().length;\n if (domainCount <= 6) {\n return estimatedWidth > step * 1.4; // be more tolerant for small datasets\n }\n return estimatedWidth > step;\n }\n createXAxisTitle(axesGroup, title, tickAreaHeight, gapBelowTicks = 8) {\n // Title positioned directly below tick area with a consistent gap\n const labelY = this.height + tickAreaHeight + gapBelowTicks;\n axesGroup\n .append('text')\n .attr('class', 'ax-bar-chart-axis-label ax-x-axis-label')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'hanging') // Align to top of text for better positioning\n .attr('x', this.width / 2)\n .attr('y', labelY)\n .attr('direction', 'ltr')\n .style('font-size', '14px')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n .text(title);\n }\n createYAxisTitle(axesGroup, title) {\n // Calculate the exact position for Y-axis title\n // Y-axis tick labels use text-anchor: end, so they extend LEFT of the Y-axis line\n // Y-axis is at X = 0 within the chart group\n // Chart group is translated by (margin.left, margin.top)\n // So Y-axis is at X = margin.left in SVG coordinates\n const maxTickLabelWidth = this.calculateMaxYAxisTickLabelWidth();\n const padding = 20; // Increased padding between tick labels and axis title\n // Position title to the left of the tick labels\n // Since text-anchor: end aligns the text to the Y-axis, we need to go further left\n const labelY = -maxTickLabelWidth - padding;\n // Center the title vertically\n const labelX = -this.height / 2;\n axesGroup\n .append('text')\n .attr('class', 'ax-bar-chart-axis-label ax-y-axis-label')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr('transform', 'rotate(-90)')\n .attr('x', labelX)\n .attr('y', labelY)\n .attr('direction', 'ltr')\n .style('font-size', '14px')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n .text(title);\n }\n calculateMaxYAxisTickLabelWidth() {\n // Calculate the maximum width needed for Y-axis tick labels\n const raw = (this.data() || []);\n const isClustered = this.isClusteredData(raw);\n let maxValue = 0;\n if (isClustered) {\n const groups = raw;\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n for (const g of groups) {\n visibleSeries.forEach((_, idx) => {\n const item = g.chartData[idx];\n if (item && typeof item.value === 'number')\n maxValue = Math.max(maxValue, item.value);\n });\n }\n }\n else {\n const visibleData = raw.filter((d) => !this.isBarHidden(d.id));\n maxValue = visibleData.reduce((acc, d) => (d.value > acc ? d.value : acc), 0);\n }\n const tickLabelText = Number.isFinite(maxValue) ? maxValue.toLocaleString() : '00000';\n const fontSize = 13; // Approximate font size for Y-axis tick labels\n return tickLabelText.length * fontSize * 0.6 + 8; // Character width + padding\n }\n createGridLines() {\n this.chart\n .append('g')\n .attr('class', 'ax-bar-chart-grid')\n .call(this.d3\n .axisLeft(this.yScale)\n .tickSize(-this.width)\n .tickFormat(() => ''))\n .selectAll('line')\n .style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))')\n .style('stroke-opacity', 0.2);\n // Remove unneeded elements from grid\n this.chart.select('.ax-bar-chart-grid').selectAll('path, text').remove();\n }\n /**\n * Creates axes for clustered charts\n */\n createAxesClustered(options, groups) {\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n const axesGroup = this.chart.append('g').attr('class', 'ax-bar-chart-axes');\n if (showXAxis) {\n this.createXAxisClustered(axesGroup, options, groups);\n }\n if (showYAxis) {\n this.createYAxis(axesGroup, options);\n }\n if (showGrid) {\n this.createGridLines();\n }\n }\n createXAxisClustered(axesGroup, options, groups) {\n const idToLabel = new Map(groups.map((g) => [g.id, g.label]));\n this.buildXAxisCommon(axesGroup, idToLabel, options);\n }\n /**\n * Renders the bars with animations\n */\n renderBars(data) {\n // Filter out hidden bars\n const visibleData = data.filter((d) => !this.isBarHidden(d.id));\n const originalFullData = this.data() || [];\n // Reset animation state\n this._initialAnimationComplete.set(false);\n // Get corner radius from options\n const radius = this.effectiveOptions().cornerRadius;\n // Get animation options\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n // Create a container for all bars\n const barsContainer = this.chart.append('g').attr('class', 'ax-bar-chart-bars-container');\n // Create groups for each bar to handle transformations\n const barGroups = barsContainer\n .selectAll('.ax-bar-chart-bar-group')\n .data(visibleData)\n .enter()\n .append('g')\n .style('cursor', 'pointer')\n .attr('class', 'ax-bar-chart-bar-group');\n // Add bars inside groups\n const bars = barGroups\n .append('path')\n .attr('class', 'ax-bar-chart-bar')\n .attr('d', (d) => {\n const x = this.xScale(d.id);\n const width = this.xScale.bandwidth();\n const y = this.height - 0.5; // initial height is zero\n return `M${x},${y} L${x},${y} L${x + width},${y} L${x + width},${y} Z`;\n })\n .attr('fill', (d) => {\n // Find the index of the current bar (d) in the original data array\n const originalIndex = originalFullData.findIndex((item) => item.id === d.id);\n // Use the original color if provided, otherwise get color from palette using original index\n // Fallback to index 0 if not found, though this shouldn't happen with valid data.\n return d.color || this.getColor(originalIndex !== -1 ? originalIndex : 0);\n });\n // Add data labels if they're enabled\n if (this.effectiveOptions().showDataLabels !== false) {\n barGroups\n .append('text')\n .attr('class', 'ax-bar-chart-data-label')\n .attr('text-anchor', 'middle')\n .attr('x', (d) => this.xScale(d.id) + this.xScale.bandwidth() / 2)\n .attr('y', this.height) // Start from bottom for animation\n .style('font-size', 'clamp(8px, 2vmin, 12px)')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-data-labels-color))')\n .style('opacity', 0) // Start invisible for animation\n .text((d) => d.value);\n // Animate data labels\n barGroups\n .selectAll('.ax-bar-chart-data-label')\n .transition()\n .duration(animationDuration)\n .delay((d, i) => i * 50 + 100) // Slightly delayed after bar animation\n .attr('y', (d) => this.yScale(d.value) - 8) // Position above bar\n .style('opacity', 1)\n .ease(animationEasing);\n }\n // Set up event handlers on each group\n barGroups\n .on('mouseenter', (event, d) => {\n // Only apply hover effects if initial animation is complete\n if (!this._initialAnimationComplete())\n return;\n const barEl = this.d3.select(event.currentTarget).select('path');\n // Standard hover effect - darken the bar slightly and add a subtle shadow\n barEl.transition().duration(150).style('filter', 'brightness(0.7) drop-shadow(0 0 2px rgba(0,0,0,0.1))');\n this.handleBarHover(event, d);\n })\n .on('mousemove', (event) => {\n // Only update tooltip if initial animation is complete\n if (this._initialAnimationComplete()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', (event) => {\n // Only apply hover effects if initial animation is complete\n if (!this._initialAnimationComplete())\n return;\n const barEl = this.d3.select(event.currentTarget).select('path');\n // Remove hover effect\n barEl.transition().duration(150).style('filter', null);\n this._tooltipVisible.set(false);\n })\n .on('click', (event, d) => {\n // Only trigger click events if initial animation is complete\n if (this._initialAnimationComplete()) {\n this.handleBarClick(event, d);\n }\n });\n // Add animation\n bars\n .transition()\n .duration(animationDuration)\n .delay((d, i) => i * 50) // Stagger each bar animation\n .attrTween('d', (d) => {\n const x = this.xScale(d.id);\n const width = this.xScale.bandwidth();\n const finalHeight = this.height - this.yScale(d.value);\n return (t) => {\n const currentHeight = finalHeight * t;\n const currentY = this.height - currentHeight;\n const bottomY = this.height - 0.5; // Add small gap to prevent overlap with x-axis\n if (radius > 0 && currentHeight > 0) {\n // Limit radius to prevent it from exceeding half the bar width\n const effectiveRadius = Math.min(radius, width / 2);\n return `M${x},${bottomY} L${x},${currentY + effectiveRadius} Q${x},${currentY} ${x + effectiveRadius},${currentY} L${x + width - effectiveRadius},${currentY} Q${x + width},${currentY} ${x + width},${currentY + effectiveRadius} L${x + width},${bottomY} Z`;\n }\n else {\n return `M${x},${bottomY} L${x},${currentY} L${x + width},${currentY} L${x + width},${bottomY} Z`;\n }\n };\n })\n .ease(animationEasing) // Use the configured easing function\n .end() // Wait for all animations to complete\n .then(() => {\n // Mark animation as complete to enable hover effects\n this._initialAnimationComplete.set(true);\n });\n }\n /**\n * Renders bars for clustered charts\n */\n renderBarsClustered(groups) {\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n this._initialAnimationComplete.set(false);\n const radius = this.effectiveOptions().cornerRadius;\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n const barsContainer = this.chart.append('g').attr('class', 'ax-bar-chart-bars-container');\n const groupSel = barsContainer\n .selectAll('.ax-bar-chart-group')\n .data(groups)\n .enter()\n .append('g')\n .attr('class', 'ax-bar-chart-group')\n .attr('transform', (g) => `translate(${this.xScale(g.id)},0)`);\n const barGroups = groupSel\n .selectAll('.ax-bar-chart-bar-group')\n .data((g) => visibleSeries.map((label, idx) => ({ group: g, seriesLabel: label, seriesIndex: idx })))\n .enter()\n .append('g')\n .style('cursor', 'pointer')\n .attr('class', 'ax-bar-chart-bar-group');\n const bars = barGroups\n .append('path')\n .attr('class', 'ax-bar-chart-bar')\n .attr('data-series', (d) => d.seriesLabel)\n .attr('d', (d) => {\n const x = this.xSubScale(d.seriesLabel);\n const width = this.xSubScale.bandwidth();\n const y = this.height - 0.5; // initial height is zero\n return `M${x},${y} L${x},${y} L${x + width},${y} L${x + width},${y} Z`;\n })\n .attr('fill', (d) => {\n const item = d.group.chartData[d.seriesIndex];\n const colorIndex = d.seriesIndex;\n return item?.color || this.getColor(colorIndex);\n });\n if (this.effectiveOptions().showDataLabels !== false) {\n barGroups\n .append('text')\n .attr('class', 'ax-bar-chart-data-label')\n .attr('text-anchor', 'middle')\n .attr('x', (d) => (this.xSubScale(d.seriesLabel) || 0) + this.xSubScale.bandwidth() / 2)\n .attr('y', this.height)\n .style('font-size', 'clamp(8px, 2vmin, 12px)')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-data-labels-color))')\n .style('opacity', 0)\n .text((d) => {\n const item = d.group.chartData[d.seriesIndex];\n return item ? item.value : '';\n });\n barGroups\n .selectAll('.ax-bar-chart-data-label')\n .transition()\n .duration(animationDuration)\n .delay((_, i) => i * 50 + 100)\n .attr('y', (d) => {\n const item = d.group.chartData[d.seriesIndex];\n return item ? this.yScale(item.value) - 8 : this.height;\n })\n .style('opacity', 1)\n .ease(animationEasing);\n }\n barGroups\n .on('mouseenter', (event, d) => {\n if (!this._initialAnimationComplete())\n return;\n const barEl = this.d3.select(event.currentTarget).select('path');\n barEl.transition().duration(150).style('filter', 'brightness(0.7) drop-shadow(0 0 2px rgba(0,0,0,0.1))');\n const item = d.group.chartData[d.seriesIndex];\n if (item)\n this.handleBarHover(event, item, d.group);\n })\n .on('mousemove', (event) => {\n if (this._initialAnimationComplete())\n this.updateTooltipPosition(event);\n })\n .on('mouseleave', (event) => {\n if (!this._initialAnimationComplete())\n return;\n const barEl = this.d3.select(event.currentTarget).select('path');\n barEl.transition().duration(150).style('filter', null);\n this._tooltipVisible.set(false);\n })\n .on('click', (event, d) => {\n if (!this._initialAnimationComplete())\n return;\n const item = d.group.chartData[d.seriesIndex];\n if (item)\n this.handleBarClick(event, item);\n });\n bars\n .transition()\n .duration(animationDuration)\n .delay((_, i) => i * 50)\n .attrTween('d', (d) => {\n const x = this.xSubScale(d.seriesLabel);\n const width = this.xSubScale.bandwidth();\n const item = d.group.chartData[d.seriesIndex];\n const finalHeight = item ? this.height - this.yScale(item.value) : 0;\n return (t) => {\n const currentHeight = finalHeight * t;\n const currentY = this.height - currentHeight;\n const bottomY = this.height - 0.5; // Add small gap to prevent overlap with x-axis\n if (radius > 0 && currentHeight > 0) {\n // Limit radius to prevent it from exceeding half the bar width\n const effectiveRadius = Math.min(radius, width / 2);\n return `M${x},${bottomY} L${x},${currentY + effectiveRadius} Q${x},${currentY} ${x + effectiveRadius},${currentY} L${x + width - effectiveRadius},${currentY} Q${x + width},${currentY} ${x + width},${currentY + effectiveRadius} L${x + width},${bottomY} Z`;\n }\n else {\n return `M${x},${bottomY} L${x},${currentY} L${x + width},${currentY} L${x + width},${bottomY} Z`;\n }\n };\n })\n .ease(animationEasing)\n .end()\n .then(() => this._initialAnimationComplete.set(true));\n }\n /**\n * Gets the appropriate D3 easing function based on the option string\n */\n // getEasingFunction moved to shared chart utils\n /**\n * Handles bar hover event and shows tooltip\n */\n handleBarHover(event, datum, group) {\n if (this.effectiveOptions().showTooltip !== false) {\n const dataValue = this.data();\n const isClustered = this.isClusteredData(dataValue);\n const flatData = isClustered\n ? dataValue.flatMap((g) => g.chartData)\n : dataValue || [];\n const index = flatData.findIndex((item) => item.id === datum.id && item.label === datum.label);\n const color = datum.color || this.getColor(index !== -1 ? index : 0);\n // Calculate percentage of total\n const total = isClustered\n ? dataValue.reduce((sum, g) => sum + g.chartData.reduce((s, it) => s + it.value, 0), 0)\n : flatData.reduce((sum, item) => sum + item.value, 0);\n const percentage = total > 0 ? ((datum.value / total) * 100).toFixed(1) : '0';\n this._tooltipData.set({\n title: group ? `${datum.tooltipLabel || datum.label} — ${group.label}` : datum.tooltipLabel || datum.label,\n value: datum.value.toString(),\n percentage: `${percentage}%`,\n color: color,\n });\n this.updateTooltipPosition(event);\n this._tooltipVisible.set(true);\n }\n }\n /**\n * Updates tooltip position based on mouse coordinates\n */\n updateTooltipPosition(event) {\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl)\n return;\n const containerRect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip');\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = computeTooltipPosition(containerRect, tooltipRect, event.clientX, event.clientY, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n }\n /**\n * Handles bar click event\n */\n handleBarClick(event, datum) {\n this.barClick.emit({ item: datum, event: { nativeEvent: event, sender: this } });\n }\n /**\n * Shows a message when no data is available\n */\n showNoDataMessage(containerElement) {\n this.clearChartArea(containerElement);\n this.showMessage(containerElement, this.effectiveMessages().noDataIcon, this.effectiveMessages().noData, this.effectiveMessages().noDataHelp, 'ax-bar-chart-no-data-message');\n }\n /**\n * Shows a message when all bars are hidden\n */\n showAllBarsHiddenMessage(containerElement) {\n this.clearChartArea(containerElement);\n this.showMessage(containerElement, this.effectiveMessages().allHiddenIcon, this.effectiveMessages().allHidden, this.effectiveMessages().allHiddenHelp, 'ax-bar-chart-no-data-message');\n }\n /**\n * Gets the color for a bar based on its index\n */\n getColor(index) {\n return getChartColor(index, this.chartColors);\n }\n /**\n * Checks if a bar is hidden\n */\n isBarHidden(id) {\n return this.hiddenBars.has(id);\n }\n /**\n * Implementation of AXChartLegendCompatible interface\n * Returns legend items based on the chart data\n */\n getLegendItems() {\n const value = (this.data() || []);\n if (this.isClusteredData(value)) {\n const groups = value;\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const total = groups.reduce((sum, g) => sum + g.chartData.reduce((s, it) => s + (typeof it.value === 'number' ? it.value : 0), 0), 0);\n return seriesLabels.map((label, index) => {\n const seriesTotal = groups.reduce((s, g) => {\n const item = g.chartData[index];\n const v = item && typeof item.value === 'number' ? item.value : 0;\n return s + v;\n }, 0);\n const percentage = total > 0 ? (seriesTotal / total) * 100 : 0;\n const firstItem = groups[0]?.chartData[index];\n return {\n id: label,\n name: label || `Series ${index + 1}`,\n value: seriesTotal,\n percentage,\n color: firstItem?.color || this.getColor(index),\n hidden: this.hiddenSeries.has(label),\n };\n });\n }\n const flat = value;\n const total = flat.reduce((sum, item) => sum + (typeof item.value === 'number' ? item.value : 0), 0);\n return flat.map((item, index) => {\n const val = typeof item.value === 'number' ? item.value : 0;\n const percentage = total > 0 ? (val / total) * 100 : 0;\n return {\n id: item.id,\n name: item.label || `Item ${index + 1}`,\n value: item.value,\n percentage,\n color: item.color || this.getColor(index),\n hidden: this.isBarHidden(item.id),\n };\n });\n }\n /**\n * Implementation of AXChartLegendCompatible interface\n * Highlights a specific bar by ID\n */\n highlightSegment(id) {\n if (!this.svg)\n return;\n const value = (this.data() || []);\n const isClustered = this.isClusteredData(value);\n const resetAll = () => {\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .classed('ax-bar-chart-highlighted', false)\n .classed('ax-bar-chart-dimmed', false)\n .attr('opacity', 1)\n .attr('filter', null)\n .attr('stroke', null)\n .attr('stroke-width', null)\n .attr('stroke-opacity', null);\n };\n if (id === null) {\n resetAll();\n return;\n }\n if (!isClustered) {\n if (this.isBarHidden(id)) {\n resetAll();\n return;\n }\n const targetBar = this.svg.selectAll('.ax-bar-chart-bar').filter((d) => d?.id === id);\n if (targetBar.empty())\n return;\n const isCurrentlyHighlighted = targetBar.classed('ax-bar-chart-highlighted');\n if (isCurrentlyHighlighted) {\n resetAll();\n }\n else {\n resetAll();\n targetBar\n .classed('ax-bar-chart-highlighted', true)\n .attr('filter', 'drop-shadow(0 0 4px rgba(0, 0, 0, 0.3))')\n .attr('stroke', '#000')\n .attr('stroke-width', '1px')\n .attr('stroke-opacity', '0.3')\n .style('transition', 'all 0.2s ease-in-out');\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((d) => d?.id !== id)\n .classed('ax-bar-chart-dimmed', true)\n .attr('opacity', 0.5)\n .style('transition', 'opacity 0.2s ease-in-out');\n }\n return;\n }\n const targetBars = this.svg.selectAll('.ax-bar-chart-bar').filter((_, i, nodes) => {\n const node = nodes[i];\n return node.getAttribute('data-series') === id;\n });\n if (targetBars.empty())\n return;\n const isHighlighted = targetBars.classed('ax-bar-chart-highlighted');\n if (isHighlighted) {\n resetAll();\n }\n else {\n resetAll();\n targetBars\n .classed('ax-bar-chart-highlighted', true)\n .attr('filter', 'drop-shadow(0 0 4px rgba(0, 0, 0, 0.3))')\n .attr('stroke', '#000')\n .attr('stroke-width', '1px')\n .attr('stroke-opacity', '0.3')\n .style('transition', 'all 0.2s ease-in-out');\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((_, i, nodes) => nodes[i].getAttribute('data-series') !== id)\n .classed('ax-bar-chart-dimmed', true)\n .attr('opacity', 0.5)\n .style('transition', 'opacity 0.2s ease-in-out');\n }\n }\n /**\n * Implementation of AXChartLegendCompatible interface\n * Toggles visibility of a bar by ID\n * @returns New visibility state (true = visible, false = hidden)\n */\n toggleSegment(id) {\n const value = (this.data() || []);\n const isClustered = this.isClusteredData(value);\n if (!isClustered) {\n const wasAllHidden = value.length > 0 && value.every((d) => this.isBarHidden(d.id));\n if (this.hiddenBars.has(id)) {\n this.hiddenBars.delete(id);\n if (wasAllHidden) {\n if (this.chartContainerEl()?.nativeElement) {\n this.d3\n ?.select(this.chartContainerEl().nativeElement)\n .selectAll('svg, .ax-chart-message-container')\n .remove();\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n }\n else {\n this.updateChart();\n }\n }\n else {\n this.hiddenBars.add(id);\n this.updateChart();\n }\n return !this.hiddenBars.has(id);\n }\n // Clustered mode: toggle series by label\n const groups = value;\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const seriesCount = seriesLabels.length;\n const wasAllHidden = seriesCount > 0 && this.hiddenSeries.size >= seriesCount;\n if (this.hiddenSeries.has(id)) {\n this.hiddenSeries.delete(id);\n if (wasAllHidden) {\n if (this.chartContainerEl()?.nativeElement) {\n this.d3?.select(this.chartContainerEl().nativeElement).selectAll('svg, .ax-chart-message-container').remove();\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n }\n else {\n this.updateChart();\n }\n }\n else {\n this.hiddenSeries.add(id);\n this.updateChart();\n }\n return !this.hiddenSeries.has(id);\n }\n // ===== Helper utilities for modularity and maintainability =====\n getContainerElement() {\n return this.chartContainerEl()?.nativeElement ?? null;\n }\n clearChartArea(containerElement) {\n this.d3.select(containerElement).selectAll('svg, .ax-chart-message-container').remove();\n }\n getXAxisTickFontSizeBasedOnWidth() {\n return Math.max(10, Math.min(14, Math.round(this.width / 50)));\n }\n getYAxisTickFontSizeBasedOnHeight() {\n return Math.max(11, Math.min(15, Math.round(this.height / 30)));\n }\n buildXAxisCommon(axesGroup, idToLabel, options) {\n this.xAxis = axesGroup\n .append('g')\n .attr('class', 'ax-bar-chart-axis-x')\n .attr('transform', `translate(0,${this.height})`)\n .call(this.d3.axisBottom(this.xScale).tickFormat((id) => idToLabel.get(id) ?? String(id)));\n const dynamicFontSize = this.getXAxisTickFontSizeBasedOnWidth();\n const xAxisTicks = this.xAxis\n .selectAll('text')\n .style('font-size', `${dynamicFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)')\n .attr('direction', 'ltr');\n const isRotated = this.shouldRotateXAxisLabels(idToLabel, dynamicFontSize);\n if (isRotated) {\n xAxisTicks.attr('transform', 'rotate(-45)').style('text-anchor', 'end').attr('dx', '-0.8em').attr('dy', '0.15em');\n }\n this.xAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n if (options.xAxisLabel && !isRotated) {\n const tickNodes = (this.xAxis.selectAll('text').nodes() || []);\n const measuredTickHeight = tickNodes.length > 0\n ? Math.max(...tickNodes.map((n) => (n && n.getBBox ? n.getBBox().height : dynamicFontSize)))\n : dynamicFontSize;\n const tickAreaHeight = measuredTickHeight + 6;\n const gapBelowTicks = 14;\n this.createXAxisTitle(axesGroup, options.xAxisLabel, tickAreaHeight, gapBelowTicks);\n }\n }\n // computeTooltipPosition moved to shared chart utils\n showMessage(containerElement, iconClass, text, helpText, specificClass) {\n const container = this.d3\n .select(containerElement)\n .append('div')\n .attr('class', `ax-chart-message-container ax-bar-chart-message-background ${specificClass}`);\n container\n .append('div')\n .attr('class', 'ax-chart-message-icon ax-bar-chart-no-data-icon')\n .html(`<i class=\"${iconClass} fa-2x\"></i>`);\n container.append('div').attr('class', 'ax-chart-message-text ax-bar-chart-no-data-text').text(text);\n container.append('div').attr('class', 'ax-chart-message-help ax-bar-chart-no-data-help').text(helpText);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.2.4\", ngImport: i0, type: AXBarChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.2.4\", type: AXBarChartComponent, isStandalone: true, selector: \"ax-bar-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: { barClick: \"barClick\" }, viewQueries: [{ propertyName: \"chartContainerEl\", first: true, predicate: [\"chartContainer\"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: \"<div class=\\\"ax-bar-chart\\\" #chartContainer>\\n <!-- Shared 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-bar-chart{display:block;width:100%;height:100%;min-height:200px;--ax-comp-bar-chart-axis-label-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-data-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-grid-lines-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-bg-color: var(--ax-sys-color-lightest-surface)}ax-bar-chart .ax-bar-chart{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;border-radius:.5rem;overflow:hidden;color:rgb(var(--ax-sys-color-on-lightest-surface));background-color:rgb(var(--ax-comp-bar-chart-bg-color))}ax-bar-chart .ax-bar-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-bar-chart .ax-bar-chart svg g:has(text){font-family:inherit}ax-bar-chart .ax-bar-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-bar-chart-bg-color));padding:1.5rem;border-radius:.5rem;box-shadow:0 2px 12px #00000014;width:80%;max-width:300px}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-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.2.4\", ngImport: i0, type: AXBarChartComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-bar-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"ax-bar-chart\\\" #chartContainer>\\n <!-- Shared 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-bar-chart{display:block;width:100%;height:100%;min-height:200px;--ax-comp-bar-chart-axis-label-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-data-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-grid-lines-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-bg-color: var(--ax-sys-color-lightest-surface)}ax-bar-chart .ax-bar-chart{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;border-radius:.5rem;overflow:hidden;color:rgb(var(--ax-sys-color-on-lightest-surface));background-color:rgb(var(--ax-comp-bar-chart-bg-color))}ax-bar-chart .ax-bar-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-bar-chart .ax-bar-chart svg g:has(text){font-family:inherit}ax-bar-chart .ax-bar-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-bar-chart-bg-color));padding:1.5rem;border-radius:.5rem;box-shadow:0 2px 12px #00000014;width:80%;max-width:300px}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-chart-no-data-help{font-size:.8rem;opacity:.6}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9iYXItY2hhcnQvc3JjL2xpYi9iYXItY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2Jhci1jaGFydC9zcmMvbGliL2Jhci1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxILE9BQU8sRUFBRSx1QkFBdUIsRUFBc0IsTUFBTSw4QkFBOEIsQ0FBQztBQUUzRixPQUFPLEVBQ0wsZUFBZSxFQUNmLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFFTixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFTekQ7OztHQUdHO0FBU0gsTUFBTSxPQUFPLG1CQUFvQixTQUFRLFdBQVc7SUFDbEQsU0FBUztJQUNULHVCQUF1QjtJQUN2QixJQUFJLEdBQUcsS0FBSyxDQUFrQixFQUFxQixnREFBQyxDQUFDO0lBRXJELDBCQUEwQjtJQUMxQixPQUFPLEdBQUcsS0FBSyxDQUFtQixFQUFFLG1EQUFDLENBQUM7SUFFdEMsVUFBVTtJQUNWLG9DQUFvQztJQUNwQyxRQUFRLEdBQUcsTUFBTSxFQUF3QixDQUFDO0lBRTFDLDRCQUE0QjtJQUNYLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQTZCLGdCQUFnQixDQUFDLENBQUM7SUFFckcsdUNBQXVDO0lBQzdCLEVBQUUsQ0FBdUI7SUFFbkMsaUJBQWlCO0lBQ1QsR0FBRyxDQUFPO0lBQ1YsS0FBSyxDQUFPO0lBQ1osTUFBTSxDQUFPO0lBQ2IsTUFBTSxDQUFPO0lBQ2IsU0FBUyxDQUFPO0lBQ2hCLEtBQUssQ0FBTztJQUNaLEtBQUssQ0FBTztJQUVwQixtQkFBbUI7SUFDWCxLQUFLLENBQVU7SUFDZixNQUFNLENBQVU7SUFDaEIsTUFBTSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBRTFELGdFQUFnRTtJQUMvQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFDekMsK0NBQStDO0lBQzlCLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFFbEMsa0JBQWtCO0lBQ1YseUJBQXlCLEdBQUcsTUFBTSxDQUFDLEtBQUsscUVBQUMsQ0FBQztJQUVsRCxnQkFBZ0I7SUFDUixlQUFlLEdBQUcsTUFBTSxDQUFDLEtBQUssMkRBQUMsQ0FBQztJQUNoQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsNERBQUMsQ0FBQztJQUMxQyxZQUFZLEdBQUcsTUFBTSxDQUFxQjtRQUNoRCxLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxHQUFHO1FBQ1YsVUFBVSxFQUFFLElBQUk7UUFDaEIsS0FBSyxFQUFFLEVBQUU7S0FDVix3REFBQyxDQUFDO0lBRUgsOEJBQThCO0lBQ3RCLFlBQVksR0FBRyxNQUFNLENBQUMsS0FBSyx3REFBQyxDQUFDO0lBQzdCLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxxREFBQyxDQUFDO0lBRWxDLG9CQUFvQjtJQUNWLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ25ELGVBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDckQsV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7SUFFdkQsdUJBQXVCO0lBQ2YsV0FBVyxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBRWxELDBCQUEwQjtJQUNsQixXQUFXLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFFckQsb0JBQW9CO0lBQ3BCLHNDQUFzQztJQUV0Qyw4QkFBOEI7SUFDcEIsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUN6QyxPQUFPO1lBQ0wsR0FBRyxJQUFJLENBQUMsV0FBVztZQUNuQixHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7U0FDbEIsQ0FBQztJQUNKLENBQUMsNERBQUMsQ0FBQztJQUVILHlCQUF5QjtJQUNmLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDMUMsTUFBTSxlQUFlLEdBQUc7WUFDdEIsTUFBTSxFQUFFLG1CQUFtQjtZQUMzQixVQUFVLEVBQUUsMENBQTBDO1lBQ3RELFNBQVMsRUFBRSxxQkFBcUI7WUFDaEMsYUFBYSxFQUFFLG9DQUFvQztZQUNuRCxVQUFVLEVBQUUsMEJBQTBCO1lBQ3RDLGFBQWEsRUFBRSx1QkFBdUI7U0FDdkMsQ0FBQztRQUNGLE9BQU87WUFDTCxHQUFHLGVBQWU7WUFDbEIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRO1NBQ3BDLENBQUM7SUFDSixDQUFDLDZEQUFDLENBQUM7SUFFSCxvQkFBb0I7SUFDWixVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUN2Qyw2REFBNkQ7SUFDckQsWUFBWSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFFekMsVUFBVTtJQUNGLGVBQWUsQ0FBQyxLQUFzQjtRQUM1QyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUssS0FBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsSUFBSyxLQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0csQ0FBQztJQUVPLHNCQUFzQixDQUFDLE1BQWlDO1FBQzlELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLElBQUksRUFBRSxDQUFDO1FBQ3pDLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDtRQUNFLEtBQUssRUFBRSxDQUFDO1FBQ1IsMkVBQTJFO1FBQzNFLGVBQWUsQ0FBQyxHQUFHLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2QsNkRBQTZEO1lBQzdELElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDO2dCQUN2QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILHdDQUF3QztRQUN4QyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsOEJBQThCO1lBQzlCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNaLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBRXhCLGtDQUFrQztZQUNsQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOztPQUVHO0lBQ08sS0FBSyxDQUFDLE1BQU07UUFDcEIsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QixzQ0FBc0M7WUFDdEMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsYUFBYTtZQUFFLE9BQU87UUFFaEUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDL0QsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFvQixDQUFDO1FBQzFELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFckQseUJBQXlCO1FBQ3pCLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLGlCQUFpQixHQUFxQixFQUFFLENBQUM7UUFDN0MsSUFBSSxXQUFXLEdBQThCLEVBQUUsQ0FBQztRQUNoRCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLFdBQVcsR0FBRyxVQUF1QyxDQUFDO1lBQ3RELE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM1RixNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUUsYUFBYSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUYsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLE1BQU0sR0FBSSxVQUErQixJQUFJLEVBQUUsQ0FBQztZQUN0RCxpQkFBaUIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbEUsYUFBYSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELDBFQUEwRTtRQUMxRSxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRXhGLDBCQUEwQjtRQUMxQixJQUFJLENBQUUsVUFBb0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN6QyxPQUFPO1FBQ1QsQ0FBQztRQUVELHNDQUFzQztRQUN0QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDaEQsT0FBTztRQUNULENBQUM7UUFFRCxtQ0FBbUM7UUFDbkMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUVyRCxrREFBa0Q7UUFDbEQsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDeEMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLFdBQVc7UUFDaEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNJLFlBQVk7UUFDakIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsYUFBYSxDQUFDO1FBQ3pELElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCw2RUFBNkU7WUFDN0UsSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLGtDQUFrQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDcEYsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBVyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBVyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNLLGVBQWUsQ0FBQyxnQkFBNkIsRUFBRSxPQUF5QjtRQUM5RSw2RUFBNkU7UUFDN0UsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUV2RCwyQkFBMkI7UUFDM0IsTUFBTSxjQUFjLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxDQUFDO1FBQ3BELE1BQU0sZUFBZSxHQUFHLGdCQUFnQixDQUFDLFlBQVksQ0FBQztRQUV0RCxrQkFBa0I7UUFDbEIsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUM7UUFDOUMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUM7UUFFOUMsc0RBQXNEO1FBQ3RELE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQzlCLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQ0FBa0M7UUFDM0YsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDhCQUE4QjtRQUNyRixNQUFNLG1CQUFtQixHQUFHLFNBQVM7WUFDbkMsQ0FBQyxDQUFDLElBQUksQ0FBQywrQkFBK0IsRUFBRSxHQUFHLGtCQUFrQixHQUFHLGlCQUFpQixHQUFHLG1CQUFtQjtZQUN2RyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRU4saUVBQWlFO1FBQ2pFLElBQUkscUJBQXFCLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQW9CLENBQUM7WUFDbkQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QyxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFFLEdBQWlDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBRSxHQUF3QixDQUFDLE1BQU0sQ0FBQztZQUM1RyxNQUFNLFlBQVksR0FBRyxDQUFDLEdBQUcsRUFBRTtnQkFDekIsSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDaEIsTUFBTSxNQUFNLEdBQUcsR0FBZ0MsQ0FBQztvQkFDaEQsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3RHLENBQUM7Z0JBQ0QsTUFBTSxJQUFJLEdBQUksR0FBd0IsSUFBSSxFQUFFLENBQUM7Z0JBQzdDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDOUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUVMLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksY0FBYyxDQUFDO1lBQ2xELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ2xFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRixNQUFNLDBCQUEwQixHQUFHLFlBQVksQ0FBQyxNQUFNLEdBQUcsZUFBZSxHQUFHLElBQUksQ0FBQztZQUNoRixNQUFNLG9CQUFvQixHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztZQUNuRixNQUFNLFVBQVUsR0FDZCxPQUFPLENBQUMsaUJBQWlCLEtBQUssSUFBSTtnQkFDaEMsQ0FBQyxDQUFDLElBQUk7Z0JBQ04sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsS0FBSyxLQUFLO29CQUNuQyxDQUFDLENBQUMsS0FBSztvQkFDUCxDQUFDLENBQUMsMEJBQTBCLEdBQUcsb0JBQW9CLENBQUM7WUFFMUQsTUFBTSxjQUFjLEdBQUcsVUFBVTtnQkFDL0IsQ0FBQyxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQztnQkFDaEYsQ0FBQyxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7WUFDeEIsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUI7WUFDckYsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsVUFBVSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHdCQUF3QjtZQUM3RixxQkFBcUIsR0FBRyxjQUFjLEdBQUcsYUFBYSxHQUFHLGdCQUFnQixDQUFDO1FBQzVFLENBQUM7UUFFRCx3REFBd0Q7UUFDeEQsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUMsQ0FBQyxvREFBb0Q7UUFDcEYsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxjQUFjLENBQUM7UUFDbEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxVQUFVLEdBQUcsbUJBQW1CLENBQUMsQ0FBQztRQUVoRSxJQUFJLFVBQWtCLENBQUM7UUFDdkIsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEdBQUcscUJBQXFCLENBQUMsQ0FBQztRQUNyRSxDQUFDO2FBQU0sSUFBSSxlQUFlLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLGVBQWUsR0FBRyxxQkFBcUIsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQzFGLENBQUM7YUFBTSxDQUFDO1lBQ04sVUFBVSxHQUFHLGtCQUFrQixDQUFDO1FBQ2xDLENBQUM7UUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQztRQUV6Qiw4REFBOEQ7UUFDOUQsK0VBQStFO1FBQy9FLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcscUJBQXFCLEdBQUcsb0JBQW9CLENBQUM7UUFFL0UsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUU7YUFDaEIsTUFBTSxDQUFDLGdCQUFnQixDQUFDO2FBQ3hCLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDYixJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQzthQUNyQixJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNuQyxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDO2FBQ25ELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUVoRCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUVmLDJFQUEyRTtRQUMzRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHO2FBQ2xCLE1BQU0sQ0FBQyxHQUFHLENBQUM7YUFDWCxJQUFJLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQzthQUM5QixJQUFJLENBQUMsV0FBVyxFQUFFLGFBQWEsbUJBQW1CLElBQUksb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFRCxrRkFBa0Y7SUFFbEY7O09BRUc7SUFDSyxXQUFXLENBQUMsSUFBc0I7UUFDeEMsNkNBQTZDO1FBQzdDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDO1FBQ3JFLDZEQUE2RDtRQUM3RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUM7UUFFbkQsbURBQW1EO1FBQ25ELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUU7YUFDbEIsU0FBUyxFQUFFO2FBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUM3QixLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3RCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVwQiwyQ0FBMkM7UUFDM0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRTthQUNsQixXQUFXLEVBQUU7YUFDYixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDbkQsSUFBSSxFQUFFO2FBQ04sS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNLLG9CQUFvQixDQUFDLE1BQWlDO1FBQzVELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsRixNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFNUUsMEJBQTBCO1FBQzFCLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFO2FBQ2xCLFNBQVMsRUFBRTthQUNYLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDL0IsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0QixPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFekIsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUU1RyxvQ0FBb0M7UUFDcEMsTUFBTSxnQkFBZ0IsR0FBYSxFQUFFLENBQUM7UUFDdEMsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN2QixhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUMvQixNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM5QixJQUFJLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUTtvQkFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hGLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVEOztPQUVHO0lBQ0ssVUFBVSxDQUFDLE9BQXlCO1FBQzFDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDO1FBQzlDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDO1FBQzlDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEtBQUssS0FBSyxDQUFDO1FBRTVDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUU1RSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUVELElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBRUQsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVPLFdBQVcsQ0FBQyxTQUFjLEVBQUUsT0FBeUI7UUFDM0QsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2RixNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBaUIsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRU8sV0FBVyxDQUFDLFNBQWMsRUFBRSxPQUF5QjtRQUMzRCxnQkFBZ0I7UUFDaEIsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFFNUcsc0JBQXNCO1FBQ3RCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxDQUFDO1FBQ2pFLElBQUksQ0FBQyxLQUFLO2FBQ1AsU0FBUyxDQUFDLE1BQU0sQ0FBQzthQUNqQixLQUFLLENBQUMsV0FBVyxFQUFFLEdBQUcsZUFBZSxJQUFJLENBQUM7YUFDMUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUM7YUFDM0IsS0FBSyxDQUFDLE1BQU0sRUFBRSxrREFBa0QsQ0FBQzthQUNqRSxJQUFJLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQzthQUMxQixJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRTVCLG1CQUFtQjtRQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLGdEQUFnRCxDQUFDLENBQUM7UUFFckcsbUJBQW1CO1FBQ25CLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7SUFDSCxDQUFDO0lBRU8sdUJBQXVCLENBQUMsU0FBOEIsRUFBRSxRQUFnQjtRQUM5RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUV4QywrQ0FBK0M7UUFDL0MsSUFBSSxPQUFPLENBQUMsaUJBQWlCLEtBQUssSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3BELElBQUksT0FBTyxDQUFDLGlCQUFpQixLQUFLLEtBQUs7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUV0RCxzREFBc0Q7UUFDdEQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFcEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNoRixNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsTUFBTSxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFFOUUsdUdBQXVHO1FBQ3ZHLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2hELElBQUksV0FBVyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sY0FBYyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxzQ0FBc0M7UUFDNUUsQ0FBQztRQUVELE9BQU8sY0FBYyxHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsU0FBYyxFQUFFLEtBQWEsRUFBRSxjQUFzQixFQUFFLGFBQWEsR0FBRyxDQUFDO1FBQy9GLGtFQUFrRTtRQUNsRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLGNBQWMsR0FBRyxhQUFhLENBQUM7UUFFNUQsU0FBUzthQUNOLE1BQU0sQ0FBQyxNQUFNLENBQUM7YUFDZCxJQUFJLENBQUMsT0FBTyxFQUFFLHlDQUF5QyxDQUFDO2FBQ3hELElBQUksQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDO2FBQzdCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLENBQUMsQ0FBQyw4Q0FBOEM7YUFDbkYsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQzthQUN6QixJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQzthQUNqQixJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQzthQUN4QixLQUFLLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQzthQUMxQixLQUFLLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQzthQUMzQixLQUFLLENBQUMsTUFBTSxFQUFFLGdEQUFnRCxDQUFDO2FBQy9ELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsU0FBYyxFQUFFLEtBQWE7UUFDcEQsZ0RBQWdEO1FBQ2hELGtGQUFrRjtRQUNsRiw0Q0FBNEM7UUFDNUMseURBQXlEO1FBQ3pELHFEQUFxRDtRQUVyRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQywrQkFBK0IsRUFBRSxDQUFDO1FBQ2pFLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDLHVEQUF1RDtRQUUzRSxnREFBZ0Q7UUFDaEQsbUZBQW1GO1FBQ25GLE1BQU0sTUFBTSxHQUFHLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDO1FBRTVDLDhCQUE4QjtRQUM5QixNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRWhDLFNBQVM7YUFDTixNQUFNLENBQUMsTUFBTSxDQUFDO2FBQ2QsSUFBSSxDQUFDLE9BQU8sRUFBRSx5Q0FBeUMsQ0FBQzthQUN4RCxJQUFJLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQzthQUM3QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsUUFBUSxDQUFDO2FBQ25DLElBQUksQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDO2FBQ2hDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO2FBQ2pCLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO2FBQ2pCLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDO2FBQ3hCLEtBQUssQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDO2FBQzFCLEtBQUssQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDO2FBQzNCLEtBQUssQ0FBQyxNQUFNLEVBQUUsZ0RBQWdELENBQUM7YUFDL0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pCLENBQUM7SUFFTywrQkFBK0I7UUFDckMsNERBQTREO1FBQzVELE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBb0IsQ0FBQztRQUNuRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTlDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNqQixJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sTUFBTSxHQUFHLEdBQWdDLENBQUM7WUFDaEQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xGLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU1RSxLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUN2QixhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFO29CQUMvQixNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM5QixJQUFJLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUTt3QkFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4RixDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sV0FBVyxHQUFJLEdBQXdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckYsUUFBUSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNoRixDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDdEYsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLENBQUMsK0NBQStDO1FBQ3BFLE9BQU8sYUFBYSxDQUFDLE1BQU0sR0FBRyxRQUFRLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLDRCQUE0QjtJQUNoRixDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsS0FBSzthQUNQLE1BQU0sQ0FBQyxHQUFHLENBQUM7YUFDWCxJQUFJLENBQUMsT0FBTyxFQUFFLG1CQUFtQixDQUFDO2FBQ2xDLElBQUksQ0FDSCxJQUFJLENBQUMsRUFBRTthQUNKLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2FBQ3JCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7YUFDckIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUN4QjthQUNBLFNBQVMsQ0FBQyxNQUFNLENBQUM7YUFDakIsS0FBSyxDQUFDLFFBQVEsRUFBRSxnREFBZ0QsQ0FBQzthQUNqRSxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFaEMscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzNFLENBQUM7SUFFRDs7T0FFRztJQUNLLG1CQUFtQixDQUFDLE9BQXlCLEVBQUUsTUFBaUM7UUFDdEYsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUM7UUFDOUMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUM7UUFDOUMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsS0FBSyxLQUFLLENBQUM7UUFFNUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBRTVFLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBRUQsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsU0FBYyxFQUFFLE9BQXlCLEVBQUUsTUFBaUM7UUFDdkcsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQWlCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7T0FFRztJQUNLLFVBQVUsQ0FBQyxJQUFzQjtRQUN2Qyx5QkFBeUI7UUFDekIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sZ0JBQWdCLEdBQUksSUFBSSxDQUFDLElBQUksRUFBdUIsSUFBSSxFQUFFLENBQUM7UUFFakUsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUMsaUNBQWlDO1FBQ2pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFlBQVksQ0FBQztRQUVwRCx3QkFBd0I7UUFDeEIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztRQUNwRSxNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRTVGLGtDQUFrQztRQUNsQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLDZCQUE2QixDQUFDLENBQUM7UUFFMUYsdURBQXVEO1FBQ3ZELE1BQU0sU0FBUyxHQUFHLGFBQWE7YUFDNUIsU0FBUyxDQUFDLHlCQUF5QixDQUFDO2FBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUM7YUFDakIsS0FBSyxFQUFFO2FBQ1AsTUFBTSxDQUFDLEdBQUcsQ0FBQzthQUNYLEtBQUssQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDO2FBQzFCLElBQUksQ0FBQyxPQUFPLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztRQUUzQyx5QkFBeUI7UUFDekIsTUFBTSxJQUFJLEdBQUcsU0FBUzthQUNuQixNQUFNLENBQUMsTUFBTSxDQUFDO2FBQ2QsSUFBSSxDQUFDLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQzthQUNqQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBaUIsRUFBRSxFQUFFO1lBQy9CLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyx5QkFBeUI7WUFDdEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3pFLENBQUMsQ0FBQzthQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFpQixFQUFFLEVBQUU7WUFDbEMsbUVBQW1FO1lBQ25FLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0UsNEZBQTRGO1lBQzVGLGtGQUFrRjtZQUNsRixPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUUsQ0FBQyxDQUFDLENBQUM7UUFFTCxxQ0FBcUM7UUFDckMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxjQUFjLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDckQsU0FBUztpQkFDTixNQUFNLENBQUMsTUFBTSxDQUFDO2lCQUNkLElBQUksQ0FBQyxPQUFPLEVBQUUseUJBQXlCLENBQUM7aUJBQ3hDLElBQUksQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDO2lCQUM3QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBaUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7aUJBQ2pGLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGtDQUFrQztpQkFDekQsS0FBSyxDQUFDLFdBQVcsRUFBRSx5QkFBeUIsQ0FBQztpQkFDN0MsS0FBSyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUM7aUJBQzNCLEtBQUssQ0FBQyxNQUFNLEVBQUUsaURBQWlELENBQUM7aUJBQ2hFLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0NBQWdDO2lCQUNwRCxJQUFJLENBQUMsQ0FBQyxDQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFeEMsc0JBQXNCO1lBQ3RCLFNBQVM7aUJBQ04sU0FBUyxDQUFDLDBCQUEwQixDQUFDO2lCQUNyQyxVQUFVLEVBQUU7aUJBQ1osUUFBUSxDQUFDLGlCQUFpQixDQUFDO2lCQUMzQixLQUFLLENBQUMsQ0FBQyxDQUFpQixFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyx1Q0FBdUM7aUJBQzdGLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFpQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxxQkFBcUI7aUJBQ2hGLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO2lCQUNuQixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVELHNDQUFzQztRQUN0QyxTQUFTO2FBQ04sRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLEtBQWlCLEVBQUUsQ0FBaUIsRUFBRSxFQUFFO1lBQ3pELDREQUE0RDtZQUM1RCxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFO2dCQUFFLE9BQU87WUFFOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVqRSwwRUFBMEU7WUFDMUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLHNEQUFzRCxDQUFDLENBQUM7WUFFekcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDO2FBQ0QsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQWlCLEVBQUUsRUFBRTtZQUNyQyx1REFBdUQ7WUFDdkQsSUFBSSxJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEMsQ0FBQztRQUNILENBQUMsQ0FBQzthQUNELEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxLQUFpQixFQUFFLEVBQUU7WUFDdEMsNERBQTREO1lBQzVELElBQUksQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUU7Z0JBQUUsT0FBTztZQUU5QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRWpFLHNCQUFzQjtZQUN0QixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFdkQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDO2FBQ0QsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQWlCLEVBQUUsQ0FBaUIsRUFBRSxFQUFFO1lBQ3BELDZEQUE2RDtZQUM3RCxJQUFJLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVMLGdCQUFnQjtRQUNoQixJQUFJO2FBQ0QsVUFBVSxFQUFFO2FBQ1osUUFBUSxDQUFDLGlCQUFpQixDQUFDO2FBQzNCLEtBQUssQ0FBQyxDQUFDLENBQWlCLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsNkJBQTZCO2FBQzdFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFpQixFQUFFLEVBQUU7WUFDcEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXZELE9BQU8sQ0FBQyxDQUFTLEVBQUUsRUFBRTtnQkFDbkIsTUFBTSxhQUFhLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUM7Z0JBQzdDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsK0NBQStDO2dCQUVsRixJQUFJLE1BQU0sR0FBRyxDQUFDLElBQUksYUFBYSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNwQywrREFBK0Q7b0JBQy9ELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDcEQsT0FBTyxJQUFJLENBQUMsSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLFFBQVEsR0FBRyxlQUFlLEtBQUssQ0FBQyxJQUFJLFFBQVEsSUFBSSxDQUFDLEdBQUcsZUFBZSxJQUFJLFFBQVEsS0FBSyxDQUFDLEdBQUcsS0FBSyxHQUFHLGVBQWUsSUFBSSxRQUFRLEtBQUssQ0FBQyxHQUFHLEtBQUssSUFBSSxRQUFRLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxRQUFRLEdBQUcsZUFBZSxLQUFLLENBQUMsR0FBRyxLQUFLLElBQUksT0FBTyxJQUFJLENBQUM7Z0JBQ2pRLENBQUM7cUJBQU0sQ0FBQztvQkFDTixPQUFPLElBQUksQ0FBQyxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksUUFBUSxLQUFLLENBQUMsR0FBRyxLQUFLLElBQUksUUFBUSxLQUFLLENBQUMsR0FBRyxLQUFLLElBQUksT0FBTyxJQUFJLENBQUM7Z0JBQ25HLENBQUM7WUFDSCxDQUFDLENBQUM7UUFDSixDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMscUNBQXFDO2FBQzNELEdBQUcsRUFBRSxDQUFDLHNDQUFzQzthQUM1QyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1QscURBQXFEO1lBQ3JELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxtQkFBbUIsQ0FBQyxNQUFpQztRQUMzRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEYsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTVFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsWUFBWSxDQUFDO1FBQ3BELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsaUJBQWlCLENBQUM7UUFDcEUsTUFBTSxlQUFlLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUU1RixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLDZCQUE2QixDQUFDLENBQUM7UUFFMUYsTUFBTSxRQUFRLEdBQUcsYUFBYTthQUMzQixTQUFTLENBQUMscUJBQXFCLENBQUM7YUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUNaLEtBQUssRUFBRTthQUNQLE1BQU0sQ0FBQyxHQUFHLENBQUM7YUFDWCxJQUFJLENBQUMsT0FBTyxFQUFFLG9CQUFvQixDQUFDO2FBQ25DLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUEwQixFQUFFLEVBQUUsQ0FBQyxhQUFhLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUxRixNQUFNLFNBQVMsR0FBRyxRQUFRO2FBQ3ZCLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQzthQUNwQyxJQUFJLENBQUMsQ0FBQyxDQUEwQixFQUFFLEVBQUUsQ0FDbkMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FDeEY7YUFDQSxLQUFLLEVBQUU7YUFDUCxNQUFNLENBQUMsR0FBRyxDQUFDO2FBQ1gsS0FBSyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUM7YUFDMUIsSUFBSSxDQUFDLE9BQU8sRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1FBRTNDLE1BQU0sSUFBSSxHQUFHLFNBQVM7YUFDbkIsTUFBTSxDQUFDLE1BQU0sQ0FBQzthQUNkLElBQUksQ0FBQyxPQUFPLEVBQUUsa0JBQWtCLENBQUM7YUFDakMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQzthQUM5QyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBTSxFQUFFLEVBQUU7WUFDcEIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDeEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN6QyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLHlCQUF5QjtZQUN0RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDekUsQ0FBQyxDQUFDO2FBQ0QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQ3ZCLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQStCLENBQUM7WUFDNUUsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQztZQUNqQyxPQUFPLElBQUksRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztRQUVMLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsY0FBYyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ3JELFNBQVM7aUJBQ04sTUFBTSxDQUFDLE1BQU0sQ0FBQztpQkFDZCxJQUFJLENBQUMsT0FBTyxFQUFFLHlCQUF5QixDQUFDO2lCQUN4QyxJQUFJLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQztpQkFDN0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztpQkFDNUYsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO2lCQUN0QixLQUFLLENBQUMsV0FBVyxFQUFFLHlCQUF5QixDQUFDO2lCQUM3QyxLQUFLLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQztpQkFDM0IsS0FBSyxDQUFDLE1BQU0sRUFBRSxpREFBaUQsQ0FBQztpQkFDaEUsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7aUJBQ25CLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUNmLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQStCLENBQUM7Z0JBQzVFLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUM7WUFFTCxTQUFTO2lCQUNOLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQztpQkFDckMsVUFBVSxFQUFFO2lCQUNaLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztpQkFDM0IsS0FBSyxDQUFDLENBQUMsQ0FBTSxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7aUJBQzFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFNLEVBQUUsRUFBRTtnQkFDcEIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBK0IsQ0FBQztnQkFDNUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUMxRCxDQUFDLENBQUM7aUJBQ0QsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7aUJBQ25CLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBRUQsU0FBUzthQUNOLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxLQUFpQixFQUFFLENBQU0sRUFBRSxFQUFFO1lBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUU7Z0JBQUUsT0FBTztZQUM5QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pFLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxzREFBc0QsQ0FBQyxDQUFDO1lBQ3pHLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQStCLENBQUM7WUFDNUUsSUFBSSxJQUFJO2dCQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDO2FBQ0QsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQWlCLEVBQUUsRUFBRTtZQUNyQyxJQUFJLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtnQkFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDO2FBQ0QsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLEtBQWlCLEVBQUUsRUFBRTtZQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFO2dCQUFFLE9BQU87WUFDOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqRSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDO2FBQ0QsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQWlCLEVBQUUsQ0FBTSxFQUFFLEVBQUU7WUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtnQkFBRSxPQUFPO1lBQzlDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQStCLENBQUM7WUFDNUUsSUFBSSxJQUFJO2dCQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSTthQUNELFVBQVUsRUFBRTthQUNaLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQzthQUMzQixLQUFLLENBQUMsQ0FBQyxDQUFNLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQ3BDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFNLEVBQUUsRUFBRTtZQUN6QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN4QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQStCLENBQUM7WUFDNUUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFckUsT0FBTyxDQUFDLENBQVMsRUFBRSxFQUFFO2dCQUNuQixNQUFNLGFBQWEsR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDO2dCQUN0QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQztnQkFDN0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQywrQ0FBK0M7Z0JBRWxGLElBQUksTUFBTSxHQUFHLENBQUMsSUFBSSxhQUFhLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3BDLCtEQUErRDtvQkFDL0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUNwRCxPQUFPLElBQUksQ0FBQyxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksUUFBUSxHQUFHLGVBQWUsS0FBSyxDQUFDLElBQUksUUFBUSxJQUFJLENBQUMsR0FBRyxlQUFlLElBQUksUUFBUSxLQUFLLENBQUMsR0FBRyxLQUFLLEdBQUcsZUFBZSxJQUFJLFFBQVEsS0FBSyxDQUFDLEdBQUcsS0FBSyxJQUFJLFFBQVEsSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLFFBQVEsR0FBRyxlQUFlLEtBQUssQ0FBQyxHQUFHLEtBQUssSUFBSSxPQUFPLElBQUksQ0FBQztnQkFDalEsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE9BQU8sSUFBSSxDQUFDLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxRQUFRLEtBQUssQ0FBQyxHQUFHLEtBQUssSUFBSSxRQUFRLEtBQUssQ0FBQyxHQUFHLEtBQUssSUFBSSxPQUFPLElBQUksQ0FBQztnQkFDbkcsQ0FBQztZQUNILENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQzthQUNELElBQUksQ0FBQyxlQUFlLENBQUM7YUFDckIsR0FBRyxFQUFFO2FBQ0wsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnREFBZ0Q7SUFFaEQ7O09BRUc7SUFDSyxjQUFjLENBQUMsS0FBaUIsRUFBRSxLQUFxQixFQUFFLEtBQXFDO1FBQ3BHLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsV0FBVyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ2xELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQXFCLENBQUM7WUFDakQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNwRCxNQUFNLFFBQVEsR0FBcUIsV0FBVztnQkFDNUMsQ0FBQyxDQUFFLFNBQXVDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUN0RSxDQUFDLENBQUUsU0FBOEIsSUFBSSxFQUFFLENBQUM7WUFDMUMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9GLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFckUsZ0NBQWdDO1lBQ2hDLE1BQU0sS0FBSyxHQUFHLFdBQVc7Z0JBQ3ZCLENBQUMsQ0FBRSxTQUF1QyxDQUFDLE1BQU0sQ0FDN0MsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFDaEUsQ0FBQyxDQUNGO2dCQUNILENBQUMsQ0FBRSxRQUE2QixDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzlFLE1BQU0sVUFBVSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBRTlFLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDO2dCQUNwQixLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLEtBQUssTUFBTSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLEtBQUs7Z0JBQzFHLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRTtnQkFDN0IsVUFBVSxFQUFFLEdBQUcsVUFBVSxHQUFHO2dCQUM1QixLQUFLLEVBQUUsS0FBSzthQUNiLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0sscUJBQXFCLENBQUMsS0FBaUI7UUFDN0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsYUFBYSxDQUFDO1FBQzNELElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTztRQUN6QixNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMxRCxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUF1QixDQUFDO1FBQ3BGLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN6RSxNQUFNLEdBQUcsR0FBRyxzQkFBc0IsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDL0csSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxjQUFjLENBQUMsS0FBaUIsRUFBRSxLQUFxQjtRQUM3RCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRDs7T0FFRztJQUNLLGlCQUFpQixDQUFDLGdCQUE2QjtRQUNyRCxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLFdBQVcsQ0FDZCxnQkFBZ0IsRUFDaEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsVUFBVSxFQUNuQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxNQUFNLEVBQy9CLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLFVBQVUsRUFDbkMsOEJBQThCLENBQy9CLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSyx3QkFBd0IsQ0FBQyxnQkFBNkI7UUFDNUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxXQUFXLENBQ2QsZ0JBQWdCLEVBQ2hCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLGFBQWEsRUFDdEMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsU0FBUyxFQUNsQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxhQUFhLEVBQ3RDLDhCQUE4QixDQUMvQixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ08sUUFBUSxDQUFDLEtBQWE7UUFDOUIsT0FBTyxhQUFhLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxXQUFXLENBQUMsRUFBVTtRQUM5QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxjQUFjO1FBQ1osTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFvQixDQUFDO1FBQ3JELElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sTUFBTSxHQUFHLEtBQWtDLENBQUM7WUFDbEQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xGLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQ3pCLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ3JHLENBQUMsQ0FDRixDQUFDO1lBQ0YsT0FBTyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUN2QyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUN6QyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNoQyxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNsRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2YsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNOLE1BQU0sVUFBVSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM5QyxPQUFPO29CQUNMLEVBQUUsRUFBRSxLQUFLO29CQUNULElBQUksRUFBRSxLQUFLLElBQUksVUFBVSxLQUFLLEdBQUcsQ0FBQyxFQUFFO29CQUNwQyxLQUFLLEVBQUUsV0FBVztvQkFDbEIsVUFBVTtvQkFDVixLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDL0MsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztpQkFDckMsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLEtBQXlCLENBQUM7UUFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JHLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUM5QixNQUFNLEdBQUcsR0FBRyxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUQsTUFBTSxVQUFVLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkQsT0FBTztnQkFDTCxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ1gsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLElBQUksUUFBUSxLQUFLLEdBQUcsQ0FBQyxFQUFFO2dCQUN2QyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7Z0JBQ2pCLFVBQVU7Z0JBQ1YsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQ3pDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7YUFDbEMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILGdCQUFnQixDQUFDLEVBQWlCO1FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU87UUFFdEIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFvQixDQUFDO1FBQ3JELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFaEQsTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxHQUFHO2lCQUNMLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQztpQkFDOUIsT0FBTyxDQUFDLDBCQUEwQixFQUFFLEtBQUssQ0FBQztpQkFDMUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQztpQkFDckMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7aUJBQ2xCLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDO2lCQUNwQixJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQztpQkFDcEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUM7aUJBQzFCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUM7UUFFRixJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNoQixRQUFRLEVBQUUsQ0FBQztZQUNYLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFZLENBQUMsRUFBRSxDQUFDO2dCQUNuQyxRQUFRLEVBQUUsQ0FBQztnQkFDWCxPQUFPO1lBQ1QsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzNGLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRTtnQkFBRSxPQUFPO1lBQzlCLE1BQU0sc0JBQXNCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1lBQzdFLElBQUksc0JBQXNCLEVBQUUsQ0FBQztnQkFDM0IsUUFBUSxFQUFFLENBQUM7WUFDYixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sUUFBUSxFQUFFLENBQUM7Z0JBQ1gsU0FBUztxQkFDTixPQUFPLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDO3FCQUN6QyxJQUFJLENBQUMsUUFBUSxFQUFFLHlDQUF5QyxDQUFDO3FCQUN6RCxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztxQkFDdEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUM7cUJBQzNCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUM7cUJBQzdCLEtBQUssQ0FBQyxZQUFZLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLEdBQUc7cUJBQ0wsU0FBUyxDQUFDLG1CQUFtQixDQUFDO3FCQUM5QixNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDO3FCQUNoQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDO3FCQUNwQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQztxQkFDcEIsS0FBSyxDQUFDLFlBQVksRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1lBQ3JELENBQUM7WUFDRCxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLENBQVMsRUFBRSxLQUFZLEVBQUUsRUFBRTtZQUNwRyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFtQixDQUFDO1lBQ3hDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUU7WUFBRSxPQUFPO1FBQy9CLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUNyRSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLFFBQVEsRUFBRSxDQUFDO1FBQ2IsQ0FBQzthQUFNLENBQUM7WUFDTixRQUFRLEVBQUUsQ0FBQztZQUNYLFVBQVU7aUJBQ1AsT0FBTyxDQUFDLDBCQUEwQixFQUFFLElBQUksQ0FBQztpQkFDekMsSUFBSSxDQUFDLFFBQVEsRUFBRSx5Q0FBeUMsQ0FBQztpQkFDekQsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUM7aUJBQ3RCLElBQUksQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDO2lCQUMzQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDO2lCQUM3QixLQUFLLENBQUMsWUFBWSxFQUFFLHNCQUFzQixDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLEdBQUc7aUJBQ0wsU0FBUyxDQUFDLG1CQUFtQixDQUFDO2lCQUM5QixNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsQ0FBUyxFQUFFLEtBQVksRUFBRSxFQUFFLENBQUUsS0FBSyxDQUFDLENBQUMsQ0FBb0IsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO2lCQUM1RyxPQUFPLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDO2lCQUNwQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQztpQkFDcEIsS0FBSyxDQUFDLFlBQVksRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGFBQWEsQ0FBQyxFQUFVO1FBQ3RCLE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBb0IsQ0FBQztRQUNyRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWhELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLFlBQVksR0FDZixLQUEwQixDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUssS0FBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDN0csSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDM0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztvQkFDakIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxhQUFhLEVBQUUsQ0FBQzt3QkFDM0MsSUFBSSxDQUFDLEVBQUU7NEJBQ0wsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsYUFBYSxDQUFDOzZCQUM5QyxTQUFTLENBQUMsa0NBQWtDLENBQUM7NkJBQzdDLE1BQU0sRUFBRSxDQUFDO3dCQUNaLFVBQVUsQ0FBQyxHQUFHLEVBQUU7NEJBQ2QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO3dCQUNyQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ1IsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNyQixDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN4QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsQ0FBQztZQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBRUQseUNBQXlDO1FBQ3pDLE1BQU0sTUFBTSxHQUFHLEtBQWtDLENBQUM7UUFDbEQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2xGLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7UUFDeEMsTUFBTSxZQUFZLEdBQUcsV0FBVyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxXQUFXLENBQUM7UUFFOUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ2pCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsYUFBYSxFQUFFLENBQUM7b0JBQzNDLElBQUksQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUM5RyxVQUFVLENBQUMsR0FBRyxFQUFFO3dCQUNkLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDckIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNSLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDO1FBRUQsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxrRUFBa0U7SUFFMUQsbUJBQW1CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQztJQUN4RCxDQUFDO0lBRU8sY0FBYyxDQUFDLGdCQUE2QjtRQUNsRCxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzFGLENBQUM7SUFFTyxnQ0FBZ0M7UUFDdEMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFTyxpQ0FBaUM7UUFDdkMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxTQUFjLEVBQUUsU0FBOEIsRUFBRSxPQUF5QjtRQUNoRyxJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVM7YUFDbkIsTUFBTSxDQUFDLEdBQUcsQ0FBQzthQUNYLElBQUksQ0FBQyxPQUFPLEVBQUUscUJBQXFCLENBQUM7YUFDcEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxlQUFlLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQzthQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQVUsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQVEsQ0FBQyxDQUFDO1FBRTVHLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLO2FBQzFCLFNBQVMsQ0FBQyxNQUFNLENBQUM7YUFDakIsS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLGVBQWUsSUFBSSxDQUFDO2FBQzFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDO2FBQzNCLEtBQUssQ0FBQyxNQUFNLEVBQUUsa0RBQWtELENBQUM7YUFDakUsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUU1QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzNFLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNwSCxDQUFDO1FBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxnREFBZ0QsQ0FBQyxDQUFDO1FBRXJHLElBQUksT0FBTyxDQUFDLFVBQVUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFxQixDQUFDO1lBQ25GLE1BQU0sa0JBQWtCLEdBQ3RCLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSyxDQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBRSxDQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO2dCQUM5RyxDQUFDLENBQUMsZUFBZSxDQUFDO1lBQ3RCLE1BQU0sY0FBYyxHQUFHLGtCQUFrQixHQUFHLENBQUMsQ0FBQztZQUM5QyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUN0RixDQUFDO0lBQ0gsQ0FBQztJQUVELHFEQUFxRDtJQUU3QyxXQUFXLENBQ2pCLGdCQUE2QixFQUM3QixTQUFpQixFQUNqQixJQUFZLEVBQ1osUUFBZ0IsRUFDaEIsYUFBcUI7UUFFckIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEVBQUU7YUFDdEIsTUFBTSxDQUFDLGdCQUFnQixDQUFDO2FBQ3hCLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDYixJQUFJLENBQUMsT0FBTyxFQUFFLDhEQUE4RCxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBRWhHLFNBQVM7YUFDTixNQUFNLENBQUMsS0FBSyxDQUFDO2FBQ2IsSUFBSSxDQUFDLE9BQU8sRUFBRSxpREFBaUQsQ0FBQzthQUNoRSxJQUFJLENBQUMsYUFBYSxTQUFTLGNBQWMsQ0FBQyxDQUFDO1FBRTlDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxpREFBaUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVwRyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsaURBQWlELENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUcsQ0FBQzt1R0Fwc0NVLG1CQUFtQjsyRkFBbkIsbUJBQW1CLHFnQkN6Q2hDLGlSQVNBLHU3Q0Q2QlksdUJBQXVCOzsyRkFHdEIsbUJBQW1CO2tCQVIvQixTQUFTOytCQUNFLGNBQWMsaUJBR1QsaUJBQWlCLENBQUMsSUFBSSxXQUM1QixDQUFDLHVCQUF1QixDQUFDLG1CQUNqQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTlhDb21wb25lbnQgfSBmcm9tICdAYWNvcmV4L2Nkay9jb21tb24nO1xuaW1wb3J0IHsgQVhfQ0hBUlRfQ09MT1JfUEFMRVRURSwgY29tcHV0ZVRvb2x0aXBQb3NpdGlvbiwgZ2V0Q2hhcnRDb2xvciwgZ2V0RWFzaW5nRnVuY3Rpb24gfSBmcm9tICdAYWNvcmV4L2NoYXJ0cyc7XG5pbXBvcnQgeyBBWENoYXJ0TGVnZW5kQ29tcGF0aWJsZSwgQVhDaGFydExlZ2VuZEl0ZW0gfSBmcm9tICdAYWNvcmV4L2NoYXJ0cy9jaGFydC1sZWdlbmQnO1xuaW1wb3J0IHsgQVhDaGFydFRvb2x0aXBDb21wb25lbnQsIEFYQ2hhcnRUb29sdGlwRGF0YSB9IGZyb20gJ0BhY29yZXgvY2hhcnRzL2NoYXJ0LXRvb2x0aXAnO1xuXG5pbXBvcnQge1xuICBhZnRlck5leHRSZW5kZXIsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIEVsZW1lbnRSZWYsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG4gIHZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhfQkFSX0NIQVJUX0NPTkZJRyB9IGZyb20gJy4vYmFyLWNoYXJ0LmNvbmZpZyc7XG5pbXBvcnQge1xuICBBWEJhckNoYXJ0Q2xpY2tFdmVudCxcbiAgQVhCYXJDaGFydENsdXN0ZXJlZERhdGEsXG4gIEFYQmFyQ2hhcnREYXRhLFxuICBBWEJhckNoYXJ0T3B0aW9uLFxuICBBWEJhckNoYXJ0VmFsdWUsXG59IGZyb20gJy4vYmFyLWNoYXJ0LnR5cGUnO1xuXG4vKipcbiAqIEJhciBDaGFydCBDb21wb25lbnRcbiAqIFJlbmRlcnMgZGF0YSBhcyB2ZXJ0aWNhbCBiYXJzIHdpdGggaW50ZXJhY3RpdmUgaG92ZXIgZWZmZWN0cyBhbmQgYW5pbWF0aW9uc1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdheC1iYXItY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vYmFyLWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYmFyLWNoYXJ0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGltcG9ydHM6IFtBWENoYXJ0VG9vbHRpcENvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBWEJhckNoYXJ0Q29tcG9uZW50IGV4dGVuZHMgTlhDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlIHtcbiAgLy8gSW5wdXRzXG4gIC8qKiBDaGFydCBkYXRhIGlucHV0ICovXG4gIGRhdGEgPSBpbnB1dDxBWEJhckNoYXJ0VmFsdWU+KFtdIGFzIEFYQmFyQ2hhcnRWYWx1ZSk7XG5cbiAgLyoqIENoYXJ0IG9wdGlvbnMgaW5wdXQgKi9cbiAgb3B0aW9ucyA9IGlucHV0PEFYQmFyQ2hhcnRPcHRpb24+KHt9KTtcblxuICAvLyBPdXRwdXRzXG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBiYXIgaXMgY2xpY2tlZCAqL1xuICBiYXJDbGljayA9IG91dHB1dDxBWEJhckNoYXJ0Q2xpY2tFdmVudD4oKTtcblxuICAvLyBDaGFydCBjb250YWluZXIgcmVmZXJlbmNlXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnRDb250YWluZXJFbCA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ2NoYXJ0Q29udGFpbmVyJyk7XG5cbiAgLy8gRDMgcmVmZXJlbmNlIC0gbG9hZGVkIGFzeW5jaHJvbm91c2x5XG4gIHByb3RlY3RlZCBkMyE6IHR5cGVvZiBpbXBvcnQoJ2QzJyk7XG5cbiAgLy8gQ2hhcnQgZWxlbWVudHNcbiAgcHJpdmF0ZSBzdmchOiBhbnk7XG4gIHByaXZhdGUgY2hhcnQhOiBhbnk7XG4gIHByaXZhdGUgeFNjYWxlITogYW55O1xuICBwcml2YXRlIHlTY2FsZSE6IGFueTtcbiAgcHJpdmF0ZSB4U3ViU2NhbGUhOiBhbnk7XG4gIHByaXZhdGUgeEF4aXMhOiBhbnk7XG4gIHByaXZhdGUgeUF4aXMhOiBhbnk7XG5cbiAgLy8gQ2hhcnQgZGltZW5zaW9uc1xuICBwcml2YXRlIHdpZHRoITogbnVtYmVyO1xuICBwcml2YXRlIGhlaWdodCE6IG51bWJlcjtcbiAgcHJpdmF0ZSBtYXJnaW4gPSB7IHRvcDogMCwgcmlnaHQ6IDAsIGJvdHRvbTogMCwgbGVmdDogMCB9O1xuXG4gIC8vIENoYXJhY3RlciB3aWR0aCByYXRpbyBoZXVyaXN0aWMgZm9yIG1peGVkIExhdGluL1BlcnNpYW4gdGV4dHNcbiAgcHJpdmF0ZSByZWFkb25seSBDSEFSX1dJRFRIX1JBVElPID0gMC42NTtcbiAgLy8gVG9vbHRpcCBnYXAgaW4gcGl4ZWxzIGZvciBjb25zaXN0ZW50IHNwYWNpbmdcbiAgcHJpdmF0ZSByZWFkb25seSBUT09MVElQX0dBUCA9IDEwO1xuXG4gIC8vIEFuaW1hdGlvbiBzdGF0ZVxuICBwcml2YXRlIF9pbml0aWFsQW5pbWF0aW9uQ29tcGxldGUgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIFRvb2x0aXAgc3RhdGVcbiAgcHJpdmF0ZSBfdG9vbHRpcFZpc2libGUgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF90b29sdGlwUG9zaXRpb24gPSBzaWduYWwoeyB4OiAwLCB5OiAwIH0pO1xuICBwcml2YXRlIF90b29sdGlwRGF0YSA9IHNpZ25hbDxBWENoYXJ0VG9vbHRpcERhdGE+KHtcbiAgICB0aXRsZTogJycsXG4gICAgdmFsdWU6ICcwJyxcbiAgICBwZXJjZW50YWdlOiAnMCUnLFxuICAgIGNvbG9yOiAnJyxcbiAgfSk7XG5cbiAgLy8gU2lnbmFscyBmb3IgY29tcG9uZW50IHN0YXRlXG4gIHByaXZhdGUgX2luaXRpYWxpemVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfcmVuZGVyZWQgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIFRvb2x0aXAgYWNjZXNzb3JzXG4gIHByb3RlY3RlZCB0b29sdGlwVmlzaWJsZSA9IHRoaXMuX3Rvb2x0aXBWaXNpYmxlLmFzUmVhZG9ubHkoKTtcbiAgcHJvdGVjdGVkIHRvb2x0aXBQb3NpdGlvbiA9IHRoaXMuX3Rvb2x0aXBQb3NpdGlvbi5hc1JlYWRvbmx5KCk7XG4gIHByb3RlY3RlZCB0b29sdGlwRGF0YSA9IHRoaXMuX3Rvb2x0aXBEYXRhLmFzUmVhZG9ubHkoKTtcblxuICAvLyBJbmplY3QgY29uZmlndXJhdGlvblxuICBwcml2YXRlIGNvbmZpZ1Rva2VuID0gaW5qZWN0KEFYX0JBUl9DSEFSVF9DT05GSUcpO1xuXG4gIC8vIEluamVjdCB0aGUgY2hhcnQgY29sb3JzXG4gIHByaXZhdGUgY2hhcnRDb2xvcnMgPSBpbmplY3QoQVhfQ0hBUlRfQ09MT1JfUEFMRVRURSk7XG5cbiAgLy8gSW5qZWN0IEFYUGxhdGZvcm1cbiAgLy8gUmVtb3ZlZCB1bnVzZWQgQVhQbGF0Zm9ybSBpbmplY3Rpb25cblxuICAvLyBDb25maWd1cmF0aW9uIHdpdGggZGVmYXVsdHNcbiAgcHJvdGVjdGVkIGVmZmVjdGl2ZU9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uZmlnVG9rZW4sXG4gICAgICAuLi50aGlzLm9wdGlvbnMoKSxcbiAgICB9O1xuICB9KTtcblxuICAvLyBNZXNzYWdlcyB3aXRoIGRlZmF1bHRzXG4gIHByb3RlY3RlZCBlZmZlY3RpdmVNZXNzYWdlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0TWVzc2FnZXMgPSB7XG4gICAgICBub0RhdGE6ICdObyBkYXRhIGF2YWlsYWJsZScsXG4gICAgICBub0RhdGFIZWxwOiAnUGxlYXNlIHByb3ZpZGUgZGF0YSB0byBkaXNwbGF5IHRoZSBjaGFydCcsXG4gICAgICBhbGxIaWRkZW46ICdBbGwgYmFycyBhcmUgaGlkZGVuJyxcbiAgICAgIGFsbEhpZGRlbkhlbHA6ICdDbGljayBvbiBsZWdlbmQgaXRlbXMgdG8gc2hvdyBiYXJzJyxcbiAgICAgIG5vRGF0YUljb246ICdmYS1saWdodCBmYS1jaGFydC1jb2x1bW4nLFxuICAgICAgYWxsSGlkZGVuSWNvbjogJ2ZhLWxpZ2h0IGZhLWV5ZS1zbGFzaCcsXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmYXVsdE1lc3NhZ2VzLFxuICAgICAgLi4udGhpcy5lZmZlY3RpdmVPcHRpb25zKCkubWVzc2FnZXMsXG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gVHJhY2sgaGlkZGVuIGJhcnNcbiAgcHJpdmF0ZSBoaWRkZW5CYXJzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8vIFRyYWNrIGhpZGRlbiBzZXJpZXMgZm9yIGNsdXN0ZXJlZCBjaGFydHMgKGJ5IHNlcmllcyBsYWJlbClcbiAgcHJpdmF0ZSBoaWRkZW5TZXJpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvLyBIZWxwZXJzXG4gIHByaXZhdGUgaXNDbHVzdGVyZWREYXRhKHZhbHVlOiBBWEJhckNoYXJ0VmFsdWUpOiB2YWx1ZSBpcyBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiAodmFsdWUgYXMgYW55KVswXSAmJiAnY2hhcnREYXRhJyBpbiAodmFsdWUgYXMgYW55KVswXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2x1c3RlclNlcmllc0xhYmVscyhncm91cHM6IEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZmlyc3QgPSBncm91cHNbMF0/LmNoYXJ0RGF0YSA/PyBbXTtcbiAgICByZXR1cm4gZmlyc3QubWFwKChkKSA9PiBkLmxhYmVsKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gRHluYW1pY2FsbHkgbG9hZCBEMyBhbmQgaW5pdGlhbGl6ZSB0aGUgY2hhcnQgd2hlbiB0aGUgY29tcG9uZW50IGlzIHJlYWR5XG4gICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICAgIHRoaXMuX2luaXRpYWxpemVkLnNldCh0cnVlKTtcbiAgICAgIHRoaXMubG9hZEQzKCk7XG4gICAgICAvLyBDcmVhdGUgY2hhcnQgYWZ0ZXIgRDMgaXMgbG9hZGVkIGFuZCBjb250YWluZXIgaXMgYXZhaWxhYmxlXG4gICAgICBpZiAodGhpcy5kMyAmJiB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKSkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkLnNldCh0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFdhdGNoIGZvciBjaGFuZ2VzIHRvIHJlZHJhdyB0aGUgY2hhcnRcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgLy8gQWNjZXNzIGlucHV0cyB0byB0cmFjayB0aGVtXG4gICAgICB0aGlzLmRhdGEoKTtcbiAgICAgIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuXG4gICAgICAvLyBPbmx5IHVwZGF0ZSBpZiBhbHJlYWR5IHJlbmRlcmVkXG4gICAgICBpZiAodGhpcy5fcmVuZGVyZWQoKSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXBDaGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIEQzLmpzIGR5bmFtaWNhbGx5XG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgbG9hZEQzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmQzID0gYXdhaXQgaW1wb3J0KCdkMycpO1xuICAgICAgLy8gSWYgY29udGFpbmVyIGlzIHJlYWR5LCBjcmVhdGUgY2hhcnRcbiAgICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCgpICYmIHRoaXMuY2hhcnRDb250YWluZXJFbCgpKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZWQuc2V0KHRydWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBEMy5qczonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGJhciBjaGFydCBTVkcgYW5kIHJlbmRlcnMgYWxsIGVsZW1lbnRzXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmQzIHx8ICF0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgaW5wdXRWYWx1ZSA9ICh0aGlzLmRhdGEoKSB8fCBbXSkgYXMgQVhCYXJDaGFydFZhbHVlO1xuICAgIGNvbnN0IGlzQ2x1c3RlcmVkID0gdGhpcy5pc0NsdXN0ZXJlZERhdGEoaW5wdXRWYWx1ZSk7XG5cbiAgICAvLyBWaXNpYmlsaXR5IGNhbGN1bGF0aW9uXG4gICAgbGV0IGhhc0FueVZpc2libGUgPSBmYWxzZTtcbiAgICBsZXQgdmlzaWJsZVNpbmdsZURhdGE6IEFYQmFyQ2hhcnREYXRhW10gPSBbXTtcbiAgICBsZXQgZ3JvdXBlZERhdGE6IEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10gPSBbXTtcbiAgICBpZiAoaXNDbHVzdGVyZWQpIHtcbiAgICAgIGdyb3VwZWREYXRhID0gaW5wdXRWYWx1ZSBhcyBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdO1xuICAgICAgY29uc3Qgc2VyaWVzTGFiZWxzID0gZ3JvdXBlZERhdGEubGVuZ3RoID4gMCA/IHRoaXMuZ2V0Q2x1c3RlclNlcmllc0xhYmVscyhncm91cGVkRGF0YSkgOiBbXTtcbiAgICAgIGNvbnN0IHZpc2libGVTZXJpZXMgPSBzZXJpZXNMYWJlbHMuZmlsdGVyKChzKSA9PiAhdGhpcy5oaWRkZW5TZXJpZXMuaGFzKHMpKTtcbiAgICAgIGhhc0FueVZpc2libGUgPSBncm91cGVkRGF0YS5zb21lKChnKSA9PiB2aXNpYmxlU2VyaWVzLnNvbWUoKF8sIGlkeCkgPT4gISFnLmNoYXJ0RGF0YVtpZHhdKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNpbmdsZSA9IChpbnB1dFZhbHVlIGFzIEFYQmFyQ2hhcnREYXRhW10pIHx8IFtdO1xuICAgICAgdmlzaWJsZVNpbmdsZURhdGEgPSBzaW5nbGUuZmlsdGVyKChkKSA9PiAhdGhpcy5pc0JhckhpZGRlbihkLmlkKSk7XG4gICAgICBoYXNBbnlWaXNpYmxlID0gdmlzaWJsZVNpbmdsZURhdGEubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvLyBDbGVhciBleGlzdGluZyBjaGFydCBTVkcgYW5kIG1lc3NhZ2VzIChkbyBub3QgcmVtb3ZlIHRvb2x0aXAgY29tcG9uZW50KVxuICAgIHRoaXMuZDMuc2VsZWN0KGNvbnRhaW5lckVsZW1lbnQpLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtbWVzc2FnZS1jb250YWluZXInKS5yZW1vdmUoKTtcblxuICAgIC8vIEVhcmx5IHJldHVybiBpZiBubyBkYXRhXG4gICAgaWYgKCEoaW5wdXRWYWx1ZSBhcyBhbnlbXSkubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNob3dOb0RhdGFNZXNzYWdlKGNvbnRhaW5lckVsZW1lbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEVhcmx5IHJldHVybiBpZiBhbGwgYmFycyBhcmUgaGlkZGVuXG4gICAgaWYgKCFoYXNBbnlWaXNpYmxlKSB7XG4gICAgICB0aGlzLnNob3dBbGxCYXJzSGlkZGVuTWVzc2FnZShjb250YWluZXJFbGVtZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHZXQgb3B0aW9ucyBhbmQgc2V0dXAgZGltZW5zaW9uc1xuICAgIGNvbnN0IGNoYXJ0T3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuICAgIHRoaXMuc2V0dXBEaW1lbnNpb25zKGNvbnRhaW5lckVsZW1lbnQsIGNoYXJ0T3B0aW9ucyk7XG5cbiAgICAvLyBDcmVhdGUgc2NhbGVzIGFuZCBheGVzIGFuZCByZW5kZXIgYmFzZWQgb24gbW9kZVxuICAgIGlmIChpc0NsdXN0ZXJlZCkge1xuICAgICAgdGhpcy5zZXR1cFNjYWxlc0NsdXN0ZXJlZChncm91cGVkRGF0YSk7XG4gICAgICB0aGlzLmNyZWF0ZUF4ZXNDbHVzdGVyZWQoY2hhcnRPcHRpb25zLCBncm91cGVkRGF0YSk7XG4gICAgICB0aGlzLnJlbmRlckJhcnNDbHVzdGVyZWQoZ3JvdXBlZERhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldHVwU2NhbGVzKHZpc2libGVTaW5nbGVEYXRhKTtcbiAgICAgIHRoaXMuY3JlYXRlQXhlcyhjaGFydE9wdGlvbnMpO1xuICAgICAgdGhpcy5yZW5kZXJCYXJzKHZpc2libGVTaW5nbGVEYXRhKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY2hhcnQgd2hlbiBpbnB1dHMgY2hhbmdlXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyB1cCBjaGFydCByZXNvdXJjZXNcbiAgICovXG4gIHB1YmxpYyBjbGVhbnVwQ2hhcnQoKTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgLy8gT25seSByZW1vdmUgY2hhcnQgU1ZHIGFuZCBtZXNzYWdlIGNvbnRhaW5lcnMgdG8gcHJlc2VydmUgdG9vbHRpcCBjb21wb25lbnRcbiAgICAgIHRoaXMuZDM/LnNlbGVjdChjb250YWluZXIpLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtbWVzc2FnZS1jb250YWluZXInKS5yZW1vdmUoKTtcbiAgICB9XG4gICAgdGhpcy5zdmcgPSBudWxsIGFzIGFueTtcbiAgICB0aGlzLmNoYXJ0ID0gbnVsbCBhcyBhbnk7XG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIGNoYXJ0IGRpbWVuc2lvbnMgYW5kIGNyZWF0ZXMgU1ZHIHdpdGggcmVzcG9uc2l2ZSBhdHRyaWJ1dGVzXG4gICAqL1xuICBwcml2YXRlIHNldHVwRGltZW5zaW9ucyhjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9uczogQVhCYXJDaGFydE9wdGlvbik6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBvdXRlciBtYXJnaW5zOyBjYWxjdWxhdGUgb25seSBpbnRlcm5hbCBwYWRkaW5ncyBmb3IgYXhlcyBhbmQgbGFiZWxzXG4gICAgdGhpcy5tYXJnaW4gPSB7IHRvcDogMCwgcmlnaHQ6IDAsIGJvdHRvbTogMCwgbGVmdDogMCB9O1xuXG4gICAgLy8gR2V0IGNvbnRhaW5lciBkaW1lbnNpb25zXG4gICAgY29uc3QgY29udGFpbmVyV2lkdGggPSBjb250YWluZXJFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lckVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuXG4gICAgLy8gQXhpcyB2aXNpYmlsaXR5XG4gICAgY29uc3Qgc2hvd1hBeGlzID0gb3B0aW9ucy5zaG93WEF4aXMgIT09IGZhbHNlO1xuICAgIGNvbnN0IHNob3dZQXhpcyA9IG9wdGlvbnMuc2hvd1lBeGlzICE9PSBmYWxzZTtcblxuICAgIC8vIEludGVybmFsIGxlZnQgcGFkZGluZyBmb3IgWS1heGlzIHRpY2tzL2xhYmVscy90aXRsZVxuICAgIGNvbnN0IGF4aXNBbmRUaWNrUGFkZGluZyA9IDEwO1xuICAgIGNvbnN0IHlBeGlzVGl0bGVUaGlja25lc3MgPSBvcHRpb25zLnlBeGlzTGFiZWwgPyAxNCA6IDA7IC8vIHJvdGF0ZWQgbGFiZWwgdGhpY2tuZXNzIGFsb25nIFhcbiAgICBjb25zdCB5QXhpc1RpdGxlUGFkZGluZyA9IG9wdGlvbnMueUF4aXNMYWJlbCA/IDE0IDogMDsgLy8gZ2FwIGJldHdlZW4gdGlja3MgYW5kIHRpdGxlXG4gICAgY29uc3QgbGVmdFBhZGRpbmdGb3JZQXhpcyA9IHNob3dZQXhpc1xuICAgICAgPyB0aGlzLmNhbGN1bGF0ZU1heFlBeGlzVGlja0xhYmVsV2lkdGgoKSArIGF4aXNBbmRUaWNrUGFkZGluZyArIHlBeGlzVGl0bGVQYWRkaW5nICsgeUF4aXNUaXRsZVRoaWNrbmVzc1xuICAgICAgOiAwO1xuXG4gICAgLy8gRXN0aW1hdGUgaW50ZXJuYWwgYm90dG9tIHBhZGRpbmcgZm9yIFgtYXhpcyB0aWNrcy9sYWJlbHMvdGl0bGVcbiAgICBsZXQgYm90dG9tUGFkZGluZ0ZvclhBeGlzID0gMDtcbiAgICBpZiAoc2hvd1hBeGlzKSB7XG4gICAgICBjb25zdCByYXcgPSAodGhpcy5kYXRhKCkgfHwgW10pIGFzIEFYQmFyQ2hhcnRWYWx1ZTtcbiAgICAgIGNvbnN0IGlzQ2x1c3RlcmVkID0gdGhpcy5pc0NsdXN0ZXJlZERhdGEocmF3KTtcbiAgICAgIGNvbnN0IGJhckNvdW50ID0gaXNDbHVzdGVyZWQgPyAocmF3IGFzIEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10pLmxlbmd0aCA6IChyYXcgYXMgQVhCYXJDaGFydERhdGFbXSkubGVuZ3RoO1xuICAgICAgY29uc3QgbG9uZ2VzdExhYmVsID0gKCgpID0+IHtcbiAgICAgICAgaWYgKGlzQ2x1c3RlcmVkKSB7XG4gICAgICAgICAgY29uc3QgZ3JvdXBzID0gcmF3IGFzIEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW107XG4gICAgICAgICAgcmV0dXJuIGdyb3Vwcy5yZWR1Y2UoKGFjYywgZykgPT4gKGFjYy5sZW5ndGggPiAoZy5sYWJlbD8ubGVuZ3RoID8/IDApID8gYWNjIDogKGcubGFiZWwgPz8gJycpKSwgJycpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZsYXQgPSAocmF3IGFzIEFYQmFyQ2hhcnREYXRhW10pIHx8IFtdO1xuICAgICAgICByZXR1cm4gZmxhdC5yZWR1Y2UoKGEsIGIpID0+IChhLmxlbmd0aCA+IGIubGFiZWwubGVuZ3RoID8gYSA6IGIubGFiZWwpLCAnJyk7XG4gICAgICB9KSgpO1xuXG4gICAgICBjb25zdCBiYXNlV2lkdGggPSBvcHRpb25zLndpZHRoID8/IGNvbnRhaW5lcldpZHRoO1xuICAgICAgY29uc3Qgd29ya2luZ1dpZHRoID0gTWF0aC5tYXgoMSwgYmFzZVdpZHRoIC0gbGVmdFBhZGRpbmdGb3JZQXhpcyk7XG4gICAgICBjb25zdCBkeW5hbWljRm9udFNpemUgPSBNYXRoLm1heCgxMCwgTWF0aC5taW4oMTQsIE1hdGgucm91bmQod29ya2luZ1dpZHRoIC8gNTApKSk7XG4gICAgICBjb25zdCBlc3RpbWF0ZWRMb25nZXN0TGFiZWxXaWR0aCA9IGxvbmdlc3RMYWJlbC5sZW5ndGggKiBkeW5hbWljRm9udFNpemUgKiAwLjY1O1xuICAgICAgY29uc3QgYXZhaWxhYmxlV2lkdGhQZXJCYXIgPSBiYXJDb3VudCA+IDAgPyB3b3JraW5nV2lkdGggLyBiYXJDb3VudCA6IHdvcmtpbmdXaWR0aDtcbiAgICAgIGNvbnN0IHdpbGxSb3RhdGUgPVxuICAgICAgICBvcHRpb25zLnJvdGF0ZVhBeGlzTGFiZWxzID09PSB0cnVlXG4gICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgOiBvcHRpb25zLnJvdGF0ZVhBeGlzTGFiZWxzID09PSBmYWxzZVxuICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgOiBlc3RpbWF0ZWRMb25nZXN0TGFiZWxXaWR0aCA+IGF2YWlsYWJsZVdpZHRoUGVyQmFyO1xuXG4gICAgICBjb25zdCB0aWNrQXJlYUhlaWdodCA9IHdpbGxSb3RhdGVcbiAgICAgICAgPyBlc3RpbWF0ZWRMb25nZXN0TGFiZWxXaWR0aCAqIE1hdGguU1FSVDFfMiArIGR5bmFtaWNGb250U2l6ZSAqIE1hdGguU1FSVDFfMiArIDZcbiAgICAgICAgOiBkeW5hbWljRm9udFNpemUgKyA4O1xuICAgICAgY29uc3QgZ2FwQmVsb3dUaWNrcyA9IG9wdGlvbnMueEF4aXNMYWJlbCAmJiAhd2lsbFJvdGF0ZSA/IDE0IDogMDsgLy8gbWF0Y2hlcyByZW5kZXJlclxuICAgICAgY29uc3QgdGl0bGVCbG9ja0hlaWdodCA9IG9wdGlvbnMueEF4aXNMYWJlbCAmJiAhd2lsbFJvdGF0ZSA/IDI0IDogMDsgLy8gMTRweCBmb250ICsgfjEwcHggZ2FwXG4gICAgICBib3R0b21QYWRkaW5nRm9yWEF4aXMgPSB0aWNrQXJlYUhlaWdodCArIGdhcEJlbG93VGlja3MgKyB0aXRsZUJsb2NrSGVpZ2h0O1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSBwbG90dGluZyBkaW1lbnNpb25zIHdpdGggc2Vuc2libGUgZmFsbGJhY2tzXG4gICAgY29uc3QgZmFsbGJhY2tQbG90SGVpZ2h0ID0gMjQwOyAvLyBlbnN1cmVzIHZpc2libGUgcGxvdCB3aGVuIGNvbnRhaW5lciBoYXMgbm8gaGVpZ2h0XG4gICAgY29uc3QgYmFzZVdpZHRoID0gb3B0aW9ucy53aWR0aCA/PyBjb250YWluZXJXaWR0aDtcbiAgICBjb25zdCB0b3RhbFdpZHRoID0gTWF0aC5tYXgoMjAwLCBiYXNlV2lkdGggPiAwID8gYmFzZVdpZHRoIDogMjAwKTtcbiAgICBjb25zdCBwbG90V2lkdGggPSBNYXRoLm1heCgwLCB0b3RhbFdpZHRoIC0gbGVmdFBhZGRpbmdGb3JZQXhpcyk7XG5cbiAgICBsZXQgcGxvdEhlaWdodDogbnVtYmVyO1xuICAgIGlmIChvcHRpb25zLmhlaWdodCAmJiBvcHRpb25zLmhlaWdodCA+IDApIHtcbiAgICAgIHBsb3RIZWlnaHQgPSBNYXRoLm1heCgxMjAsIG9wdGlvbnMuaGVpZ2h0IC0gYm90dG9tUGFkZGluZ0ZvclhBeGlzKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRhaW5lckhlaWdodCA+IDApIHtcbiAgICAgIHBsb3RIZWlnaHQgPSBNYXRoLm1heCgxMjAsIGNvbnRhaW5lckhlaWdodCAtIGJvdHRvbVBhZGRpbmdGb3JYQXhpcywgZmFsbGJhY2tQbG90SGVpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGxvdEhlaWdodCA9IGZhbGxiYWNrUGxvdEhlaWdodDtcbiAgICB9XG5cbiAgICB0aGlzLndpZHRoID0gcGxvdFdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gcGxvdEhlaWdodDtcblxuICAgIC8vIENyZWF0ZSBTVkcgd2l0aCBleHBsaWNpdCBwaXhlbCBkaW1lbnNpb25zIHRvIGF2b2lkIGNvbGxhcHNlXG4gICAgLy8gQWRkIGEgc21hbGwgaW50ZXJuYWwgdG9wIHBhZGRpbmcgdG8gYXZvaWQgY2xpcHBpbmcgdGhlIHRvcC1tb3N0IFktYXhpcyBsYWJlbFxuICAgIGNvbnN0IHRvcFBhZGRpbmdGb3JUb3BFZGdlID0gNjtcbiAgICBjb25zdCB0b3RhbEhlaWdodCA9IHRoaXMuaGVpZ2h0ICsgYm90dG9tUGFkZGluZ0ZvclhBeGlzICsgdG9wUGFkZGluZ0ZvclRvcEVkZ2U7XG5cbiAgICBjb25zdCBzdmcgPSB0aGlzLmQzXG4gICAgICAuc2VsZWN0KGNvbnRhaW5lckVsZW1lbnQpXG4gICAgICAuYXBwZW5kKCdzdmcnKVxuICAgICAgLmF0dHIoJ3dpZHRoJywgJzEwMCUnKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsIFN0cmluZyh0b3RhbEhlaWdodCkpXG4gICAgICAuYXR0cigndmlld0JveCcsIGAwIDAgJHt0b3RhbFdpZHRofSAke3RvdGFsSGVpZ2h0fWApXG4gICAgICAuYXR0cigncHJlc2VydmVBc3BlY3RSYXRpbycsICd4TWlkWU1pZCBtZWV0Jyk7XG5cbiAgICB0aGlzLnN2ZyA9IHN2ZztcblxuICAgIC8vIENyZWF0ZSBjaGFydCBncm91cCB0cmFuc2xhdGVkIGJ5IGludGVybmFsIHBhZGRpbmdzIChubyBleHRlcm5hbCBtYXJnaW5zKVxuICAgIHRoaXMuY2hhcnQgPSB0aGlzLnN2Z1xuICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAuYXR0cignY2xhc3MnLCAnY2hhcnQtY29udGVudCcpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke2xlZnRQYWRkaW5nRm9yWUF4aXN9LCR7dG9wUGFkZGluZ0ZvclRvcEVkZ2V9KWApO1xuICB9XG5cbiAgLy8gY2FsY3VsYXRlTWFyZ2lucyB3YXMgdW51c2VkOyByZW1vdmVkIHRvIHNpbXBsaWZ5IGFuZCByZWR1Y2UgbWFpbnRlbmFuY2Ugc3VyZmFjZVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHggYW5kIHkgc2NhbGVzIGZvciB0aGUgY2hhcnRcbiAgICovXG4gIHByaXZhdGUgc2V0dXBTY2FsZXMoZGF0YTogQVhCYXJDaGFydERhdGFbXSk6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgYmFyIHdpZHRoIHBlcmNlbnRhZ2UgKGRlZmF1bHQgODAlKVxuICAgIGNvbnN0IGJhcldpZHRoUGVyY2VudCA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmJhcldpZHRoID8/IDYwIC8gMTAwO1xuICAgIC8vIENhbGN1bGF0ZSBwYWRkaW5nIGJhc2VkIG9uIGJhcldpZHRoIChpbnZlcnNlIHJlbGF0aW9uc2hpcClcbiAgICBjb25zdCBwYWRkaW5nID0gTWF0aC5tYXgoMC4xLCAxIC0gYmFyV2lkdGhQZXJjZW50KTtcblxuICAgIC8vIENyZWF0ZSB4IHNjYWxlIChiYW5kIHNjYWxlIGZvciBjYXRlZ29yaWNhbCBkYXRhKVxuICAgIHRoaXMueFNjYWxlID0gdGhpcy5kM1xuICAgICAgLnNjYWxlQmFuZCgpXG4gICAgICAuZG9tYWluKGRhdGEubWFwKChkKSA9PiBkLmlkKSlcbiAgICAgIC5yYW5nZShbMCwgdGhpcy53aWR0aF0pXG4gICAgICAucGFkZGluZyhwYWRkaW5nKTtcblxuICAgIC8vIENyZWF0ZSB5IHNjYWxlIChsaW5lYXIgc2NhbGUgZm9yIHZhbHVlcylcbiAgICB0aGlzLnlTY2FsZSA9IHRoaXMuZDNcbiAgICAgIC5zY2FsZUxpbmVhcigpXG4gICAgICAuZG9tYWluKFswLCB0aGlzLmQzLm1heChkYXRhLCAoZCkgPT4gZC52YWx1ZSkgfHwgMF0pXG4gICAgICAubmljZSgpXG4gICAgICAucmFuZ2UoW3RoaXMuaGVpZ2h0LCAwXSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB4IGFuZCB5IHNjYWxlcyBmb3IgY2x1c3RlcmVkIGNoYXJ0c1xuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cFNjYWxlc0NsdXN0ZXJlZChncm91cHM6IEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10pOiB2b2lkIHtcbiAgICBjb25zdCBzZXJpZXNMYWJlbHMgPSBncm91cHMubGVuZ3RoID4gMCA/IHRoaXMuZ2V0Q2x1c3RlclNlcmllc0xhYmVscyhncm91cHMpIDogW107XG4gICAgY29uc3QgdmlzaWJsZVNlcmllcyA9IHNlcmllc0xhYmVscy5maWx0ZXIoKHMpID0+ICF0aGlzLmhpZGRlblNlcmllcy5oYXMocykpO1xuXG4gICAgLy8gT3V0ZXIgYmFuZCBmb3IgY2x1c3RlcnNcbiAgICBjb25zdCBvdXRlclBhZGRpbmcgPSAwLjI7XG4gICAgdGhpcy54U2NhbGUgPSB0aGlzLmQzXG4gICAgICAuc2NhbGVCYW5kKClcbiAgICAgIC5kb21haW4oZ3JvdXBzLm1hcCgoZykgPT4gZy5pZCkpXG4gICAgICAucmFuZ2UoWzAsIHRoaXMud2lkdGhdKVxuICAgICAgLnBhZGRpbmcob3V0ZXJQYWRkaW5nKTtcblxuICAgIC8vIElubmVyIGJhbmQgZm9yIHNlcmllc1xuICAgIHRoaXMueFN1YlNjYWxlID0gdGhpcy5kMy5zY2FsZUJhbmQoKS5kb21haW4odmlzaWJsZVNlcmllcykucmFuZ2UoWzAsIHRoaXMueFNjYWxlLmJhbmR3aWR0aCgpXSkucGFkZGluZygwLjEpO1xuXG4gICAgLy8gWSBzY2FsZSBhY3Jvc3MgYWxsIHZpc2libGUgdmFsdWVzXG4gICAgY29uc3QgYWxsVmlzaWJsZVZhbHVlczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGcgb2YgZ3JvdXBzKSB7XG4gICAgICB2aXNpYmxlU2VyaWVzLmZvckVhY2goKF8sIGlkeCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gZy5jaGFydERhdGFbaWR4XTtcbiAgICAgICAgaWYgKGl0ZW0gJiYgdHlwZW9mIGl0ZW0udmFsdWUgPT09ICdudW1iZXInKSBhbGxWaXNpYmxlVmFsdWVzLnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgeU1heCA9IHRoaXMuZDMubWF4KGFsbFZpc2libGVWYWx1ZXMpIHx8IDA7XG4gICAgdGhpcy55U2NhbGUgPSB0aGlzLmQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLCB5TWF4XSkubmljZSgpLnJhbmdlKFt0aGlzLmhlaWdodCwgMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgeCBhbmQgeSBheGVzIHdpdGggZ3JpZCBsaW5lc1xuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVBeGVzKG9wdGlvbnM6IEFYQmFyQ2hhcnRPcHRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBzaG93WEF4aXMgPSBvcHRpb25zLnNob3dYQXhpcyAhPT0gZmFsc2U7XG4gICAgY29uc3Qgc2hvd1lBeGlzID0gb3B0aW9ucy5zaG93WUF4aXMgIT09IGZhbHNlO1xuICAgIGNvbnN0IHNob3dHcmlkID0gb3B0aW9ucy5zaG93R3JpZCAhPT0gZmFsc2U7XG5cbiAgICBjb25zdCBheGVzR3JvdXAgPSB0aGlzLmNoYXJ0LmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1heGVzJyk7XG5cbiAgICBpZiAoc2hvd1hBeGlzKSB7XG4gICAgICB0aGlzLmNyZWF0ZVhBeGlzKGF4ZXNHcm91cCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKHNob3dZQXhpcykge1xuICAgICAgdGhpcy5jcmVhdGVZQXhpcyhheGVzR3JvdXAsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChzaG93R3JpZCkge1xuICAgICAgdGhpcy5jcmVhdGVHcmlkTGluZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVhBeGlzKGF4ZXNHcm91cDogYW55LCBvcHRpb25zOiBBWEJhckNoYXJ0T3B0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgdmlzaWJsZURhdGFGb3JUaWNrcyA9ICh0aGlzLmRhdGEoKSB8fCBbXSkuZmlsdGVyKChkKSA9PiAhdGhpcy5pc0JhckhpZGRlbihkLmlkKSk7XG4gICAgY29uc3QgaWRUb0xhYmVsID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4odmlzaWJsZURhdGFGb3JUaWNrcy5tYXAoKGQpID0+IFtkLmlkLCBkLmxhYmVsXSkpO1xuICAgIHRoaXMuYnVpbGRYQXhpc0NvbW1vbihheGVzR3JvdXAsIGlkVG9MYWJlbCwgb3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVlBeGlzKGF4ZXNHcm91cDogYW55LCBvcHRpb25zOiBBWEJhckNoYXJ0T3B0aW9uKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIFkgYXhpc1xuICAgIHRoaXMueUF4aXMgPSBheGVzR3JvdXAuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWF4aXMteScpLmNhbGwodGhpcy5kMy5heGlzTGVmdCh0aGlzLnlTY2FsZSkpO1xuXG4gICAgLy8gU3R5bGUgdGhlIGF4aXMgdGV4dFxuICAgIGNvbnN0IGR5bmFtaWNGb250U2l6ZSA9IHRoaXMuZ2V0WUF4aXNUaWNrRm9udFNpemVCYXNlZE9uSGVpZ2h0KCk7XG4gICAgdGhpcy55QXhpc1xuICAgICAgLnNlbGVjdEFsbCgndGV4dCcpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGAke2R5bmFtaWNGb250U2l6ZX1weGApXG4gICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJzQwMCcpXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiYSh2YXIoLS1heC1jb21wLWJhci1jaGFydC1sYWJlbHMtY29sb3IpLCAwLjcpJylcbiAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdlbmQnKVxuICAgICAgLmF0dHIoJ2RpcmVjdGlvbicsICdsdHInKTtcblxuICAgIC8vIFN0eWxlIGF4aXMgbGluZXNcbiAgICB0aGlzLnlBeGlzLnNlbGVjdEFsbCgnbGluZSwgcGF0aCcpLnN0eWxlKCdzdHJva2UnLCAncmdiKHZhcigtLWF4LWNvbXAtYmFyLWNoYXJ0LWdyaWQtbGluZXMtY29sb3IpKScpO1xuXG4gICAgLy8gQWRkIFkgYXhpcyB0aXRsZVxuICAgIGlmIChvcHRpb25zLnlBeGlzTGFiZWwpIHtcbiAgICAgIHRoaXMuY3JlYXRlWUF4aXNUaXRsZShheGVzR3JvdXAsIG9wdGlvbnMueUF4aXNMYWJlbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRSb3RhdGVYQXhpc0xhYmVscyhpZFRvTGFiZWw6IE1hcDxzdHJpbmcsIHN0cmluZz4sIGZvbnRTaXplOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCk7XG5cbiAgICAvLyBDaGVjayBpZiB1c2VyIGV4cGxpY2l0bHkgc2V0IHJvdGF0aW9uIG9wdGlvblxuICAgIGlmIChvcHRpb25zLnJvdGF0ZVhBeGlzTGFiZWxzID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAob3B0aW9ucy5yb3RhdGVYQXhpc0xhYmVscyA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIElmICdhdXRvJyBvciB1bmRlZmluZWQsIHVzZSBpbnRlbGxpZ2VudCBjYWxjdWxhdGlvblxuICAgIGlmICh0aGlzLnhTY2FsZS5kb21haW4oKS5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnhTY2FsZS5zdGVwKCk7XG4gICAgY29uc3QgbGFiZWxzID0gQXJyYXkuZnJvbShpZFRvTGFiZWwudmFsdWVzKCkpO1xuICAgIGNvbnN0IGxvbmdlc3RMYWJlbCA9IGxhYmVscy5yZWR1Y2UoKGEsIGIpID0+IChhLmxlbmd0aCA+IGIubGVuZ3RoID8gYSA6IGIpLCAnJyk7XG4gICAgY29uc3QgZXN0aW1hdGVkV2lkdGggPSBsb25nZXN0TGFiZWwubGVuZ3RoICogZm9udFNpemUgKiB0aGlzLkNIQVJfV0lEVEhfUkFUSU87XG5cbiAgICAvLyBIZXVyaXN0aWM6IGF2b2lkIHJvdGF0aW9uIHdoZW4gdGhlcmUgYXJlIGZldyBjYXRlZ29yaWVzICg8PSA2KSBldmVuIGlmIGVzdGltYXRpb24gaXMgc2xpZ2h0bHkgbGFyZ2VyXG4gICAgY29uc3QgZG9tYWluQ291bnQgPSB0aGlzLnhTY2FsZS5kb21haW4oKS5sZW5ndGg7XG4gICAgaWYgKGRvbWFpbkNvdW50IDw9IDYpIHtcbiAgICAgIHJldHVybiBlc3RpbWF0ZWRXaWR0aCA+IHN0ZXAgKiAxLjQ7IC8vIGJlIG1vcmUgdG9sZXJhbnQgZm9yIHNtYWxsIGRhdGFzZXRzXG4gICAgfVxuXG4gICAgcmV0dXJuIGVzdGltYXRlZFdpZHRoID4gc3RlcDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlWEF4aXNUaXRsZShheGVzR3JvdXA6IGFueSwgdGl0bGU6IHN0cmluZywgdGlja0FyZWFIZWlnaHQ6IG51bWJlciwgZ2FwQmVsb3dUaWNrcyA9IDgpOiB2b2lkIHtcbiAgICAvLyBUaXRsZSBwb3NpdGlvbmVkIGRpcmVjdGx5IGJlbG93IHRpY2sgYXJlYSB3aXRoIGEgY29uc2lzdGVudCBnYXBcbiAgICBjb25zdCBsYWJlbFkgPSB0aGlzLmhlaWdodCArIHRpY2tBcmVhSGVpZ2h0ICsgZ2FwQmVsb3dUaWNrcztcblxuICAgIGF4ZXNHcm91cFxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWF4aXMtbGFiZWwgYXgteC1heGlzLWxhYmVsJylcbiAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ2hhbmdpbmcnKSAvLyBBbGlnbiB0byB0b3Agb2YgdGV4dCBmb3IgYmV0dGVyIHBvc2l0aW9uaW5nXG4gICAgICAuYXR0cigneCcsIHRoaXMud2lkdGggLyAyKVxuICAgICAgLmF0dHIoJ3knLCBsYWJlbFkpXG4gICAgICAuYXR0cignZGlyZWN0aW9uJywgJ2x0cicpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcxNHB4JylcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNTAwJylcbiAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtYXhpcy1sYWJlbC1jb2xvcikpJylcbiAgICAgIC50ZXh0KHRpdGxlKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlWUF4aXNUaXRsZShheGVzR3JvdXA6IGFueSwgdGl0bGU6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgZXhhY3QgcG9zaXRpb24gZm9yIFktYXhpcyB0aXRsZVxuICAgIC8vIFktYXhpcyB0aWNrIGxhYmVscyB1c2UgdGV4dC1hbmNob3I6IGVuZCwgc28gdGhleSBleHRlbmQgTEVGVCBvZiB0aGUgWS1heGlzIGxpbmVcbiAgICAvLyBZLWF4aXMgaXMgYXQgWCA9IDAgd2l0aGluIHRoZSBjaGFydCBncm91cFxuICAgIC8vIENoYXJ0IGdyb3VwIGlzIHRyYW5zbGF0ZWQgYnkgKG1hcmdpbi5sZWZ0LCBtYXJnaW4udG9wKVxuICAgIC8vIFNvIFktYXhpcyBpcyBhdCBYID0gbWFyZ2luLmxlZnQgaW4gU1ZHIGNvb3JkaW5hdGVzXG5cbiAgICBjb25zdCBtYXhUaWNrTGFiZWxXaWR0aCA9IHRoaXMuY2FsY3VsYXRlTWF4WUF4aXNUaWNrTGFiZWxXaWR0aCgpO1xuICAgIGNvbnN0IHBhZGRpbmcgPSAyMDsgLy8gSW5jcmVhc2VkIHBhZGRpbmcgYmV0d2VlbiB0aWNrIGxhYmVscyBhbmQgYXhpcyB0aXRsZVxuXG4gICAgLy8gUG9zaXRpb24gdGl0bGUgdG8gdGhlIGxlZnQgb2YgdGhlIHRpY2sgbGFiZWxzXG4gICAgLy8gU2luY2UgdGV4dC1hbmNob3I6IGVuZCBhbGlnbnMgdGhlIHRleHQgdG8gdGhlIFktYXhpcywgd2UgbmVlZCB0byBnbyBmdXJ0aGVyIGxlZnRcbiAgICBjb25zdCBsYWJlbFkgPSAtbWF4VGlja0xhYmVsV2lkdGggLSBwYWRkaW5nO1xuXG4gICAgLy8gQ2VudGVyIHRoZSB0aXRsZSB2ZXJ0aWNhbGx5XG4gICAgY29uc3QgbGFiZWxYID0gLXRoaXMuaGVpZ2h0IC8gMjtcblxuICAgIGF4ZXNHcm91cFxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWF4aXMtbGFiZWwgYXgteS1heGlzLWxhYmVsJylcbiAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ21pZGRsZScpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3JvdGF0ZSgtOTApJylcbiAgICAgIC5hdHRyKCd4JywgbGFiZWxYKVxuICAgICAgLmF0dHIoJ3knLCBsYWJlbFkpXG4gICAgICAuYXR0cignZGlyZWN0aW9uJywgJ2x0cicpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcxNHB4JylcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNTAwJylcbiAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtYXhpcy1sYWJlbC1jb2xvcikpJylcbiAgICAgIC50ZXh0KHRpdGxlKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlTWF4WUF4aXNUaWNrTGFiZWxXaWR0aCgpOiBudW1iZXIge1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgbWF4aW11bSB3aWR0aCBuZWVkZWQgZm9yIFktYXhpcyB0aWNrIGxhYmVsc1xuICAgIGNvbnN0IHJhdyA9ICh0aGlzLmRhdGEoKSB8fCBbXSkgYXMgQVhCYXJDaGFydFZhbHVlO1xuICAgIGNvbnN0IGlzQ2x1c3RlcmVkID0gdGhpcy5pc0NsdXN0ZXJlZERhdGEocmF3KTtcblxuICAgIGxldCBtYXhWYWx1ZSA9IDA7XG4gICAgaWYgKGlzQ2x1c3RlcmVkKSB7XG4gICAgICBjb25zdCBncm91cHMgPSByYXcgYXMgQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXTtcbiAgICAgIGNvbnN0IHNlcmllc0xhYmVscyA9IGdyb3Vwcy5sZW5ndGggPiAwID8gdGhpcy5nZXRDbHVzdGVyU2VyaWVzTGFiZWxzKGdyb3VwcykgOiBbXTtcbiAgICAgIGNvbnN0IHZpc2libGVTZXJpZXMgPSBzZXJpZXNMYWJlbHMuZmlsdGVyKChzKSA9PiAhdGhpcy5oaWRkZW5TZXJpZXMuaGFzKHMpKTtcblxuICAgICAgZm9yIChjb25zdCBnIG9mIGdyb3Vwcykge1xuICAgICAgICB2aXNpYmxlU2VyaWVzLmZvckVhY2goKF8sIGlkeCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW0gPSBnLmNoYXJ0RGF0YVtpZHhdO1xuICAgICAgICAgIGlmIChpdGVtICYmIHR5cGVvZiBpdGVtLnZhbHVlID09PSAnbnVtYmVyJykgbWF4VmFsdWUgPSBNYXRoLm1heChtYXhWYWx1ZSwgaXRlbS52YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2aXNpYmxlRGF0YSA9IChyYXcgYXMgQVhCYXJDaGFydERhdGFbXSkuZmlsdGVyKChkKSA9PiAhdGhpcy5pc0JhckhpZGRlbihkLmlkKSk7XG4gICAgICBtYXhWYWx1ZSA9IHZpc2libGVEYXRhLnJlZHVjZSgoYWNjLCBkKSA9PiAoZC52YWx1ZSA+IGFjYyA/IGQudmFsdWUgOiBhY2MpLCAwKTtcbiAgICB9XG5cbiAgICBjb25zdCB0aWNrTGFiZWxUZXh0ID0gTnVtYmVyLmlzRmluaXRlKG1heFZhbHVlKSA/IG1heFZhbHVlLnRvTG9jYWxlU3RyaW5nKCkgOiAnMDAwMDAnO1xuICAgIGNvbnN0IGZvbnRTaXplID0gMTM7IC8vIEFwcHJveGltYXRlIGZvbnQgc2l6ZSBmb3IgWS1heGlzIHRpY2sgbGFiZWxzXG4gICAgcmV0dXJuIHRpY2tMYWJlbFRleHQubGVuZ3RoICogZm9udFNpemUgKiAwLjYgKyA4OyAvLyBDaGFyYWN0ZXIgd2lkdGggKyBwYWRkaW5nXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUdyaWRMaW5lcygpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXJ0XG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtZ3JpZCcpXG4gICAgICAuY2FsbChcbiAgICAgICAgdGhpcy5kM1xuICAgICAgICAgIC5heGlzTGVmdCh0aGlzLnlTY2FsZSlcbiAgICAgICAgICAudGlja1NpemUoLXRoaXMud2lkdGgpXG4gICAgICAgICAgLnRpY2tGb3JtYXQoKCkgPT4gJycpLFxuICAgICAgKVxuICAgICAgLnNlbGVjdEFsbCgnbGluZScpXG4gICAgICAuc3R5bGUoJ3N0cm9rZScsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtZ3JpZC1saW5lcy1jb2xvcikpJylcbiAgICAgIC5zdHlsZSgnc3Ryb2tlLW9wYWNpdHknLCAwLjIpO1xuXG4gICAgLy8gUmVtb3ZlIHVubmVlZGVkIGVsZW1lbnRzIGZyb20gZ3JpZFxuICAgIHRoaXMuY2hhcnQuc2VsZWN0KCcuYXgtYmFyLWNoYXJ0LWdyaWQnKS5zZWxlY3RBbGwoJ3BhdGgsIHRleHQnKS5yZW1vdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGF4ZXMgZm9yIGNsdXN0ZXJlZCBjaGFydHNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQXhlc0NsdXN0ZXJlZChvcHRpb25zOiBBWEJhckNoYXJ0T3B0aW9uLCBncm91cHM6IEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10pOiB2b2lkIHtcbiAgICBjb25zdCBzaG93WEF4aXMgPSBvcHRpb25zLnNob3dYQXhpcyAhPT0gZmFsc2U7XG4gICAgY29uc3Qgc2hvd1lBeGlzID0gb3B0aW9ucy5zaG93WUF4aXMgIT09IGZhbHNlO1xuICAgIGNvbnN0IHNob3dHcmlkID0gb3B0aW9ucy5zaG93R3JpZCAhPT0gZmFsc2U7XG5cbiAgICBjb25zdCBheGVzR3JvdXAgPSB0aGlzLmNoYXJ0LmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1heGVzJyk7XG5cbiAgICBpZiAoc2hvd1hBeGlzKSB7XG4gICAgICB0aGlzLmNyZWF0ZVhBeGlzQ2x1c3RlcmVkKGF4ZXNHcm91cCwgb3B0aW9ucywgZ3JvdXBzKTtcbiAgICB9XG5cbiAgICBpZiAoc2hvd1lBeGlzKSB7XG4gICAgICB0aGlzLmNyZWF0ZVlBeGlzKGF4ZXNHcm91cCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKHNob3dHcmlkKSB7XG4gICAgICB0aGlzLmNyZWF0ZUdyaWRMaW5lcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlWEF4aXNDbHVzdGVyZWQoYXhlc0dyb3VwOiBhbnksIG9wdGlvbnM6IEFYQmFyQ2hhcnRPcHRpb24sIGdyb3VwczogQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXSk6IHZvaWQge1xuICAgIGNvbnN0IGlkVG9MYWJlbCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KGdyb3Vwcy5tYXAoKGcpID0+IFtnLmlkLCBnLmxhYmVsXSkpO1xuICAgIHRoaXMuYnVpbGRYQXhpc0NvbW1vbihheGVzR3JvdXAsIGlkVG9MYWJlbCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgYmFycyB3aXRoIGFuaW1hdGlvbnNcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQmFycyhkYXRhOiBBWEJhckNoYXJ0RGF0YVtdKTogdm9pZCB7XG4gICAgLy8gRmlsdGVyIG91dCBoaWRkZW4gYmFyc1xuICAgIGNvbnN0IHZpc2libGVEYXRhID0gZGF0YS5maWx0ZXIoKGQpID0+ICF0aGlzLmlzQmFySGlkZGVuKGQuaWQpKTtcbiAgICBjb25zdCBvcmlnaW5hbEZ1bGxEYXRhID0gKHRoaXMuZGF0YSgpIGFzIEFYQmFyQ2hhcnREYXRhW10pIHx8IFtdO1xuXG4gICAgLy8gUmVzZXQgYW5pbWF0aW9uIHN0YXRlXG4gICAgdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlLnNldChmYWxzZSk7XG5cbiAgICAvLyBHZXQgY29ybmVyIHJhZGl1cyBmcm9tIG9wdGlvbnNcbiAgICBjb25zdCByYWRpdXMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5jb3JuZXJSYWRpdXM7XG5cbiAgICAvLyBHZXQgYW5pbWF0aW9uIG9wdGlvbnNcbiAgICBjb25zdCBhbmltYXRpb25EdXJhdGlvbiA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkR1cmF0aW9uO1xuICAgIGNvbnN0IGFuaW1hdGlvbkVhc2luZyA9IGdldEVhc2luZ0Z1bmN0aW9uKHRoaXMuZDMsIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkVhc2luZyk7XG5cbiAgICAvLyBDcmVhdGUgYSBjb250YWluZXIgZm9yIGFsbCBiYXJzXG4gICAgY29uc3QgYmFyc0NvbnRhaW5lciA9IHRoaXMuY2hhcnQuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWJhcnMtY29udGFpbmVyJyk7XG5cbiAgICAvLyBDcmVhdGUgZ3JvdXBzIGZvciBlYWNoIGJhciB0byBoYW5kbGUgdHJhbnNmb3JtYXRpb25zXG4gICAgY29uc3QgYmFyR3JvdXBzID0gYmFyc0NvbnRhaW5lclxuICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1iYXItZ3JvdXAnKVxuICAgICAgLmRhdGEodmlzaWJsZURhdGEpXG4gICAgICAuZW50ZXIoKVxuICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYmFyLWdyb3VwJyk7XG5cbiAgICAvLyBBZGQgYmFycyBpbnNpZGUgZ3JvdXBzXG4gICAgY29uc3QgYmFycyA9IGJhckdyb3Vwc1xuICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWJhcicpXG4gICAgICAuYXR0cignZCcsIChkOiBBWEJhckNoYXJ0RGF0YSkgPT4ge1xuICAgICAgICBjb25zdCB4ID0gdGhpcy54U2NhbGUoZC5pZCk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy54U2NhbGUuYmFuZHdpZHRoKCk7XG4gICAgICAgIGNvbnN0IHkgPSB0aGlzLmhlaWdodCAtIDAuNTsgLy8gaW5pdGlhbCBoZWlnaHQgaXMgemVyb1xuICAgICAgICByZXR1cm4gYE0ke3h9LCR7eX0gTCR7eH0sJHt5fSBMJHt4ICsgd2lkdGh9LCR7eX0gTCR7eCArIHdpZHRofSwke3l9IFpgO1xuICAgICAgfSlcbiAgICAgIC5hdHRyKCdmaWxsJywgKGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB7XG4gICAgICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGJhciAoZCkgaW4gdGhlIG9yaWdpbmFsIGRhdGEgYXJyYXlcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxJbmRleCA9IG9yaWdpbmFsRnVsbERhdGEuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09PSBkLmlkKTtcbiAgICAgICAgLy8gVXNlIHRoZSBvcmlnaW5hbCBjb2xvciBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIGdldCBjb2xvciBmcm9tIHBhbGV0dGUgdXNpbmcgb3JpZ2luYWwgaW5kZXhcbiAgICAgICAgLy8gRmFsbGJhY2sgdG8gaW5kZXggMCBpZiBub3QgZm91bmQsIHRob3VnaCB0aGlzIHNob3VsZG4ndCBoYXBwZW4gd2l0aCB2YWxpZCBkYXRhLlxuICAgICAgICByZXR1cm4gZC5jb2xvciB8fCB0aGlzLmdldENvbG9yKG9yaWdpbmFsSW5kZXggIT09IC0xID8gb3JpZ2luYWxJbmRleCA6IDApO1xuICAgICAgfSk7XG5cbiAgICAvLyBBZGQgZGF0YSBsYWJlbHMgaWYgdGhleSdyZSBlbmFibGVkXG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dEYXRhTGFiZWxzICE9PSBmYWxzZSkge1xuICAgICAgYmFyR3JvdXBzXG4gICAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWRhdGEtbGFiZWwnKVxuICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgICAgLmF0dHIoJ3gnLCAoZDogQVhCYXJDaGFydERhdGEpID0+IHRoaXMueFNjYWxlKGQuaWQpICsgdGhpcy54U2NhbGUuYmFuZHdpZHRoKCkgLyAyKVxuICAgICAgICAuYXR0cigneScsIHRoaXMuaGVpZ2h0KSAvLyBTdGFydCBmcm9tIGJvdHRvbSBmb3IgYW5pbWF0aW9uXG4gICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJ2NsYW1wKDhweCwgMnZtaW4sIDEycHgpJylcbiAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc1MDAnKVxuICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtYmFyLWNoYXJ0LWRhdGEtbGFiZWxzLWNvbG9yKSknKVxuICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKSAvLyBTdGFydCBpbnZpc2libGUgZm9yIGFuaW1hdGlvblxuICAgICAgICAudGV4dCgoZDogQVhCYXJDaGFydERhdGEpID0+IGQudmFsdWUpO1xuXG4gICAgICAvLyBBbmltYXRlIGRhdGEgbGFiZWxzXG4gICAgICBiYXJHcm91cHNcbiAgICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1kYXRhLWxhYmVsJylcbiAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAuZHVyYXRpb24oYW5pbWF0aW9uRHVyYXRpb24pXG4gICAgICAgIC5kZWxheSgoZDogQVhCYXJDaGFydERhdGEsIGk6IG51bWJlcikgPT4gaSAqIDUwICsgMTAwKSAvLyBTbGlnaHRseSBkZWxheWVkIGFmdGVyIGJhciBhbmltYXRpb25cbiAgICAgICAgLmF0dHIoJ3knLCAoZDogQVhCYXJDaGFydERhdGEpID0+IHRoaXMueVNjYWxlKGQudmFsdWUpIC0gOCkgLy8gUG9zaXRpb24gYWJvdmUgYmFyXG4gICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgIC5lYXNlKGFuaW1hdGlvbkVhc2luZyk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHVwIGV2ZW50IGhhbmRsZXJzIG9uIGVhY2ggZ3JvdXBcbiAgICBiYXJHcm91cHNcbiAgICAgIC5vbignbW91c2VlbnRlcicsIChldmVudDogTW91c2VFdmVudCwgZDogQVhCYXJDaGFydERhdGEpID0+IHtcbiAgICAgICAgLy8gT25seSBhcHBseSBob3ZlciBlZmZlY3RzIGlmIGluaXRpYWwgYW5pbWF0aW9uIGlzIGNvbXBsZXRlXG4gICAgICAgIGlmICghdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlKCkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBiYXJFbCA9IHRoaXMuZDMuc2VsZWN0KGV2ZW50LmN1cnJlbnRUYXJnZXQpLnNlbGVjdCgncGF0aCcpO1xuXG4gICAgICAgIC8vIFN0YW5kYXJkIGhvdmVyIGVmZmVjdCAtIGRhcmtlbiB0aGUgYmFyIHNsaWdodGx5IGFuZCBhZGQgYSBzdWJ0bGUgc2hhZG93XG4gICAgICAgIGJhckVsLnRyYW5zaXRpb24oKS5kdXJhdGlvbigxNTApLnN0eWxlKCdmaWx0ZXInLCAnYnJpZ2h0bmVzcygwLjcpIGRyb3Atc2hhZG93KDAgMCAycHggcmdiYSgwLDAsMCwwLjEpKScpO1xuXG4gICAgICAgIHRoaXMuaGFuZGxlQmFySG92ZXIoZXZlbnQsIGQpO1xuICAgICAgfSlcbiAgICAgIC5vbignbW91c2Vtb3ZlJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIC8vIE9ubHkgdXBkYXRlIHRvb2x0aXAgaWYgaW5pdGlhbCBhbmltYXRpb24gaXMgY29tcGxldGVcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIC8vIE9ubHkgYXBwbHkgaG92ZXIgZWZmZWN0cyBpZiBpbml0aWFsIGFuaW1hdGlvbiBpcyBjb21wbGV0ZVxuICAgICAgICBpZiAoIXRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgYmFyRWwgPSB0aGlzLmQzLnNlbGVjdChldmVudC5jdXJyZW50VGFyZ2V0KS5zZWxlY3QoJ3BhdGgnKTtcblxuICAgICAgICAvLyBSZW1vdmUgaG92ZXIgZWZmZWN0XG4gICAgICAgIGJhckVsLnRyYW5zaXRpb24oKS5kdXJhdGlvbigxNTApLnN0eWxlKCdmaWx0ZXInLCBudWxsKTtcblxuICAgICAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICAgICAgfSlcbiAgICAgIC5vbignY2xpY2snLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB7XG4gICAgICAgIC8vIE9ubHkgdHJpZ2dlciBjbGljayBldmVudHMgaWYgaW5pdGlhbCBhbmltYXRpb24gaXMgY29tcGxldGVcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVCYXJDbGljayhldmVudCwgZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgLy8gQWRkIGFuaW1hdGlvblxuICAgIGJhcnNcbiAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgIC5kdXJhdGlvbihhbmltYXRpb25EdXJhdGlvbilcbiAgICAgIC5kZWxheSgoZDogQVhCYXJDaGFydERhdGEsIGk6IG51bWJlcikgPT4gaSAqIDUwKSAvLyBTdGFnZ2VyIGVhY2ggYmFyIGFuaW1hdGlvblxuICAgICAgLmF0dHJUd2VlbignZCcsIChkOiBBWEJhckNoYXJ0RGF0YSkgPT4ge1xuICAgICAgICBjb25zdCB4ID0gdGhpcy54U2NhbGUoZC5pZCk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy54U2NhbGUuYmFuZHdpZHRoKCk7XG4gICAgICAgIGNvbnN0IGZpbmFsSGVpZ2h0ID0gdGhpcy5oZWlnaHQgLSB0aGlzLnlTY2FsZShkLnZhbHVlKTtcblxuICAgICAgICByZXR1cm4gKHQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRIZWlnaHQgPSBmaW5hbEhlaWdodCAqIHQ7XG4gICAgICAgICAgY29uc3QgY3VycmVudFkgPSB0aGlzLmhlaWdodCAtIGN1cnJlbnRIZWlnaHQ7XG4gICAgICAgICAgY29uc3QgYm90dG9tWSA9IHRoaXMuaGVpZ2h0IC0gMC41OyAvLyBBZGQgc21hbGwgZ2FwIHRvIHByZXZlbnQgb3ZlcmxhcCB3aXRoIHgtYXhpc1xuXG4gICAgICAgICAgaWYgKHJhZGl1cyA+IDAgJiYgY3VycmVudEhlaWdodCA+IDApIHtcbiAgICAgICAgICAgIC8vIExpbWl0IHJhZGl1cyB0byBwcmV2ZW50IGl0IGZyb20gZXhjZWVkaW5nIGhhbGYgdGhlIGJhciB3aWR0aFxuICAgICAgICAgICAgY29uc3QgZWZmZWN0aXZlUmFkaXVzID0gTWF0aC5taW4ocmFkaXVzLCB3aWR0aCAvIDIpO1xuICAgICAgICAgICAgcmV0dXJuIGBNJHt4fSwke2JvdHRvbVl9IEwke3h9LCR7Y3VycmVudFkgKyBlZmZlY3RpdmVSYWRpdXN9IFEke3h9LCR7Y3VycmVudFl9ICR7eCArIGVmZmVjdGl2ZVJhZGl1c30sJHtjdXJyZW50WX0gTCR7eCArIHdpZHRoIC0gZWZmZWN0aXZlUmFkaXVzfSwke2N1cnJlbnRZfSBRJHt4ICsgd2lkdGh9LCR7Y3VycmVudFl9ICR7eCArIHdpZHRofSwke2N1cnJlbnRZICsgZWZmZWN0aXZlUmFkaXVzfSBMJHt4ICsgd2lkdGh9LCR7Ym90dG9tWX0gWmA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgTSR7eH0sJHtib3R0b21ZfSBMJHt4fSwke2N1cnJlbnRZfSBMJHt4ICsgd2lkdGh9LCR7Y3VycmVudFl9IEwke3ggKyB3aWR0aH0sJHtib3R0b21ZfSBaYDtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLmVhc2UoYW5pbWF0aW9uRWFzaW5nKSAvLyBVc2UgdGhlIGNvbmZpZ3VyZWQgZWFzaW5nIGZ1bmN0aW9uXG4gICAgICAuZW5kKCkgLy8gV2FpdCBmb3IgYWxsIGFuaW1hdGlvbnMgdG8gY29tcGxldGVcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gTWFyayBhbmltYXRpb24gYXMgY29tcGxldGUgdG8gZW5hYmxlIGhvdmVyIGVmZmVjdHNcbiAgICAgICAgdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlLnNldCh0cnVlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgYmFycyBmb3IgY2x1c3RlcmVkIGNoYXJ0c1xuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJCYXJzQ2x1c3RlcmVkKGdyb3VwczogQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXSk6IHZvaWQge1xuICAgIGNvbnN0IHNlcmllc0xhYmVscyA9IGdyb3Vwcy5sZW5ndGggPiAwID8gdGhpcy5nZXRDbHVzdGVyU2VyaWVzTGFiZWxzKGdyb3VwcykgOiBbXTtcbiAgICBjb25zdCB2aXNpYmxlU2VyaWVzID0gc2VyaWVzTGFiZWxzLmZpbHRlcigocykgPT4gIXRoaXMuaGlkZGVuU2VyaWVzLmhhcyhzKSk7XG5cbiAgICB0aGlzLl9pbml0aWFsQW5pbWF0aW9uQ29tcGxldGUuc2V0KGZhbHNlKTtcblxuICAgIGNvbnN0IHJhZGl1cyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmNvcm5lclJhZGl1cztcbiAgICBjb25zdCBhbmltYXRpb25EdXJhdGlvbiA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkR1cmF0aW9uO1xuICAgIGNvbnN0IGFuaW1hdGlvbkVhc2luZyA9IGdldEVhc2luZ0Z1bmN0aW9uKHRoaXMuZDMsIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkVhc2luZyk7XG5cbiAgICBjb25zdCBiYXJzQ29udGFpbmVyID0gdGhpcy5jaGFydC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYmFycy1jb250YWluZXInKTtcblxuICAgIGNvbnN0IGdyb3VwU2VsID0gYmFyc0NvbnRhaW5lclxuICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1ncm91cCcpXG4gICAgICAuZGF0YShncm91cHMpXG4gICAgICAuZW50ZXIoKVxuICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWdyb3VwJylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoZzogQVhCYXJDaGFydENsdXN0ZXJlZERhdGEpID0+IGB0cmFuc2xhdGUoJHt0aGlzLnhTY2FsZShnLmlkKX0sMClgKTtcblxuICAgIGNvbnN0IGJhckdyb3VwcyA9IGdyb3VwU2VsXG4gICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhci1ncm91cCcpXG4gICAgICAuZGF0YSgoZzogQVhCYXJDaGFydENsdXN0ZXJlZERhdGEpID0+XG4gICAgICAgIHZpc2libGVTZXJpZXMubWFwKChsYWJlbCwgaWR4KSA9PiAoeyBncm91cDogZywgc2VyaWVzTGFiZWw6IGxhYmVsLCBzZXJpZXNJbmRleDogaWR4IH0pKSxcbiAgICAgIClcbiAgICAgIC5lbnRlcigpXG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1iYXItZ3JvdXAnKTtcblxuICAgIGNvbnN0IGJhcnMgPSBiYXJHcm91cHNcbiAgICAgIC5hcHBlbmQoJ3BhdGgnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1iYXInKVxuICAgICAgLmF0dHIoJ2RhdGEtc2VyaWVzJywgKGQ6IGFueSkgPT4gZC5zZXJpZXNMYWJlbClcbiAgICAgIC5hdHRyKCdkJywgKGQ6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB4ID0gdGhpcy54U3ViU2NhbGUoZC5zZXJpZXNMYWJlbCk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy54U3ViU2NhbGUuYmFuZHdpZHRoKCk7XG4gICAgICAgIGNvbnN0IHkgPSB0aGlzLmhlaWdodCAtIDAuNTsgLy8gaW5pdGlhbCBoZWlnaHQgaXMgemVyb1xuICAgICAgICByZXR1cm4gYE0ke3h9LCR7eX0gTCR7eH0sJHt5fSBMJHt4ICsgd2lkdGh9LCR7eX0gTCR7eCArIHdpZHRofSwke3l9IFpgO1xuICAgICAgfSlcbiAgICAgIC5hdHRyKCdmaWxsJywgKGQ6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gZC5ncm91cC5jaGFydERhdGFbZC5zZXJpZXNJbmRleF0gYXMgQVhCYXJDaGFydERhdGEgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGNvbG9ySW5kZXggPSBkLnNlcmllc0luZGV4O1xuICAgICAgICByZXR1cm4gaXRlbT8uY29sb3IgfHwgdGhpcy5nZXRDb2xvcihjb2xvckluZGV4KTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dEYXRhTGFiZWxzICE9PSBmYWxzZSkge1xuICAgICAgYmFyR3JvdXBzXG4gICAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWRhdGEtbGFiZWwnKVxuICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgICAgLmF0dHIoJ3gnLCAoZDogYW55KSA9PiAodGhpcy54U3ViU2NhbGUoZC5zZXJpZXNMYWJlbCkgfHwgMCkgKyB0aGlzLnhTdWJTY2FsZS5iYW5kd2lkdGgoKSAvIDIpXG4gICAgICAgIC5hdHRyKCd5JywgdGhpcy5oZWlnaHQpXG4gICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJ2NsYW1wKDhweCwgMnZtaW4sIDEycHgpJylcbiAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc1MDAnKVxuICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtYmFyLWNoYXJ0LWRhdGEtbGFiZWxzLWNvbG9yKSknKVxuICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgICAgICAudGV4dCgoZDogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlbSA9IGQuZ3JvdXAuY2hhcnREYXRhW2Quc2VyaWVzSW5kZXhdIGFzIEFYQmFyQ2hhcnREYXRhIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIHJldHVybiBpdGVtID8gaXRlbS52YWx1ZSA6ICcnO1xuICAgICAgICB9KTtcblxuICAgICAgYmFyR3JvdXBzXG4gICAgICAgIC5zZWxlY3RBbGwoJy5heC1iYXItY2hhcnQtZGF0YS1sYWJlbCcpXG4gICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgICAuZGVsYXkoKF86IGFueSwgaTogbnVtYmVyKSA9PiBpICogNTAgKyAxMDApXG4gICAgICAgIC5hdHRyKCd5JywgKGQ6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW0gPSBkLmdyb3VwLmNoYXJ0RGF0YVtkLnNlcmllc0luZGV4XSBhcyBBWEJhckNoYXJ0RGF0YSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICByZXR1cm4gaXRlbSA/IHRoaXMueVNjYWxlKGl0ZW0udmFsdWUpIC0gOCA6IHRoaXMuaGVpZ2h0O1xuICAgICAgICB9KVxuICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAxKVxuICAgICAgICAuZWFzZShhbmltYXRpb25FYXNpbmcpO1xuICAgIH1cblxuICAgIGJhckdyb3Vwc1xuICAgICAgLm9uKCdtb3VzZWVudGVyJywgKGV2ZW50OiBNb3VzZUV2ZW50LCBkOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLl9pbml0aWFsQW5pbWF0aW9uQ29tcGxldGUoKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBiYXJFbCA9IHRoaXMuZDMuc2VsZWN0KGV2ZW50LmN1cnJlbnRUYXJnZXQpLnNlbGVjdCgncGF0aCcpO1xuICAgICAgICBiYXJFbC50cmFuc2l0aW9uKCkuZHVyYXRpb24oMTUwKS5zdHlsZSgnZmlsdGVyJywgJ2JyaWdodG5lc3MoMC43KSBkcm9wLXNoYWRvdygwIDAgMnB4IHJnYmEoMCwwLDAsMC4xKSknKTtcbiAgICAgICAgY29uc3QgaXRlbSA9IGQuZ3JvdXAuY2hhcnREYXRhW2Quc2VyaWVzSW5kZXhdIGFzIEFYQmFyQ2hhcnREYXRhIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaXRlbSkgdGhpcy5oYW5kbGVCYXJIb3ZlcihldmVudCwgaXRlbSwgZC5ncm91cCk7XG4gICAgICB9KVxuICAgICAgLm9uKCdtb3VzZW1vdmUnLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gICAgICB9KVxuICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlKCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgYmFyRWwgPSB0aGlzLmQzLnNlbGVjdChldmVudC5jdXJyZW50VGFyZ2V0KS5zZWxlY3QoJ3BhdGgnKTtcbiAgICAgICAgYmFyRWwudHJhbnNpdGlvbigpLmR1cmF0aW9uKDE1MCkuc3R5bGUoJ2ZpbHRlcicsIG51bGwpO1xuICAgICAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICAgICAgfSlcbiAgICAgIC5vbignY2xpY2snLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBkLmdyb3VwLmNoYXJ0RGF0YVtkLnNlcmllc0luZGV4XSBhcyBBWEJhckNoYXJ0RGF0YSB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGl0ZW0pIHRoaXMuaGFuZGxlQmFyQ2xpY2soZXZlbnQsIGl0ZW0pO1xuICAgICAgfSk7XG5cbiAgICBiYXJzXG4gICAgICAudHJhbnNpdGlvbigpXG4gICAgICAuZHVyYXRpb24oYW5pbWF0aW9uRHVyYXRpb24pXG4gICAgICAuZGVsYXkoKF86IGFueSwgaTogbnVtYmVyKSA9PiBpICogNTApXG4gICAgICAuYXR0clR3ZWVuKCdkJywgKGQ6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB4ID0gdGhpcy54U3ViU2NhbGUoZC5zZXJpZXNMYWJlbCk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy54U3ViU2NhbGUuYmFuZHdpZHRoKCk7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBkLmdyb3VwLmNoYXJ0RGF0YVtkLnNlcmllc0luZGV4XSBhcyBBWEJhckNoYXJ0RGF0YSB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgZmluYWxIZWlnaHQgPSBpdGVtID8gdGhpcy5oZWlnaHQgLSB0aGlzLnlTY2FsZShpdGVtLnZhbHVlKSA6IDA7XG5cbiAgICAgICAgcmV0dXJuICh0OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50SGVpZ2h0ID0gZmluYWxIZWlnaHQgKiB0O1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRZID0gdGhpcy5oZWlnaHQgLSBjdXJyZW50SGVpZ2h0O1xuICAgICAgICAgIGNvbnN0IGJvdHRvbVkgPSB0aGlzLmhlaWdodCAtIDAuNTsgLy8gQWRkIHNtYWxsIGdhcCB0byBwcmV2ZW50IG92ZXJsYXAgd2l0aCB4LWF4aXNcblxuICAgICAgICAgIGlmIChyYWRpdXMgPiAwICYmIGN1cnJlbnRIZWlnaHQgPiAwKSB7XG4gICAgICAgICAgICAvLyBMaW1pdCByYWRpdXMgdG8gcHJldmVudCBpdCBmcm9tIGV4Y2VlZGluZyBoYWxmIHRoZSBiYXIgd2lkdGhcbiAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZVJhZGl1cyA9IE1hdGgubWluKHJhZGl1cywgd2lkdGggLyAyKTtcbiAgICAgICAgICAgIHJldHVybiBgTSR7eH0sJHtib3R0b21ZfSBMJHt4fSwke2N1cnJlbnRZICsgZWZmZWN0aXZlUmFkaXVzfSBRJHt4fSwke2N1cnJlbnRZfSAke3ggKyBlZmZlY3RpdmVSYWRpdXN9LCR7Y3VycmVudFl9IEwke3ggKyB3aWR0aCAtIGVmZmVjdGl2ZVJhZGl1c30sJHtjdXJyZW50WX0gUSR7eCArIHdpZHRofSwke2N1cnJlbnRZfSAke3ggKyB3aWR0aH0sJHtjdXJyZW50WSArIGVmZmVjdGl2ZVJhZGl1c30gTCR7eCArIHdpZHRofSwke2JvdHRvbVl9IFpgO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYE0ke3h9LCR7Ym90dG9tWX0gTCR7eH0sJHtjdXJyZW50WX0gTCR7eCArIHdpZHRofSwke2N1cnJlbnRZfSBMJHt4ICsgd2lkdGh9LCR7Ym90dG9tWX0gWmA7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICAgIC5lYXNlKGFuaW1hdGlvbkVhc2luZylcbiAgICAgIC5lbmQoKVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlLnNldCh0cnVlKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgYXBwcm9wcmlhdGUgRDMgZWFzaW5nIGZ1bmN0aW9uIGJhc2VkIG9uIHRoZSBvcHRpb24gc3RyaW5nXG4gICAqL1xuICAvLyBnZXRFYXNpbmdGdW5jdGlvbiBtb3ZlZCB0byBzaGFyZWQgY2hhcnQgdXRpbHNcblxuICAvKipcbiAgICogSGFuZGxlcyBiYXIgaG92ZXIgZXZlbnQgYW5kIHNob3dzIHRvb2x0aXBcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlQmFySG92ZXIoZXZlbnQ6IE1vdXNlRXZlbnQsIGRhdHVtOiBBWEJhckNoYXJ0RGF0YSwgZ3JvdXA/OiB7IGlkOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93VG9vbHRpcCAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IGRhdGFWYWx1ZSA9IHRoaXMuZGF0YSgpIGFzIEFYQmFyQ2hhcnRWYWx1ZTtcbiAgICAgIGNvbnN0IGlzQ2x1c3RlcmVkID0gdGhpcy5pc0NsdXN0ZXJlZERhdGEoZGF0YVZhbHVlKTtcbiAgICAgIGNvbnN0IGZsYXREYXRhOiBBWEJhckNoYXJ0RGF0YVtdID0gaXNDbHVzdGVyZWRcbiAgICAgICAgPyAoZGF0YVZhbHVlIGFzIEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10pLmZsYXRNYXAoKGcpID0+IGcuY2hhcnREYXRhKVxuICAgICAgICA6IChkYXRhVmFsdWUgYXMgQVhCYXJDaGFydERhdGFbXSkgfHwgW107XG4gICAgICBjb25zdCBpbmRleCA9IGZsYXREYXRhLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZGF0dW0uaWQgJiYgaXRlbS5sYWJlbCA9PT0gZGF0dW0ubGFiZWwpO1xuICAgICAgY29uc3QgY29sb3IgPSBkYXR1bS5jb2xvciB8fCB0aGlzLmdldENvbG9yKGluZGV4ICE9PSAtMSA/IGluZGV4IDogMCk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBwZXJjZW50YWdlIG9mIHRvdGFsXG4gICAgICBjb25zdCB0b3RhbCA9IGlzQ2x1c3RlcmVkXG4gICAgICAgID8gKGRhdGFWYWx1ZSBhcyBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdKS5yZWR1Y2UoXG4gICAgICAgICAgICAoc3VtLCBnKSA9PiBzdW0gKyBnLmNoYXJ0RGF0YS5yZWR1Y2UoKHMsIGl0KSA9PiBzICsgaXQudmFsdWUsIDApLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICApXG4gICAgICAgIDogKGZsYXREYXRhIGFzIEFYQmFyQ2hhcnREYXRhW10pLnJlZHVjZSgoc3VtLCBpdGVtKSA9PiBzdW0gKyBpdGVtLnZhbHVlLCAwKTtcbiAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSB0b3RhbCA+IDAgPyAoKGRhdHVtLnZhbHVlIC8gdG90YWwpICogMTAwKS50b0ZpeGVkKDEpIDogJzAnO1xuXG4gICAgICB0aGlzLl90b29sdGlwRGF0YS5zZXQoe1xuICAgICAgICB0aXRsZTogZ3JvdXAgPyBgJHtkYXR1bS50b29sdGlwTGFiZWwgfHwgZGF0dW0ubGFiZWx9IOKAlCAke2dyb3VwLmxhYmVsfWAgOiBkYXR1bS50b29sdGlwTGFiZWwgfHwgZGF0dW0ubGFiZWwsXG4gICAgICAgIHZhbHVlOiBkYXR1bS52YWx1ZS50b1N0cmluZygpLFxuICAgICAgICBwZXJjZW50YWdlOiBgJHtwZXJjZW50YWdlfSVgLFxuICAgICAgICBjb2xvcjogY29sb3IsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICAgICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRvb2x0aXAgcG9zaXRpb24gYmFzZWQgb24gbW91c2UgY29vcmRpbmF0ZXNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyRWwgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWNvbnRhaW5lckVsKSByZXR1cm47XG4gICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHRvb2x0aXBFbCA9IGNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoJy5jaGFydC10b29sdGlwJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGNvbnN0IHRvb2x0aXBSZWN0ID0gdG9vbHRpcEVsID8gdG9vbHRpcEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogbnVsbDtcbiAgICBjb25zdCBwb3MgPSBjb21wdXRlVG9vbHRpcFBvc2l0aW9uKGNvbnRhaW5lclJlY3QsIHRvb2x0aXBSZWN0LCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCB0aGlzLlRPT0xUSVBfR0FQKTtcbiAgICB0aGlzLl90b29sdGlwUG9zaXRpb24uc2V0KHBvcyk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBiYXIgY2xpY2sgZXZlbnRcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlQmFyQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQsIGRhdHVtOiBBWEJhckNoYXJ0RGF0YSk6IHZvaWQge1xuICAgIHRoaXMuYmFyQ2xpY2suZW1pdCh7IGl0ZW06IGRhdHVtLCBldmVudDogeyBuYXRpdmVFdmVudDogZXZlbnQsIHNlbmRlcjogdGhpcyB9IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGEgbWVzc2FnZSB3aGVuIG5vIGRhdGEgaXMgYXZhaWxhYmxlXG4gICAqL1xuICBwcml2YXRlIHNob3dOb0RhdGFNZXNzYWdlKGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckNoYXJ0QXJlYShjb250YWluZXJFbGVtZW50KTtcbiAgICB0aGlzLnNob3dNZXNzYWdlKFxuICAgICAgY29udGFpbmVyRWxlbWVudCxcbiAgICAgIHRoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKS5ub0RhdGFJY29uLFxuICAgICAgdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLm5vRGF0YSxcbiAgICAgIHRoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKS5ub0RhdGFIZWxwLFxuICAgICAgJ2F4LWJhci1jaGFydC1uby1kYXRhLW1lc3NhZ2UnLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSBtZXNzYWdlIHdoZW4gYWxsIGJhcnMgYXJlIGhpZGRlblxuICAgKi9cbiAgcHJpdmF0ZSBzaG93QWxsQmFyc0hpZGRlbk1lc3NhZ2UoY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyQ2hhcnRBcmVhKGNvbnRhaW5lckVsZW1lbnQpO1xuICAgIHRoaXMuc2hvd01lc3NhZ2UoXG4gICAgICBjb250YWluZXJFbGVtZW50LFxuICAgICAgdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLmFsbEhpZGRlbkljb24sXG4gICAgICB0aGlzLmVmZmVjdGl2ZU1lc3NhZ2VzKCkuYWxsSGlkZGVuLFxuICAgICAgdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLmFsbEhpZGRlbkhlbHAsXG4gICAgICAnYXgtYmFyLWNoYXJ0LW5vLWRhdGEtbWVzc2FnZScsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb2xvciBmb3IgYSBiYXIgYmFzZWQgb24gaXRzIGluZGV4XG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Q29sb3IoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdldENoYXJ0Q29sb3IoaW5kZXgsIHRoaXMuY2hhcnRDb2xvcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGJhciBpcyBoaWRkZW5cbiAgICovXG4gIHByb3RlY3RlZCBpc0JhckhpZGRlbihpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGlkZGVuQmFycy5oYXMoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIG9mIEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlIGludGVyZmFjZVxuICAgKiBSZXR1cm5zIGxlZ2VuZCBpdGVtcyBiYXNlZCBvbiB0aGUgY2hhcnQgZGF0YVxuICAgKi9cbiAgZ2V0TGVnZW5kSXRlbXMoKTogQVhDaGFydExlZ2VuZEl0ZW1bXSB7XG4gICAgY29uc3QgdmFsdWUgPSAodGhpcy5kYXRhKCkgfHwgW10pIGFzIEFYQmFyQ2hhcnRWYWx1ZTtcbiAgICBpZiAodGhpcy5pc0NsdXN0ZXJlZERhdGEodmFsdWUpKSB7XG4gICAgICBjb25zdCBncm91cHMgPSB2YWx1ZSBhcyBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdO1xuICAgICAgY29uc3Qgc2VyaWVzTGFiZWxzID0gZ3JvdXBzLmxlbmd0aCA+IDAgPyB0aGlzLmdldENsdXN0ZXJTZXJpZXNMYWJlbHMoZ3JvdXBzKSA6IFtdO1xuICAgICAgY29uc3QgdG90YWwgPSBncm91cHMucmVkdWNlKFxuICAgICAgICAoc3VtLCBnKSA9PiBzdW0gKyBnLmNoYXJ0RGF0YS5yZWR1Y2UoKHMsIGl0KSA9PiBzICsgKHR5cGVvZiBpdC52YWx1ZSA9PT0gJ251bWJlcicgPyBpdC52YWx1ZSA6IDApLCAwKSxcbiAgICAgICAgMCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gc2VyaWVzTGFiZWxzLm1hcCgobGFiZWwsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlcmllc1RvdGFsID0gZ3JvdXBzLnJlZHVjZSgocywgZykgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW0gPSBnLmNoYXJ0RGF0YVtpbmRleF07XG4gICAgICAgICAgY29uc3QgdiA9IGl0ZW0gJiYgdHlwZW9mIGl0ZW0udmFsdWUgPT09ICdudW1iZXInID8gaXRlbS52YWx1ZSA6IDA7XG4gICAgICAgICAgcmV0dXJuIHMgKyB2O1xuICAgICAgICB9LCAwKTtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9IHRvdGFsID4gMCA/IChzZXJpZXNUb3RhbCAvIHRvdGFsKSAqIDEwMCA6IDA7XG4gICAgICAgIGNvbnN0IGZpcnN0SXRlbSA9IGdyb3Vwc1swXT8uY2hhcnREYXRhW2luZGV4XTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogbGFiZWwsXG4gICAgICAgICAgbmFtZTogbGFiZWwgfHwgYFNlcmllcyAke2luZGV4ICsgMX1gLFxuICAgICAgICAgIHZhbHVlOiBzZXJpZXNUb3RhbCxcbiAgICAgICAgICBwZXJjZW50YWdlLFxuICAgICAgICAgIGNvbG9yOiBmaXJzdEl0ZW0/LmNvbG9yIHx8IHRoaXMuZ2V0Q29sb3IoaW5kZXgpLFxuICAgICAgICAgIGhpZGRlbjogdGhpcy5oaWRkZW5TZXJpZXMuaGFzKGxhYmVsKSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZsYXQgPSB2YWx1ZSBhcyBBWEJhckNoYXJ0RGF0YVtdO1xuICAgIGNvbnN0IHRvdGFsID0gZmxhdC5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4gc3VtICsgKHR5cGVvZiBpdGVtLnZhbHVlID09PSAnbnVtYmVyJyA/IGl0ZW0udmFsdWUgOiAwKSwgMCk7XG4gICAgcmV0dXJuIGZsYXQubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gdHlwZW9mIGl0ZW0udmFsdWUgPT09ICdudW1iZXInID8gaXRlbS52YWx1ZSA6IDA7XG4gICAgICBjb25zdCBwZXJjZW50YWdlID0gdG90YWwgPiAwID8gKHZhbCAvIHRvdGFsKSAqIDEwMCA6IDA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogaXRlbS5pZCxcbiAgICAgICAgbmFtZTogaXRlbS5sYWJlbCB8fCBgSXRlbSAke2luZGV4ICsgMX1gLFxuICAgICAgICB2YWx1ZTogaXRlbS52YWx1ZSxcbiAgICAgICAgcGVyY2VudGFnZSxcbiAgICAgICAgY29sb3I6IGl0ZW0uY29sb3IgfHwgdGhpcy5nZXRDb2xvcihpbmRleCksXG4gICAgICAgIGhpZGRlbjogdGhpcy5pc0JhckhpZGRlbihpdGVtLmlkKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gb2YgQVhDaGFydExlZ2VuZENvbXBhdGlibGUgaW50ZXJmYWNlXG4gICAqIEhpZ2hsaWdodHMgYSBzcGVjaWZpYyBiYXIgYnkgSURcbiAgICovXG4gIGhpZ2hsaWdodFNlZ21lbnQoaWQ6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICBjb25zdCB2YWx1ZSA9ICh0aGlzLmRhdGEoKSB8fCBbXSkgYXMgQVhCYXJDaGFydFZhbHVlO1xuICAgIGNvbnN0IGlzQ2x1c3RlcmVkID0gdGhpcy5pc0NsdXN0ZXJlZERhdGEodmFsdWUpO1xuXG4gICAgY29uc3QgcmVzZXRBbGwgPSAoKSA9PiB7XG4gICAgICB0aGlzLnN2Z1xuICAgICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhcicpXG4gICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtaGlnaGxpZ2h0ZWQnLCBmYWxzZSlcbiAgICAgICAgLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1kaW1tZWQnLCBmYWxzZSlcbiAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAxKVxuICAgICAgICAuYXR0cignZmlsdGVyJywgbnVsbClcbiAgICAgICAgLmF0dHIoJ3N0cm9rZScsIG51bGwpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBudWxsKVxuICAgICAgICAuYXR0cignc3Ryb2tlLW9wYWNpdHknLCBudWxsKTtcbiAgICB9O1xuXG4gICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICByZXNldEFsbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghaXNDbHVzdGVyZWQpIHtcbiAgICAgIGlmICh0aGlzLmlzQmFySGlkZGVuKGlkIGFzIHN0cmluZykpIHtcbiAgICAgICAgcmVzZXRBbGwoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0QmFyID0gdGhpcy5zdmcuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhcicpLmZpbHRlcigoZDogYW55KSA9PiBkPy5pZCA9PT0gaWQpO1xuICAgICAgaWYgKHRhcmdldEJhci5lbXB0eSgpKSByZXR1cm47XG4gICAgICBjb25zdCBpc0N1cnJlbnRseUhpZ2hsaWdodGVkID0gdGFyZ2V0QmFyLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1oaWdobGlnaHRlZCcpO1xuICAgICAgaWYgKGlzQ3VycmVudGx5SGlnaGxpZ2h0ZWQpIHtcbiAgICAgICAgcmVzZXRBbGwoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc2V0QWxsKCk7XG4gICAgICAgIHRhcmdldEJhclxuICAgICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtaGlnaGxpZ2h0ZWQnLCB0cnVlKVxuICAgICAgICAgIC5hdHRyKCdmaWx0ZXInLCAnZHJvcC1zaGFkb3coMCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMykpJylcbiAgICAgICAgICAuYXR0cignc3Ryb2tlJywgJyMwMDAnKVxuICAgICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAnMXB4JylcbiAgICAgICAgICAuYXR0cignc3Ryb2tlLW9wYWNpdHknLCAnMC4zJylcbiAgICAgICAgICAuc3R5bGUoJ3RyYW5zaXRpb24nLCAnYWxsIDAuMnMgZWFzZS1pbi1vdXQnKTtcbiAgICAgICAgdGhpcy5zdmdcbiAgICAgICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhcicpXG4gICAgICAgICAgLmZpbHRlcigoZDogYW55KSA9PiBkPy5pZCAhPT0gaWQpXG4gICAgICAgICAgLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1kaW1tZWQnLCB0cnVlKVxuICAgICAgICAgIC5hdHRyKCdvcGFjaXR5JywgMC41KVxuICAgICAgICAgIC5zdHlsZSgndHJhbnNpdGlvbicsICdvcGFjaXR5IDAuMnMgZWFzZS1pbi1vdXQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRCYXJzID0gdGhpcy5zdmcuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhcicpLmZpbHRlcigoXzogYW55LCBpOiBudW1iZXIsIG5vZGVzOiBhbnlbXSkgPT4ge1xuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldIGFzIFNWR1BhdGhFbGVtZW50O1xuICAgICAgcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXNlcmllcycpID09PSBpZDtcbiAgICB9KTtcbiAgICBpZiAodGFyZ2V0QmFycy5lbXB0eSgpKSByZXR1cm47XG4gICAgY29uc3QgaXNIaWdobGlnaHRlZCA9IHRhcmdldEJhcnMuY2xhc3NlZCgnYXgtYmFyLWNoYXJ0LWhpZ2hsaWdodGVkJyk7XG4gICAgaWYgKGlzSGlnaGxpZ2h0ZWQpIHtcbiAgICAgIHJlc2V0QWxsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc2V0QWxsKCk7XG4gICAgICB0YXJnZXRCYXJzXG4gICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtaGlnaGxpZ2h0ZWQnLCB0cnVlKVxuICAgICAgICAuYXR0cignZmlsdGVyJywgJ2Ryb3Atc2hhZG93KDAgMCA0cHggcmdiYSgwLCAwLCAwLCAwLjMpKScpXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCAnIzAwMCcpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAnMXB4JylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS1vcGFjaXR5JywgJzAuMycpXG4gICAgICAgIC5zdHlsZSgndHJhbnNpdGlvbicsICdhbGwgMC4ycyBlYXNlLWluLW91dCcpO1xuICAgICAgdGhpcy5zdmdcbiAgICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1iYXInKVxuICAgICAgICAuZmlsdGVyKChfOiBhbnksIGk6IG51bWJlciwgbm9kZXM6IGFueVtdKSA9PiAobm9kZXNbaV0gYXMgU1ZHUGF0aEVsZW1lbnQpLmdldEF0dHJpYnV0ZSgnZGF0YS1zZXJpZXMnKSAhPT0gaWQpXG4gICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtZGltbWVkJywgdHJ1ZSlcbiAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAwLjUpXG4gICAgICAgIC5zdHlsZSgndHJhbnNpdGlvbicsICdvcGFjaXR5IDAuMnMgZWFzZS1pbi1vdXQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gb2YgQVhDaGFydExlZ2VuZENvbXBhdGlibGUgaW50ZXJmYWNlXG4gICAqIFRvZ2dsZXMgdmlzaWJpbGl0eSBvZiBhIGJhciBieSBJRFxuICAgKiBAcmV0dXJucyBOZXcgdmlzaWJpbGl0eSBzdGF0ZSAodHJ1ZSA9IHZpc2libGUsIGZhbHNlID0gaGlkZGVuKVxuICAgKi9cbiAgdG9nZ2xlU2VnbWVudChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmFsdWUgPSAodGhpcy5kYXRhKCkgfHwgW10pIGFzIEFYQmFyQ2hhcnRWYWx1ZTtcbiAgICBjb25zdCBpc0NsdXN0ZXJlZCA9IHRoaXMuaXNDbHVzdGVyZWREYXRhKHZhbHVlKTtcblxuICAgIGlmICghaXNDbHVzdGVyZWQpIHtcbiAgICAgIGNvbnN0IHdhc0FsbEhpZGRlbiA9XG4gICAgICAgICh2YWx1ZSBhcyBBWEJhckNoYXJ0RGF0YVtdKS5sZW5ndGggPiAwICYmICh2YWx1ZSBhcyBBWEJhckNoYXJ0RGF0YVtdKS5ldmVyeSgoZCkgPT4gdGhpcy5pc0JhckhpZGRlbihkLmlkKSk7XG4gICAgICBpZiAodGhpcy5oaWRkZW5CYXJzLmhhcyhpZCkpIHtcbiAgICAgICAgdGhpcy5oaWRkZW5CYXJzLmRlbGV0ZShpZCk7XG4gICAgICAgIGlmICh3YXNBbGxIaWRkZW4pIHtcbiAgICAgICAgICBpZiAodGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZDNcbiAgICAgICAgICAgICAgPy5zZWxlY3QodGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAgICAgLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtbWVzc2FnZS1jb250YWluZXInKVxuICAgICAgICAgICAgICAucmVtb3ZlKCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oaWRkZW5CYXJzLmFkZChpZCk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhdGhpcy5oaWRkZW5CYXJzLmhhcyhpZCk7XG4gICAgfVxuXG4gICAgLy8gQ2x1c3RlcmVkIG1vZGU6IHRvZ2dsZSBzZXJpZXMgYnkgbGFiZWxcbiAgICBjb25zdCBncm91cHMgPSB2YWx1ZSBhcyBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdO1xuICAgIGNvbnN0IHNlcmllc0xhYmVscyA9IGdyb3Vwcy5sZW5ndGggPiAwID8gdGhpcy5nZXRDbHVzdGVyU2VyaWVzTGFiZWxzKGdyb3VwcykgOiBbXTtcbiAgICBjb25zdCBzZXJpZXNDb3VudCA9IHNlcmllc0xhYmVscy5sZW5ndGg7XG4gICAgY29uc3Qgd2FzQWxsSGlkZGVuID0gc2VyaWVzQ291bnQgPiAwICYmIHRoaXMuaGlkZGVuU2VyaWVzLnNpemUgPj0gc2VyaWVzQ291bnQ7XG5cbiAgICBpZiAodGhpcy5oaWRkZW5TZXJpZXMuaGFzKGlkKSkge1xuICAgICAgdGhpcy5oaWRkZW5TZXJpZXMuZGVsZXRlKGlkKTtcbiAgICAgIGlmICh3YXNBbGxIaWRkZW4pIHtcbiAgICAgICAgaWYgKHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy5kMz8uc2VsZWN0KHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQpLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtbWVzc2FnZS1jb250YWluZXInKS5yZW1vdmUoKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhpZGRlblNlcmllcy5hZGQoaWQpO1xuICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgIH1cblxuICAgIHJldHVybiAhdGhpcy5oaWRkZW5TZXJpZXMuaGFzKGlkKTtcbiAgfVxuXG4gIC8vID09PT09IEhlbHBlciB1dGlsaXRpZXMgZm9yIG1vZHVsYXJpdHkgYW5kIG1haW50YWluYWJpbGl0eSA9PT09PVxuXG4gIHByaXZhdGUgZ2V0Q29udGFpbmVyRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckNoYXJ0QXJlYShjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMuZDMuc2VsZWN0KGNvbnRhaW5lckVsZW1lbnQpLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtbWVzc2FnZS1jb250YWluZXInKS5yZW1vdmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0WEF4aXNUaWNrRm9udFNpemVCYXNlZE9uV2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMTAsIE1hdGgubWluKDE0LCBNYXRoLnJvdW5kKHRoaXMud2lkdGggLyA1MCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0WUF4aXNUaWNrRm9udFNpemVCYXNlZE9uSGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDExLCBNYXRoLm1pbigxNSwgTWF0aC5yb3VuZCh0aGlzLmhlaWdodCAvIDMwKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFhBeGlzQ29tbW9uKGF4ZXNHcm91cDogYW55LCBpZFRvTGFiZWw6IE1hcDxzdHJpbmcsIHN0cmluZz4sIG9wdGlvbnM6IEFYQmFyQ2hhcnRPcHRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnhBeGlzID0gYXhlc0dyb3VwXG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYXhpcy14JylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHt0aGlzLmhlaWdodH0pYClcbiAgICAgIC5jYWxsKHRoaXMuZDMuYXhpc0JvdHRvbSh0aGlzLnhTY2FsZSkudGlja0Zvcm1hdCgoaWQ6IHN0cmluZykgPT4gaWRUb0xhYmVsLmdldChpZCkgPz8gU3RyaW5nKGlkKSkgYXMgYW55KTtcblxuICAgIGNvbnN0IGR5bmFtaWNGb250U2l6ZSA9IHRoaXMuZ2V0WEF4aXNUaWNrRm9udFNpemVCYXNlZE9uV2lkdGgoKTtcbiAgICBjb25zdCB4QXhpc1RpY2tzID0gdGhpcy54QXhpc1xuICAgICAgLnNlbGVjdEFsbCgndGV4dCcpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGAke2R5bmFtaWNGb250U2l6ZX1weGApXG4gICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJzQwMCcpXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiYSh2YXIoLS1heC1jb21wLWJhci1jaGFydC1sYWJlbHMtY29sb3IpLCAwLjcpJylcbiAgICAgIC5hdHRyKCdkaXJlY3Rpb24nLCAnbHRyJyk7XG5cbiAgICBjb25zdCBpc1JvdGF0ZWQgPSB0aGlzLnNob3VsZFJvdGF0ZVhBeGlzTGFiZWxzKGlkVG9MYWJlbCwgZHluYW1pY0ZvbnRTaXplKTtcbiAgICBpZiAoaXNSb3RhdGVkKSB7XG4gICAgICB4QXhpc1RpY2tzLmF0dHIoJ3RyYW5zZm9ybScsICdyb3RhdGUoLTQ1KScpLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdlbmQnKS5hdHRyKCdkeCcsICctMC44ZW0nKS5hdHRyKCdkeScsICcwLjE1ZW0nKTtcbiAgICB9XG5cbiAgICB0aGlzLnhBeGlzLnNlbGVjdEFsbCgnbGluZSwgcGF0aCcpLnN0eWxlKCdzdHJva2UnLCAncmdiKHZhcigtLWF4LWNvbXAtYmFyLWNoYXJ0LWdyaWQtbGluZXMtY29sb3IpKScpO1xuXG4gICAgaWYgKG9wdGlvbnMueEF4aXNMYWJlbCAmJiAhaXNSb3RhdGVkKSB7XG4gICAgICBjb25zdCB0aWNrTm9kZXMgPSAodGhpcy54QXhpcy5zZWxlY3RBbGwoJ3RleHQnKS5ub2RlcygpIHx8IFtdKSBhcyBTVkdUZXh0RWxlbWVudFtdO1xuICAgICAgY29uc3QgbWVhc3VyZWRUaWNrSGVpZ2h0ID1cbiAgICAgICAgdGlja05vZGVzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IE1hdGgubWF4KC4uLnRpY2tOb2Rlcy5tYXAoKG4pID0+IChuICYmIChuIGFzIGFueSkuZ2V0QkJveCA/IChuIGFzIGFueSkuZ2V0QkJveCgpLmhlaWdodCA6IGR5bmFtaWNGb250U2l6ZSkpKVxuICAgICAgICAgIDogZHluYW1pY0ZvbnRTaXplO1xuICAgICAgY29uc3QgdGlja0FyZWFIZWlnaHQgPSBtZWFzdXJlZFRpY2tIZWlnaHQgKyA2O1xuICAgICAgY29uc3QgZ2FwQmVsb3dUaWNrcyA9IDE0O1xuICAgICAgdGhpcy5jcmVhdGVYQXhpc1RpdGxlKGF4ZXNHcm91cCwgb3B0aW9ucy54QXhpc0xhYmVsLCB0aWNrQXJlYUhlaWdodCwgZ2FwQmVsb3dUaWNrcyk7XG4gICAgfVxuICB9XG5cbiAgLy8gY29tcHV0ZVRvb2x0aXBQb3NpdGlvbiBtb3ZlZCB0byBzaGFyZWQgY2hhcnQgdXRpbHNcblxuICBwcml2YXRlIHNob3dNZXNzYWdlKFxuICAgIGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIGljb25DbGFzczogc3RyaW5nLFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBoZWxwVGV4dDogc3RyaW5nLFxuICAgIHNwZWNpZmljQ2xhc3M6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5kM1xuICAgICAgLnNlbGVjdChjb250YWluZXJFbGVtZW50KVxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC5hdHRyKCdjbGFzcycsIGBheC1jaGFydC1tZXNzYWdlLWNvbnRhaW5lciBheC1iYXItY2hhcnQtbWVzc2FnZS1iYWNrZ3JvdW5kICR7c3BlY2lmaWNDbGFzc31gKTtcblxuICAgIGNvbnRhaW5lclxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1jaGFydC1tZXNzYWdlLWljb24gYXgtYmFyLWNoYXJ0LW5vLWRhdGEtaWNvbicpXG4gICAgICAuaHRtbChgPGkgY2xhc3M9XCIke2ljb25DbGFzc30gZmEtMnhcIj48L2k+YCk7XG5cbiAgICBjb250YWluZXIuYXBwZW5kKCdkaXYnKS5hdHRyKCdjbGFzcycsICdheC1jaGFydC1tZXNzYWdlLXRleHQgYXgtYmFyLWNoYXJ0LW5vLWRhdGEtdGV4dCcpLnRleHQodGV4dCk7XG5cbiAgICBjb250YWluZXIuYXBwZW5kKCdkaXYnKS5hdHRyKCdjbGFzcycsICdheC1jaGFydC1tZXNzYWdlLWhlbHAgYXgtYmFyLWNoYXJ0LW5vLWRhdGEtaGVscCcpLnRleHQoaGVscFRleHQpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYXgtYmFyLWNoYXJ0XCIgI2NoYXJ0Q29udGFpbmVyPlxuICA8IS0tIFNoYXJlZCB0b29sdGlwIGNvbXBvbmVudCAtLT5cbiAgPGF4LWNoYXJ0LXRvb2x0aXBcbiAgICBbdmlzaWJsZV09XCJ0b29sdGlwVmlzaWJsZSgpXCJcbiAgICBbcG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uKClcIlxuICAgIFtkYXRhXT1cInRvb2x0aXBEYXRhKClcIlxuICAgIFtzaG93UGVyY2VudGFnZV09XCJ0cnVlXCJcbiAgPjwvYXgtY2hhcnQtdG9vbHRpcD5cbjwvZGl2PlxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1iYXItY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jaGFydHMvYmFyLWNoYXJ0L3NyYy9hY29yZXgtY2hhcnRzLWJhci1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}