@acorex/charts 20.1.15 → 20.1.17

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 barWidth: 80,\n cornerRadius: 4,\n animationDuration: 800,\n animationEasing: 'cubic-out',\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWNoYXJ0LmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9iYXItY2hhcnQvc3JjL2xpYi9iYXItY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHaEMsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQXFCO0lBQ3ZELFNBQVMsRUFBRSxJQUFJO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixRQUFRLEVBQUUsSUFBSTtJQUNkLGNBQWMsRUFBRSxJQUFJO0lBQ3BCLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLFFBQVEsRUFBRSxFQUFFO0lBQ1osWUFBWSxFQUFFLENBQUM7SUFDZixpQkFBaUIsRUFBRSxHQUFHO0lBQ3RCLGVBQWUsRUFBRSxXQUFXO0NBQzdCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLGNBQWMsQ0FBbUIscUJBQXFCLEVBQUU7SUFDN0YsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRTtRQUNaLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3hDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUN2RCxPQUFPLHVCQUF1QixDQUFDO0lBQ2pDLENBQUM7Q0FDRixDQUFDLENBQUM7QUFJSCxNQUFNLFVBQVUsY0FBYyxDQUFDLFNBQWdDLEVBQUU7SUFDL0QsTUFBTSxNQUFNLEdBQUc7UUFDYixHQUFHLHVCQUF1QjtRQUMxQixHQUFHLE1BQU07S0FDVixDQUFDO0lBQ0YsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFYX0dMT0JBTF9DT05GSUcgfSBmcm9tICdAYWNvcmV4L2NvcmUvY29uZmlnJztcbmltcG9ydCB7IEluamVjdGlvblRva2VuLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHNldCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBBWEJhckNoYXJ0T3B0aW9uIH0gZnJvbSAnLi9iYXItY2hhcnQudHlwZSc7XG5cbmV4cG9ydCBjb25zdCBBWEJhckNoYXJ0RGVmYXVsdENvbmZpZzogQVhCYXJDaGFydE9wdGlvbiA9IHtcbiAgc2hvd1hBeGlzOiB0cnVlLFxuICBzaG93WUF4aXM6IHRydWUsXG4gIHNob3dHcmlkOiB0cnVlLFxuICBzaG93RGF0YUxhYmVsczogdHJ1ZSxcbiAgc2hvd1Rvb2x0aXA6IHRydWUsXG4gIGJhcldpZHRoOiA4MCxcbiAgY29ybmVyUmFkaXVzOiA0LFxuICBhbmltYXRpb25EdXJhdGlvbjogODAwLFxuICBhbmltYXRpb25FYXNpbmc6ICdjdWJpYy1vdXQnLFxufTtcblxuZXhwb3J0IGNvbnN0IEFYX0JBUl9DSEFSVF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48QVhCYXJDaGFydE9wdGlvbj4oJ0FYX0JBUl9DSEFSVF9DT05GSUcnLCB7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgZmFjdG9yeTogKCkgPT4ge1xuICAgIGNvbnN0IGdsb2JhbCA9IGluamVjdChBWF9HTE9CQUxfQ09ORklHKTtcbiAgICBzZXQoZ2xvYmFsLCAnY2hhcnQuYmFyQ2hhcnQnLCBBWEJhckNoYXJ0RGVmYXVsdENvbmZpZyk7XG4gICAgcmV0dXJuIEFYQmFyQ2hhcnREZWZhdWx0Q29uZmlnO1xuICB9LFxufSk7XG5cbmV4cG9ydCB0eXBlIFBhcnRpYWxCYXJDaGFydENvbmZpZyA9IFBhcnRpYWw8QVhCYXJDaGFydE9wdGlvbj47XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXJDaGFydENvbmZpZyhjb25maWc6IFBhcnRpYWxCYXJDaGFydENvbmZpZyA9IHt9KTogQVhCYXJDaGFydE9wdGlvbiB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAuLi5BWEJhckNoYXJ0RGVmYXVsdENvbmZpZyxcbiAgICAuLi5jb25maWcsXG4gIH07XG4gIHJldHVybiByZXN1bHQ7XG59XG4iXX0=","import { NXComponent } from '@acorex/cdk/common';\nimport { AX_CHART_COLOR_PALETTE, getChartColor } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { AXPlatform } from '@acorex/core/platform';\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 xAxis;\n yAxis;\n // Chart dimensions\n width;\n height;\n margin = { top: 20, right: 20, bottom: 30, left: 40 };\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 platform = inject(AXPlatform);\n // Configuration with defaults\n effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\n // Track hidden bars\n hiddenBars = new Set();\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 data = this.data() || [];\n // Filter out hidden bars for visible data\n const visibleData = data.filter((d) => !this.isBarHidden(d.id));\n // Clear existing chart\n this.d3.select(containerElement).selectAll('svg').remove();\n // Early return if no data\n if (!data.length) {\n this.showNoDataMessage(containerElement);\n return;\n }\n // Early return if all bars are hidden\n if (visibleData.length === 0) {\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 using visible data\n this.setupScales(visibleData);\n this.createAxes(chartOptions);\n // Render the bars\n this.renderBars(data);\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 if (this.svg) {\n this.d3?.select(this.chartContainerEl()?.nativeElement).selectAll('svg').remove();\n this.svg = null;\n this.chart = null;\n }\n this._tooltipVisible.set(false);\n }\n /**\n * Sets up chart dimensions and creates SVG with responsive attributes\n */\n setupDimensions(containerElement, options) {\n // Calculate margins based on options\n this.calculateMargins(options, containerElement.clientWidth);\n // Get container dimensions\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n // If options specify width and height, use those, otherwise default to container size\n const minDim = Math.min(200, containerWidth, containerHeight); // Ensure reasonable minimum\n if (options.width && options.height) {\n // Explicit dimensions provided\n this.width = options.width - this.margin.left - this.margin.right;\n this.height = options.height - this.margin.top - this.margin.bottom;\n }\n else {\n // Responsive dimensions\n this.width = Math.max(containerWidth, minDim) - this.margin.left - this.margin.right;\n this.height = Math.max(containerHeight, minDim) - this.margin.top - this.margin.bottom;\n }\n // Create responsive SVG that scales with its container\n const svg = this.d3\n .select(containerElement)\n .append('svg')\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${this.width + this.margin.left + this.margin.right} ${this.height + this.margin.top + this.margin.bottom}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n this.svg = svg;\n // Create chart group with margins\n this.chart = this.svg.append('g').attr('transform', `translate(${this.margin.left},${this.margin.top})`);\n }\n /**\n * Calculates chart margins based on options\n */\n calculateMargins(options, containerWidth) {\n // Start with default margins\n this.margin = {\n top: 20,\n right: 20,\n bottom: 30,\n left: 40,\n };\n const visibleData = this.data().filter((d) => !this.isBarHidden(d.id));\n const barCount = visibleData.length;\n // Pre-emptively increase bottom margin if x-axis labels are likely to be rotated.\n // This is an estimation before scales and full dimensions are calculated.\n if (barCount > 0 && containerWidth > 0) {\n const workingWidth = containerWidth - this.margin.left - this.margin.right;\n if (workingWidth > 0) {\n const availableWidthPerBar = workingWidth / barCount;\n const longestLabel = visibleData.reduce((a, b) => (a.label.length > b.label.length ? a : b), {\n label: '',\n }).label;\n // Estimate font size using the same logic as in createAxes, but with workingWidth.\n const estimatedFontSize = Math.max(11, Math.min(15, Math.round(workingWidth / 45)));\n // Estimate label width (using 0.6 as an average character width-to-height ratio).\n const estimatedLongestLabelWidth = longestLabel.length * estimatedFontSize * 0.6;\n // If estimated label width is greater than the space available, rotation will occur.\n if (estimatedLongestLabelWidth > availableWidthPerBar) {\n // Add space for rotated labels. The height of the rotated label's bounding box\n // is roughly its length * sin(45 degrees). Add some padding.\n const requiredExtraMargin = estimatedLongestLabelWidth * Math.sin(Math.PI / 4) + 10;\n this.margin.bottom += Math.min(60, requiredExtraMargin); // Cap max extra margin.\n }\n }\n }\n // Adjust margins if axis labels are present\n if (options.xAxisLabel) {\n const xLabelLength = options.xAxisLabel.length;\n const extraBottomMargin = Math.min(20, Math.max(10, xLabelLength * 0.8));\n this.margin.bottom = Math.max(this.margin.bottom, 30 + extraBottomMargin);\n }\n if (options.yAxisLabel) {\n const yLabelLength = options.yAxisLabel.length;\n const extraLeftMargin = Math.min(20, Math.max(10, yLabelLength * 0.8));\n this.margin.left = Math.max(this.margin.left, 40 + extraLeftMargin);\n }\n // Ensure minimum margins for axes\n if (options.showXAxis !== false) {\n this.margin.bottom = Math.max(this.margin.bottom, 35);\n }\n if (options.showYAxis !== false) {\n this.margin.left = Math.max(this.margin.left, 45);\n }\n }\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.label))\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 axes with grid lines\n */\n createAxes(options) {\n // Only create axes if they are enabled in options\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n const isRtl = this.platform.isRtl();\n // Create a group for all axes\n const axesGroup = this.chart.append('g').attr('class', 'ax-bar-chart-axes');\n if (showXAxis) {\n // Create X axis\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));\n // Style the axis text\n const dynamicXAxisTickFontSize = Math.max(11, Math.min(15, Math.round(this.width / 45)));\n const xAxisTicks = this.xAxis\n .selectAll('text')\n .style('font-size', `${dynamicXAxisTickFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)');\n // Automatically rotate labels if they are likely to overlap\n if (this.xScale.domain().length > 0) {\n const step = this.xScale.step();\n const longestLabel = this.xScale.domain().reduce((a, b) => (a.length > b.length ? a : b), '');\n // Using 0.55 as a safer estimate for char width-to-height ratio\n const estimatedLongestLabelWidth = longestLabel.length * dynamicXAxisTickFontSize * 0.55;\n if (estimatedLongestLabelWidth > step) {\n xAxisTicks\n .attr('transform', 'rotate(-45)')\n .style('text-anchor', 'end')\n .attr('dx', '-0.8em')\n .attr('dy', '0.15em');\n }\n }\n // Style all lines in the x-axis (path, ticks)\n this.xAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n // Add X axis label if provided\n if (options.xAxisLabel) {\n const labelY = this.height + this.margin.bottom * 0.8;\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', 'middle')\n .attr('x', this.width / 2)\n .attr('y', labelY)\n .style('font-size', '14px')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n .text(options.xAxisLabel);\n }\n }\n if (showYAxis) {\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 dynamicYAxisTickFontSize = Math.max(11, Math.min(15, Math.round(this.height / 30)));\n const yTickTexts = this.yAxis\n .selectAll('text')\n .style('font-size', `${dynamicYAxisTickFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)');\n if (isRtl) {\n yTickTexts.attr('text-anchor', 'start');\n }\n // Style all lines in the y-axis (path, ticks)\n this.yAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n // Add Y axis label if provided\n if (options.yAxisLabel) {\n const labelX = -this.height / 2;\n const labelY = -this.margin.left * 0.8;\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 .style('font-size', '14px')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n .text(options.yAxisLabel);\n }\n }\n if (showGrid) {\n // Add horizontal grid lines\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 /**\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(); // Get the original full data set\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 = this.getEasingFunction(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('rect')\n .attr('class', 'ax-bar-chart-bar')\n .attr('x', (d) => this.xScale(d.label))\n .attr('width', this.xScale.bandwidth())\n .attr('y', this.height) // Start from bottom for animation\n .attr('height', 0) // Start with height 0 for animation\n .attr('rx', radius) // Rounded corners\n .attr('ry', radius) // Rounded corners\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.label) + 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('rect');\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, 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('rect');\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 .attr('y', (d) => this.yScale(d.value))\n .attr('height', (d) => this.height - this.yScale(d.value))\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 * Gets the appropriate D3 easing function based on the option string\n */\n getEasingFunction(easing) {\n switch (easing) {\n case 'linear':\n return this.d3.easeLinear;\n case 'ease':\n return this.d3.easePolyInOut;\n case 'ease-in':\n return this.d3.easePolyIn;\n case 'ease-out':\n return this.d3.easePolyOut;\n case 'ease-in-out':\n return this.d3.easePolyInOut;\n case 'cubic':\n return this.d3.easeCubic;\n case 'cubic-in':\n return this.d3.easeCubicIn;\n case 'cubic-out':\n return this.d3.easeCubicOut;\n case 'cubic-in-out':\n return this.d3.easeCubicInOut;\n default:\n return this.d3.easeCubicOut; // Default easing\n }\n }\n /**\n * Handles bar hover event and shows tooltip\n */\n handleBarHover(event, datum) {\n if (this.effectiveOptions().showTooltip !== false) {\n const index = this.data().findIndex((item) => item.id === datum.id);\n const color = datum.color || this.getColor(index);\n // Calculate percentage of total\n const total = this.data().reduce((sum, item) => sum + item.value, 0);\n const percentage = total > 0 ? ((datum.value / total) * 100).toFixed(1) : '0';\n this._tooltipData.set({\n title: datum.tooltipLabel || datum.label,\n value: datum.value.toString(),\n percentage: `${percentage}%`,\n color: color,\n });\n this.updateTooltipPosition(event);\n this._tooltipVisible.set(true);\n }\n }\n /**\n * Updates tooltip position based on mouse coordinates\n */\n updateTooltipPosition(event) {\n const container = this.chartContainerEl().nativeElement.getBoundingClientRect();\n const tooltipEl = this.chartContainerEl().nativeElement.querySelector('.chart-tooltip');\n if (!tooltipEl) {\n const x = event.clientX - container.left;\n const y = event.clientY - container.top;\n this._tooltipPosition.set({ x, y });\n return;\n }\n const tooltipRect = tooltipEl.getBoundingClientRect();\n let x = event.clientX - container.left;\n const y = event.clientY - container.top;\n // Adjust position if near the right edge\n if (x + tooltipRect.width + 10 > container.width) {\n x = x - tooltipRect.width - 10;\n }\n else {\n x = x + 10;\n }\n this._tooltipPosition.set({ x, y });\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 // Clear existing contents first\n this.d3.select(containerElement).selectAll('*').remove();\n const messageContainer = this.d3\n .select(containerElement)\n .append('div')\n // Apply generic container class, specific bar chart background class, and existing specific class\n .attr('class', 'ax-chart-message-container ax-bar-chart-message-background ax-bar-chart-no-data-message');\n // Add an icon\n messageContainer\n .append('div')\n // Apply generic icon class and specific bar chart icon class\n .attr('class', 'ax-chart-message-icon ax-bar-chart-no-data-icon')\n .html('<i class=\"fa-light fa-chart-column fa-2x\"></i>');\n // Add text message\n messageContainer\n .append('div')\n // Apply generic text class and specific bar chart text class\n .attr('class', 'ax-chart-message-text ax-bar-chart-no-data-text')\n .text('No data available');\n // Add help text\n messageContainer\n .append('div')\n // Apply generic help class and specific bar chart help class\n .attr('class', 'ax-chart-message-help ax-bar-chart-no-data-help')\n .text('Please provide data to display the chart');\n }\n /**\n * Shows a message when all bars are hidden\n */\n showAllBarsHiddenMessage(containerElement) {\n // Clear existing contents first\n this.d3.select(containerElement).selectAll('*').remove();\n const messageContainer = this.d3\n .select(containerElement)\n .append('div')\n // Apply generic container class, specific bar chart background class, and existing specific class\n .attr('class', 'ax-chart-message-container ax-bar-chart-message-background ax-bar-chart-no-data-message');\n // Add an icon\n messageContainer\n .append('div')\n // Apply generic icon class and specific bar chart icon class\n .attr('class', 'ax-chart-message-icon ax-bar-chart-no-data-icon')\n .html('<i class=\"fa-light fa-eye-slash fa-2x\"></i>');\n // Add text message\n messageContainer\n .append('div')\n // Apply generic text class and specific bar chart text class\n .attr('class', 'ax-chart-message-text ax-bar-chart-no-data-text')\n .text('All bars are hidden');\n // Add help text\n messageContainer\n .append('div')\n // Apply generic help class and specific bar chart help class\n .attr('class', 'ax-chart-message-help ax-bar-chart-no-data-help')\n .text('Click on legend items to show bars');\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 data = this.data() || [];\n const total = data.reduce((sum, item) => sum + (typeof item.value === 'number' ? item.value : 0), 0);\n return data.map((item, index) => {\n const value = typeof item.value === 'number' ? item.value : 0;\n const percentage = total > 0 ? (value / 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 // If the bar is hidden, we shouldn't try to highlight it\n if (id !== null && this.isBarHidden(id)) {\n // Just unhighlight everything when trying to highlight a hidden bar\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 return;\n }\n if (id === null) {\n // If id is null, unhighlight everything\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 return;\n }\n // Find the target bar\n const targetBar = this.svg.selectAll('.ax-bar-chart-bar').filter((d) => d?.id === id);\n // Safety check - if no matching bar is found, do nothing\n if (targetBar.empty())\n return;\n // Check if the target bar is currently highlighted\n const isCurrentlyHighlighted = targetBar.classed('ax-bar-chart-highlighted');\n if (isCurrentlyHighlighted) {\n // If already highlighted, unhighlight all bars\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 else {\n // Reset all bars first\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 // Highlight the target bar\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 // Dim other bars\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 }\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 wasAllHidden = this.data().length > 0 && this.data().every((d) => this.isBarHidden(d.id));\n if (this.hiddenBars.has(id)) {\n // Making a bar visible\n this.hiddenBars.delete(id);\n // If all bars were previously hidden, we need to ensure the message is cleared\n if (wasAllHidden) {\n // Force complete DOM cleanup and redraw\n if (this.chartContainerEl()?.nativeElement) {\n // Clear everything in the container\n this.d3?.select(this.chartContainerEl().nativeElement).selectAll('*').remove();\n // Force full redraw\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n }\n else {\n // Normal update for other cases\n this.updateChart();\n }\n }\n else {\n // Hiding a bar\n this.hiddenBars.add(id);\n this.updateChart();\n }\n // Return the new visibility state\n return !this.hiddenBars.has(id);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.2\", ngImport: i0, type: AXBarChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.1.2\", 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:visible}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.2\", 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:visible}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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9iYXItY2hhcnQvc3JjL2xpYi9iYXItY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2Jhci1jaGFydC9zcmMvbGliL2Jhci1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZFLE9BQU8sRUFBRSx1QkFBdUIsRUFBc0IsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFbkQsT0FBTyxFQUNMLGVBQWUsRUFDZix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBRU4sTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBR3pEOzs7R0FHRztBQVNILE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxXQUFXO0lBQ2xELFNBQVM7SUFDVCx1QkFBdUI7SUFDdkIsSUFBSSxHQUFHLEtBQUssQ0FBbUIsRUFBRSxnREFBQyxDQUFDO0lBRW5DLDBCQUEwQjtJQUMxQixPQUFPLEdBQUcsS0FBSyxDQUFtQixFQUFFLG1EQUFDLENBQUM7SUFFdEMsVUFBVTtJQUNWLG9DQUFvQztJQUNwQyxRQUFRLEdBQUcsTUFBTSxFQUF3QixDQUFDO0lBRTFDLDRCQUE0QjtJQUNYLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxRQUFRLENB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QUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQztRQUVELGtDQUFrQztRQUNsQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEMsQ0FBQzt1R0EzMkJVLG1CQUFtQjsyRkFBbkIsbUJBQW1CLHFnQkNwQ2hDLGlSQVNBLHkzQ0R3QlksdUJBQXVCOzsyRkFHdEIsbUJBQW1CO2tCQVIvQixTQUFTOytCQUNFLGNBQWMsaUJBR1QsaUJBQWlCLENBQUMsSUFBSSxXQUM1QixDQUFDLHVCQUF1QixDQUFDLG1CQUNqQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTlhDb21wb25lbnQgfSBmcm9tICdAYWNvcmV4L2Nkay9jb21tb24nO1xuaW1wb3J0IHsgQVhfQ0hBUlRfQ09MT1JfUEFMRVRURSwgZ2V0Q2hhcnRDb2xvciB9IGZyb20gJ0BhY29yZXgvY2hhcnRzJztcbmltcG9ydCB7IEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlLCBBWENoYXJ0TGVnZW5kSXRlbSB9IGZyb20gJ0BhY29yZXgvY2hhcnRzL2NoYXJ0LWxlZ2VuZCc7XG5pbXBvcnQgeyBBWENoYXJ0VG9vbHRpcENvbXBvbmVudCwgQVhDaGFydFRvb2x0aXBEYXRhIH0gZnJvbSAnQGFjb3JleC9jaGFydHMvY2hhcnQtdG9vbHRpcCc7XG5pbXBvcnQgeyBBWFBsYXRmb3JtIH0gZnJvbSAnQGFjb3JleC9jb3JlL3BsYXRmb3JtJztcblxuaW1wb3J0IHtcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBFbGVtZW50UmVmLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBPbkRlc3Ryb3ksXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxuICB2aWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYX0JBUl9DSEFSVF9DT05GSUcgfSBmcm9tICcuL2Jhci1jaGFydC5jb25maWcnO1xuaW1wb3J0IHsgQVhCYXJDaGFydENsaWNrRXZlbnQsIEFYQmFyQ2hhcnREYXRhLCBBWEJhckNoYXJ0T3B0aW9uIH0gZnJvbSAnLi9iYXItY2hhcnQudHlwZSc7XG5cbi8qKlxuICogQmFyIENoYXJ0IENvbXBvbmVudFxuICogUmVuZGVycyBkYXRhIGFzIHZlcnRpY2FsIGJhcnMgd2l0aCBpbnRlcmFjdGl2ZSBob3ZlciBlZmZlY3RzIGFuZCBhbmltYXRpb25zXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2F4LWJhci1jaGFydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9iYXItY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9iYXItY2hhcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW0FYQ2hhcnRUb29sdGlwQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFYQmFyQ2hhcnRDb21wb25lbnQgZXh0ZW5kcyBOWENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQVhDaGFydExlZ2VuZENvbXBhdGlibGUge1xuICAvLyBJbnB1dHNcbiAgLyoqIENoYXJ0IGRhdGEgaW5wdXQgKi9cbiAgZGF0YSA9IGlucHV0PEFYQmFyQ2hhcnREYXRhW10+KFtdKTtcblxuICAvKiogQ2hhcnQgb3B0aW9ucyBpbnB1dCAqL1xuICBvcHRpb25zID0gaW5wdXQ8QVhCYXJDaGFydE9wdGlvbj4oe30pO1xuXG4gIC8vIE91dHB1dHNcbiAgLyoqIEVtaXR0ZWQgd2hlbiBhIGJhciBpcyBjbGlja2VkICovXG4gIGJhckNsaWNrID0gb3V0cHV0PEFYQmFyQ2hhcnRDbGlja0V2ZW50PigpO1xuXG4gIC8vIENoYXJ0IGNvbnRhaW5lciByZWZlcmVuY2VcbiAgcHJpdmF0ZSByZWFkb25seSBjaGFydENvbnRhaW5lckVsID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignY2hhcnRDb250YWluZXInKTtcblxuICAvLyBEMyByZWZlcmVuY2UgLSBsb2FkZWQgYXN5bmNocm9ub3VzbHlcbiAgcHJvdGVjdGVkIGQzITogdHlwZW9mIGltcG9ydCgnZDMnKTtcblxuICAvLyBDaGFydCBlbGVtZW50c1xuICBwcml2YXRlIHN2ZyE6IGFueTtcbiAgcHJpdmF0ZSBjaGFydCE6IGFueTtcbiAgcHJpdmF0ZSB4U2NhbGUhOiBhbnk7XG4gIHByaXZhdGUgeVNjYWxlITogYW55O1xuICBwcml2YXRlIHhBeGlzITogYW55O1xuICBwcml2YXRlIHlBeGlzITogYW55O1xuXG4gIC8vIENoYXJ0IGRpbWVuc2lvbnNcbiAgcHJpdmF0ZSB3aWR0aCE6IG51bWJlcjtcbiAgcHJpdmF0ZSBoZWlnaHQhOiBudW1iZXI7XG4gIHByaXZhdGUgbWFyZ2luID0geyB0b3A6IDIwLCByaWdodDogMjAsIGJvdHRvbTogMzAsIGxlZnQ6IDQwIH07XG5cbiAgLy8gQW5pbWF0aW9uIHN0YXRlXG4gIHByaXZhdGUgX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gVG9vbHRpcCBzdGF0ZVxuICBwcml2YXRlIF90b29sdGlwVmlzaWJsZSA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX3Rvb2x0aXBQb3NpdGlvbiA9IHNpZ25hbCh7IHg6IDAsIHk6IDAgfSk7XG4gIHByaXZhdGUgX3Rvb2x0aXBEYXRhID0gc2lnbmFsPEFYQ2hhcnRUb29sdGlwRGF0YT4oe1xuICAgIHRpdGxlOiAnJyxcbiAgICB2YWx1ZTogJzAnLFxuICAgIHBlcmNlbnRhZ2U6ICcwJScsXG4gICAgY29sb3I6ICcnLFxuICB9KTtcblxuICAvLyBTaWduYWxzIGZvciBjb21wb25lbnQgc3RhdGVcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9yZW5kZXJlZCA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gVG9vbHRpcCBhY2Nlc3NvcnNcbiAgcHJvdGVjdGVkIHRvb2x0aXBWaXNpYmxlID0gdGhpcy5fdG9vbHRpcFZpc2libGUuYXNSZWFkb25seSgpO1xuICBwcm90ZWN0ZWQgdG9vbHRpcFBvc2l0aW9uID0gdGhpcy5fdG9vbHRpcFBvc2l0aW9uLmFzUmVhZG9ubHkoKTtcbiAgcHJvdGVjdGVkIHRvb2x0aXBEYXRhID0gdGhpcy5fdG9vbHRpcERhdGEuYXNSZWFkb25seSgpO1xuXG4gIC8vIEluamVjdCBjb25maWd1cmF0aW9uXG4gIHByaXZhdGUgY29uZmlnVG9rZW4gPSBpbmplY3QoQVhfQkFSX0NIQVJUX0NPTkZJRyk7XG5cbiAgLy8gSW5qZWN0IHRoZSBjaGFydCBjb2xvcnNcbiAgcHJpdmF0ZSBjaGFydENvbG9ycyA9IGluamVjdChBWF9DSEFSVF9DT0xPUl9QQUxFVFRFKTtcblxuICAvLyBJbmplY3QgQVhQbGF0Zm9ybVxuICBwcml2YXRlIHBsYXRmb3JtID0gaW5qZWN0KEFYUGxhdGZvcm0pO1xuXG4gIC8vIENvbmZpZ3VyYXRpb24gd2l0aCBkZWZhdWx0c1xuICBwcm90ZWN0ZWQgZWZmZWN0aXZlT3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25maWdUb2tlbixcbiAgICAgIC4uLnRoaXMub3B0aW9ucygpLFxuICAgIH07XG4gIH0pO1xuXG4gIC8vIFRyYWNrIGhpZGRlbiBiYXJzXG4gIHByaXZhdGUgaGlkZGVuQmFycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gRHluYW1pY2FsbHkgbG9hZCBEMyBhbmQgaW5pdGlhbGl6ZSB0aGUgY2hhcnQgd2hlbiB0aGUgY29tcG9uZW50IGlzIHJlYWR5XG4gICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICAgIHRoaXMuX2luaXRpYWxpemVkLnNldCh0cnVlKTtcbiAgICAgIHRoaXMubG9hZEQzKCk7XG4gICAgICAvLyBDcmVhdGUgY2hhcnQgYWZ0ZXIgRDMgaXMgbG9hZGVkIGFuZCBjb250YWluZXIgaXMgYXZhaWxhYmxlXG4gICAgICBpZiAodGhpcy5kMyAmJiB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKSkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkLnNldCh0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFdhdGNoIGZvciBjaGFuZ2VzIHRvIHJlZHJhdyB0aGUgY2hhcnRcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgLy8gQWNjZXNzIGlucHV0cyB0byB0cmFjayB0aGVtXG4gICAgICB0aGlzLmRhdGEoKTtcbiAgICAgIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuXG4gICAgICAvLyBPbmx5IHVwZGF0ZSBpZiBhbHJlYWR5IHJlbmRlcmVkXG4gICAgICBpZiAodGhpcy5fcmVuZGVyZWQoKSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXBDaGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIEQzLmpzIGR5bmFtaWNhbGx5XG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgbG9hZEQzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmQzID0gYXdhaXQgaW1wb3J0KCdkMycpO1xuICAgICAgLy8gSWYgY29udGFpbmVyIGlzIHJlYWR5LCBjcmVhdGUgY2hhcnRcbiAgICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCgpICYmIHRoaXMuY2hhcnRDb250YWluZXJFbCgpKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZWQuc2V0KHRydWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBEMy5qczonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGJhciBjaGFydCBTVkcgYW5kIHJlbmRlcnMgYWxsIGVsZW1lbnRzXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmQzIHx8ICF0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YSgpIHx8IFtdO1xuXG4gICAgLy8gRmlsdGVyIG91dCBoaWRkZW4gYmFycyBmb3IgdmlzaWJsZSBkYXRhXG4gICAgY29uc3QgdmlzaWJsZURhdGEgPSBkYXRhLmZpbHRlcigoZCkgPT4gIXRoaXMuaXNCYXJIaWRkZW4oZC5pZCkpO1xuXG4gICAgLy8gQ2xlYXIgZXhpc3RpbmcgY2hhcnRcbiAgICB0aGlzLmQzLnNlbGVjdChjb250YWluZXJFbGVtZW50KS5zZWxlY3RBbGwoJ3N2ZycpLnJlbW92ZSgpO1xuXG4gICAgLy8gRWFybHkgcmV0dXJuIGlmIG5vIGRhdGFcbiAgICBpZiAoIWRhdGEubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNob3dOb0RhdGFNZXNzYWdlKGNvbnRhaW5lckVsZW1lbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEVhcmx5IHJldHVybiBpZiBhbGwgYmFycyBhcmUgaGlkZGVuXG4gICAgaWYgKHZpc2libGVEYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5zaG93QWxsQmFyc0hpZGRlbk1lc3NhZ2UoY29udGFpbmVyRWxlbWVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gR2V0IG9wdGlvbnMgYW5kIHNldHVwIGRpbWVuc2lvbnNcbiAgICBjb25zdCBjaGFydE9wdGlvbnMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKTtcbiAgICB0aGlzLnNldHVwRGltZW5zaW9ucyhjb250YWluZXJFbGVtZW50LCBjaGFydE9wdGlvbnMpO1xuXG4gICAgLy8gQ3JlYXRlIHNjYWxlcyBhbmQgYXhlcyB1c2luZyB2aXNpYmxlIGRhdGFcbiAgICB0aGlzLnNldHVwU2NhbGVzKHZpc2libGVEYXRhKTtcbiAgICB0aGlzLmNyZWF0ZUF4ZXMoY2hhcnRPcHRpb25zKTtcblxuICAgIC8vIFJlbmRlciB0aGUgYmFyc1xuICAgIHRoaXMucmVuZGVyQmFycyhkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBjaGFydCB3aGVuIGlucHV0cyBjaGFuZ2VcbiAgICovXG4gIHByb3RlY3RlZCB1cGRhdGVDaGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW5zIHVwIGNoYXJ0IHJlc291cmNlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGNsZWFudXBDaGFydCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdmcpIHtcbiAgICAgIHRoaXMuZDM/LnNlbGVjdCh0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkuc2VsZWN0QWxsKCdzdmcnKS5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc3ZnID0gbnVsbDtcbiAgICAgIHRoaXMuY2hhcnQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgY2hhcnQgZGltZW5zaW9ucyBhbmQgY3JlYXRlcyBTVkcgd2l0aCByZXNwb25zaXZlIGF0dHJpYnV0ZXNcbiAgICovXG4gIHByaXZhdGUgc2V0dXBEaW1lbnNpb25zKGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zOiBBWEJhckNoYXJ0T3B0aW9uKTogdm9pZCB7XG4gICAgLy8gQ2FsY3VsYXRlIG1hcmdpbnMgYmFzZWQgb24gb3B0aW9uc1xuICAgIHRoaXMuY2FsY3VsYXRlTWFyZ2lucyhvcHRpb25zLCBjb250YWluZXJFbGVtZW50LmNsaWVudFdpZHRoKTtcblxuICAgIC8vIEdldCBjb250YWluZXIgZGltZW5zaW9uc1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gY29udGFpbmVyRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSBjb250YWluZXJFbGVtZW50LmNsaWVudEhlaWdodDtcblxuICAgIC8vIElmIG9wdGlvbnMgc3BlY2lmeSB3aWR0aCBhbmQgaGVpZ2h0LCB1c2UgdGhvc2UsIG90aGVyd2lzZSBkZWZhdWx0IHRvIGNvbnRhaW5lciBzaXplXG4gICAgY29uc3QgbWluRGltID0gTWF0aC5taW4oMjAwLCBjb250YWluZXJXaWR0aCwgY29udGFpbmVySGVpZ2h0KTsgLy8gRW5zdXJlIHJlYXNvbmFibGUgbWluaW11bVxuXG4gICAgaWYgKG9wdGlvbnMud2lkdGggJiYgb3B0aW9ucy5oZWlnaHQpIHtcbiAgICAgIC8vIEV4cGxpY2l0IGRpbWVuc2lvbnMgcHJvdmlkZWRcbiAgICAgIHRoaXMud2lkdGggPSBvcHRpb25zLndpZHRoIC0gdGhpcy5tYXJnaW4ubGVmdCAtIHRoaXMubWFyZ2luLnJpZ2h0O1xuICAgICAgdGhpcy5oZWlnaHQgPSBvcHRpb25zLmhlaWdodCAtIHRoaXMubWFyZ2luLnRvcCAtIHRoaXMubWFyZ2luLmJvdHRvbTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVzcG9uc2l2ZSBkaW1lbnNpb25zXG4gICAgICB0aGlzLndpZHRoID0gTWF0aC5tYXgoY29udGFpbmVyV2lkdGgsIG1pbkRpbSkgLSB0aGlzLm1hcmdpbi5sZWZ0IC0gdGhpcy5tYXJnaW4ucmlnaHQ7XG4gICAgICB0aGlzLmhlaWdodCA9IE1hdGgubWF4KGNvbnRhaW5lckhlaWdodCwgbWluRGltKSAtIHRoaXMubWFyZ2luLnRvcCAtIHRoaXMubWFyZ2luLmJvdHRvbTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgcmVzcG9uc2l2ZSBTVkcgdGhhdCBzY2FsZXMgd2l0aCBpdHMgY29udGFpbmVyXG4gICAgY29uc3Qgc3ZnID0gdGhpcy5kM1xuICAgICAgLnNlbGVjdChjb250YWluZXJFbGVtZW50KVxuICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgIC5hdHRyKCd3aWR0aCcsICcxMDAlJylcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCAnMTAwJScpXG4gICAgICAuYXR0cihcbiAgICAgICAgJ3ZpZXdCb3gnLFxuICAgICAgICBgMCAwICR7dGhpcy53aWR0aCArIHRoaXMubWFyZ2luLmxlZnQgKyB0aGlzLm1hcmdpbi5yaWdodH0gJHt0aGlzLmhlaWdodCArIHRoaXMubWFyZ2luLnRvcCArIHRoaXMubWFyZ2luLmJvdHRvbX1gLFxuICAgICAgKVxuICAgICAgLmF0dHIoJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLCAneE1pZFlNaWQgbWVldCcpO1xuXG4gICAgdGhpcy5zdmcgPSBzdmc7XG5cbiAgICAvLyBDcmVhdGUgY2hhcnQgZ3JvdXAgd2l0aCBtYXJnaW5zXG4gICAgdGhpcy5jaGFydCA9IHRoaXMuc3ZnLmFwcGVuZCgnZycpLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHt0aGlzLm1hcmdpbi5sZWZ0fSwke3RoaXMubWFyZ2luLnRvcH0pYCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyBjaGFydCBtYXJnaW5zIGJhc2VkIG9uIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlTWFyZ2lucyhvcHRpb25zOiBBWEJhckNoYXJ0T3B0aW9uLCBjb250YWluZXJXaWR0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gU3RhcnQgd2l0aCBkZWZhdWx0IG1hcmdpbnNcbiAgICB0aGlzLm1hcmdpbiA9IHtcbiAgICAgIHRvcDogMjAsXG4gICAgICByaWdodDogMjAsXG4gICAgICBib3R0b206IDMwLFxuICAgICAgbGVmdDogNDAsXG4gICAgfTtcblxuICAgIGNvbnN0IHZpc2libGVEYXRhID0gdGhpcy5kYXRhKCkuZmlsdGVyKChkKSA9PiAhdGhpcy5pc0JhckhpZGRlbihkLmlkKSk7XG4gICAgY29uc3QgYmFyQ291bnQgPSB2aXNpYmxlRGF0YS5sZW5ndGg7XG5cbiAgICAvLyBQcmUtZW1wdGl2ZWx5IGluY3JlYXNlIGJvdHRvbSBtYXJnaW4gaWYgeC1heGlzIGxhYmVscyBhcmUgbGlrZWx5IHRvIGJlIHJvdGF0ZWQuXG4gICAgLy8gVGhpcyBpcyBhbiBlc3RpbWF0aW9uIGJlZm9yZSBzY2FsZXMgYW5kIGZ1bGwgZGltZW5zaW9ucyBhcmUgY2FsY3VsYXRlZC5cbiAgICBpZiAoYmFyQ291bnQgPiAwICYmIGNvbnRhaW5lcldpZHRoID4gMCkge1xuICAgICAgY29uc3Qgd29ya2luZ1dpZHRoID0gY29udGFpbmVyV2lkdGggLSB0aGlzLm1hcmdpbi5sZWZ0IC0gdGhpcy5tYXJnaW4ucmlnaHQ7XG4gICAgICBpZiAod29ya2luZ1dpZHRoID4gMCkge1xuICAgICAgICBjb25zdCBhdmFpbGFibGVXaWR0aFBlckJhciA9IHdvcmtpbmdXaWR0aCAvIGJhckNvdW50O1xuXG4gICAgICAgIGNvbnN0IGxvbmdlc3RMYWJlbCA9IHZpc2libGVEYXRhLnJlZHVjZSgoYSwgYikgPT4gKGEubGFiZWwubGVuZ3RoID4gYi5sYWJlbC5sZW5ndGggPyBhIDogYiksIHtcbiAgICAgICAgICBsYWJlbDogJycsXG4gICAgICAgIH0pLmxhYmVsO1xuXG4gICAgICAgIC8vIEVzdGltYXRlIGZvbnQgc2l6ZSB1c2luZyB0aGUgc2FtZSBsb2dpYyBhcyBpbiBjcmVhdGVBeGVzLCBidXQgd2l0aCB3b3JraW5nV2lkdGguXG4gICAgICAgIGNvbnN0IGVzdGltYXRlZEZvbnRTaXplID0gTWF0aC5tYXgoMTEsIE1hdGgubWluKDE1LCBNYXRoLnJvdW5kKHdvcmtpbmdXaWR0aCAvIDQ1KSkpO1xuXG4gICAgICAgIC8vIEVzdGltYXRlIGxhYmVsIHdpZHRoICh1c2luZyAwLjYgYXMgYW4gYXZlcmFnZSBjaGFyYWN0ZXIgd2lkdGgtdG8taGVpZ2h0IHJhdGlvKS5cbiAgICAgICAgY29uc3QgZXN0aW1hdGVkTG9uZ2VzdExhYmVsV2lkdGggPSBsb25nZXN0TGFiZWwubGVuZ3RoICogZXN0aW1hdGVkRm9udFNpemUgKiAwLjY7XG5cbiAgICAgICAgLy8gSWYgZXN0aW1hdGVkIGxhYmVsIHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BhY2UgYXZhaWxhYmxlLCByb3RhdGlvbiB3aWxsIG9jY3VyLlxuICAgICAgICBpZiAoZXN0aW1hdGVkTG9uZ2VzdExhYmVsV2lkdGggPiBhdmFpbGFibGVXaWR0aFBlckJhcikge1xuICAgICAgICAgIC8vIEFkZCBzcGFjZSBmb3Igcm90YXRlZCBsYWJlbHMuIFRoZSBoZWlnaHQgb2YgdGhlIHJvdGF0ZWQgbGFiZWwncyBib3VuZGluZyBib3hcbiAgICAgICAgICAvLyBpcyByb3VnaGx5IGl0cyBsZW5ndGggKiBzaW4oNDUgZGVncmVlcykuIEFkZCBzb21lIHBhZGRpbmcuXG4gICAgICAgICAgY29uc3QgcmVxdWlyZWRFeHRyYU1hcmdpbiA9IGVzdGltYXRlZExvbmdlc3RMYWJlbFdpZHRoICogTWF0aC5zaW4oTWF0aC5QSSAvIDQpICsgMTA7XG4gICAgICAgICAgdGhpcy5tYXJnaW4uYm90dG9tICs9IE1hdGgubWluKDYwLCByZXF1aXJlZEV4dHJhTWFyZ2luKTsgLy8gQ2FwIG1heCBleHRyYSBtYXJnaW4uXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGp1c3QgbWFyZ2lucyBpZiBheGlzIGxhYmVscyBhcmUgcHJlc2VudFxuICAgIGlmIChvcHRpb25zLnhBeGlzTGFiZWwpIHtcbiAgICAgIGNvbnN0IHhMYWJlbExlbmd0aCA9IG9wdGlvbnMueEF4aXNMYWJlbC5sZW5ndGg7XG4gICAgICBjb25zdCBleHRyYUJvdHRvbU1hcmdpbiA9IE1hdGgubWluKDIwLCBNYXRoLm1heCgxMCwgeExhYmVsTGVuZ3RoICogMC44KSk7XG4gICAgICB0aGlzLm1hcmdpbi5ib3R0b20gPSBNYXRoLm1heCh0aGlzLm1hcmdpbi5ib3R0b20sIDMwICsgZXh0cmFCb3R0b21NYXJnaW4pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnlBeGlzTGFiZWwpIHtcbiAgICAgIGNvbnN0IHlMYWJlbExlbmd0aCA9IG9wdGlvbnMueUF4aXNMYWJlbC5sZW5ndGg7XG4gICAgICBjb25zdCBleHRyYUxlZnRNYXJnaW4gPSBNYXRoLm1pbigyMCwgTWF0aC5tYXgoMTAsIHlMYWJlbExlbmd0aCAqIDAuOCkpO1xuICAgICAgdGhpcy5tYXJnaW4ubGVmdCA9IE1hdGgubWF4KHRoaXMubWFyZ2luLmxlZnQsIDQwICsgZXh0cmFMZWZ0TWFyZ2luKTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgbWluaW11bSBtYXJnaW5zIGZvciBheGVzXG4gICAgaWYgKG9wdGlvbnMuc2hvd1hBeGlzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5tYXJnaW4uYm90dG9tID0gTWF0aC5tYXgodGhpcy5tYXJnaW4uYm90dG9tLCAzNSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc2hvd1lBeGlzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5tYXJnaW4ubGVmdCA9IE1hdGgubWF4KHRoaXMubWFyZ2luLmxlZnQsIDQ1KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB4IGFuZCB5IHNjYWxlcyBmb3IgdGhlIGNoYXJ0XG4gICAqL1xuICBwcml2YXRlIHNldHVwU2NhbGVzKGRhdGE6IEFYQmFyQ2hhcnREYXRhW10pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIGJhciB3aWR0aCBwZXJjZW50YWdlIChkZWZhdWx0IDgwJSlcbiAgICBjb25zdCBiYXJXaWR0aFBlcmNlbnQgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5iYXJXaWR0aCA/PyA2MCAvIDEwMDtcbiAgICAvLyBDYWxjdWxhdGUgcGFkZGluZyBiYXNlZCBvbiBiYXJXaWR0aCAoaW52ZXJzZSByZWxhdGlvbnNoaXApXG4gICAgY29uc3QgcGFkZGluZyA9IE1hdGgubWF4KDAuMSwgMSAtIGJhcldpZHRoUGVyY2VudCk7XG5cbiAgICAvLyBDcmVhdGUgeCBzY2FsZSAoYmFuZCBzY2FsZSBmb3IgY2F0ZWdvcmljYWwgZGF0YSlcbiAgICB0aGlzLnhTY2FsZSA9IHRoaXMuZDNcbiAgICAgIC5zY2FsZUJhbmQoKVxuICAgICAgLmRvbWFpbihkYXRhLm1hcCgoZCkgPT4gZC5sYWJlbCkpXG4gICAgICAucmFuZ2UoWzAsIHRoaXMud2lkdGhdKVxuICAgICAgLnBhZGRpbmcocGFkZGluZyk7XG5cbiAgICAvLyBDcmVhdGUgeSBzY2FsZSAobGluZWFyIHNjYWxlIGZvciB2YWx1ZXMpXG4gICAgdGhpcy55U2NhbGUgPSB0aGlzLmQzXG4gICAgICAuc2NhbGVMaW5lYXIoKVxuICAgICAgLmRvbWFpbihbMCwgdGhpcy5kMy5tYXgoZGF0YSwgKGQpID0+IGQudmFsdWUpIHx8IDBdKVxuICAgICAgLm5pY2UoKVxuICAgICAgLnJhbmdlKFt0aGlzLmhlaWdodCwgMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgeCBhbmQgeSBheGVzIHdpdGggZ3JpZCBsaW5lc1xuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVBeGVzKG9wdGlvbnM6IEFYQmFyQ2hhcnRPcHRpb24pOiB2b2lkIHtcbiAgICAvLyBPbmx5IGNyZWF0ZSBheGVzIGlmIHRoZXkgYXJlIGVuYWJsZWQgaW4gb3B0aW9uc1xuICAgIGNvbnN0IHNob3dYQXhpcyA9IG9wdGlvbnMuc2hvd1hBeGlzICE9PSBmYWxzZTtcbiAgICBjb25zdCBzaG93WUF4aXMgPSBvcHRpb25zLnNob3dZQXhpcyAhPT0gZmFsc2U7XG4gICAgY29uc3Qgc2hvd0dyaWQgPSBvcHRpb25zLnNob3dHcmlkICE9PSBmYWxzZTtcbiAgICBjb25zdCBpc1J0bCA9IHRoaXMucGxhdGZvcm0uaXNSdGwoKTtcblxuICAgIC8vIENyZWF0ZSBhIGdyb3VwIGZvciBhbGwgYXhlc1xuICAgIGNvbnN0IGF4ZXNHcm91cCA9IHRoaXMuY2hhcnQuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWF4ZXMnKTtcblxuICAgIGlmIChzaG93WEF4aXMpIHtcbiAgICAgIC8vIENyZWF0ZSBYIGF4aXNcbiAgICAgIHRoaXMueEF4aXMgPSBheGVzR3JvdXBcbiAgICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYXhpcy14JylcbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwke3RoaXMuaGVpZ2h0fSlgKVxuICAgICAgICAuY2FsbCh0aGlzLmQzLmF4aXNCb3R0b20odGhpcy54U2NhbGUpKTtcblxuICAgICAgLy8gU3R5bGUgdGhlIGF4aXMgdGV4dFxuICAgICAgY29uc3QgZHluYW1pY1hBeGlzVGlja0ZvbnRTaXplID0gTWF0aC5tYXgoMTEsIE1hdGgubWluKDE1LCBNYXRoLnJvdW5kKHRoaXMud2lkdGggLyA0NSkpKTtcbiAgICAgIGNvbnN0IHhBeGlzVGlja3MgPSB0aGlzLnhBeGlzXG4gICAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxuICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGAke2R5bmFtaWNYQXhpc1RpY2tGb250U2l6ZX1weGApXG4gICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNDAwJylcbiAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYmEodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtbGFiZWxzLWNvbG9yKSwgMC43KScpO1xuXG4gICAgICAvLyBBdXRvbWF0aWNhbGx5IHJvdGF0ZSBsYWJlbHMgaWYgdGhleSBhcmUgbGlrZWx5IHRvIG92ZXJsYXBcbiAgICAgIGlmICh0aGlzLnhTY2FsZS5kb21haW4oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnhTY2FsZS5zdGVwKCk7XG4gICAgICAgIGNvbnN0IGxvbmdlc3RMYWJlbCA9IHRoaXMueFNjYWxlLmRvbWFpbigpLnJlZHVjZSgoYSwgYikgPT4gKGEubGVuZ3RoID4gYi5sZW5ndGggPyBhIDogYiksICcnKTtcbiAgICAgICAgLy8gVXNpbmcgMC41NSBhcyBhIHNhZmVyIGVzdGltYXRlIGZvciBjaGFyIHdpZHRoLXRvLWhlaWdodCByYXRpb1xuICAgICAgICBjb25zdCBlc3RpbWF0ZWRMb25nZXN0TGFiZWxXaWR0aCA9IGxvbmdlc3RMYWJlbC5sZW5ndGggKiBkeW5hbWljWEF4aXNUaWNrRm9udFNpemUgKiAwLjU1O1xuXG4gICAgICAgIGlmIChlc3RpbWF0ZWRMb25nZXN0TGFiZWxXaWR0aCA+IHN0ZXApIHtcbiAgICAgICAgICB4QXhpc1RpY2tzXG4gICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3JvdGF0ZSgtNDUpJylcbiAgICAgICAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnZW5kJylcbiAgICAgICAgICAgIC5hdHRyKCdkeCcsICctMC44ZW0nKVxuICAgICAgICAgICAgLmF0dHIoJ2R5JywgJzAuMTVlbScpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFN0eWxlIGFsbCBsaW5lcyBpbiB0aGUgeC1heGlzIChwYXRoLCB0aWNrcylcbiAgICAgIHRoaXMueEF4aXMuc2VsZWN0QWxsKCdsaW5lLCBwYXRoJykuc3R5bGUoJ3N0cm9rZScsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtZ3JpZC1saW5lcy1jb2xvcikpJyk7XG5cbiAgICAgIC8vIEFkZCBYIGF4aXMgbGFiZWwgaWYgcHJvdmlkZWRcbiAgICAgIGlmIChvcHRpb25zLnhBeGlzTGFiZWwpIHtcbiAgICAgICAgY29uc3QgbGFiZWxZID0gdGhpcy5oZWlnaHQgKyB0aGlzLm1hcmdpbi5ib3R0b20gKiAwLjg7XG5cbiAgICAgICAgYXhlc0dyb3VwXG4gICAgICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1heGlzLWxhYmVsIGF4LXgtYXhpcy1sYWJlbCcpXG4gICAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAgICAgLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ21pZGRsZScpXG4gICAgICAgICAgLmF0dHIoJ3gnLCB0aGlzLndpZHRoIC8gMilcbiAgICAgICAgICAuYXR0cigneScsIGxhYmVsWSlcbiAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcxNHB4JylcbiAgICAgICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJzUwMCcpXG4gICAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWJhci1jaGFydC1heGlzLWxhYmVsLWNvbG9yKSknKVxuICAgICAgICAgIC50ZXh0KG9wdGlvbnMueEF4aXNMYWJlbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dZQXhpcykge1xuICAgICAgLy8gQ3JlYXRlIFkgYXhpc1xuICAgICAgdGhpcy55QXhpcyA9IGF4ZXNHcm91cC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYXhpcy15JykuY2FsbCh0aGlzLmQzLmF4aXNMZWZ0KHRoaXMueVNjYWxlKSk7XG5cbiAgICAgIC8vIFN0eWxlIHRoZSBheGlzIHRleHRcbiAgICAgIGNvbnN0IGR5bmFtaWNZQXhpc1RpY2tGb250U2l6ZSA9IE1hdGgubWF4KDExLCBNYXRoLm1pbigxNSwgTWF0aC5yb3VuZCh0aGlzLmhlaWdodCAvIDMwKSkpO1xuICAgICAgY29uc3QgeVRpY2tUZXh0cyA9IHRoaXMueUF4aXNcbiAgICAgICAgLnNlbGVjdEFsbCgndGV4dCcpXG4gICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgYCR7ZHluYW1pY1lBeGlzVGlja0ZvbnRTaXplfXB4YClcbiAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc0MDAnKVxuICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiYSh2YXIoLS1heC1jb21wLWJhci1jaGFydC1sYWJlbHMtY29sb3IpLCAwLjcpJyk7XG5cbiAgICAgIGlmIChpc1J0bCkge1xuICAgICAgICB5VGlja1RleHRzLmF0dHIoJ3RleHQtYW5jaG9yJywgJ3N0YXJ0Jyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0eWxlIGFsbCBsaW5lcyBpbiB0aGUgeS1heGlzIChwYXRoLCB0aWNrcylcbiAgICAgIHRoaXMueUF4aXMuc2VsZWN0QWxsKCdsaW5lLCBwYXRoJykuc3R5bGUoJ3N0cm9rZScsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtZ3JpZC1saW5lcy1jb2xvcikpJyk7XG5cbiAgICAgIC8vIEFkZCBZIGF4aXMgbGFiZWwgaWYgcHJvdmlkZWRcbiAgICAgIGlmIChvcHRpb25zLnlBeGlzTGFiZWwpIHtcbiAgICAgICAgY29uc3QgbGFiZWxYID0gLXRoaXMuaGVpZ2h0IC8gMjtcbiAgICAgICAgY29uc3QgbGFiZWxZID0gLXRoaXMubWFyZ2luLmxlZnQgKiAwLjg7XG5cbiAgICAgICAgYXhlc0dyb3VwXG4gICAgICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1heGlzLWxhYmVsIGF4LXktYXhpcy1sYWJlbCcpXG4gICAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAgICAgLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ21pZGRsZScpXG4gICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICdyb3RhdGUoLTkwKScpXG4gICAgICAgICAgLmF0dHIoJ3gnLCBsYWJlbFgpXG4gICAgICAgICAgLmF0dHIoJ3knLCBsYWJlbFkpXG4gICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnMTRweCcpXG4gICAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc1MDAnKVxuICAgICAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtYXhpcy1sYWJlbC1jb2xvcikpJylcbiAgICAgICAgICAudGV4dChvcHRpb25zLnlBeGlzTGFiZWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG93R3JpZCkge1xuICAgICAgLy8gQWRkIGhvcml6b250YWwgZ3JpZCBsaW5lc1xuICAgICAgdGhpcy5jaGFydFxuICAgICAgICAuYXBwZW5kKCdnJylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1ncmlkJylcbiAgICAgICAgLmNhbGwoXG4gICAgICAgICAgdGhpcy5kM1xuICAgICAgICAgICAgLmF4aXNMZWZ0KHRoaXMueVNjYWxlKVxuICAgICAgICAgICAgLnRpY2tTaXplKC10aGlzLndpZHRoKVxuICAgICAgICAgICAgLnRpY2tGb3JtYXQoKCkgPT4gJycpLFxuICAgICAgICApXG4gICAgICAgIC5zZWxlY3RBbGwoJ2xpbmUnKVxuICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtZ3JpZC1saW5lcy1jb2xvcikpJylcbiAgICAgICAgLnN0eWxlKCdzdHJva2Utb3BhY2l0eScsIDAuMik7XG5cbiAgICAgIC8vIFJlbW92ZSB1bm5lZWRlZCBlbGVtZW50cyBmcm9tIGdyaWRcbiAgICAgIHRoaXMuY2hhcnQuc2VsZWN0KCcuYXgtYmFyLWNoYXJ0LWdyaWQnKS5zZWxlY3RBbGwoJ3BhdGgsIHRleHQnKS5yZW1vdmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgYmFycyB3aXRoIGFuaW1hdGlvbnNcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQmFycyhkYXRhOiBBWEJhckNoYXJ0RGF0YVtdKTogdm9pZCB7XG4gICAgLy8gRmlsdGVyIG91dCBoaWRkZW4gYmFyc1xuICAgIGNvbnN0IHZpc2libGVEYXRhID0gZGF0YS5maWx0ZXIoKGQpID0+ICF0aGlzLmlzQmFySGlkZGVuKGQuaWQpKTtcbiAgICBjb25zdCBvcmlnaW5hbEZ1bGxEYXRhID0gdGhpcy5kYXRhKCk7IC8vIEdldCB0aGUgb3JpZ2luYWwgZnVsbCBkYXRhIHNldFxuXG4gICAgLy8gUmVzZXQgYW5pbWF0aW9uIHN0YXRlXG4gICAgdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlLnNldChmYWxzZSk7XG5cbiAgICAvLyBHZXQgY29ybmVyIHJhZGl1cyBmcm9tIG9wdGlvbnNcbiAgICBjb25zdCByYWRpdXMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5jb3JuZXJSYWRpdXM7XG5cbiAgICAvLyBHZXQgYW5pbWF0aW9uIG9wdGlvbnNcbiAgICBjb25zdCBhbmltYXRpb25EdXJhdGlvbiA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkR1cmF0aW9uO1xuICAgIGNvbnN0IGFuaW1hdGlvbkVhc2luZyA9IHRoaXMuZ2V0RWFzaW5nRnVuY3Rpb24odGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuYW5pbWF0aW9uRWFzaW5nKTtcblxuICAgIC8vIENyZWF0ZSBhIGNvbnRhaW5lciBmb3IgYWxsIGJhcnNcbiAgICBjb25zdCBiYXJzQ29udGFpbmVyID0gdGhpcy5jaGFydC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYmFycy1jb250YWluZXInKTtcblxuICAgIC8vIENyZWF0ZSBncm91cHMgZm9yIGVhY2ggYmFyIHRvIGhhbmRsZSB0cmFuc2Zvcm1hdGlvbnNcbiAgICBjb25zdCBiYXJHcm91cHMgPSBiYXJzQ29udGFpbmVyXG4gICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhci1ncm91cCcpXG4gICAgICAuZGF0YSh2aXNpYmxlRGF0YSlcbiAgICAgIC5lbnRlcigpXG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1iYXItZ3JvdXAnKTtcblxuICAgIC8vIEFkZCBiYXJzIGluc2lkZSBncm91cHNcbiAgICBjb25zdCBiYXJzID0gYmFyR3JvdXBzXG4gICAgICAuYXBwZW5kKCdyZWN0JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYmFyJylcbiAgICAgIC5hdHRyKCd4JywgKGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB0aGlzLnhTY2FsZShkLmxhYmVsKSlcbiAgICAgIC5hdHRyKCd3aWR0aCcsIHRoaXMueFNjYWxlLmJhbmR3aWR0aCgpKVxuICAgICAgLmF0dHIoJ3knLCB0aGlzLmhlaWdodCkgLy8gU3RhcnQgZnJvbSBib3R0b20gZm9yIGFuaW1hdGlvblxuICAgICAgLmF0dHIoJ2hlaWdodCcsIDApIC8vIFN0YXJ0IHdpdGggaGVpZ2h0IDAgZm9yIGFuaW1hdGlvblxuICAgICAgLmF0dHIoJ3J4JywgcmFkaXVzKSAvLyBSb3VuZGVkIGNvcm5lcnNcbiAgICAgIC5hdHRyKCdyeScsIHJhZGl1cykgLy8gUm91bmRlZCBjb3JuZXJzXG4gICAgICAuYXR0cignZmlsbCcsIChkOiBBWEJhckNoYXJ0RGF0YSkgPT4ge1xuICAgICAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBiYXIgKGQpIGluIHRoZSBvcmlnaW5hbCBkYXRhIGFycmF5XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsSW5kZXggPSBvcmlnaW5hbEZ1bGxEYXRhLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZC5pZCk7XG4gICAgICAgIC8vIFVzZSB0aGUgb3JpZ2luYWwgY29sb3IgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSBnZXQgY29sb3IgZnJvbSBwYWxldHRlIHVzaW5nIG9yaWdpbmFsIGluZGV4XG4gICAgICAgIC8vIEZhbGxiYWNrIHRvIGluZGV4IDAgaWYgbm90IGZvdW5kLCB0aG91Z2ggdGhpcyBzaG91bGRuJ3QgaGFwcGVuIHdpdGggdmFsaWQgZGF0YS5cbiAgICAgICAgcmV0dXJuIGQuY29sb3IgfHwgdGhpcy5nZXRDb2xvcihvcmlnaW5hbEluZGV4ICE9PSAtMSA/IG9yaWdpbmFsSW5kZXggOiAwKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gQWRkIGRhdGEgbGFiZWxzIGlmIHRoZXkncmUgZW5hYmxlZFxuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93RGF0YUxhYmVscyAhPT0gZmFsc2UpIHtcbiAgICAgIGJhckdyb3Vwc1xuICAgICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1kYXRhLWxhYmVsJylcbiAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAgIC5hdHRyKCd4JywgKGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB0aGlzLnhTY2FsZShkLmxhYmVsKSArIHRoaXMueFNjYWxlLmJhbmR3aWR0aCgpIC8gMilcbiAgICAgICAgLmF0dHIoJ3knLCB0aGlzLmhlaWdodCkgLy8gU3RhcnQgZnJvbSBib3R0b20gZm9yIGFuaW1hdGlvblxuICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICdjbGFtcCg4cHgsIDJ2bWluLCAxMnB4KScpXG4gICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNTAwJylcbiAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWJhci1jaGFydC1kYXRhLWxhYmVscy1jb2xvcikpJylcbiAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMCkgLy8gU3RhcnQgaW52aXNpYmxlIGZvciBhbmltYXRpb25cbiAgICAgICAgLnRleHQoKGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiBkLnZhbHVlKTtcblxuICAgICAgLy8gQW5pbWF0ZSBkYXRhIGxhYmVsc1xuICAgICAgYmFyR3JvdXBzXG4gICAgICAgIC5zZWxlY3RBbGwoJy5heC1iYXItY2hhcnQtZGF0YS1sYWJlbCcpXG4gICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgICAuZGVsYXkoKGQ6IEFYQmFyQ2hhcnREYXRhLCBpOiBudW1iZXIpID0+IGkgKiA1MCArIDEwMCkgLy8gU2xpZ2h0bHkgZGVsYXllZCBhZnRlciBiYXIgYW5pbWF0aW9uXG4gICAgICAgIC5hdHRyKCd5JywgKGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB0aGlzLnlTY2FsZShkLnZhbHVlKSAtIDgpIC8vIFBvc2l0aW9uIGFib3ZlIGJhclxuICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAxKVxuICAgICAgICAuZWFzZShhbmltYXRpb25FYXNpbmcpO1xuICAgIH1cblxuICAgIC8vIFNldCB1cCBldmVudCBoYW5kbGVycyBvbiBlYWNoIGdyb3VwXG4gICAgYmFyR3JvdXBzXG4gICAgICAub24oJ21vdXNlZW50ZXInLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB7XG4gICAgICAgIC8vIE9ubHkgYXBwbHkgaG92ZXIgZWZmZWN0cyBpZiBpbml0aWFsIGFuaW1hdGlvbiBpcyBjb21wbGV0ZVxuICAgICAgICBpZiAoIXRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgYmFyRWwgPSB0aGlzLmQzLnNlbGVjdChldmVudC5jdXJyZW50VGFyZ2V0KS5zZWxlY3QoJ3JlY3QnKTtcblxuICAgICAgICAvLyBTdGFuZGFyZCBob3ZlciBlZmZlY3QgLSBkYXJrZW4gdGhlIGJhciBzbGlnaHRseSBhbmQgYWRkIGEgc3VidGxlIHNoYWRvd1xuICAgICAgICBiYXJFbC50cmFuc2l0aW9uKCkuZHVyYXRpb24oMTUwKS5zdHlsZSgnZmlsdGVyJywgJ2JyaWdodG5lc3MoMC43KSBkcm9wLXNoYWRvdygwIDAgMnB4IHJnYmEoMCwwLDAsMC4xKSknKTtcblxuICAgICAgICB0aGlzLmhhbmRsZUJhckhvdmVyKGV2ZW50LCBkKTtcbiAgICAgIH0pXG4gICAgICAub24oJ21vdXNlbW92ZScsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAvLyBPbmx5IHVwZGF0ZSB0b29sdGlwIGlmIGluaXRpYWwgYW5pbWF0aW9uIGlzIGNvbXBsZXRlXG4gICAgICAgIGlmICh0aGlzLl9pbml0aWFsQW5pbWF0aW9uQ29tcGxldGUoKSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5vbignbW91c2VsZWF2ZScsIChldmVudDogTW91c2VFdmVudCwgZDogQVhCYXJDaGFydERhdGEpID0+IHtcbiAgICAgICAgLy8gT25seSBhcHBseSBob3ZlciBlZmZlY3RzIGlmIGluaXRpYWwgYW5pbWF0aW9uIGlzIGNvbXBsZXRlXG4gICAgICAgIGlmICghdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlKCkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBiYXJFbCA9IHRoaXMuZDMuc2VsZWN0KGV2ZW50LmN1cnJlbnRUYXJnZXQpLnNlbGVjdCgncmVjdCcpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBob3ZlciBlZmZlY3RcbiAgICAgICAgYmFyRWwudHJhbnNpdGlvbigpLmR1cmF0aW9uKDE1MCkuc3R5bGUoJ2ZpbHRlcicsIG51bGwpO1xuXG4gICAgICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldChmYWxzZSk7XG4gICAgICB9KVxuICAgICAgLm9uKCdjbGljaycsIChldmVudDogTW91c2VFdmVudCwgZDogQVhCYXJDaGFydERhdGEpID0+IHtcbiAgICAgICAgLy8gT25seSB0cmlnZ2VyIGNsaWNrIGV2ZW50cyBpZiBpbml0aWFsIGFuaW1hdGlvbiBpcyBjb21wbGV0ZVxuICAgICAgICBpZiAodGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlKCkpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUJhckNsaWNrKGV2ZW50LCBkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAvLyBBZGQgYW5pbWF0aW9uXG4gICAgYmFyc1xuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgLmRlbGF5KChkOiBBWEJhckNoYXJ0RGF0YSwgaTogbnVtYmVyKSA9PiBpICogNTApIC8vIFN0YWdnZXIgZWFjaCBiYXIgYW5pbWF0aW9uXG4gICAgICAuYXR0cigneScsIChkOiBBWEJhckNoYXJ0RGF0YSkgPT4gdGhpcy55U2NhbGUoZC52YWx1ZSkpXG4gICAgICAuYXR0cignaGVpZ2h0JywgKGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB0aGlzLmhlaWdodCAtIHRoaXMueVNjYWxlKGQudmFsdWUpKVxuICAgICAgLmVhc2UoYW5pbWF0aW9uRWFzaW5nKSAvLyBVc2UgdGhlIGNvbmZpZ3VyZWQgZWFzaW5nIGZ1bmN0aW9uXG4gICAgICAuZW5kKCkgLy8gV2FpdCBmb3IgYWxsIGFuaW1hdGlvbnMgdG8gY29tcGxldGVcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gTWFyayBhbmltYXRpb24gYXMgY29tcGxldGUgdG8gZW5hYmxlIGhvdmVyIGVmZmVjdHNcbiAgICAgICAgdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlLnNldCh0cnVlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIEQzIGVhc2luZyBmdW5jdGlvbiBiYXNlZCBvbiB0aGUgb3B0aW9uIHN0cmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRFYXNpbmdGdW5jdGlvbihlYXNpbmc/OiBzdHJpbmcpOiBhbnkge1xuICAgIHN3aXRjaCAoZWFzaW5nKSB7XG4gICAgICBjYXNlICdsaW5lYXInOlxuICAgICAgICByZXR1cm4gdGhpcy5kMy5lYXNlTGluZWFyO1xuICAgICAgY2FzZSAnZWFzZSc6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VQb2x5SW5PdXQ7XG4gICAgICBjYXNlICdlYXNlLWluJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZDMuZWFzZVBvbHlJbjtcbiAgICAgIGNhc2UgJ2Vhc2Utb3V0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZDMuZWFzZVBvbHlPdXQ7XG4gICAgICBjYXNlICdlYXNlLWluLW91dCc6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VQb2x5SW5PdXQ7XG4gICAgICBjYXNlICdjdWJpYyc6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VDdWJpYztcbiAgICAgIGNhc2UgJ2N1YmljLWluJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZDMuZWFzZUN1YmljSW47XG4gICAgICBjYXNlICdjdWJpYy1vdXQnOlxuICAgICAgICByZXR1cm4gdGhpcy5kMy5lYXNlQ3ViaWNPdXQ7XG4gICAgICBjYXNlICdjdWJpYy1pbi1vdXQnOlxuICAgICAgICByZXR1cm4gdGhpcy5kMy5lYXNlQ3ViaWNJbk91dDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VDdWJpY091dDsgLy8gRGVmYXVsdCBlYXNpbmdcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBiYXIgaG92ZXIgZXZlbnQgYW5kIHNob3dzIHRvb2x0aXBcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlQmFySG92ZXIoZXZlbnQ6IE1vdXNlRXZlbnQsIGRhdHVtOiBBWEJhckNoYXJ0RGF0YSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93VG9vbHRpcCAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5kYXRhKCkuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09PSBkYXR1bS5pZCk7XG4gICAgICBjb25zdCBjb2xvciA9IGRhdHVtLmNvbG9yIHx8IHRoaXMuZ2V0Q29sb3IoaW5kZXgpO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgcGVyY2VudGFnZSBvZiB0b3RhbFxuICAgICAgY29uc3QgdG90YWwgPSB0aGlzLmRhdGEoKS5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4gc3VtICsgaXRlbS52YWx1ZSwgMCk7XG4gICAgICBjb25zdCBwZXJjZW50YWdlID0gdG90YWwgPiAwID8gKChkYXR1bS52YWx1ZSAvIHRvdGFsKSAqIDEwMCkudG9GaXhlZCgxKSA6ICcwJztcblxuICAgICAgdGhpcy5fdG9vbHRpcERhdGEuc2V0KHtcbiAgICAgICAgdGl0bGU6IGRhdHVtLnRvb2x0aXBMYWJlbCB8fCBkYXR1bS5sYWJlbCxcbiAgICAgICAgdmFsdWU6IGRhdHVtLnZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgIHBlcmNlbnRhZ2U6IGAke3BlcmNlbnRhZ2V9JWAsXG4gICAgICAgIGNvbG9yOiBjb2xvcixcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gICAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdG9vbHRpcCBwb3NpdGlvbiBiYXNlZCBvbiBtb3VzZSBjb29yZGluYXRlc1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHRvb2x0aXBFbCA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmNoYXJ0LXRvb2x0aXAnKTtcblxuICAgIGlmICghdG9vbHRpcEVsKSB7XG4gICAgICBjb25zdCB4ID0gZXZlbnQuY2xpZW50WCAtIGNvbnRhaW5lci5sZWZ0O1xuICAgICAgY29uc3QgeSA9IGV2ZW50LmNsaWVudFkgLSBjb250YWluZXIudG9wO1xuICAgICAgdGhpcy5fdG9vbHRpcFBvc2l0aW9uLnNldCh7IHgsIHkgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdG9vbHRpcFJlY3QgPSB0b29sdGlwRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IHggPSBldmVudC5jbGllbnRYIC0gY29udGFpbmVyLmxlZnQ7XG4gICAgY29uc3QgeSA9IGV2ZW50LmNsaWVudFkgLSBjb250YWluZXIudG9wO1xuXG4gICAgLy8gQWRqdXN0IHBvc2l0aW9uIGlmIG5lYXIgdGhlIHJpZ2h0IGVkZ2VcbiAgICBpZiAoeCArIHRvb2x0aXBSZWN0LndpZHRoICsgMTAgPiBjb250YWluZXIud2lkdGgpIHtcbiAgICAgIHggPSB4IC0gdG9vbHRpcFJlY3Qud2lkdGggLSAxMDtcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IHggKyAxMDtcbiAgICB9XG5cbiAgICB0aGlzLl90b29sdGlwUG9zaXRpb24uc2V0KHsgeCwgeSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGJhciBjbGljayBldmVudFxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVCYXJDbGljayhldmVudDogTW91c2VFdmVudCwgZGF0dW06IEFYQmFyQ2hhcnREYXRhKTogdm9pZCB7XG4gICAgdGhpcy5iYXJDbGljay5lbWl0KHsgaXRlbTogZGF0dW0sIGV2ZW50OiB7IG5hdGl2ZUV2ZW50OiBldmVudCwgc2VuZGVyOiB0aGlzIH0gfSk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSBtZXNzYWdlIHdoZW4gbm8gZGF0YSBpcyBhdmFpbGFibGVcbiAgICovXG4gIHByaXZhdGUgc2hvd05vRGF0YU1lc3NhZ2UoY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBleGlzdGluZyBjb250ZW50cyBmaXJzdFxuICAgIHRoaXMuZDMuc2VsZWN0KGNvbnRhaW5lckVsZW1lbnQpLnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpO1xuXG4gICAgY29uc3QgbWVzc2FnZUNvbnRhaW5lciA9IHRoaXMuZDNcbiAgICAgIC5zZWxlY3QoY29udGFpbmVyRWxlbWVudClcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAvLyBBcHBseSBnZW5lcmljIGNvbnRhaW5lciBjbGFzcywgc3BlY2lmaWMgYmFyIGNoYXJ0IGJhY2tncm91bmQgY2xhc3MsIGFuZCBleGlzdGluZyBzcGVjaWZpYyBjbGFzc1xuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWNoYXJ0LW1lc3NhZ2UtY29udGFpbmVyIGF4LWJhci1jaGFydC1tZXNzYWdlLWJhY2tncm91bmQgYXgtYmFyLWNoYXJ0LW5vLWRhdGEtbWVzc2FnZScpO1xuXG4gICAgLy8gQWRkIGFuIGljb25cbiAgICBtZXNzYWdlQ29udGFpbmVyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLy8gQXBwbHkgZ2VuZXJpYyBpY29uIGNsYXNzIGFuZCBzcGVjaWZpYyBiYXIgY2hhcnQgaWNvbiBjbGFzc1xuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWNoYXJ0LW1lc3NhZ2UtaWNvbiBheC1iYXItY2hhcnQtbm8tZGF0YS1pY29uJylcbiAgICAgIC5odG1sKCc8aSBjbGFzcz1cImZhLWxpZ2h0IGZhLWNoYXJ0LWNvbHVtbiBmYS0yeFwiPjwvaT4nKTtcblxuICAgIC8vIEFkZCB0ZXh0IG1lc3NhZ2VcbiAgICBtZXNzYWdlQ29udGFpbmVyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLy8gQXBwbHkgZ2VuZXJpYyB0ZXh0IGNsYXNzIGFuZCBzcGVjaWZpYyBiYXIgY2hhcnQgdGV4dCBjbGFzc1xuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWNoYXJ0LW1lc3NhZ2UtdGV4dCBheC1iYXItY2hhcnQtbm8tZGF0YS10ZXh0JylcbiAgICAgIC50ZXh0KCdObyBkYXRhIGF2YWlsYWJsZScpO1xuXG4gICAgLy8gQWRkIGhlbHAgdGV4dFxuICAgIG1lc3NhZ2VDb250YWluZXJcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAvLyBBcHBseSBnZW5lcmljIGhlbHAgY2xhc3MgYW5kIHNwZWNpZmljIGJhciBjaGFydCBoZWxwIGNsYXNzXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtY2hhcnQtbWVzc2FnZS1oZWxwIGF4LWJhci1jaGFydC1uby1kYXRhLWhlbHAnKVxuICAgICAgLnRleHQoJ1BsZWFzZSBwcm92aWRlIGRhdGEgdG8gZGlzcGxheSB0aGUgY2hhcnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG1lc3NhZ2Ugd2hlbiBhbGwgYmFycyBhcmUgaGlkZGVuXG4gICAqL1xuICBwcml2YXRlIHNob3dBbGxCYXJzSGlkZGVuTWVzc2FnZShjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGV4aXN0aW5nIGNvbnRlbnRzIGZpcnN0XG4gICAgdGhpcy5kMy5zZWxlY3QoY29udGFpbmVyRWxlbWVudCkuc2VsZWN0QWxsKCcqJykucmVtb3ZlKCk7XG5cbiAgICBjb25zdCBtZXNzYWdlQ29udGFpbmVyID0gdGhpcy5kM1xuICAgICAgLnNlbGVjdChjb250YWluZXJFbGVtZW50KVxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC8vIEFwcGx5IGdlbmVyaWMgY29udGFpbmVyIGNsYXNzLCBzcGVjaWZpYyBiYXIgY2hhcnQgYmFja2dyb3VuZCBjbGFzcywgYW5kIGV4aXN0aW5nIHNwZWNpZmljIGNsYXNzXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtY2hhcnQtbWVzc2FnZS1jb250YWluZXIgYXgtYmFyLWNoYXJ0LW1lc3NhZ2UtYmFja2dyb3VuZCBheC1iYXItY2hhcnQtbm8tZGF0YS1tZXNzYWdlJyk7XG5cbiAgICAvLyBBZGQgYW4gaWNvblxuICAgIG1lc3NhZ2VDb250YWluZXJcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAvLyBBcHBseSBnZW5lcmljIGljb24gY2xhc3MgYW5kIHNwZWNpZmljIGJhciBjaGFydCBpY29uIGNsYXNzXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtY2hhcnQtbWVzc2FnZS1pY29uIGF4LWJhci1jaGFydC1uby1kYXRhLWljb24nKVxuICAgICAgLmh0bWwoJzxpIGNsYXNzPVwiZmEtbGlnaHQgZmEtZXllLXNsYXNoIGZhLTJ4XCI+PC9pPicpO1xuXG4gICAgLy8gQWRkIHRleHQgbWVzc2FnZVxuICAgIG1lc3NhZ2VDb250YWluZXJcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAvLyBBcHBseSBnZW5lcmljIHRleHQgY2xhc3MgYW5kIHNwZWNpZmljIGJhciBjaGFydCB0ZXh0IGNsYXNzXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtY2hhcnQtbWVzc2FnZS10ZXh0IGF4LWJhci1jaGFydC1uby1kYXRhLXRleHQnKVxuICAgICAgLnRleHQoJ0FsbCBiYXJzIGFyZSBoaWRkZW4nKTtcblxuICAgIC8vIEFkZCBoZWxwIHRleHRcbiAgICBtZXNzYWdlQ29udGFpbmVyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLy8gQXBwbHkgZ2VuZXJpYyBoZWxwIGNsYXNzIGFuZCBzcGVjaWZpYyBiYXIgY2hhcnQgaGVscCBjbGFzc1xuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWNoYXJ0LW1lc3NhZ2UtaGVscCBheC1iYXItY2hhcnQtbm8tZGF0YS1oZWxwJylcbiAgICAgIC50ZXh0KCdDbGljayBvbiBsZWdlbmQgaXRlbXMgdG8gc2hvdyBiYXJzJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY29sb3IgZm9yIGEgYmFyIGJhc2VkIG9uIGl0cyBpbmRleFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldENvbG9yKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXRDaGFydENvbG9yKGluZGV4LCB0aGlzLmNoYXJ0Q29sb3JzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBiYXIgaXMgaGlkZGVuXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNCYXJIaWRkZW4oaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhpZGRlbkJhcnMuaGFzKGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBBWENoYXJ0TGVnZW5kQ29tcGF0aWJsZSBpbnRlcmZhY2VcbiAgICogUmV0dXJucyBsZWdlbmQgaXRlbXMgYmFzZWQgb24gdGhlIGNoYXJ0IGRhdGFcbiAgICovXG4gIGdldExlZ2VuZEl0ZW1zKCk6IEFYQ2hhcnRMZWdlbmRJdGVtW10ge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGEoKSB8fCBbXTtcbiAgICBjb25zdCB0b3RhbCA9IGRhdGEucmVkdWNlKChzdW0sIGl0ZW0pID0+IHN1bSArICh0eXBlb2YgaXRlbS52YWx1ZSA9PT0gJ251bWJlcicgPyBpdGVtLnZhbHVlIDogMCksIDApO1xuXG4gICAgcmV0dXJuIGRhdGEubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgaXRlbS52YWx1ZSA9PT0gJ251bWJlcicgPyBpdGVtLnZhbHVlIDogMDtcbiAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSB0b3RhbCA+IDAgPyAodmFsdWUgLyB0b3RhbCkgKiAxMDAgOiAwO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogaXRlbS5pZCxcbiAgICAgICAgbmFtZTogaXRlbS5sYWJlbCB8fCBgSXRlbSAke2luZGV4ICsgMX1gLFxuICAgICAgICB2YWx1ZTogaXRlbS52YWx1ZSxcbiAgICAgICAgcGVyY2VudGFnZSxcbiAgICAgICAgY29sb3I6IGl0ZW0uY29sb3IgfHwgdGhpcy5nZXRDb2xvcihpbmRleCksXG4gICAgICAgIGhpZGRlbjogdGhpcy5pc0JhckhpZGRlbihpdGVtLmlkKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gb2YgQVhDaGFydExlZ2VuZENvbXBhdGlibGUgaW50ZXJmYWNlXG4gICAqIEhpZ2hsaWdodHMgYSBzcGVjaWZpYyBiYXIgYnkgSURcbiAgICovXG4gIGhpZ2hsaWdodFNlZ21lbnQoaWQ6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICAvLyBJZiB0aGUgYmFyIGlzIGhpZGRlbiwgd2Ugc2hvdWxkbid0IHRyeSB0byBoaWdobGlnaHQgaXRcbiAgICBpZiAoaWQgIT09IG51bGwgJiYgdGhpcy5pc0JhckhpZGRlbihpZCkpIHtcbiAgICAgIC8vIEp1c3QgdW5oaWdobGlnaHQgZXZlcnl0aGluZyB3aGVuIHRyeWluZyB0byBoaWdobGlnaHQgYSBoaWRkZW4gYmFyXG4gICAgICB0aGlzLnN2Z1xuICAgICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhcicpXG4gICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtaGlnaGxpZ2h0ZWQnLCBmYWxzZSlcbiAgICAgICAgLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1kaW1tZWQnLCBmYWxzZSlcbiAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAxKVxuICAgICAgICAuYXR0cignZmlsdGVyJywgbnVsbClcbiAgICAgICAgLmF0dHIoJ3N0cm9rZScsIG51bGwpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBudWxsKVxuICAgICAgICAuYXR0cignc3Ryb2tlLW9wYWNpdHknLCBudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgIC8vIElmIGlkIGlzIG51bGwsIHVuaGlnaGxpZ2h0IGV2ZXJ5dGhpbmdcbiAgICAgIHRoaXMuc3ZnXG4gICAgICAgIC5zZWxlY3RBbGwoJy5heC1iYXItY2hhcnQtYmFyJylcbiAgICAgICAgLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1oaWdobGlnaHRlZCcsIGZhbHNlKVxuICAgICAgICAuY2xhc3NlZCgnYXgtYmFyLWNoYXJ0LWRpbW1lZCcsIGZhbHNlKVxuICAgICAgICAuYXR0cignb3BhY2l0eScsIDEpXG4gICAgICAgIC5hdHRyKCdmaWx0ZXInLCBudWxsKVxuICAgICAgICAuYXR0cignc3Ryb2tlJywgbnVsbClcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIG51bGwpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utb3BhY2l0eScsIG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIHRhcmdldCBiYXJcbiAgICBjb25zdCB0YXJnZXRCYXIgPSB0aGlzLnN2Zy5zZWxlY3RBbGwoJy5heC1iYXItY2hhcnQtYmFyJykuZmlsdGVyKChkOiBhbnkpID0+IGQ/LmlkID09PSBpZCk7XG5cbiAgICAvLyBTYWZldHkgY2hlY2sgLSBpZiBubyBtYXRjaGluZyBiYXIgaXMgZm91bmQsIGRvIG5vdGhpbmdcbiAgICBpZiAodGFyZ2V0QmFyLmVtcHR5KCkpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgYmFyIGlzIGN1cnJlbnRseSBoaWdobGlnaHRlZFxuICAgIGNvbnN0IGlzQ3VycmVudGx5SGlnaGxpZ2h0ZWQgPSB0YXJnZXRCYXIuY2xhc3NlZCgnYXgtYmFyLWNoYXJ0LWhpZ2hsaWdodGVkJyk7XG5cbiAgICBpZiAoaXNDdXJyZW50bHlIaWdobGlnaHRlZCkge1xuICAgICAgLy8gSWYgYWxyZWFkeSBoaWdobGlnaHRlZCwgdW5oaWdobGlnaHQgYWxsIGJhcnNcbiAgICAgIHRoaXMuc3ZnXG4gICAgICAgIC5zZWxlY3RBbGwoJy5heC1iYXItY2hhcnQtYmFyJylcbiAgICAgICAgLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1oaWdobGlnaHRlZCcsIGZhbHNlKVxuICAgICAgICAuY2xhc3NlZCgnYXgtYmFyLWNoYXJ0LWRpbW1lZCcsIGZhbHNlKVxuICAgICAgICAuYXR0cignb3BhY2l0eScsIDEpXG4gICAgICAgIC5hdHRyKCdmaWx0ZXInLCBudWxsKVxuICAgICAgICAuYXR0cignc3Ryb2tlJywgbnVsbClcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIG51bGwpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utb3BhY2l0eScsIG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXNldCBhbGwgYmFycyBmaXJzdFxuICAgICAgdGhpcy5zdmdcbiAgICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1iYXInKVxuICAgICAgICAuY2xhc3NlZCgnYXgtYmFyLWNoYXJ0LWhpZ2hsaWdodGVkJywgZmFsc2UpXG4gICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtZGltbWVkJywgZmFsc2UpXG4gICAgICAgIC5hdHRyKCdvcGFjaXR5JywgMSlcbiAgICAgICAgLmF0dHIoJ2ZpbHRlcicsIG51bGwpXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCBudWxsKVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgbnVsbClcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS1vcGFjaXR5JywgbnVsbCk7XG5cbiAgICAgIC8vIEhpZ2hsaWdodCB0aGUgdGFyZ2V0IGJhclxuICAgICAgdGFyZ2V0QmFyXG4gICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtaGlnaGxpZ2h0ZWQnLCB0cnVlKVxuICAgICAgICAuYXR0cignZmlsdGVyJywgJ2Ryb3Atc2hhZG93KDAgMCA0cHggcmdiYSgwLCAwLCAwLCAwLjMpKScpXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCAnIzAwMCcpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAnMXB4JylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS1vcGFjaXR5JywgJzAuMycpXG4gICAgICAgIC5zdHlsZSgndHJhbnNpdGlvbicsICdhbGwgMC4ycyBlYXNlLWluLW91dCcpO1xuXG4gICAgICAvLyBEaW0gb3RoZXIgYmFyc1xuICAgICAgdGhpcy5zdmdcbiAgICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1iYXInKVxuICAgICAgICAuZmlsdGVyKChkOiBhbnkpID0+IGQ/LmlkICE9PSBpZClcbiAgICAgICAgLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1kaW1tZWQnLCB0cnVlKVxuICAgICAgICAuYXR0cignb3BhY2l0eScsIDAuNSlcbiAgICAgICAgLnN0eWxlKCd0cmFuc2l0aW9uJywgJ29wYWNpdHkgMC4ycyBlYXNlLWluLW91dCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBBWENoYXJ0TGVnZW5kQ29tcGF0aWJsZSBpbnRlcmZhY2VcbiAgICogVG9nZ2xlcyB2aXNpYmlsaXR5IG9mIGEgYmFyIGJ5IElEXG4gICAqIEByZXR1cm5zIE5ldyB2aXNpYmlsaXR5IHN0YXRlICh0cnVlID0gdmlzaWJsZSwgZmFsc2UgPSBoaWRkZW4pXG4gICAqL1xuICB0b2dnbGVTZWdtZW50KGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCB3YXNBbGxIaWRkZW4gPSB0aGlzLmRhdGEoKS5sZW5ndGggPiAwICYmIHRoaXMuZGF0YSgpLmV2ZXJ5KChkKSA9PiB0aGlzLmlzQmFySGlkZGVuKGQuaWQpKTtcblxuICAgIGlmICh0aGlzLmhpZGRlbkJhcnMuaGFzKGlkKSkge1xuICAgICAgLy8gTWFraW5nIGEgYmFyIHZpc2libGVcbiAgICAgIHRoaXMuaGlkZGVuQmFycy5kZWxldGUoaWQpO1xuXG4gICAgICAvLyBJZiBhbGwgYmFycyB3ZXJlIHByZXZpb3VzbHkgaGlkZGVuLCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGUgbWVzc2FnZSBpcyBjbGVhcmVkXG4gICAgICBpZiAod2FzQWxsSGlkZGVuKSB7XG4gICAgICAgIC8vIEZvcmNlIGNvbXBsZXRlIERPTSBjbGVhbnVwIGFuZCByZWRyYXdcbiAgICAgICAgaWYgKHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgLy8gQ2xlYXIgZXZlcnl0aGluZyBpbiB0aGUgY29udGFpbmVyXG4gICAgICAgICAgdGhpcy5kMz8uc2VsZWN0KHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQpLnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpO1xuXG4gICAgICAgICAgLy8gRm9yY2UgZnVsbCByZWRyYXdcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm9ybWFsIHVwZGF0ZSBmb3Igb3RoZXIgY2FzZXNcbiAgICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIaWRpbmcgYSBiYXJcbiAgICAgIHRoaXMuaGlkZGVuQmFycy5hZGQoaWQpO1xuICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgbmV3IHZpc2liaWxpdHkgc3RhdGVcbiAgICByZXR1cm4gIXRoaXMuaGlkZGVuQmFycy5oYXMoaWQpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYXgtYmFyLWNoYXJ0XCIgI2NoYXJ0Q29udGFpbmVyPlxuICA8IS0tIFNoYXJlZCB0b29sdGlwIGNvbXBvbmVudCAtLT5cbiAgPGF4LWNoYXJ0LXRvb2x0aXBcbiAgICBbdmlzaWJsZV09XCJ0b29sdGlwVmlzaWJsZSgpXCJcbiAgICBbcG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uKClcIlxuICAgIFtkYXRhXT1cInRvb2x0aXBEYXRhKClcIlxuICAgIFtzaG93UGVyY2VudGFnZV09XCJ0cnVlXCJcbiAgPjwvYXgtY2hhcnQtdG9vbHRpcD5cbjwvZGl2PlxuIl19","/**\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 barWidth: 80,\n cornerRadius: 4,\n animationDuration: 800,\n animationEasing: 'cubic-out',\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWNoYXJ0LmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9iYXItY2hhcnQvc3JjL2xpYi9iYXItY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHaEMsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQXFCO0lBQ3ZELFNBQVMsRUFBRSxJQUFJO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixRQUFRLEVBQUUsSUFBSTtJQUNkLGNBQWMsRUFBRSxJQUFJO0lBQ3BCLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLFFBQVEsRUFBRSxFQUFFO0lBQ1osWUFBWSxFQUFFLENBQUM7SUFDZixpQkFBaUIsRUFBRSxHQUFHO0lBQ3RCLGVBQWUsRUFBRSxXQUFXO0NBQzdCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLGNBQWMsQ0FBbUIscUJBQXFCLEVBQUU7SUFDN0YsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRTtRQUNaLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3hDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUN2RCxPQUFPLHVCQUF1QixDQUFDO0lBQ2pDLENBQUM7Q0FDRixDQUFDLENBQUM7QUFJSCxNQUFNLFVBQVUsY0FBYyxDQUFDLFNBQWdDLEVBQUU7SUFDL0QsTUFBTSxNQUFNLEdBQUc7UUFDYixHQUFHLHVCQUF1QjtRQUMxQixHQUFHLE1BQU07S0FDVixDQUFDO0lBQ0YsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFYX0dMT0JBTF9DT05GSUcgfSBmcm9tICdAYWNvcmV4L2NvcmUvY29uZmlnJztcbmltcG9ydCB7IEluamVjdGlvblRva2VuLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHNldCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBBWEJhckNoYXJ0T3B0aW9uIH0gZnJvbSAnLi9iYXItY2hhcnQudHlwZSc7XG5cbmV4cG9ydCBjb25zdCBBWEJhckNoYXJ0RGVmYXVsdENvbmZpZzogQVhCYXJDaGFydE9wdGlvbiA9IHtcbiAgc2hvd1hBeGlzOiB0cnVlLFxuICBzaG93WUF4aXM6IHRydWUsXG4gIHNob3dHcmlkOiB0cnVlLFxuICBzaG93RGF0YUxhYmVsczogdHJ1ZSxcbiAgc2hvd1Rvb2x0aXA6IHRydWUsXG4gIGJhcldpZHRoOiA4MCxcbiAgY29ybmVyUmFkaXVzOiA0LFxuICBhbmltYXRpb25EdXJhdGlvbjogODAwLFxuICBhbmltYXRpb25FYXNpbmc6ICdjdWJpYy1vdXQnLFxufTtcblxuZXhwb3J0IGNvbnN0IEFYX0JBUl9DSEFSVF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48QVhCYXJDaGFydE9wdGlvbj4oJ0FYX0JBUl9DSEFSVF9DT05GSUcnLCB7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgZmFjdG9yeTogKCkgPT4ge1xuICAgIGNvbnN0IGdsb2JhbCA9IGluamVjdChBWF9HTE9CQUxfQ09ORklHKTtcbiAgICBzZXQoZ2xvYmFsLCAnY2hhcnQuYmFyQ2hhcnQnLCBBWEJhckNoYXJ0RGVmYXVsdENvbmZpZyk7XG4gICAgcmV0dXJuIEFYQmFyQ2hhcnREZWZhdWx0Q29uZmlnO1xuICB9LFxufSk7XG5cbmV4cG9ydCB0eXBlIFBhcnRpYWxCYXJDaGFydENvbmZpZyA9IFBhcnRpYWw8QVhCYXJDaGFydE9wdGlvbj47XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXJDaGFydENvbmZpZyhjb25maWc6IFBhcnRpYWxCYXJDaGFydENvbmZpZyA9IHt9KTogQVhCYXJDaGFydE9wdGlvbiB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAuLi5BWEJhckNoYXJ0RGVmYXVsdENvbmZpZyxcbiAgICAuLi5jb25maWcsXG4gIH07XG4gIHJldHVybiByZXN1bHQ7XG59XG4iXX0=","import { NXComponent } from '@acorex/cdk/common';\nimport { AX_CHART_COLOR_PALETTE, getChartColor } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { AXPlatform } from '@acorex/core/platform';\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 xAxis;\n yAxis;\n // Chart dimensions\n width;\n height;\n margin = { top: 20, right: 20, bottom: 30, left: 40 };\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 platform = inject(AXPlatform);\n // Configuration with defaults\n effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\n // Track hidden bars\n hiddenBars = new Set();\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 data = this.data() || [];\n // Filter out hidden bars for visible data\n const visibleData = data.filter((d) => !this.isBarHidden(d.id));\n // Clear existing chart\n this.d3.select(containerElement).selectAll('svg').remove();\n // Early return if no data\n if (!data.length) {\n this.showNoDataMessage(containerElement);\n return;\n }\n // Early return if all bars are hidden\n if (visibleData.length === 0) {\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 using visible data\n this.setupScales(visibleData);\n this.createAxes(chartOptions);\n // Render the bars\n this.renderBars(data);\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 if (this.svg) {\n this.d3?.select(this.chartContainerEl()?.nativeElement).selectAll('svg').remove();\n this.svg = null;\n this.chart = null;\n }\n this._tooltipVisible.set(false);\n }\n /**\n * Sets up chart dimensions and creates SVG with responsive attributes\n */\n setupDimensions(containerElement, options) {\n // Calculate margins based on options\n this.calculateMargins(options, containerElement.clientWidth);\n // Get container dimensions\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n // If options specify width and height, use those, otherwise default to container size\n const minDim = Math.min(200, containerWidth, containerHeight); // Ensure reasonable minimum\n if (options.width && options.height) {\n // Explicit dimensions provided\n this.width = options.width - this.margin.left - this.margin.right;\n this.height = options.height - this.margin.top - this.margin.bottom;\n }\n else {\n // Responsive dimensions\n this.width = Math.max(containerWidth, minDim) - this.margin.left - this.margin.right;\n this.height = Math.max(containerHeight, minDim) - this.margin.top - this.margin.bottom;\n }\n // Create responsive SVG that scales with its container\n const svg = this.d3\n .select(containerElement)\n .append('svg')\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${this.width + this.margin.left + this.margin.right} ${this.height + this.margin.top + this.margin.bottom}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n this.svg = svg;\n // Create chart group with margins\n this.chart = this.svg.append('g').attr('transform', `translate(${this.margin.left},${this.margin.top})`);\n }\n /**\n * Calculates chart margins based on options\n */\n calculateMargins(options, containerWidth) {\n // Start with default margins\n this.margin = {\n top: 20,\n right: 20,\n bottom: 30,\n left: 40,\n };\n const visibleData = this.data().filter((d) => !this.isBarHidden(d.id));\n const barCount = visibleData.length;\n // Pre-emptively increase bottom margin if x-axis labels are likely to be rotated.\n // This is an estimation before scales and full dimensions are calculated.\n if (barCount > 0 && containerWidth > 0) {\n const workingWidth = containerWidth - this.margin.left - this.margin.right;\n if (workingWidth > 0) {\n const availableWidthPerBar = workingWidth / barCount;\n const longestLabel = visibleData.reduce((a, b) => (a.label.length > b.label.length ? a : b), {\n label: '',\n }).label;\n // Estimate font size using the same logic as in createAxes, but with workingWidth.\n const estimatedFontSize = Math.max(11, Math.min(15, Math.round(workingWidth / 45)));\n // Estimate label width (using 0.6 as an average character width-to-height ratio).\n const estimatedLongestLabelWidth = longestLabel.length * estimatedFontSize * 0.6;\n // If estimated label width is greater than the space available, rotation will occur.\n if (estimatedLongestLabelWidth > availableWidthPerBar) {\n // Add space for rotated labels. The height of the rotated label's bounding box\n // is roughly its length * sin(45 degrees). Add some padding.\n const requiredExtraMargin = estimatedLongestLabelWidth * Math.sin(Math.PI / 4) + 10;\n this.margin.bottom += Math.min(60, requiredExtraMargin); // Cap max extra margin.\n }\n }\n }\n // Adjust margins if axis labels are present\n if (options.xAxisLabel) {\n const xLabelLength = options.xAxisLabel.length;\n const extraBottomMargin = Math.min(20, Math.max(10, xLabelLength * 0.8));\n this.margin.bottom = Math.max(this.margin.bottom, 30 + extraBottomMargin);\n }\n if (options.yAxisLabel) {\n const yLabelLength = options.yAxisLabel.length;\n const extraLeftMargin = Math.min(20, Math.max(10, yLabelLength * 0.8));\n this.margin.left = Math.max(this.margin.left, 40 + extraLeftMargin);\n }\n // Ensure minimum margins for axes\n if (options.showXAxis !== false) {\n this.margin.bottom = Math.max(this.margin.bottom, 35);\n }\n if (options.showYAxis !== false) {\n this.margin.left = Math.max(this.margin.left, 45);\n }\n }\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.label))\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 axes with grid lines\n */\n createAxes(options) {\n // Only create axes if they are enabled in options\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n const isRtl = this.platform.isRtl();\n // Create a group for all axes\n const axesGroup = this.chart.append('g').attr('class', 'ax-bar-chart-axes');\n if (showXAxis) {\n // Create X axis\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));\n // Style the axis text\n const dynamicXAxisTickFontSize = Math.max(11, Math.min(15, Math.round(this.width / 45)));\n const xAxisTicks = this.xAxis\n .selectAll('text')\n .style('font-size', `${dynamicXAxisTickFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)');\n // Automatically rotate labels if they are likely to overlap\n if (this.xScale.domain().length > 0) {\n const step = this.xScale.step();\n const longestLabel = this.xScale.domain().reduce((a, b) => (a.length > b.length ? a : b), '');\n // Using 0.55 as a safer estimate for char width-to-height ratio\n const estimatedLongestLabelWidth = longestLabel.length * dynamicXAxisTickFontSize * 0.55;\n if (estimatedLongestLabelWidth > step) {\n xAxisTicks\n .attr('transform', 'rotate(-45)')\n .style('text-anchor', 'end')\n .attr('dx', '-0.8em')\n .attr('dy', '0.15em');\n }\n }\n // Style all lines in the x-axis (path, ticks)\n this.xAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n // Add X axis label if provided\n if (options.xAxisLabel) {\n const labelY = this.height + this.margin.bottom * 0.8;\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', 'middle')\n .attr('x', this.width / 2)\n .attr('y', labelY)\n .style('font-size', '14px')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n .text(options.xAxisLabel);\n }\n }\n if (showYAxis) {\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 dynamicYAxisTickFontSize = Math.max(11, Math.min(15, Math.round(this.height / 30)));\n const yTickTexts = this.yAxis\n .selectAll('text')\n .style('font-size', `${dynamicYAxisTickFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)');\n if (isRtl) {\n yTickTexts.attr('text-anchor', 'start');\n }\n // Style all lines in the y-axis (path, ticks)\n this.yAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n // Add Y axis label if provided\n if (options.yAxisLabel) {\n const labelX = -this.height / 2;\n const labelY = -this.margin.left * 0.8;\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 .style('font-size', '14px')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n .text(options.yAxisLabel);\n }\n }\n if (showGrid) {\n // Add horizontal grid lines\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 /**\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(); // Get the original full data set\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 = this.getEasingFunction(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('rect')\n .attr('class', 'ax-bar-chart-bar')\n .attr('x', (d) => this.xScale(d.label))\n .attr('width', this.xScale.bandwidth())\n .attr('y', this.height) // Start from bottom for animation\n .attr('height', 0) // Start with height 0 for animation\n .attr('rx', radius) // Rounded corners\n .attr('ry', radius) // Rounded corners\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.label) + 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('rect');\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, 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('rect');\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 .attr('y', (d) => this.yScale(d.value))\n .attr('height', (d) => this.height - this.yScale(d.value))\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 * Gets the appropriate D3 easing function based on the option string\n */\n getEasingFunction(easing) {\n switch (easing) {\n case 'linear':\n return this.d3.easeLinear;\n case 'ease':\n return this.d3.easePolyInOut;\n case 'ease-in':\n return this.d3.easePolyIn;\n case 'ease-out':\n return this.d3.easePolyOut;\n case 'ease-in-out':\n return this.d3.easePolyInOut;\n case 'cubic':\n return this.d3.easeCubic;\n case 'cubic-in':\n return this.d3.easeCubicIn;\n case 'cubic-out':\n return this.d3.easeCubicOut;\n case 'cubic-in-out':\n return this.d3.easeCubicInOut;\n default:\n return this.d3.easeCubicOut; // Default easing\n }\n }\n /**\n * Handles bar hover event and shows tooltip\n */\n handleBarHover(event, datum) {\n if (this.effectiveOptions().showTooltip !== false) {\n const index = this.data().findIndex((item) => item.id === datum.id);\n const color = datum.color || this.getColor(index);\n // Calculate percentage of total\n const total = this.data().reduce((sum, item) => sum + item.value, 0);\n const percentage = total > 0 ? ((datum.value / total) * 100).toFixed(1) : '0';\n this._tooltipData.set({\n title: datum.tooltipLabel || datum.label,\n value: datum.value.toString(),\n percentage: `${percentage}%`,\n color: color,\n });\n this.updateTooltipPosition(event);\n this._tooltipVisible.set(true);\n }\n }\n /**\n * Updates tooltip position based on mouse coordinates\n */\n updateTooltipPosition(event) {\n const container = this.chartContainerEl().nativeElement.getBoundingClientRect();\n const tooltipEl = this.chartContainerEl().nativeElement.querySelector('.chart-tooltip');\n if (!tooltipEl) {\n const x = event.clientX - container.left;\n const y = event.clientY - container.top;\n this._tooltipPosition.set({ x, y });\n return;\n }\n const tooltipRect = tooltipEl.getBoundingClientRect();\n let x = event.clientX - container.left;\n const y = event.clientY - container.top;\n // Adjust position if near the right edge\n if (x + tooltipRect.width + 10 > container.width) {\n x = x - tooltipRect.width - 10;\n }\n else {\n x = x + 10;\n }\n this._tooltipPosition.set({ x, y });\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 // Clear existing contents first\n this.d3.select(containerElement).selectAll('*').remove();\n const messageContainer = this.d3\n .select(containerElement)\n .append('div')\n // Apply generic container class, specific bar chart background class, and existing specific class\n .attr('class', 'ax-chart-message-container ax-bar-chart-message-background ax-bar-chart-no-data-message');\n // Add an icon\n messageContainer\n .append('div')\n // Apply generic icon class and specific bar chart icon class\n .attr('class', 'ax-chart-message-icon ax-bar-chart-no-data-icon')\n .html('<i class=\"fa-light fa-chart-column fa-2x\"></i>');\n // Add text message\n messageContainer\n .append('div')\n // Apply generic text class and specific bar chart text class\n .attr('class', 'ax-chart-message-text ax-bar-chart-no-data-text')\n .text('No data available');\n // Add help text\n messageContainer\n .append('div')\n // Apply generic help class and specific bar chart help class\n .attr('class', 'ax-chart-message-help ax-bar-chart-no-data-help')\n .text('Please provide data to display the chart');\n }\n /**\n * Shows a message when all bars are hidden\n */\n showAllBarsHiddenMessage(containerElement) {\n // Clear existing contents first\n this.d3.select(containerElement).selectAll('*').remove();\n const messageContainer = this.d3\n .select(containerElement)\n .append('div')\n // Apply generic container class, specific bar chart background class, and existing specific class\n .attr('class', 'ax-chart-message-container ax-bar-chart-message-background ax-bar-chart-no-data-message');\n // Add an icon\n messageContainer\n .append('div')\n // Apply generic icon class and specific bar chart icon class\n .attr('class', 'ax-chart-message-icon ax-bar-chart-no-data-icon')\n .html('<i class=\"fa-light fa-eye-slash fa-2x\"></i>');\n // Add text message\n messageContainer\n .append('div')\n // Apply generic text class and specific bar chart text class\n .attr('class', 'ax-chart-message-text ax-bar-chart-no-data-text')\n .text('All bars are hidden');\n // Add help text\n messageContainer\n .append('div')\n // Apply generic help class and specific bar chart help class\n .attr('class', 'ax-chart-message-help ax-bar-chart-no-data-help')\n .text('Click on legend items to show bars');\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 data = this.data() || [];\n const total = data.reduce((sum, item) => sum + (typeof item.value === 'number' ? item.value : 0), 0);\n return data.map((item, index) => {\n const value = typeof item.value === 'number' ? item.value : 0;\n const percentage = total > 0 ? (value / 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 // If the bar is hidden, we shouldn't try to highlight it\n if (id !== null && this.isBarHidden(id)) {\n // Just unhighlight everything when trying to highlight a hidden bar\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 return;\n }\n if (id === null) {\n // If id is null, unhighlight everything\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 return;\n }\n // Find the target bar\n const targetBar = this.svg.selectAll('.ax-bar-chart-bar').filter((d) => d?.id === id);\n // Safety check - if no matching bar is found, do nothing\n if (targetBar.empty())\n return;\n // Check if the target bar is currently highlighted\n const isCurrentlyHighlighted = targetBar.classed('ax-bar-chart-highlighted');\n if (isCurrentlyHighlighted) {\n // If already highlighted, unhighlight all bars\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 else {\n // Reset all bars first\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 // Highlight the target bar\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 // Dim other bars\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 }\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 wasAllHidden = this.data().length > 0 && this.data().every((d) => this.isBarHidden(d.id));\n if (this.hiddenBars.has(id)) {\n // Making a bar visible\n this.hiddenBars.delete(id);\n // If all bars were previously hidden, we need to ensure the message is cleared\n if (wasAllHidden) {\n // Force complete DOM cleanup and redraw\n if (this.chartContainerEl()?.nativeElement) {\n // Clear everything in the container\n this.d3?.select(this.chartContainerEl().nativeElement).selectAll('*').remove();\n // Force full redraw\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n }\n else {\n // Normal update for other cases\n this.updateChart();\n }\n }\n else {\n // Hiding a bar\n this.hiddenBars.add(id);\n this.updateChart();\n }\n // Return the new visibility state\n return !this.hiddenBars.has(id);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.3\", ngImport: i0, type: AXBarChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.1.3\", 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:visible}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.3\", 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:visible}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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9iYXItY2hhcnQvc3JjL2xpYi9iYXItY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2Jhci1jaGFydC9zcmMvbGliL2Jhci1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZFLE9BQU8sRUFBRSx1QkFBdUIsRUFBc0IsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFbkQsT0FBTyxFQUNMLGVBQWUsRUFDZix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBRU4sTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBR3pEOzs7R0FHRztBQVNILE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxXQUFXO0lBQ2xELFNBQVM7SUFDVCx1QkFBdUI7SUFDdkIsSUFBSSxHQUFHLEtBQUssQ0FBbUIsRUFBRSxnREFBQyxDQUFDO0lBRW5DLDBCQUEwQjtJQUMxQixPQUFPLEdBQUcsS0FBSyxDQUFtQixFQUFFLG1EQUFDLENBQUM7SUFFdEMsVUFBVTtJQUNWLG9DQUFvQztJQUNwQyxRQUFRLEdBQUcsTUFBTSxFQUF3QixDQUFDO0lBRTFDLDRCQUE0QjtJQUNYLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxRQUFRLENB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QUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQztRQUVELGtDQUFrQztRQUNsQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEMsQ0FBQzt1R0EzMkJVLG1CQUFtQjsyRkFBbkIsbUJBQW1CLHFnQkNwQ2hDLGlSQVNBLHkzQ0R3QlksdUJBQXVCOzsyRkFHdEIsbUJBQW1CO2tCQVIvQixTQUFTOytCQUNFLGNBQWMsaUJBR1QsaUJBQWlCLENBQUMsSUFBSSxXQUM1QixDQUFDLHVCQUF1QixDQUFDLG1CQUNqQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTlhDb21wb25lbnQgfSBmcm9tICdAYWNvcmV4L2Nkay9jb21tb24nO1xuaW1wb3J0IHsgQVhfQ0hBUlRfQ09MT1JfUEFMRVRURSwgZ2V0Q2hhcnRDb2xvciB9IGZyb20gJ0BhY29yZXgvY2hhcnRzJztcbmltcG9ydCB7IEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlLCBBWENoYXJ0TGVnZW5kSXRlbSB9IGZyb20gJ0BhY29yZXgvY2hhcnRzL2NoYXJ0LWxlZ2VuZCc7XG5pbXBvcnQgeyBBWENoYXJ0VG9vbHRpcENvbXBvbmVudCwgQVhDaGFydFRvb2x0aXBEYXRhIH0gZnJvbSAnQGFjb3JleC9jaGFydHMvY2hhcnQtdG9vbHRpcCc7XG5pbXBvcnQgeyBBWFBsYXRmb3JtIH0gZnJvbSAnQGFjb3JleC9jb3JlL3BsYXRmb3JtJztcblxuaW1wb3J0IHtcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBFbGVtZW50UmVmLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBPbkRlc3Ryb3ksXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxuICB2aWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYX0JBUl9DSEFSVF9DT05GSUcgfSBmcm9tICcuL2Jhci1jaGFydC5jb25maWcnO1xuaW1wb3J0IHsgQVhCYXJDaGFydENsaWNrRXZlbnQsIEFYQmFyQ2hhcnREYXRhLCBBWEJhckNoYXJ0T3B0aW9uIH0gZnJvbSAnLi9iYXItY2hhcnQudHlwZSc7XG5cbi8qKlxuICogQmFyIENoYXJ0IENvbXBvbmVudFxuICogUmVuZGVycyBkYXRhIGFzIHZlcnRpY2FsIGJhcnMgd2l0aCBpbnRlcmFjdGl2ZSBob3ZlciBlZmZlY3RzIGFuZCBhbmltYXRpb25zXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2F4LWJhci1jaGFydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9iYXItY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9iYXItY2hhcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW0FYQ2hhcnRUb29sdGlwQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFYQmFyQ2hhcnRDb21wb25lbnQgZXh0ZW5kcyBOWENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQVhDaGFydExlZ2VuZENvbXBhdGlibGUge1xuICAvLyBJbnB1dHNcbiAgLyoqIENoYXJ0IGRhdGEgaW5wdXQgKi9cbiAgZGF0YSA9IGlucHV0PEFYQmFyQ2hhcnREYXRhW10+KFtdKTtcblxuICAvKiogQ2hhcnQgb3B0aW9ucyBpbnB1dCAqL1xuICBvcHRpb25zID0gaW5wdXQ8QVhCYXJDaGFydE9wdGlvbj4oe30pO1xuXG4gIC8vIE91dHB1dHNcbiAgLyoqIEVtaXR0ZWQgd2hlbiBhIGJhciBpcyBjbGlja2VkICovXG4gIGJhckNsaWNrID0gb3V0cHV0PEFYQmFyQ2hhcnRDbGlja0V2ZW50PigpO1xuXG4gIC8vIENoYXJ0IGNvbnRhaW5lciByZWZlcmVuY2VcbiAgcHJpdmF0ZSByZWFkb25seSBjaGFydENvbnRhaW5lckVsID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignY2hhcnRDb250YWluZXInKTtcblxuICAvLyBEMyByZWZlcmVuY2UgLSBsb2FkZWQgYXN5bmNocm9ub3VzbHlcbiAgcHJvdGVjdGVkIGQzITogdHlwZW9mIGltcG9ydCgnZDMnKTtcblxuICAvLyBDaGFydCBlbGVtZW50c1xuICBwcml2YXRlIHN2ZyE6IGFueTtcbiAgcHJpdmF0ZSBjaGFydCE6IGFueTtcbiAgcHJpdmF0ZSB4U2NhbGUhOiBhbnk7XG4gIHByaXZhdGUgeVNjYWxlITogYW55O1xuICBwcml2YXRlIHhBeGlzITogYW55O1xuICBwcml2YXRlIHlBeGlzITogYW55O1xuXG4gIC8vIENoYXJ0IGRpbWVuc2lvbnNcbiAgcHJpdmF0ZSB3aWR0aCE6IG51bWJlcjtcbiAgcHJpdmF0ZSBoZWlnaHQhOiBudW1iZXI7XG4gIHByaXZhdGUgbWFyZ2luID0geyB0b3A6IDIwLCByaWdodDogMjAsIGJvdHRvbTogMzAsIGxlZnQ6IDQwIH07XG5cbiAgLy8gQW5pbWF0aW9uIHN0YXRlXG4gIHByaXZhdGUgX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gVG9vbHRpcCBzdGF0ZVxuICBwcml2YXRlIF90b29sdGlwVmlzaWJsZSA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX3Rvb2x0aXBQb3NpdGlvbiA9IHNpZ25hbCh7IHg6IDAsIHk6IDAgfSk7XG4gIHByaXZhdGUgX3Rvb2x0aXBEYXRhID0gc2lnbmFsPEFYQ2hhcnRUb29sdGlwRGF0YT4oe1xuICAgIHRpdGxlOiAnJyxcbiAgICB2YWx1ZTogJzAnLFxuICAgIHBlcmNlbnRhZ2U6ICcwJScsXG4gICAgY29sb3I6ICcnLFxuICB9KTtcblxuICAvLyBTaWduYWxzIGZvciBjb21wb25lbnQgc3RhdGVcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9yZW5kZXJlZCA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gVG9vbHRpcCBhY2Nlc3NvcnNcbiAgcHJvdGVjdGVkIHRvb2x0aXBWaXNpYmxlID0gdGhpcy5fdG9vbHRpcFZpc2libGUuYXNSZWFkb25seSgpO1xuICBwcm90ZWN0ZWQgdG9vbHRpcFBvc2l0aW9uID0gdGhpcy5fdG9vbHRpcFBvc2l0aW9uLmFzUmVhZG9ubHkoKTtcbiAgcHJvdGVjdGVkIHRvb2x0aXBEYXRhID0gdGhpcy5fdG9vbHRpcERhdGEuYXNSZWFkb25seSgpO1xuXG4gIC8vIEluamVjdCBjb25maWd1cmF0aW9uXG4gIHByaXZhdGUgY29uZmlnVG9rZW4gPSBpbmplY3QoQVhfQkFSX0NIQVJUX0NPTkZJRyk7XG5cbiAgLy8gSW5qZWN0IHRoZSBjaGFydCBjb2xvcnNcbiAgcHJpdmF0ZSBjaGFydENvbG9ycyA9IGluamVjdChBWF9DSEFSVF9DT0xPUl9QQUxFVFRFKTtcblxuICAvLyBJbmplY3QgQVhQbGF0Zm9ybVxuICBwcml2YXRlIHBsYXRmb3JtID0gaW5qZWN0KEFYUGxhdGZvcm0pO1xuXG4gIC8vIENvbmZpZ3VyYXRpb24gd2l0aCBkZWZhdWx0c1xuICBwcm90ZWN0ZWQgZWZmZWN0aXZlT3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25maWdUb2tlbixcbiAgICAgIC4uLnRoaXMub3B0aW9ucygpLFxuICAgIH07XG4gIH0pO1xuXG4gIC8vIFRyYWNrIGhpZGRlbiBiYXJzXG4gIHByaXZhdGUgaGlkZGVuQmFycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gRHluYW1pY2FsbHkgbG9hZCBEMyBhbmQgaW5pdGlhbGl6ZSB0aGUgY2hhcnQgd2hlbiB0aGUgY29tcG9uZW50IGlzIHJlYWR5XG4gICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICAgIHRoaXMuX2luaXRpYWxpemVkLnNldCh0cnVlKTtcbiAgICAgIHRoaXMubG9hZEQzKCk7XG4gICAgICAvLyBDcmVhdGUgY2hhcnQgYWZ0ZXIgRDMgaXMgbG9hZGVkIGFuZCBjb250YWluZXIgaXMgYXZhaWxhYmxlXG4gICAgICBpZiAodGhpcy5kMyAmJiB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKSkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkLnNldCh0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFdhdGNoIGZvciBjaGFuZ2VzIHRvIHJlZHJhdyB0aGUgY2hhcnRcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgLy8gQWNjZXNzIGlucHV0cyB0byB0cmFjayB0aGVtXG4gICAgICB0aGlzLmRhdGEoKTtcbiAgICAgIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuXG4gICAgICAvLyBPbmx5IHVwZGF0ZSBpZiBhbHJlYWR5IHJlbmRlcmVkXG4gICAgICBpZiAodGhpcy5fcmVuZGVyZWQoKSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXBDaGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIEQzLmpzIGR5bmFtaWNhbGx5XG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgbG9hZEQzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmQzID0gYXdhaXQgaW1wb3J0KCdkMycpO1xuICAgICAgLy8gSWYgY29udGFpbmVyIGlzIHJlYWR5LCBjcmVhdGUgY2hhcnRcbiAgICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCgpICYmIHRoaXMuY2hhcnRDb250YWluZXJFbCgpKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZWQuc2V0KHRydWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBEMy5qczonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGJhciBjaGFydCBTVkcgYW5kIHJlbmRlcnMgYWxsIGVsZW1lbnRzXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmQzIHx8ICF0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YSgpIHx8IFtdO1xuXG4gICAgLy8gRmlsdGVyIG91dCBoaWRkZW4gYmFycyBmb3IgdmlzaWJsZSBkYXRhXG4gICAgY29uc3QgdmlzaWJsZURhdGEgPSBkYXRhLmZpbHRlcigoZCkgPT4gIXRoaXMuaXNCYXJIaWRkZW4oZC5pZCkpO1xuXG4gICAgLy8gQ2xlYXIgZXhpc3RpbmcgY2hhcnRcbiAgICB0aGlzLmQzLnNlbGVjdChjb250YWluZXJFbGVtZW50KS5zZWxlY3RBbGwoJ3N2ZycpLnJlbW92ZSgpO1xuXG4gICAgLy8gRWFybHkgcmV0dXJuIGlmIG5vIGRhdGFcbiAgICBpZiAoIWRhdGEubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNob3dOb0RhdGFNZXNzYWdlKGNvbnRhaW5lckVsZW1lbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEVhcmx5IHJldHVybiBpZiBhbGwgYmFycyBhcmUgaGlkZGVuXG4gICAgaWYgKHZpc2libGVEYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5zaG93QWxsQmFyc0hpZGRlbk1lc3NhZ2UoY29udGFpbmVyRWxlbWVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gR2V0IG9wdGlvbnMgYW5kIHNldHVwIGRpbWVuc2lvbnNcbiAgICBjb25zdCBjaGFydE9wdGlvbnMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKTtcbiAgICB0aGlzLnNldHVwRGltZW5zaW9ucyhjb250YWluZXJFbGVtZW50LCBjaGFydE9wdGlvbnMpO1xuXG4gICAgLy8gQ3JlYXRlIHNjYWxlcyBhbmQgYXhlcyB1c2luZyB2aXNpYmxlIGRhdGFcbiAgICB0aGlzLnNldHVwU2NhbGVzKHZpc2libGVEYXRhKTtcbiAgICB0aGlzLmNyZWF0ZUF4ZXMoY2hhcnRPcHRpb25zKTtcblxuICAgIC8vIFJlbmRlciB0aGUgYmFyc1xuICAgIHRoaXMucmVuZGVyQmFycyhkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBjaGFydCB3aGVuIGlucHV0cyBjaGFuZ2VcbiAgICovXG4gIHByb3RlY3RlZCB1cGRhdGVDaGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW5zIHVwIGNoYXJ0IHJlc291cmNlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGNsZWFudXBDaGFydCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdmcpIHtcbiAgICAgIHRoaXMuZDM/LnNlbGVjdCh0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkuc2VsZWN0QWxsKCdzdmcnKS5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc3ZnID0gbnVsbDtcbiAgICAgIHRoaXMuY2hhcnQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgY2hhcnQgZGltZW5zaW9ucyBhbmQgY3JlYXRlcyBTVkcgd2l0aCByZXNwb25zaXZlIGF0dHJpYnV0ZXNcbiAgICovXG4gIHByaXZhdGUgc2V0dXBEaW1lbnNpb25zKGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zOiBBWEJhckNoYXJ0T3B0aW9uKTogdm9pZCB7XG4gICAgLy8gQ2FsY3VsYXRlIG1hcmdpbnMgYmFzZWQgb24gb3B0aW9uc1xuICAgIHRoaXMuY2FsY3VsYXRlTWFyZ2lucyhvcHRpb25zLCBjb250YWluZXJFbGVtZW50LmNsaWVudFdpZHRoKTtcblxuICAgIC8vIEdldCBjb250YWluZXIgZGltZW5zaW9uc1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gY29udGFpbmVyRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSBjb250YWluZXJFbGVtZW50LmNsaWVudEhlaWdodDtcblxuICAgIC8vIElmIG9wdGlvbnMgc3BlY2lmeSB3aWR0aCBhbmQgaGVpZ2h0LCB1c2UgdGhvc2UsIG90aGVyd2lzZSBkZWZhdWx0IHRvIGNvbnRhaW5lciBzaXplXG4gICAgY29uc3QgbWluRGltID0gTWF0aC5taW4oMjAwLCBjb250YWluZXJXaWR0aCwgY29udGFpbmVySGVpZ2h0KTsgLy8gRW5zdXJlIHJlYXNvbmFibGUgbWluaW11bVxuXG4gICAgaWYgKG9wdGlvbnMud2lkdGggJiYgb3B0aW9ucy5oZWlnaHQpIHtcbiAgICAgIC8vIEV4cGxpY2l0IGRpbWVuc2lvbnMgcHJvdmlkZWRcbiAgICAgIHRoaXMud2lkdGggPSBvcHRpb25zLndpZHRoIC0gdGhpcy5tYXJnaW4ubGVmdCAtIHRoaXMubWFyZ2luLnJpZ2h0O1xuICAgICAgdGhpcy5oZWlnaHQgPSBvcHRpb25zLmhlaWdodCAtIHRoaXMubWFyZ2luLnRvcCAtIHRoaXMubWFyZ2luLmJvdHRvbTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVzcG9uc2l2ZSBkaW1lbnNpb25zXG4gICAgICB0aGlzLndpZHRoID0gTWF0aC5tYXgoY29udGFpbmVyV2lkdGgsIG1pbkRpbSkgLSB0aGlzLm1hcmdpbi5sZWZ0IC0gdGhpcy5tYXJnaW4ucmlnaHQ7XG4gICAgICB0aGlzLmhlaWdodCA9IE1hdGgubWF4KGNvbnRhaW5lckhlaWdodCwgbWluRGltKSAtIHRoaXMubWFyZ2luLnRvcCAtIHRoaXMubWFyZ2luLmJvdHRvbTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgcmVzcG9uc2l2ZSBTVkcgdGhhdCBzY2FsZXMgd2l0aCBpdHMgY29udGFpbmVyXG4gICAgY29uc3Qgc3ZnID0gdGhpcy5kM1xuICAgICAgLnNlbGVjdChjb250YWluZXJFbGVtZW50KVxuICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgIC5hdHRyKCd3aWR0aCcsICcxMDAlJylcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCAnMTAwJScpXG4gICAgICAuYXR0cihcbiAgICAgICAgJ3ZpZXdCb3gnLFxuICAgICAgICBgMCAwICR7dGhpcy53aWR0aCArIHRoaXMubWFyZ2luLmxlZnQgKyB0aGlzLm1hcmdpbi5yaWdodH0gJHt0aGlzLmhlaWdodCArIHRoaXMubWFyZ2luLnRvcCArIHRoaXMubWFyZ2luLmJvdHRvbX1gLFxuICAgICAgKVxuICAgICAgLmF0dHIoJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLCAneE1pZFlNaWQgbWVldCcpO1xuXG4gICAgdGhpcy5zdmcgPSBzdmc7XG5cbiAgICAvLyBDcmVhdGUgY2hhcnQgZ3JvdXAgd2l0aCBtYXJnaW5zXG4gICAgdGhpcy5jaGFydCA9IHRoaXMuc3ZnLmFwcGVuZCgnZycpLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHt0aGlzLm1hcmdpbi5sZWZ0fSwke3RoaXMubWFyZ2luLnRvcH0pYCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyBjaGFydCBtYXJnaW5zIGJhc2VkIG9uIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlTWFyZ2lucyhvcHRpb25zOiBBWEJhckNoYXJ0T3B0aW9uLCBjb250YWluZXJXaWR0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gU3RhcnQgd2l0aCBkZWZhdWx0IG1hcmdpbnNcbiAgICB0aGlzLm1hcmdpbiA9IHtcbiAgICAgIHRvcDogMjAsXG4gICAgICByaWdodDogMjAsXG4gICAgICBib3R0b206IDMwLFxuICAgICAgbGVmdDogNDAsXG4gICAgfTtcblxuICAgIGNvbnN0IHZpc2libGVEYXRhID0gdGhpcy5kYXRhKCkuZmlsdGVyKChkKSA9PiAhdGhpcy5pc0JhckhpZGRlbihkLmlkKSk7XG4gICAgY29uc3QgYmFyQ291bnQgPSB2aXNpYmxlRGF0YS5sZW5ndGg7XG5cbiAgICAvLyBQcmUtZW1wdGl2ZWx5IGluY3JlYXNlIGJvdHRvbSBtYXJnaW4gaWYgeC1heGlzIGxhYmVscyBhcmUgbGlrZWx5IHRvIGJlIHJvdGF0ZWQuXG4gICAgLy8gVGhpcyBpcyBhbiBlc3RpbWF0aW9uIGJlZm9yZSBzY2FsZXMgYW5kIGZ1bGwgZGltZW5zaW9ucyBhcmUgY2FsY3VsYXRlZC5cbiAgICBpZiAoYmFyQ291bnQgPiAwICYmIGNvbnRhaW5lcldpZHRoID4gMCkge1xuICAgICAgY29uc3Qgd29ya2luZ1dpZHRoID0gY29udGFpbmVyV2lkdGggLSB0aGlzLm1hcmdpbi5sZWZ0IC0gdGhpcy5tYXJnaW4ucmlnaHQ7XG4gICAgICBpZiAod29ya2luZ1dpZHRoID4gMCkge1xuICAgICAgICBjb25zdCBhdmFpbGFibGVXaWR0aFBlckJhciA9IHdvcmtpbmdXaWR0aCAvIGJhckNvdW50O1xuXG4gICAgICAgIGNvbnN0IGxvbmdlc3RMYWJlbCA9IHZpc2libGVEYXRhLnJlZHVjZSgoYSwgYikgPT4gKGEubGFiZWwubGVuZ3RoID4gYi5sYWJlbC5sZW5ndGggPyBhIDogYiksIHtcbiAgICAgICAgICBsYWJlbDogJycsXG4gICAgICAgIH0pLmxhYmVsO1xuXG4gICAgICAgIC8vIEVzdGltYXRlIGZvbnQgc2l6ZSB1c2luZyB0aGUgc2FtZSBsb2dpYyBhcyBpbiBjcmVhdGVBeGVzLCBidXQgd2l0aCB3b3JraW5nV2lkdGguXG4gICAgICAgIGNvbnN0IGVzdGltYXRlZEZvbnRTaXplID0gTWF0aC5tYXgoMTEsIE1hdGgubWluKDE1LCBNYXRoLnJvdW5kKHdvcmtpbmdXaWR0aCAvIDQ1KSkpO1xuXG4gICAgICAgIC8vIEVzdGltYXRlIGxhYmVsIHdpZHRoICh1c2luZyAwLjYgYXMgYW4gYXZlcmFnZSBjaGFyYWN0ZXIgd2lkdGgtdG8taGVpZ2h0IHJhdGlvKS5cbiAgICAgICAgY29uc3QgZXN0aW1hdGVkTG9uZ2VzdExhYmVsV2lkdGggPSBsb25nZXN0TGFiZWwubGVuZ3RoICogZXN0aW1hdGVkRm9udFNpemUgKiAwLjY7XG5cbiAgICAgICAgLy8gSWYgZXN0aW1hdGVkIGxhYmVsIHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BhY2UgYXZhaWxhYmxlLCByb3RhdGlvbiB3aWxsIG9jY3VyLlxuICAgICAgICBpZiAoZXN0aW1hdGVkTG9uZ2VzdExhYmVsV2lkdGggPiBhdmFpbGFibGVXaWR0aFBlckJhcikge1xuICAgICAgICAgIC8vIEFkZCBzcGFjZSBmb3Igcm90YXRlZCBsYWJlbHMuIFRoZSBoZWlnaHQgb2YgdGhlIHJvdGF0ZWQgbGFiZWwncyBib3VuZGluZyBib3hcbiAgICAgICAgICAvLyBpcyByb3VnaGx5IGl0cyBsZW5ndGggKiBzaW4oNDUgZGVncmVlcykuIEFkZCBzb21lIHBhZGRpbmcuXG4gICAgICAgICAgY29uc3QgcmVxdWlyZWRFeHRyYU1hcmdpbiA9IGVzdGltYXRlZExvbmdlc3RMYWJlbFdpZHRoICogTWF0aC5zaW4oTWF0aC5QSSAvIDQpICsgMTA7XG4gICAgICAgICAgdGhpcy5tYXJnaW4uYm90dG9tICs9IE1hdGgubWluKDYwLCByZXF1aXJlZEV4dHJhTWFyZ2luKTsgLy8gQ2FwIG1heCBleHRyYSBtYXJnaW4uXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGp1c3QgbWFyZ2lucyBpZiBheGlzIGxhYmVscyBhcmUgcHJlc2VudFxuICAgIGlmIChvcHRpb25zLnhBeGlzTGFiZWwpIHtcbiAgICAgIGNvbnN0IHhMYWJlbExlbmd0aCA9IG9wdGlvbnMueEF4aXNMYWJlbC5sZW5ndGg7XG4gICAgICBjb25zdCBleHRyYUJvdHRvbU1hcmdpbiA9IE1hdGgubWluKDIwLCBNYXRoLm1heCgxMCwgeExhYmVsTGVuZ3RoICogMC44KSk7XG4gICAgICB0aGlzLm1hcmdpbi5ib3R0b20gPSBNYXRoLm1heCh0aGlzLm1hcmdpbi5ib3R0b20sIDMwICsgZXh0cmFCb3R0b21NYXJnaW4pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnlBeGlzTGFiZWwpIHtcbiAgICAgIGNvbnN0IHlMYWJlbExlbmd0aCA9IG9wdGlvbnMueUF4aXNMYWJlbC5sZW5ndGg7XG4gICAgICBjb25zdCBleHRyYUxlZnRNYXJnaW4gPSBNYXRoLm1pbigyMCwgTWF0aC5tYXgoMTAsIHlMYWJlbExlbmd0aCAqIDAuOCkpO1xuICAgICAgdGhpcy5tYXJnaW4ubGVmdCA9IE1hdGgubWF4KHRoaXMubWFyZ2luLmxlZnQsIDQwICsgZXh0cmFMZWZ0TWFyZ2luKTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgbWluaW11bSBtYXJnaW5zIGZvciBheGVzXG4gICAgaWYgKG9wdGlvbnMuc2hvd1hBeGlzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5tYXJnaW4uYm90dG9tID0gTWF0aC5tYXgodGhpcy5tYXJnaW4uYm90dG9tLCAzNSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc2hvd1lBeGlzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5tYXJnaW4ubGVmdCA9IE1hdGgubWF4KHRoaXMubWFyZ2luLmxlZnQsIDQ1KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB4IGFuZCB5IHNjYWxlcyBmb3IgdGhlIGNoYXJ0XG4gICAqL1xuICBwcml2YXRlIHNldHVwU2NhbGVzKGRhdGE6IEFYQmFyQ2hhcnREYXRhW10pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIGJhciB3aWR0aCBwZXJjZW50YWdlIChkZWZhdWx0IDgwJSlcbiAgICBjb25zdCBiYXJXaWR0aFBlcmNlbnQgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5iYXJXaWR0aCA/PyA2MCAvIDEwMDtcbiAgICAvLyBDYWxjdWxhdGUgcGFkZGluZyBiYXNlZCBvbiBiYXJXaWR0aCAoaW52ZXJzZSByZWxhdGlvbnNoaXApXG4gICAgY29uc3QgcGFkZGluZyA9IE1hdGgubWF4KDAuMSwgMSAtIGJhcldpZHRoUGVyY2VudCk7XG5cbiAgICAvLyBDcmVhdGUgeCBzY2FsZSAoYmFuZCBzY2FsZSBmb3IgY2F0ZWdvcmljYWwgZGF0YSlcbiAgICB0aGlzLnhTY2FsZSA9IHRoaXMuZDNcbiAgICAgIC5zY2FsZUJhbmQoKVxuICAgICAgLmRvbWFpbihkYXRhLm1hcCgoZCkgPT4gZC5sYWJlbCkpXG4gICAgICAucmFuZ2UoWzAsIHRoaXMud2lkdGhdKVxuICAgICAgLnBhZGRpbmcocGFkZGluZyk7XG5cbiAgICAvLyBDcmVhdGUgeSBzY2FsZSAobGluZWFyIHNjYWxlIGZvciB2YWx1ZXMpXG4gICAgdGhpcy55U2NhbGUgPSB0aGlzLmQzXG4gICAgICAuc2NhbGVMaW5lYXIoKVxuICAgICAgLmRvbWFpbihbMCwgdGhpcy5kMy5tYXgoZGF0YSwgKGQpID0+IGQudmFsdWUpIHx8IDBdKVxuICAgICAgLm5pY2UoKVxuICAgICAgLnJhbmdlKFt0aGlzLmhlaWdodCwgMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgeCBhbmQgeSBheGVzIHdpdGggZ3JpZCBsaW5lc1xuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVBeGVzKG9wdGlvbnM6IEFYQmFyQ2hhcnRPcHRpb24pOiB2b2lkIHtcbiAgICAvLyBPbmx5IGNyZWF0ZSBheGVzIGlmIHRoZXkgYXJlIGVuYWJsZWQgaW4gb3B0aW9uc1xuICAgIGNvbnN0IHNob3dYQXhpcyA9IG9wdGlvbnMuc2hvd1hBeGlzICE9PSBmYWxzZTtcbiAgICBjb25zdCBzaG93WUF4aXMgPSBvcHRpb25zLnNob3dZQXhpcyAhPT0gZmFsc2U7XG4gICAgY29uc3Qgc2hvd0dyaWQgPSBvcHRpb25zLnNob3dHcmlkICE9PSBmYWxzZTtcbiAgICBjb25zdCBpc1J0bCA9IHRoaXMucGxhdGZvcm0uaXNSdGwoKTtcblxuICAgIC8vIENyZWF0ZSBhIGdyb3VwIGZvciBhbGwgYXhlc1xuICAgIGNvbnN0IGF4ZXNHcm91cCA9IHRoaXMuY2hhcnQuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWF4ZXMnKTtcblxuICAgIGlmIChzaG93WEF4aXMpIHtcbiAgICAgIC8vIENyZWF0ZSBYIGF4aXNcbiAgICAgIHRoaXMueEF4aXMgPSBheGVzR3JvdXBcbiAgICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYXhpcy14JylcbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwke3RoaXMuaGVpZ2h0fSlgKVxuICAgICAgICAuY2FsbCh0aGlzLmQzLmF4aXNCb3R0b20odGhpcy54U2NhbGUpKTtcblxuICAgICAgLy8gU3R5bGUgdGhlIGF4aXMgdGV4dFxuICAgICAgY29uc3QgZHluYW1pY1hBeGlzVGlja0ZvbnRTaXplID0gTWF0aC5tYXgoMTEsIE1hdGgubWluKDE1LCBNYXRoLnJvdW5kKHRoaXMud2lkdGggLyA0NSkpKTtcbiAgICAgIGNvbnN0IHhBeGlzVGlja3MgPSB0aGlzLnhBeGlzXG4gICAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxuICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGAke2R5bmFtaWNYQXhpc1RpY2tGb250U2l6ZX1weGApXG4gICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNDAwJylcbiAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYmEodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtbGFiZWxzLWNvbG9yKSwgMC43KScpO1xuXG4gICAgICAvLyBBdXRvbWF0aWNhbGx5IHJvdGF0ZSBsYWJlbHMgaWYgdGhleSBhcmUgbGlrZWx5IHRvIG92ZXJsYXBcbiAgICAgIGlmICh0aGlzLnhTY2FsZS5kb21haW4oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnhTY2FsZS5zdGVwKCk7XG4gICAgICAgIGNvbnN0IGxvbmdlc3RMYWJlbCA9IHRoaXMueFNjYWxlLmRvbWFpbigpLnJlZHVjZSgoYSwgYikgPT4gKGEubGVuZ3RoID4gYi5sZW5ndGggPyBhIDogYiksICcnKTtcbiAgICAgICAgLy8gVXNpbmcgMC41NSBhcyBhIHNhZmVyIGVzdGltYXRlIGZvciBjaGFyIHdpZHRoLXRvLWhlaWdodCByYXRpb1xuICAgICAgICBjb25zdCBlc3RpbWF0ZWRMb25nZXN0TGFiZWxXaWR0aCA9IGxvbmdlc3RMYWJlbC5sZW5ndGggKiBkeW5hbWljWEF4aXNUaWNrRm9udFNpemUgKiAwLjU1O1xuXG4gICAgICAgIGlmIChlc3RpbWF0ZWRMb25nZXN0TGFiZWxXaWR0aCA+IHN0ZXApIHtcbiAgICAgICAgICB4QXhpc1RpY2tzXG4gICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3JvdGF0ZSgtNDUpJylcbiAgICAgICAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnZW5kJylcbiAgICAgICAgICAgIC5hdHRyKCdkeCcsICctMC44ZW0nKVxuICAgICAgICAgICAgLmF0dHIoJ2R5JywgJzAuMTVlbScpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFN0eWxlIGFsbCBsaW5lcyBpbiB0aGUgeC1heGlzIChwYXRoLCB0aWNrcylcbiAgICAgIHRoaXMueEF4aXMuc2VsZWN0QWxsKCdsaW5lLCBwYXRoJykuc3R5bGUoJ3N0cm9rZScsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtZ3JpZC1saW5lcy1jb2xvcikpJyk7XG5cbiAgICAgIC8vIEFkZCBYIGF4aXMgbGFiZWwgaWYgcHJvdmlkZWRcbiAgICAgIGlmIChvcHRpb25zLnhBeGlzTGFiZWwpIHtcbiAgICAgICAgY29uc3QgbGFiZWxZID0gdGhpcy5oZWlnaHQgKyB0aGlzLm1hcmdpbi5ib3R0b20gKiAwLjg7XG5cbiAgICAgICAgYXhlc0dyb3VwXG4gICAgICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1heGlzLWxhYmVsIGF4LXgtYXhpcy1sYWJlbCcpXG4gICAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAgICAgLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ21pZGRsZScpXG4gICAgICAgICAgLmF0dHIoJ3gnLCB0aGlzLndpZHRoIC8gMilcbiAgICAgICAgICAuYXR0cigneScsIGxhYmVsWSlcbiAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcxNHB4JylcbiAgICAgICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJzUwMCcpXG4gICAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWJhci1jaGFydC1heGlzLWxhYmVsLWNvbG9yKSknKVxuICAgICAgICAgIC50ZXh0KG9wdGlvbnMueEF4aXNMYWJlbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dZQXhpcykge1xuICAgICAgLy8gQ3JlYXRlIFkgYXhpc1xuICAgICAgdGhpcy55QXhpcyA9IGF4ZXNHcm91cC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYXhpcy15JykuY2FsbCh0aGlzLmQzLmF4aXNMZWZ0KHRoaXMueVNjYWxlKSk7XG5cbiAgICAgIC8vIFN0eWxlIHRoZSBheGlzIHRleHRcbiAgICAgIGNvbnN0IGR5bmFtaWNZQXhpc1RpY2tGb250U2l6ZSA9IE1hdGgubWF4KDExLCBNYXRoLm1pbigxNSwgTWF0aC5yb3VuZCh0aGlzLmhlaWdodCAvIDMwKSkpO1xuICAgICAgY29uc3QgeVRpY2tUZXh0cyA9IHRoaXMueUF4aXNcbiAgICAgICAgLnNlbGVjdEFsbCgndGV4dCcpXG4gICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgYCR7ZHluYW1pY1lBeGlzVGlja0ZvbnRTaXplfXB4YClcbiAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc0MDAnKVxuICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiYSh2YXIoLS1heC1jb21wLWJhci1jaGFydC1sYWJlbHMtY29sb3IpLCAwLjcpJyk7XG5cbiAgICAgIGlmIChpc1J0bCkge1xuICAgICAgICB5VGlja1RleHRzLmF0dHIoJ3RleHQtYW5jaG9yJywgJ3N0YXJ0Jyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0eWxlIGFsbCBsaW5lcyBpbiB0aGUgeS1heGlzIChwYXRoLCB0aWNrcylcbiAgICAgIHRoaXMueUF4aXMuc2VsZWN0QWxsKCdsaW5lLCBwYXRoJykuc3R5bGUoJ3N0cm9rZScsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtZ3JpZC1saW5lcy1jb2xvcikpJyk7XG5cbiAgICAgIC8vIEFkZCBZIGF4aXMgbGFiZWwgaWYgcHJvdmlkZWRcbiAgICAgIGlmIChvcHRpb25zLnlBeGlzTGFiZWwpIHtcbiAgICAgICAgY29uc3QgbGFiZWxYID0gLXRoaXMuaGVpZ2h0IC8gMjtcbiAgICAgICAgY29uc3QgbGFiZWxZID0gLXRoaXMubWFyZ2luLmxlZnQgKiAwLjg7XG5cbiAgICAgICAgYXhlc0dyb3VwXG4gICAgICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1heGlzLWxhYmVsIGF4LXktYXhpcy1sYWJlbCcpXG4gICAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAgICAgLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ21pZGRsZScpXG4gICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICdyb3RhdGUoLTkwKScpXG4gICAgICAgICAgLmF0dHIoJ3gnLCBsYWJlbFgpXG4gICAgICAgICAgLmF0dHIoJ3knLCBsYWJlbFkpXG4gICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnMTRweCcpXG4gICAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc1MDAnKVxuICAgICAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtYXhpcy1sYWJlbC1jb2xvcikpJylcbiAgICAgICAgICAudGV4dChvcHRpb25zLnlBeGlzTGFiZWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG93R3JpZCkge1xuICAgICAgLy8gQWRkIGhvcml6b250YWwgZ3JpZCBsaW5lc1xuICAgICAgdGhpcy5jaGFydFxuICAgICAgICAuYXBwZW5kKCdnJylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1ncmlkJylcbiAgICAgICAgLmNhbGwoXG4gICAgICAgICAgdGhpcy5kM1xuICAgICAgICAgICAgLmF4aXNMZWZ0KHRoaXMueVNjYWxlKVxuICAgICAgICAgICAgLnRpY2tTaXplKC10aGlzLndpZHRoKVxuICAgICAgICAgICAgLnRpY2tGb3JtYXQoKCkgPT4gJycpLFxuICAgICAgICApXG4gICAgICAgIC5zZWxlY3RBbGwoJ2xpbmUnKVxuICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtZ3JpZC1saW5lcy1jb2xvcikpJylcbiAgICAgICAgLnN0eWxlKCdzdHJva2Utb3BhY2l0eScsIDAuMik7XG5cbiAgICAgIC8vIFJlbW92ZSB1bm5lZWRlZCBlbGVtZW50cyBmcm9tIGdyaWRcbiAgICAgIHRoaXMuY2hhcnQuc2VsZWN0KCcuYXgtYmFyLWNoYXJ0LWdyaWQnKS5zZWxlY3RBbGwoJ3BhdGgsIHRleHQnKS5yZW1vdmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgYmFycyB3aXRoIGFuaW1hdGlvbnNcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQmFycyhkYXRhOiBBWEJhckNoYXJ0RGF0YVtdKTogdm9pZCB7XG4gICAgLy8gRmlsdGVyIG91dCBoaWRkZW4gYmFyc1xuICAgIGNvbnN0IHZpc2libGVEYXRhID0gZGF0YS5maWx0ZXIoKGQpID0+ICF0aGlzLmlzQmFySGlkZGVuKGQuaWQpKTtcbiAgICBjb25zdCBvcmlnaW5hbEZ1bGxEYXRhID0gdGhpcy5kYXRhKCk7IC8vIEdldCB0aGUgb3JpZ2luYWwgZnVsbCBkYXRhIHNldFxuXG4gICAgLy8gUmVzZXQgYW5pbWF0aW9uIHN0YXRlXG4gICAgdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlLnNldChmYWxzZSk7XG5cbiAgICAvLyBHZXQgY29ybmVyIHJhZGl1cyBmcm9tIG9wdGlvbnNcbiAgICBjb25zdCByYWRpdXMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5jb3JuZXJSYWRpdXM7XG5cbiAgICAvLyBHZXQgYW5pbWF0aW9uIG9wdGlvbnNcbiAgICBjb25zdCBhbmltYXRpb25EdXJhdGlvbiA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkR1cmF0aW9uO1xuICAgIGNvbnN0IGFuaW1hdGlvbkVhc2luZyA9IHRoaXMuZ2V0RWFzaW5nRnVuY3Rpb24odGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuYW5pbWF0aW9uRWFzaW5nKTtcblxuICAgIC8vIENyZWF0ZSBhIGNvbnRhaW5lciBmb3IgYWxsIGJhcnNcbiAgICBjb25zdCBiYXJzQ29udGFpbmVyID0gdGhpcy5jaGFydC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYmFycy1jb250YWluZXInKTtcblxuICAgIC8vIENyZWF0ZSBncm91cHMgZm9yIGVhY2ggYmFyIHRvIGhhbmRsZSB0cmFuc2Zvcm1hdGlvbnNcbiAgICBjb25zdCBiYXJHcm91cHMgPSBiYXJzQ29udGFpbmVyXG4gICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhci1ncm91cCcpXG4gICAgICAuZGF0YSh2aXNpYmxlRGF0YSlcbiAgICAgIC5lbnRlcigpXG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1iYXItZ3JvdXAnKTtcblxuICAgIC8vIEFkZCBiYXJzIGluc2lkZSBncm91cHNcbiAgICBjb25zdCBiYXJzID0gYmFyR3JvdXBzXG4gICAgICAuYXBwZW5kKCdyZWN0JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYmFyJylcbiAgICAgIC5hdHRyKCd4JywgKGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB0aGlzLnhTY2FsZShkLmxhYmVsKSlcbiAgICAgIC5hdHRyKCd3aWR0aCcsIHRoaXMueFNjYWxlLmJhbmR3aWR0aCgpKVxuICAgICAgLmF0dHIoJ3knLCB0aGlzLmhlaWdodCkgLy8gU3RhcnQgZnJvbSBib3R0b20gZm9yIGFuaW1hdGlvblxuICAgICAgLmF0dHIoJ2hlaWdodCcsIDApIC8vIFN0YXJ0IHdpdGggaGVpZ2h0IDAgZm9yIGFuaW1hdGlvblxuICAgICAgLmF0dHIoJ3J4JywgcmFkaXVzKSAvLyBSb3VuZGVkIGNvcm5lcnNcbiAgICAgIC5hdHRyKCdyeScsIHJhZGl1cykgLy8gUm91bmRlZCBjb3JuZXJzXG4gICAgICAuYXR0cignZmlsbCcsIChkOiBBWEJhckNoYXJ0RGF0YSkgPT4ge1xuICAgICAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBiYXIgKGQpIGluIHRoZSBvcmlnaW5hbCBkYXRhIGFycmF5XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsSW5kZXggPSBvcmlnaW5hbEZ1bGxEYXRhLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZC5pZCk7XG4gICAgICAgIC8vIFVzZSB0aGUgb3JpZ2luYWwgY29sb3IgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSBnZXQgY29sb3IgZnJvbSBwYWxldHRlIHVzaW5nIG9yaWdpbmFsIGluZGV4XG4gICAgICAgIC8vIEZhbGxiYWNrIHRvIGluZGV4IDAgaWYgbm90IGZvdW5kLCB0aG91Z2ggdGhpcyBzaG91bGRuJ3QgaGFwcGVuIHdpdGggdmFsaWQgZGF0YS5cbiAgICAgICAgcmV0dXJuIGQuY29sb3IgfHwgdGhpcy5nZXRDb2xvcihvcmlnaW5hbEluZGV4ICE9PSAtMSA/IG9yaWdpbmFsSW5kZXggOiAwKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gQWRkIGRhdGEgbGFiZWxzIGlmIHRoZXkncmUgZW5hYmxlZFxuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93RGF0YUxhYmVscyAhPT0gZmFsc2UpIHtcbiAgICAgIGJhckdyb3Vwc1xuICAgICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1kYXRhLWxhYmVsJylcbiAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAgIC5hdHRyKCd4JywgKGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB0aGlzLnhTY2FsZShkLmxhYmVsKSArIHRoaXMueFNjYWxlLmJhbmR3aWR0aCgpIC8gMilcbiAgICAgICAgLmF0dHIoJ3knLCB0aGlzLmhlaWdodCkgLy8gU3RhcnQgZnJvbSBib3R0b20gZm9yIGFuaW1hdGlvblxuICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICdjbGFtcCg4cHgsIDJ2bWluLCAxMnB4KScpXG4gICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNTAwJylcbiAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWJhci1jaGFydC1kYXRhLWxhYmVscy1jb2xvcikpJylcbiAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMCkgLy8gU3RhcnQgaW52aXNpYmxlIGZvciBhbmltYXRpb25cbiAgICAgICAgLnRleHQoKGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiBkLnZhbHVlKTtcblxuICAgICAgLy8gQW5pbWF0ZSBkYXRhIGxhYmVsc1xuICAgICAgYmFyR3JvdXBzXG4gICAgICAgIC5zZWxlY3RBbGwoJy5heC1iYXItY2hhcnQtZGF0YS1sYWJlbCcpXG4gICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgICAuZGVsYXkoKGQ6IEFYQmFyQ2hhcnREYXRhLCBpOiBudW1iZXIpID0+IGkgKiA1MCArIDEwMCkgLy8gU2xpZ2h0bHkgZGVsYXllZCBhZnRlciBiYXIgYW5pbWF0aW9uXG4gICAgICAgIC5hdHRyKCd5JywgKGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB0aGlzLnlTY2FsZShkLnZhbHVlKSAtIDgpIC8vIFBvc2l0aW9uIGFib3ZlIGJhclxuICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAxKVxuICAgICAgICAuZWFzZShhbmltYXRpb25FYXNpbmcpO1xuICAgIH1cblxuICAgIC8vIFNldCB1cCBldmVudCBoYW5kbGVycyBvbiBlYWNoIGdyb3VwXG4gICAgYmFyR3JvdXBzXG4gICAgICAub24oJ21vdXNlZW50ZXInLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB7XG4gICAgICAgIC8vIE9ubHkgYXBwbHkgaG92ZXIgZWZmZWN0cyBpZiBpbml0aWFsIGFuaW1hdGlvbiBpcyBjb21wbGV0ZVxuICAgICAgICBpZiAoIXRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgYmFyRWwgPSB0aGlzLmQzLnNlbGVjdChldmVudC5jdXJyZW50VGFyZ2V0KS5zZWxlY3QoJ3JlY3QnKTtcblxuICAgICAgICAvLyBTdGFuZGFyZCBob3ZlciBlZmZlY3QgLSBkYXJrZW4gdGhlIGJhciBzbGlnaHRseSBhbmQgYWRkIGEgc3VidGxlIHNoYWRvd1xuICAgICAgICBiYXJFbC50cmFuc2l0aW9uKCkuZHVyYXRpb24oMTUwKS5zdHlsZSgnZmlsdGVyJywgJ2JyaWdodG5lc3MoMC43KSBkcm9wLXNoYWRvdygwIDAgMnB4IHJnYmEoMCwwLDAsMC4xKSknKTtcblxuICAgICAgICB0aGlzLmhhbmRsZUJhckhvdmVyKGV2ZW50LCBkKTtcbiAgICAgIH0pXG4gICAgICAub24oJ21vdXNlbW92ZScsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAvLyBPbmx5IHVwZGF0ZSB0b29sdGlwIGlmIGluaXRpYWwgYW5pbWF0aW9uIGlzIGNvbXBsZXRlXG4gICAgICAgIGlmICh0aGlzLl9pbml0aWFsQW5pbWF0aW9uQ29tcGxldGUoKSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5vbignbW91c2VsZWF2ZScsIChldmVudDogTW91c2VFdmVudCwgZDogQVhCYXJDaGFydERhdGEpID0+IHtcbiAgICAgICAgLy8gT25seSBhcHBseSBob3ZlciBlZmZlY3RzIGlmIGluaXRpYWwgYW5pbWF0aW9uIGlzIGNvbXBsZXRlXG4gICAgICAgIGlmICghdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlKCkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBiYXJFbCA9IHRoaXMuZDMuc2VsZWN0KGV2ZW50LmN1cnJlbnRUYXJnZXQpLnNlbGVjdCgncmVjdCcpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBob3ZlciBlZmZlY3RcbiAgICAgICAgYmFyRWwudHJhbnNpdGlvbigpLmR1cmF0aW9uKDE1MCkuc3R5bGUoJ2ZpbHRlcicsIG51bGwpO1xuXG4gICAgICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldChmYWxzZSk7XG4gICAgICB9KVxuICAgICAgLm9uKCdjbGljaycsIChldmVudDogTW91c2VFdmVudCwgZDogQVhCYXJDaGFydERhdGEpID0+IHtcbiAgICAgICAgLy8gT25seSB0cmlnZ2VyIGNsaWNrIGV2ZW50cyBpZiBpbml0aWFsIGFuaW1hdGlvbiBpcyBjb21wbGV0ZVxuICAgICAgICBpZiAodGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlKCkpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUJhckNsaWNrKGV2ZW50LCBkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAvLyBBZGQgYW5pbWF0aW9uXG4gICAgYmFyc1xuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgLmRlbGF5KChkOiBBWEJhckNoYXJ0RGF0YSwgaTogbnVtYmVyKSA9PiBpICogNTApIC8vIFN0YWdnZXIgZWFjaCBiYXIgYW5pbWF0aW9uXG4gICAgICAuYXR0cigneScsIChkOiBBWEJhckNoYXJ0RGF0YSkgPT4gdGhpcy55U2NhbGUoZC52YWx1ZSkpXG4gICAgICAuYXR0cignaGVpZ2h0JywgKGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB0aGlzLmhlaWdodCAtIHRoaXMueVNjYWxlKGQudmFsdWUpKVxuICAgICAgLmVhc2UoYW5pbWF0aW9uRWFzaW5nKSAvLyBVc2UgdGhlIGNvbmZpZ3VyZWQgZWFzaW5nIGZ1bmN0aW9uXG4gICAgICAuZW5kKCkgLy8gV2FpdCBmb3IgYWxsIGFuaW1hdGlvbnMgdG8gY29tcGxldGVcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gTWFyayBhbmltYXRpb24gYXMgY29tcGxldGUgdG8gZW5hYmxlIGhvdmVyIGVmZmVjdHNcbiAgICAgICAgdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlLnNldCh0cnVlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIEQzIGVhc2luZyBmdW5jdGlvbiBiYXNlZCBvbiB0aGUgb3B0aW9uIHN0cmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRFYXNpbmdGdW5jdGlvbihlYXNpbmc/OiBzdHJpbmcpOiBhbnkge1xuICAgIHN3aXRjaCAoZWFzaW5nKSB7XG4gICAgICBjYXNlICdsaW5lYXInOlxuICAgICAgICByZXR1cm4gdGhpcy5kMy5lYXNlTGluZWFyO1xuICAgICAgY2FzZSAnZWFzZSc6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VQb2x5SW5PdXQ7XG4gICAgICBjYXNlICdlYXNlLWluJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZDMuZWFzZVBvbHlJbjtcbiAgICAgIGNhc2UgJ2Vhc2Utb3V0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZDMuZWFzZVBvbHlPdXQ7XG4gICAgICBjYXNlICdlYXNlLWluLW91dCc6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VQb2x5SW5PdXQ7XG4gICAgICBjYXNlICdjdWJpYyc6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VDdWJpYztcbiAgICAgIGNhc2UgJ2N1YmljLWluJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZDMuZWFzZUN1YmljSW47XG4gICAgICBjYXNlICdjdWJpYy1vdXQnOlxuICAgICAgICByZXR1cm4gdGhpcy5kMy5lYXNlQ3ViaWNPdXQ7XG4gICAgICBjYXNlICdjdWJpYy1pbi1vdXQnOlxuICAgICAgICByZXR1cm4gdGhpcy5kMy5lYXNlQ3ViaWNJbk91dDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VDdWJpY091dDsgLy8gRGVmYXVsdCBlYXNpbmdcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBiYXIgaG92ZXIgZXZlbnQgYW5kIHNob3dzIHRvb2x0aXBcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlQmFySG92ZXIoZXZlbnQ6IE1vdXNlRXZlbnQsIGRhdHVtOiBBWEJhckNoYXJ0RGF0YSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93VG9vbHRpcCAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5kYXRhKCkuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09PSBkYXR1bS5pZCk7XG4gICAgICBjb25zdCBjb2xvciA9IGRhdHVtLmNvbG9yIHx8IHRoaXMuZ2V0Q29sb3IoaW5kZXgpO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgcGVyY2VudGFnZSBvZiB0b3RhbFxuICAgICAgY29uc3QgdG90YWwgPSB0aGlzLmRhdGEoKS5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4gc3VtICsgaXRlbS52YWx1ZSwgMCk7XG4gICAgICBjb25zdCBwZXJjZW50YWdlID0gdG90YWwgPiAwID8gKChkYXR1bS52YWx1ZSAvIHRvdGFsKSAqIDEwMCkudG9GaXhlZCgxKSA6ICcwJztcblxuICAgICAgdGhpcy5fdG9vbHRpcERhdGEuc2V0KHtcbiAgICAgICAgdGl0bGU6IGRhdHVtLnRvb2x0aXBMYWJlbCB8fCBkYXR1bS5sYWJlbCxcbiAgICAgICAgdmFsdWU6IGRhdHVtLnZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgIHBlcmNlbnRhZ2U6IGAke3BlcmNlbnRhZ2V9JWAsXG4gICAgICAgIGNvbG9yOiBjb2xvcixcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gICAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdG9vbHRpcCBwb3NpdGlvbiBiYXNlZCBvbiBtb3VzZSBjb29yZGluYXRlc1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHRvb2x0aXBFbCA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmNoYXJ0LXRvb2x0aXAnKTtcblxuICAgIGlmICghdG9vbHRpcEVsKSB7XG4gICAgICBjb25zdCB4ID0gZXZlbnQuY2xpZW50WCAtIGNvbnRhaW5lci5sZWZ0O1xuICAgICAgY29uc3QgeSA9IGV2ZW50LmNsaWVudFkgLSBjb250YWluZXIudG9wO1xuICAgICAgdGhpcy5fdG9vbHRpcFBvc2l0aW9uLnNldCh7IHgsIHkgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdG9vbHRpcFJlY3QgPSB0b29sdGlwRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IHggPSBldmVudC5jbGllbnRYIC0gY29udGFpbmVyLmxlZnQ7XG4gICAgY29uc3QgeSA9IGV2ZW50LmNsaWVudFkgLSBjb250YWluZXIudG9wO1xuXG4gICAgLy8gQWRqdXN0IHBvc2l0aW9uIGlmIG5lYXIgdGhlIHJpZ2h0IGVkZ2VcbiAgICBpZiAoeCArIHRvb2x0aXBSZWN0LndpZHRoICsgMTAgPiBjb250YWluZXIud2lkdGgpIHtcbiAgICAgIHggPSB4IC0gdG9vbHRpcFJlY3Qud2lkdGggLSAxMDtcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IHggKyAxMDtcbiAgICB9XG5cbiAgICB0aGlzLl90b29sdGlwUG9zaXRpb24uc2V0KHsgeCwgeSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGJhciBjbGljayBldmVudFxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVCYXJDbGljayhldmVudDogTW91c2VFdmVudCwgZGF0dW06IEFYQmFyQ2hhcnREYXRhKTogdm9pZCB7XG4gICAgdGhpcy5iYXJDbGljay5lbWl0KHsgaXRlbTogZGF0dW0sIGV2ZW50OiB7IG5hdGl2ZUV2ZW50OiBldmVudCwgc2VuZGVyOiB0aGlzIH0gfSk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSBtZXNzYWdlIHdoZW4gbm8gZGF0YSBpcyBhdmFpbGFibGVcbiAgICovXG4gIHByaXZhdGUgc2hvd05vRGF0YU1lc3NhZ2UoY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBleGlzdGluZyBjb250ZW50cyBmaXJzdFxuICAgIHRoaXMuZDMuc2VsZWN0KGNvbnRhaW5lckVsZW1lbnQpLnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpO1xuXG4gICAgY29uc3QgbWVzc2FnZUNvbnRhaW5lciA9IHRoaXMuZDNcbiAgICAgIC5zZWxlY3QoY29udGFpbmVyRWxlbWVudClcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAvLyBBcHBseSBnZW5lcmljIGNvbnRhaW5lciBjbGFzcywgc3BlY2lmaWMgYmFyIGNoYXJ0IGJhY2tncm91bmQgY2xhc3MsIGFuZCBleGlzdGluZyBzcGVjaWZpYyBjbGFzc1xuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWNoYXJ0LW1lc3NhZ2UtY29udGFpbmVyIGF4LWJhci1jaGFydC1tZXNzYWdlLWJhY2tncm91bmQgYXgtYmFyLWNoYXJ0LW5vLWRhdGEtbWVzc2FnZScpO1xuXG4gICAgLy8gQWRkIGFuIGljb25cbiAgICBtZXNzYWdlQ29udGFpbmVyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLy8gQXBwbHkgZ2VuZXJpYyBpY29uIGNsYXNzIGFuZCBzcGVjaWZpYyBiYXIgY2hhcnQgaWNvbiBjbGFzc1xuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWNoYXJ0LW1lc3NhZ2UtaWNvbiBheC1iYXItY2hhcnQtbm8tZGF0YS1pY29uJylcbiAgICAgIC5odG1sKCc8aSBjbGFzcz1cImZhLWxpZ2h0IGZhLWNoYXJ0LWNvbHVtbiBmYS0yeFwiPjwvaT4nKTtcblxuICAgIC8vIEFkZCB0ZXh0IG1lc3NhZ2VcbiAgICBtZXNzYWdlQ29udGFpbmVyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLy8gQXBwbHkgZ2VuZXJpYyB0ZXh0IGNsYXNzIGFuZCBzcGVjaWZpYyBiYXIgY2hhcnQgdGV4dCBjbGFzc1xuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWNoYXJ0LW1lc3NhZ2UtdGV4dCBheC1iYXItY2hhcnQtbm8tZGF0YS10ZXh0JylcbiAgICAgIC50ZXh0KCdObyBkYXRhIGF2YWlsYWJsZScpO1xuXG4gICAgLy8gQWRkIGhlbHAgdGV4dFxuICAgIG1lc3NhZ2VDb250YWluZXJcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAvLyBBcHBseSBnZW5lcmljIGhlbHAgY2xhc3MgYW5kIHNwZWNpZmljIGJhciBjaGFydCBoZWxwIGNsYXNzXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtY2hhcnQtbWVzc2FnZS1oZWxwIGF4LWJhci1jaGFydC1uby1kYXRhLWhlbHAnKVxuICAgICAgLnRleHQoJ1BsZWFzZSBwcm92aWRlIGRhdGEgdG8gZGlzcGxheSB0aGUgY2hhcnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG1lc3NhZ2Ugd2hlbiBhbGwgYmFycyBhcmUgaGlkZGVuXG4gICAqL1xuICBwcml2YXRlIHNob3dBbGxCYXJzSGlkZGVuTWVzc2FnZShjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGV4aXN0aW5nIGNvbnRlbnRzIGZpcnN0XG4gICAgdGhpcy5kMy5zZWxlY3QoY29udGFpbmVyRWxlbWVudCkuc2VsZWN0QWxsKCcqJykucmVtb3ZlKCk7XG5cbiAgICBjb25zdCBtZXNzYWdlQ29udGFpbmVyID0gdGhpcy5kM1xuICAgICAgLnNlbGVjdChjb250YWluZXJFbGVtZW50KVxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC8vIEFwcGx5IGdlbmVyaWMgY29udGFpbmVyIGNsYXNzLCBzcGVjaWZpYyBiYXIgY2hhcnQgYmFja2dyb3VuZCBjbGFzcywgYW5kIGV4aXN0aW5nIHNwZWNpZmljIGNsYXNzXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtY2hhcnQtbWVzc2FnZS1jb250YWluZXIgYXgtYmFyLWNoYXJ0LW1lc3NhZ2UtYmFja2dyb3VuZCBheC1iYXItY2hhcnQtbm8tZGF0YS1tZXNzYWdlJyk7XG5cbiAgICAvLyBBZGQgYW4gaWNvblxuICAgIG1lc3NhZ2VDb250YWluZXJcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAvLyBBcHBseSBnZW5lcmljIGljb24gY2xhc3MgYW5kIHNwZWNpZmljIGJhciBjaGFydCBpY29uIGNsYXNzXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtY2hhcnQtbWVzc2FnZS1pY29uIGF4LWJhci1jaGFydC1uby1kYXRhLWljb24nKVxuICAgICAgLmh0bWwoJzxpIGNsYXNzPVwiZmEtbGlnaHQgZmEtZXllLXNsYXNoIGZhLTJ4XCI+PC9pPicpO1xuXG4gICAgLy8gQWRkIHRleHQgbWVzc2FnZVxuICAgIG1lc3NhZ2VDb250YWluZXJcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAvLyBBcHBseSBnZW5lcmljIHRleHQgY2xhc3MgYW5kIHNwZWNpZmljIGJhciBjaGFydCB0ZXh0IGNsYXNzXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtY2hhcnQtbWVzc2FnZS10ZXh0IGF4LWJhci1jaGFydC1uby1kYXRhLXRleHQnKVxuICAgICAgLnRleHQoJ0FsbCBiYXJzIGFyZSBoaWRkZW4nKTtcblxuICAgIC8vIEFkZCBoZWxwIHRleHRcbiAgICBtZXNzYWdlQ29udGFpbmVyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLy8gQXBwbHkgZ2VuZXJpYyBoZWxwIGNsYXNzIGFuZCBzcGVjaWZpYyBiYXIgY2hhcnQgaGVscCBjbGFzc1xuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWNoYXJ0LW1lc3NhZ2UtaGVscCBheC1iYXItY2hhcnQtbm8tZGF0YS1oZWxwJylcbiAgICAgIC50ZXh0KCdDbGljayBvbiBsZWdlbmQgaXRlbXMgdG8gc2hvdyBiYXJzJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY29sb3IgZm9yIGEgYmFyIGJhc2VkIG9uIGl0cyBpbmRleFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldENvbG9yKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXRDaGFydENvbG9yKGluZGV4LCB0aGlzLmNoYXJ0Q29sb3JzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBiYXIgaXMgaGlkZGVuXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNCYXJIaWRkZW4oaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhpZGRlbkJhcnMuaGFzKGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBBWENoYXJ0TGVnZW5kQ29tcGF0aWJsZSBpbnRlcmZhY2VcbiAgICogUmV0dXJucyBsZWdlbmQgaXRlbXMgYmFzZWQgb24gdGhlIGNoYXJ0IGRhdGFcbiAgICovXG4gIGdldExlZ2VuZEl0ZW1zKCk6IEFYQ2hhcnRMZWdlbmRJdGVtW10ge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGEoKSB8fCBbXTtcbiAgICBjb25zdCB0b3RhbCA9IGRhdGEucmVkdWNlKChzdW0sIGl0ZW0pID0+IHN1bSArICh0eXBlb2YgaXRlbS52YWx1ZSA9PT0gJ251bWJlcicgPyBpdGVtLnZhbHVlIDogMCksIDApO1xuXG4gICAgcmV0dXJuIGRhdGEubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgaXRlbS52YWx1ZSA9PT0gJ251bWJlcicgPyBpdGVtLnZhbHVlIDogMDtcbiAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSB0b3RhbCA+IDAgPyAodmFsdWUgLyB0b3RhbCkgKiAxMDAgOiAwO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogaXRlbS5pZCxcbiAgICAgICAgbmFtZTogaXRlbS5sYWJlbCB8fCBgSXRlbSAke2luZGV4ICsgMX1gLFxuICAgICAgICB2YWx1ZTogaXRlbS52YWx1ZSxcbiAgICAgICAgcGVyY2VudGFnZSxcbiAgICAgICAgY29sb3I6IGl0ZW0uY29sb3IgfHwgdGhpcy5nZXRDb2xvcihpbmRleCksXG4gICAgICAgIGhpZGRlbjogdGhpcy5pc0JhckhpZGRlbihpdGVtLmlkKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gb2YgQVhDaGFydExlZ2VuZENvbXBhdGlibGUgaW50ZXJmYWNlXG4gICAqIEhpZ2hsaWdodHMgYSBzcGVjaWZpYyBiYXIgYnkgSURcbiAgICovXG4gIGhpZ2hsaWdodFNlZ21lbnQoaWQ6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICAvLyBJZiB0aGUgYmFyIGlzIGhpZGRlbiwgd2Ugc2hvdWxkbid0IHRyeSB0byBoaWdobGlnaHQgaXRcbiAgICBpZiAoaWQgIT09IG51bGwgJiYgdGhpcy5pc0JhckhpZGRlbihpZCkpIHtcbiAgICAgIC8vIEp1c3QgdW5oaWdobGlnaHQgZXZlcnl0aGluZyB3aGVuIHRyeWluZyB0byBoaWdobGlnaHQgYSBoaWRkZW4gYmFyXG4gICAgICB0aGlzLnN2Z1xuICAgICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhcicpXG4gICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtaGlnaGxpZ2h0ZWQnLCBmYWxzZSlcbiAgICAgICAgLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1kaW1tZWQnLCBmYWxzZSlcbiAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAxKVxuICAgICAgICAuYXR0cignZmlsdGVyJywgbnVsbClcbiAgICAgICAgLmF0dHIoJ3N0cm9rZScsIG51bGwpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBudWxsKVxuICAgICAgICAuYXR0cignc3Ryb2tlLW9wYWNpdHknLCBudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgIC8vIElmIGlkIGlzIG51bGwsIHVuaGlnaGxpZ2h0IGV2ZXJ5dGhpbmdcbiAgICAgIHRoaXMuc3ZnXG4gICAgICAgIC5zZWxlY3RBbGwoJy5heC1iYXItY2hhcnQtYmFyJylcbiAgICAgICAgLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1oaWdobGlnaHRlZCcsIGZhbHNlKVxuICAgICAgICAuY2xhc3NlZCgnYXgtYmFyLWNoYXJ0LWRpbW1lZCcsIGZhbHNlKVxuICAgICAgICAuYXR0cignb3BhY2l0eScsIDEpXG4gICAgICAgIC5hdHRyKCdmaWx0ZXInLCBudWxsKVxuICAgICAgICAuYXR0cignc3Ryb2tlJywgbnVsbClcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIG51bGwpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utb3BhY2l0eScsIG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIHRhcmdldCBiYXJcbiAgICBjb25zdCB0YXJnZXRCYXIgPSB0aGlzLnN2Zy5zZWxlY3RBbGwoJy5heC1iYXItY2hhcnQtYmFyJykuZmlsdGVyKChkOiBhbnkpID0+IGQ/LmlkID09PSBpZCk7XG5cbiAgICAvLyBTYWZldHkgY2hlY2sgLSBpZiBubyBtYXRjaGluZyBiYXIgaXMgZm91bmQsIGRvIG5vdGhpbmdcbiAgICBpZiAodGFyZ2V0QmFyLmVtcHR5KCkpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgYmFyIGlzIGN1cnJlbnRseSBoaWdobGlnaHRlZFxuICAgIGNvbnN0IGlzQ3VycmVudGx5SGlnaGxpZ2h0ZWQgPSB0YXJnZXRCYXIuY2xhc3NlZCgnYXgtYmFyLWNoYXJ0LWhpZ2hsaWdodGVkJyk7XG5cbiAgICBpZiAoaXNDdXJyZW50bHlIaWdobGlnaHRlZCkge1xuICAgICAgLy8gSWYgYWxyZWFkeSBoaWdobGlnaHRlZCwgdW5oaWdobGlnaHQgYWxsIGJhcnNcbiAgICAgIHRoaXMuc3ZnXG4gICAgICAgIC5zZWxlY3RBbGwoJy5heC1iYXItY2hhcnQtYmFyJylcbiAgICAgICAgLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1oaWdobGlnaHRlZCcsIGZhbHNlKVxuICAgICAgICAuY2xhc3NlZCgnYXgtYmFyLWNoYXJ0LWRpbW1lZCcsIGZhbHNlKVxuICAgICAgICAuYXR0cignb3BhY2l0eScsIDEpXG4gICAgICAgIC5hdHRyKCdmaWx0ZXInLCBudWxsKVxuICAgICAgICAuYXR0cignc3Ryb2tlJywgbnVsbClcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIG51bGwpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utb3BhY2l0eScsIG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXNldCBhbGwgYmFycyBmaXJzdFxuICAgICAgdGhpcy5zdmdcbiAgICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1iYXInKVxuICAgICAgICAuY2xhc3NlZCgnYXgtYmFyLWNoYXJ0LWhpZ2hsaWdodGVkJywgZmFsc2UpXG4gICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtZGltbWVkJywgZmFsc2UpXG4gICAgICAgIC5hdHRyKCdvcGFjaXR5JywgMSlcbiAgICAgICAgLmF0dHIoJ2ZpbHRlcicsIG51bGwpXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCBudWxsKVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgbnVsbClcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS1vcGFjaXR5JywgbnVsbCk7XG5cbiAgICAgIC8vIEhpZ2hsaWdodCB0aGUgdGFyZ2V0IGJhclxuICAgICAgdGFyZ2V0QmFyXG4gICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtaGlnaGxpZ2h0ZWQnLCB0cnVlKVxuICAgICAgICAuYXR0cignZmlsdGVyJywgJ2Ryb3Atc2hhZG93KDAgMCA0cHggcmdiYSgwLCAwLCAwLCAwLjMpKScpXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCAnIzAwMCcpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAnMXB4JylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS1vcGFjaXR5JywgJzAuMycpXG4gICAgICAgIC5zdHlsZSgndHJhbnNpdGlvbicsICdhbGwgMC4ycyBlYXNlLWluLW91dCcpO1xuXG4gICAgICAvLyBEaW0gb3RoZXIgYmFyc1xuICAgICAgdGhpcy5zdmdcbiAgICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1iYXInKVxuICAgICAgICAuZmlsdGVyKChkOiBhbnkpID0+IGQ/LmlkICE9PSBpZClcbiAgICAgICAgLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1kaW1tZWQnLCB0cnVlKVxuICAgICAgICAuYXR0cignb3BhY2l0eScsIDAuNSlcbiAgICAgICAgLnN0eWxlKCd0cmFuc2l0aW9uJywgJ29wYWNpdHkgMC4ycyBlYXNlLWluLW91dCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBBWENoYXJ0TGVnZW5kQ29tcGF0aWJsZSBpbnRlcmZhY2VcbiAgICogVG9nZ2xlcyB2aXNpYmlsaXR5IG9mIGEgYmFyIGJ5IElEXG4gICAqIEByZXR1cm5zIE5ldyB2aXNpYmlsaXR5IHN0YXRlICh0cnVlID0gdmlzaWJsZSwgZmFsc2UgPSBoaWRkZW4pXG4gICAqL1xuICB0b2dnbGVTZWdtZW50KGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCB3YXNBbGxIaWRkZW4gPSB0aGlzLmRhdGEoKS5sZW5ndGggPiAwICYmIHRoaXMuZGF0YSgpLmV2ZXJ5KChkKSA9PiB0aGlzLmlzQmFySGlkZGVuKGQuaWQpKTtcblxuICAgIGlmICh0aGlzLmhpZGRlbkJhcnMuaGFzKGlkKSkge1xuICAgICAgLy8gTWFraW5nIGEgYmFyIHZpc2libGVcbiAgICAgIHRoaXMuaGlkZGVuQmFycy5kZWxldGUoaWQpO1xuXG4gICAgICAvLyBJZiBhbGwgYmFycyB3ZXJlIHByZXZpb3VzbHkgaGlkZGVuLCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGUgbWVzc2FnZSBpcyBjbGVhcmVkXG4gICAgICBpZiAod2FzQWxsSGlkZGVuKSB7XG4gICAgICAgIC8vIEZvcmNlIGNvbXBsZXRlIERPTSBjbGVhbnVwIGFuZCByZWRyYXdcbiAgICAgICAgaWYgKHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgLy8gQ2xlYXIgZXZlcnl0aGluZyBpbiB0aGUgY29udGFpbmVyXG4gICAgICAgICAgdGhpcy5kMz8uc2VsZWN0KHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQpLnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpO1xuXG4gICAgICAgICAgLy8gRm9yY2UgZnVsbCByZWRyYXdcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm9ybWFsIHVwZGF0ZSBmb3Igb3RoZXIgY2FzZXNcbiAgICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIaWRpbmcgYSBiYXJcbiAgICAgIHRoaXMuaGlkZGVuQmFycy5hZGQoaWQpO1xuICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgbmV3IHZpc2liaWxpdHkgc3RhdGVcbiAgICByZXR1cm4gIXRoaXMuaGlkZGVuQmFycy5oYXMoaWQpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYXgtYmFyLWNoYXJ0XCIgI2NoYXJ0Q29udGFpbmVyPlxuICA8IS0tIFNoYXJlZCB0b29sdGlwIGNvbXBvbmVudCAtLT5cbiAgPGF4LWNoYXJ0LXRvb2x0aXBcbiAgICBbdmlzaWJsZV09XCJ0b29sdGlwVmlzaWJsZSgpXCJcbiAgICBbcG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uKClcIlxuICAgIFtkYXRhXT1cInRvb2x0aXBEYXRhKClcIlxuICAgIFtzaG93UGVyY2VudGFnZV09XCJ0cnVlXCJcbiAgPjwvYXgtY2hhcnQtdG9vbHRpcD5cbjwvZGl2PlxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1iYXItY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jaGFydHMvYmFyLWNoYXJ0L3NyYy9hY29yZXgtY2hhcnRzLWJhci1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":";;;;;;;;;AAGY,MAAC,uBAAuB,GAAG;AACvC,IAAI,SAAS,EAAE,IAAI;AACnB,IAAI,SAAS,EAAE,IAAI;AACnB,IAAI,QAAQ,EAAE,IAAI;AAClB,IAAI,cAAc,EAAE,IAAI;AACxB,IAAI,WAAW,EAAE,IAAI;AACrB,IAAI,QAAQ,EAAE,EAAE;AAChB,IAAI,YAAY,EAAE,CAAC;AACnB,IAAI,iBAAiB,EAAE,GAAG;AAC1B,IAAI,eAAe,EAAE,WAAW;AAChC;AACY,MAAC,mBAAmB,GAAG,IAAI,cAAc,CAAC,qBAAqB,EAAE;AAC7E,IAAI,UAAU,EAAE,MAAM;AACtB,IAAI,OAAO,EAAE,MAAM;AACnB,QAAQ,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC/C,QAAQ,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,uBAAuB,CAAC;AAC9D,QAAQ,OAAO,uBAAuB;AACtC,KAAK;AACL,CAAC;AACM,SAAS,cAAc,CAAC,MAAM,GAAG,EAAE,EAAE;AAC5C,IAAI,MAAM,MAAM,GAAG;AACnB,QAAQ,GAAG,uBAAuB;AAClC,QAAQ,GAAG,MAAM;AACjB,KAAK;AACL,IAAI,OAAO,MAAM;AACjB;;ACrBA;AACA;AACA;AACA;AACO,MAAM,mBAAmB,SAAS,WAAW,CAAC;AACrD;AACA;AACA,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACnE;AACA,IAAI,OAAO,GAAG,KAAK,CAAC,EAAE,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACzE;AACA;AACA,IAAI,QAAQ,GAAG,MAAM,EAAE;AACvB;AACA,IAAI,gBAAgB,GAAG,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC;AAC3D;AACA,IAAI,EAAE;AACN;AACA,IAAI,GAAG;AACP,IAAI,KAAK;AACT,IAAI,MAAM;AACV,IAAI,MAAM;AACV,IAAI,KAAK;AACT,IAAI,KAAK;AACT;AACA,IAAI,KAAK;AACT,IAAI,MAAM;AACV,IAAI,MAAM,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;AACzD;AACA,IAAI,yBAAyB,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,2BAA2B,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACjH;AACA,IAAI,eAAe,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC7F,IAAI,gBAAgB,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACxG,IAAI,YAAY,GAAG,MAAM,CAAC;AAC1B,QAAQ,KAAK,EAAE,EAAE;AACjB,QAAQ,KAAK,EAAE,GAAG;AAClB,QAAQ,UAAU,EAAE,IAAI;AACxB,QAAQ,KAAK,EAAE,EAAE;AACjB,KAAK,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC7D;AACA,IAAI,YAAY,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACvF,IAAI,SAAS,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACjF;AACA,IAAI,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;AACtD,IAAI,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;AACxD,IAAI,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;AAChD;AACA,IAAI,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAC7C;AACA,IAAI,WAAW,GAAG,MAAM,CAAC,sBAAsB,CAAC;AAChD;AACA,IAAI,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC;AACjC;AACA,IAAI,gBAAgB,GAAG,QAAQ,CAAC,MAAM;AACtC,QAAQ,OAAO;AACf,YAAY,GAAG,IAAI,CAAC,WAAW;AAC/B,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE;AAC7B,SAAS;AACT,KAAK,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACjE;AACA,IAAI,UAAU,GAAG,IAAI,GAAG,EAAE;AAC1B,IAAI,WAAW,GAAG;AAClB,QAAQ,KAAK,EAAE;AACf;AACA,QAAQ,eAAe,CAAC,MAAM;AAC9B,YAAY,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AACvC,YAAY,IAAI,CAAC,MAAM,EAAE;AACzB;AACA,YAAY,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;AACpD,gBAAgB,IAAI,CAAC,WAAW,EAAE;AAClC,gBAAgB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxC;AACA,SAAS,CAAC;AACV;AACA,QAAQ,MAAM,CAAC,MAAM;AACrB;AACA,YAAY,IAAI,CAAC,IAAI,EAAE;AACvB,YAAY,IAAI,CAAC,gBAAgB,EAAE;AACnC;AACA,YAAY,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AAClC,gBAAgB,IAAI,CAAC,WAAW,EAAE;AAClC;AACA,SAAS,CAAC;AACV;AACA,IAAI,WAAW,GAAG;AAClB,QAAQ,IAAI,CAAC,YAAY,EAAE;AAC3B;AACA;AACA;AACA;AACA,IAAI,MAAM,MAAM,GAAG;AACnB,QAAQ,IAAI;AACZ,YAAY,IAAI,CAAC,EAAE,GAAG,MAAM,OAAO,IAAI,CAAC;AACxC;AACA,YAAY,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;AAChE,gBAAgB,IAAI,CAAC,WAAW,EAAE;AAClC,gBAAgB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxC;AACA;AACA,QAAQ,OAAO,KAAK,EAAE;AACtB,YAAY,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC;AACzD;AACA;AACA;AACA;AACA;AACA,IAAI,WAAW,GAAG;AAClB,QAAQ,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa;AAC/D,YAAY;AACZ,QAAQ,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,aAAa;AACtE,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;AACtC;AACA,QAAQ,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACvE;AACA,QAAQ,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE;AAClE;AACA,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AAC1B,YAAY,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC;AACpD,YAAY;AACZ;AACA;AACA,QAAQ,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;AACtC,YAAY,IAAI,CAAC,wBAAwB,CAAC,gBAAgB,CAAC;AAC3D,YAAY;AACZ;AACA;AACA,QAAQ,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACpD,QAAQ,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,YAAY,CAAC;AAC5D;AACA,QAAQ,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;AACrC,QAAQ,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;AACrC;AACA,QAAQ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AAC7B;AACA;AACA;AACA;AACA,IAAI,WAAW,GAAG;AAClB,QAAQ,IAAI,CAAC,WAAW,EAAE;AAC1B;AACA;AACA;AACA;AACA,IAAI,YAAY,GAAG;AACnB,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE;AACtB,YAAY,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE;AAC7F,YAAY,IAAI,CAAC,GAAG,GAAG,IAAI;AAC3B,YAAY,IAAI,CAAC,KAAK,GAAG,IAAI;AAC7B;AACA,QAAQ,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;AACvC;AACA;AACA;AACA;AACA,IAAI,eAAe,CAAC,gBAAgB,EAAE,OAAO,EAAE;AAC/C;AACA,QAAQ,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,CAAC,WAAW,CAAC;AACpE;AACA,QAAQ,MAAM,cAAc,GAAG,gBAAgB,CAAC,WAAW;AAC3D,QAAQ,MAAM,eAAe,GAAG,gBAAgB,CAAC,YAAY;AAC7D;AACA,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;AACtE,QAAQ,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE;AAC7C;AACA,YAAY,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK;AAC7E,YAAY,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM;AAC/E;AACA,aAAa;AACb;AACA,YAAY,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK;AAChG,YAAY,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM;AAClG;AACA;AACA,QAAQ,MAAM,GAAG,GAAG,IAAI,CAAC;AACzB,aAAa,MAAM,CAAC,gBAAgB;AACpC,aAAa,MAAM,CAAC,KAAK;AACzB,aAAa,IAAI,CAAC,OAAO,EAAE,MAAM;AACjC,aAAa,IAAI,CAAC,QAAQ,EAAE,MAAM;AAClC,aAAa,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC7I,aAAa,IAAI,CAAC,qBAAqB,EAAE,eAAe,CAAC;AACzD,QAAQ,IAAI,CAAC,GAAG,GAAG,GAAG;AACtB;AACA,QAAQ,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAChH;AACA;AACA;AACA;AACA,IAAI,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE;AAC9C;AACA,QAAQ,IAAI,CAAC,MAAM,GAAG;AACtB,YAAY,GAAG,EAAE,EAAE;AACnB,YAAY,KAAK,EAAE,EAAE;AACrB,YAAY,MAAM,EAAE,EAAE;AACtB,YAAY,IAAI,EAAE,EAAE;AACpB,SAAS;AACT,QAAQ,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC9E,QAAQ,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM;AAC3C;AACA;AACA,QAAQ,IAAI,QAAQ,GAAG,CAAC,IAAI,cAAc,GAAG,CAAC,EAAE;AAChD,YAAY,MAAM,YAAY,GAAG,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK;AACtF,YAAY,IAAI,YAAY,GAAG,CAAC,EAAE;AAClC,gBAAgB,MAAM,oBAAoB,GAAG,YAAY,GAAG,QAAQ;AACpE,gBAAgB,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE;AAC7G,oBAAoB,KAAK,EAAE,EAAE;AAC7B,iBAAiB,CAAC,CAAC,KAAK;AACxB;AACA,gBAAgB,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC,CAAC;AACnG;AACA,gBAAgB,MAAM,0BAA0B,GAAG,YAAY,CAAC,MAAM,GAAG,iBAAiB,GAAG,GAAG;AAChG;AACA,gBAAgB,IAAI,0BAA0B,GAAG,oBAAoB,EAAE;AACvE;AACA;AACA,oBAAoB,MAAM,mBAAmB,GAAG,0BAA0B,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE;AACvG,oBAAoB,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;AAC5E;AACA;AACA;AACA;AACA,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE;AAChC,YAAY,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM;AAC1D,YAAY,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,GAAG,GAAG,CAAC,CAAC;AACpF,YAAY,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,iBAAiB,CAAC;AACrF;AACA,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE;AAChC,YAAY,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM;AAC1D,YAAY,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,GAAG,GAAG,CAAC,CAAC;AAClF,YAAY,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,GAAG,eAAe,CAAC;AAC/E;AACA;AACA,QAAQ,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE;AACzC,YAAY,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;AACjE;AACA,QAAQ,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE;AACzC,YAAY,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;AAC7D;AACA;AACA;AACA;AACA;AACA,IAAI,WAAW,CAAC,IAAI,EAAE;AACtB;AACA,QAAQ,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,QAAQ,IAAI,EAAE,GAAG,GAAG;AAC5E;AACA,QAAQ,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,eAAe,CAAC;AAC1D;AACA,QAAQ,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;AAC3B,aAAa,SAAS;AACtB,aAAa,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AAC5C,aAAa,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC;AAClC,aAAa,OAAO,CAAC,OAAO,CAAC;AAC7B;AACA,QAAQ,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;AAC3B,aAAa,WAAW;AACxB,aAAa,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC/D,aAAa,IAAI;AACjB,aAAa,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACpC;AACA;AACA;AACA;AACA,IAAI,UAAU,CAAC,OAAO,EAAE;AACxB;AACA,QAAQ,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,KAAK;AACrD,QAAQ,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,KAAK;AACrD,QAAQ,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,KAAK;AACnD,QAAQ,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;AAC3C;AACA,QAAQ,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC;AACnF,QAAQ,IAAI,SAAS,EAAE;AACvB;AACA,YAAY,IAAI,CAAC,KAAK,GAAG;AACzB,iBAAiB,MAAM,CAAC,GAAG;AAC3B,iBAAiB,IAAI,CAAC,OAAO,EAAE,qBAAqB;AACpD,iBAAiB,IAAI,CAAC,WAAW,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAChE,iBAAiB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACtD;AACA,YAAY,MAAM,wBAAwB,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;AACpG,YAAY,MAAM,UAAU,GAAG,IAAI,CAAC;AACpC,iBAAiB,SAAS,CAAC,MAAM;AACjC,iBAAiB,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,wBAAwB,CAAC,EAAE,CAAC;AACnE,iBAAiB,KAAK,CAAC,aAAa,EAAE,KAAK;AAC3C,iBAAiB,KAAK,CAAC,MAAM,EAAE,kDAAkD,CAAC;AAClF;AACA,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AACjD,gBAAgB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AAC/C,gBAAgB,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;AAC7G;AACA,gBAAgB,MAAM,0BAA0B,GAAG,YAAY,CAAC,MAAM,GAAG,wBAAwB,GAAG,IAAI;AACxG,gBAAgB,IAAI,0BAA0B,GAAG,IAAI,EAAE;AACvD,oBAAoB;AACpB,yBAAyB,IAAI,CAAC,WAAW,EAAE,aAAa;AACxD,yBAAyB,KAAK,CAAC,aAAa,EAAE,KAAK;AACnD,yBAAyB,IAAI,CAAC,IAAI,EAAE,QAAQ;AAC5C,yBAAyB,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;AAC7C;AACA;AACA;AACA,YAAY,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,gDAAgD,CAAC;AAChH;AACA,YAAY,IAAI,OAAO,CAAC,UAAU,EAAE;AACpC,gBAAgB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG;AACrE,gBAAgB;AAChB,qBAAqB,MAAM,CAAC,MAAM;AAClC,qBAAqB,IAAI,CAAC,OAAO,EAAE,yCAAyC;AAC5E,qBAAqB,IAAI,CAAC,aAAa,EAAE,QAAQ;AACjD,qBAAqB,IAAI,CAAC,mBAAmB,EAAE,QAAQ;AACvD,qBAAqB,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC;AAC7C,qBAAqB,IAAI,CAAC,GAAG,EAAE,MAAM;AACrC,qBAAqB,KAAK,CAAC,WAAW,EAAE,MAAM;AAC9C,qBAAqB,KAAK,CAAC,aAAa,EAAE,KAAK;AAC/C,qBAAqB,KAAK,CAAC,MAAM,EAAE,gDAAgD;AACnF,qBAAqB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;AAC7C;AACA;AACA,QAAQ,IAAI,SAAS,EAAE;AACvB;AACA,YAAY,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACvH;AACA,YAAY,MAAM,wBAAwB,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;AACrG,YAAY,MAAM,UAAU,GAAG,IAAI,CAAC;AACpC,iBAAiB,SAAS,CAAC,MAAM;AACjC,iBAAiB,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,wBAAwB,CAAC,EAAE,CAAC;AACnE,iBAAiB,KAAK,CAAC,aAAa,EAAE,KAAK;AAC3C,iBAAiB,KAAK,CAAC,MAAM,EAAE,kDAAkD,CAAC;AAClF,YAAY,IAAI,KAAK,EAAE;AACvB,gBAAgB,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC;AACvD;AACA;AACA,YAAY,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,gDAAgD,CAAC;AAChH;AACA,YAAY,IAAI,OAAO,CAAC,UAAU,EAAE;AACpC,gBAAgB,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;AAC/C,gBAAgB,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,GAAG;AACtD,gBAAgB;AAChB,qBAAqB,MAAM,CAAC,MAAM;AAClC,qBAAqB,IAAI,CAAC,OAAO,EAAE,yCAAyC;AAC5E,qBAAqB,IAAI,CAAC,aAAa,EAAE,QAAQ;AACjD,qBAAqB,IAAI,CAAC,mBAAmB,EAAE,QAAQ;AACvD,qBAAqB,IAAI,CAAC,WAAW,EAAE,aAAa;AACpD,qBAAqB,IAAI,CAAC,GAAG,EAAE,MAAM;AACrC,qBAAqB,IAAI,CAAC,GAAG,EAAE,MAAM;AACrC,qBAAqB,KAAK,CAAC,WAAW,EAAE,MAAM;AAC9C,qBAAqB,KAAK,CAAC,aAAa,EAAE,KAAK;AAC/C,qBAAqB,KAAK,CAAC,MAAM,EAAE,gDAAgD;AACnF,qBAAqB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;AAC7C;AACA;AACA,QAAQ,IAAI,QAAQ,EAAE;AACtB;AACA,YAAY,IAAI,CAAC;AACjB,iBAAiB,MAAM,CAAC,GAAG;AAC3B,iBAAiB,IAAI,CAAC,OAAO,EAAE,mBAAmB;AAClD,iBAAiB,IAAI,CAAC,IAAI,CAAC;AAC3B,iBAAiB,QAAQ,CAAC,IAAI,CAAC,MAAM;AACrC,iBAAiB,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK;AACrC,iBAAiB,UAAU,CAAC,MAAM,EAAE,CAAC;AACrC,iBAAiB,SAAS,CAAC,MAAM;AACjC,iBAAiB,KAAK,CAAC,QAAQ,EAAE,gDAAgD;AACjF,iBAAiB,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC;AAC7C;AACA,YAAY,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE;AACpF;AACA;AACA;AACA;AACA;AACA,IAAI,UAAU,CAAC,IAAI,EAAE;AACrB;AACA,QAAQ,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACvE,QAAQ,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;AAC7C;AACA,QAAQ,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC;AACjD;AACA,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,YAAY;AAC3D;AACA,QAAQ,MAAM,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,iBAAiB;AAC3E,QAAQ,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,eAAe,CAAC;AAC/F;AACA,QAAQ,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,6BAA6B,CAAC;AACjG;AACA,QAAQ,MAAM,SAAS,GAAG;AAC1B,aAAa,SAAS,CAAC,yBAAyB;AAChD,aAAa,IAAI,CAAC,WAAW;AAC7B,aAAa,KAAK;AAClB,aAAa,MAAM,CAAC,GAAG;AACvB,aAAa,KAAK,CAAC,QAAQ,EAAE,SAAS;AACtC,aAAa,IAAI,CAAC,OAAO,EAAE,wBAAwB,CAAC;AACpD;AACA,QAAQ,MAAM,IAAI,GAAG;AACrB,aAAa,MAAM,CAAC,MAAM;AAC1B,aAAa,IAAI,CAAC,OAAO,EAAE,kBAAkB;AAC7C,aAAa,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAClD,aAAa,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;AAClD,aAAa,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;AACnC,aAAa,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC9B,aAAa,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;AAC/B,aAAa,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;AAC/B,aAAa,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK;AACjC;AACA,YAAY,MAAM,aAAa,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;AACxF;AACA;AACA,YAAY,OAAO,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,KAAK,CAAC,CAAC,GAAG,aAAa,GAAG,CAAC,CAAC;AACrF,SAAS,CAAC;AACV;AACA,QAAQ,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC,cAAc,KAAK,KAAK,EAAE;AAC9D,YAAY;AACZ,iBAAiB,MAAM,CAAC,MAAM;AAC9B,iBAAiB,IAAI,CAAC,OAAO,EAAE,yBAAyB;AACxD,iBAAiB,IAAI,CAAC,aAAa,EAAE,QAAQ;AAC7C,iBAAiB,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC;AACpF,iBAAiB,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;AACvC,iBAAiB,KAAK,CAAC,WAAW,EAAE,yBAAyB;AAC7D,iBAAiB,KAAK,CAAC,aAAa,EAAE,KAAK;AAC3C,iBAAiB,KAAK,CAAC,MAAM,EAAE,iDAAiD;AAChF,iBAAiB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;AACpC,iBAAiB,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AACrC;AACA,YAAY;AACZ,iBAAiB,SAAS,CAAC,0BAA0B;AACrD,iBAAiB,UAAU;AAC3B,iBAAiB,QAAQ,CAAC,iBAAiB;AAC3C,iBAAiB,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC;AAC9C,iBAAiB,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC3D,iBAAiB,KAAK,CAAC,SAAS,EAAE,CAAC;AACnC,iBAAiB,IAAI,CAAC,eAAe,CAAC;AACtC;AACA;AACA,QAAQ;AACR,aAAa,EAAE,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK;AAC5C;AACA,YAAY,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE;AACjD,gBAAgB;AAChB,YAAY,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;AAC5E;AACA,YAAY,KAAK,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,sDAAsD,CAAC;AACpH,YAAY,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC;AACzC,SAAS;AACT,aAAa,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,KAAK;AACxC;AACA,YAAY,IAAI,IAAI,CAAC,yBAAyB,EAAE,EAAE;AAClD,gBAAgB,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;AACjD;AACA,SAAS;AACT,aAAa,EAAE,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK;AAC5C;AACA,YAAY,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE;AACjD,gBAAgB;AAChB,YAAY,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;AAC5E;AACA,YAAY,KAAK,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC;AAClE,YAAY,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3C,SAAS;AACT,aAAa,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK;AACvC;AACA,YAAY,IAAI,IAAI,CAAC,yBAAyB,EAAE,EAAE;AAClD,gBAAgB,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC;AAC7C;AACA,SAAS,CAAC;AACV;AACA,QAAQ;AACR,aAAa,UAAU;AACvB,aAAa,QAAQ,CAAC,iBAAiB;AACvC,aAAa,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;AACpC,aAAa,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAClD,aAAa,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AACrE,aAAa,IAAI,CAAC,eAAe,CAAC;AAClC,aAAa,GAAG,EAAE;AAClB,aAAa,IAAI,CAAC,MAAM;AACxB;AACA,YAAY,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,IAAI,CAAC;AACpD,SAAS,CAAC;AACV;AACA;AACA;AACA;AACA,IAAI,iBAAiB,CAAC,MAAM,EAAE;AAC9B,QAAQ,QAAQ,MAAM;AACtB,YAAY,KAAK,QAAQ;AACzB,gBAAgB,OAAO,IAAI,CAAC,EAAE,CAAC,UAAU;AACzC,YAAY,KAAK,MAAM;AACvB,gBAAgB,OAAO,IAAI,CAAC,EAAE,CAAC,aAAa;AAC5C,YAAY,KAAK,SAAS;AAC1B,gBAAgB,OAAO,IAAI,CAAC,EAAE,CAAC,UAAU;AACzC,YAAY,KAAK,UAAU;AAC3B,gBAAgB,OAAO,IAAI,CAAC,EAAE,CAAC,WAAW;AAC1C,YAAY,KAAK,aAAa;AAC9B,gBAAgB,OAAO,IAAI,CAAC,EAAE,CAAC,aAAa;AAC5C,YAAY,KAAK,OAAO;AACxB,gBAAgB,OAAO,IAAI,CAAC,EAAE,CAAC,SAAS;AACxC,YAAY,KAAK,UAAU;AAC3B,gBAAgB,OAAO,IAAI,CAAC,EAAE,CAAC,WAAW;AAC1C,YAAY,KAAK,WAAW;AAC5B,gBAAgB,OAAO,IAAI,CAAC,EAAE,CAAC,YAAY;AAC3C,YAAY,KAAK,cAAc;AAC/B,gBAAgB,OAAO,IAAI,CAAC,EAAE,CAAC,cAAc;AAC7C,YAAY;AACZ,gBAAgB,OAAO,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC;AAC5C;AACA;AACA;AACA;AACA;AACA,IAAI,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE;AACjC,QAAQ,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC,WAAW,KAAK,KAAK,EAAE;AAC3D,YAAY,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;AAC/E,YAAY,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC7D;AACA,YAAY,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AAChF,YAAY,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,IAAI,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG;AACzF,YAAY,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;AAClC,gBAAgB,KAAK,EAAE,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK;AACxD,gBAAgB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE;AAC7C,gBAAgB,UAAU,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;AAC5C,gBAAgB,KAAK,EAAE,KAAK;AAC5B,aAAa,CAAC;AACd,YAAY,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;AAC7C,YAAY,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1C;AACA;AACA;AACA;AACA;AACA,IAAI,qBAAqB,CAAC,KAAK,EAAE;AACjC,QAAQ,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,aAAa,CAAC,qBAAqB,EAAE;AACvF,QAAQ,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,gBAAgB,CAAC;AAC/F,QAAQ,IAAI,CAAC,SAAS,EAAE;AACxB,YAAY,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI;AACpD,YAAY,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG;AACnD,YAAY,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAC/C,YAAY;AACZ;AACA,QAAQ,MAAM,WAAW,GAAG,SAAS,CAAC,qBAAqB,EAAE;AAC7D,QAAQ,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI;AAC9C,QAAQ,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG;AAC/C;AACA,QAAQ,IAAI,CAAC,GAAG,WAAW,CAAC,KAAK,GAAG,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE;AAC1D,YAAY,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,KAAK,GAAG,EAAE;AAC1C;AACA,aAAa;AACb,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE;AACtB;AACA,QAAQ,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAC3C;AACA;AACA;AACA;AACA,IAAI,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE;AACjC,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;AACxF;AACA;AACA;AACA;AACA,IAAI,iBAAiB,CAAC,gBAAgB,EAAE;AACxC;AACA,QAAQ,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;AAChE,QAAQ,MAAM,gBAAgB,GAAG,IAAI,CAAC;AACtC,aAAa,MAAM,CAAC,gBAAgB;AACpC,aAAa,MAAM,CAAC,KAAK;AACzB;AACA,aAAa,IAAI,CAAC,OAAO,EAAE,yFAAyF,CAAC;AACrH;AACA,QAAQ;AACR,aAAa,MAAM,CAAC,KAAK;AACzB;AACA,aAAa,IAAI,CAAC,OAAO,EAAE,iDAAiD;AAC5E,aAAa,IAAI,CAAC,gDAAgD,CAAC;AACnE;AACA,QAAQ;AACR,aAAa,MAAM,CAAC,KAAK;AACzB;AACA,aAAa,IAAI,CAAC,OAAO,EAAE,iDAAiD;AAC5E,aAAa,IAAI,CAAC,mBAAmB,CAAC;AACtC;AACA,QAAQ;AACR,aAAa,MAAM,CAAC,KAAK;AACzB;AACA,aAAa,IAAI,CAAC,OAAO,EAAE,iDAAiD;AAC5E,aAAa,IAAI,CAAC,0CAA0C,CAAC;AAC7D;AACA;AACA;AACA;AACA,IAAI,wBAAwB,CAAC,gBAAgB,EAAE;AAC/C;AACA,QAAQ,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;AAChE,QAAQ,MAAM,gBAAgB,GAAG,IAAI,CAAC;AACtC,aAAa,MAAM,CAAC,gBAAgB;AACpC,aAAa,MAAM,CAAC,KAAK;AACzB;AACA,aAAa,IAAI,CAAC,OAAO,EAAE,yFAAyF,CAAC;AACrH;AACA,QAAQ;AACR,aAAa,MAAM,CAAC,KAAK;AACzB;AACA,aAAa,IAAI,CAAC,OAAO,EAAE,iDAAiD;AAC5E,aAAa,IAAI,CAAC,6CAA6C,CAAC;AAChE;AACA,QAAQ;AACR,aAAa,MAAM,CAAC,KAAK;AACzB;AACA,aAAa,IAAI,CAAC,OAAO,EAAE,iDAAiD;AAC5E,aAAa,IAAI,CAAC,qBAAqB,CAAC;AACxC;AACA,QAAQ;AACR,aAAa,MAAM,CAAC,KAAK;AACzB;AACA,aAAa,IAAI,CAAC,OAAO,EAAE,iDAAiD;AAC5E,aAAa,IAAI,CAAC,oCAAoC,CAAC;AACvD;AACA;AACA;AACA;AACA,IAAI,QAAQ,CAAC,KAAK,EAAE;AACpB,QAAQ,OAAO,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC;AACrD;AACA;AACA;AACA;AACA,IAAI,WAAW,CAAC,EAAE,EAAE;AACpB,QAAQ,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AACtC;AACA;AACA;AACA;AACA;AACA,IAAI,cAAc,GAAG;AACrB,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;AACtC,QAAQ,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;AAC5G,QAAQ,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK;AACzC,YAAY,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC;AACzE,YAAY,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,IAAI,GAAG,GAAG,CAAC;AACpE,YAAY,OAAO;AACnB,gBAAgB,EAAE,EAAE,IAAI,CAAC,EAAE;AAC3B,gBAAgB,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;AACvD,gBAAgB,KAAK,EAAE,IAAI,CAAC,KAAK;AACjC,gBAAgB,UAAU;AAC1B,gBAAgB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACzD,gBAAgB,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;AACjD,aAAa;AACb,SAAS,CAAC;AACV;AACA;AACA;AACA;AACA;AACA,IAAI,gBAAgB,CAAC,EAAE,EAAE;AACzB,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG;AACrB,YAAY;AACZ;AACA,QAAQ,IAAI,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE;AACjD;AACA,YAAY,IAAI,CAAC;AACjB,iBAAiB,SAAS,CAAC,mBAAmB;AAC9C,iBAAiB,OAAO,CAAC,0BAA0B,EAAE,KAAK;AAC1D,iBAAiB,OAAO,CAAC,qBAAqB,EAAE,KAAK;AACrD,iBAAiB,IAAI,CAAC,SAAS,EAAE,CAAC;AAClC,iBAAiB,IAAI,CAAC,QAAQ,EAAE,IAAI;AACpC,iBAAiB,IAAI,CAAC,QAAQ,EAAE,IAAI;AACpC,iBAAiB,IAAI,CAAC,cAAc,EAAE,IAAI;AAC1C,iBAAiB,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC;AAC7C,YAAY;AACZ;AACA,QAAQ,IAAI,EAAE,KAAK,IAAI,EAAE;AACzB;AACA,YAAY,IAAI,CAAC;AACjB,iBAAiB,SAAS,CAAC,mBAAmB;AAC9C,iBAAiB,OAAO,CAAC,0BAA0B,EAAE,KAAK;AAC1D,iBAAiB,OAAO,CAAC,qBAAqB,EAAE,KAAK;AACrD,iBAAiB,IAAI,CAAC,SAAS,EAAE,CAAC;AAClC,iBAAiB,IAAI,CAAC,QAAQ,EAAE,IAAI;AACpC,iBAAiB,IAAI,CAAC,QAAQ,EAAE,IAAI;AACpC,iBAAiB,IAAI,CAAC,cAAc,EAAE,IAAI;AAC1C,iBAAiB,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC;AAC7C,YAAY;AACZ;AACA;AACA,QAAQ,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;AAC7F;AACA,QAAQ,IAAI,SAAS,CAAC,KAAK,EAAE;AAC7B,YAAY;AACZ;AACA,QAAQ,MAAM,sBAAsB,GAAG,SAAS,CAAC,OAAO,CAAC,0BAA0B,CAAC;AACpF,QAAQ,IAAI,sBAAsB,EAAE;AACpC;AACA,YAAY,IAAI,CAAC;AACjB,iBAAiB,SAAS,CAAC,mBAAmB;AAC9C,iBAAiB,OAAO,CAAC,0BAA0B,EAAE,KAAK;AAC1D,iBAAiB,OAAO,CAAC,qBAAqB,EAAE,KAAK;AACrD,iBAAiB,IAAI,CAAC,SAAS,EAAE,CAAC;AAClC,iBAAiB,IAAI,CAAC,QAAQ,EAAE,IAAI;AACpC,iBAAiB,IAAI,CAAC,QAAQ,EAAE,IAAI;AACpC,iBAAiB,IAAI,CAAC,cAAc,EAAE,IAAI;AAC1C,iBAAiB,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC;AAC7C;AACA,aAAa;AACb;AACA,YAAY,IAAI,CAAC;AACjB,iBAAiB,SAAS,CAAC,mBAAmB;AAC9C,iBAAiB,OAAO,CAAC,0BAA0B,EAAE,KAAK;AAC1D,iBAAiB,OAAO,CAAC,qBAAqB,EAAE,KAAK;AACrD,iBAAiB,IAAI,CAAC,SAAS,EAAE,CAAC;AAClC,iBAAiB,IAAI,CAAC,QAAQ,EAAE,IAAI;AACpC,iBAAiB,IAAI,CAAC,QAAQ,EAAE,IAAI;AACpC,iBAAiB,IAAI,CAAC,cAAc,EAAE,IAAI;AAC1C,iBAAiB,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC;AAC7C;AACA,YAAY;AACZ,iBAAiB,OAAO,CAAC,0BAA0B,EAAE,IAAI;AACzD,iBAAiB,IAAI,CAAC,QAAQ,EAAE,yCAAyC;AACzE,iBAAiB,IAAI,CAAC,QAAQ,EAAE,MAAM;AACtC,iBAAiB,IAAI,CAAC,cAAc,EAAE,KAAK;AAC3C,iBAAiB,IAAI,CAAC,gBAAgB,EAAE,KAAK;AAC7C,iBAAiB,KAAK,CAAC,YAAY,EAAE,sBAAsB,CAAC;AAC5D;AACA,YAAY,IAAI,CAAC;AACjB,iBAAiB,SAAS,CAAC,mBAAmB;AAC9C,iBAAiB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE;AAC3C,iBAAiB,OAAO,CAAC,qBAAqB,EAAE,IAAI;AACpD,iBAAiB,IAAI,CAAC,SAAS,EAAE,GAAG;AACpC,iBAAiB,KAAK,CAAC,YAAY,EAAE,0BAA0B,CAAC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,aAAa,CAAC,EAAE,EAAE;AACtB,QAAQ,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACvG,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AACrC;AACA,YAAY,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;AACtC;AACA,YAAY,IAAI,YAAY,EAAE;AAC9B;AACA,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa,EAAE;AAC5D;AACA,oBAAoB,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;AAClG;AACA,oBAAoB,UAAU,CAAC,MAAM;AACrC,wBAAwB,IAAI,CAAC,WAAW,EAAE;AAC1C,qBAAqB,EAAE,CAAC,CAAC;AACzB;AACA;AACA,iBAAiB;AACjB;AACA,gBAAgB,IAAI,CAAC,WAAW,EAAE;AAClC;AACA;AACA,aAAa;AACb;AACA,YAAY,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AACnC,YAAY,IAAI,CAAC,WAAW,EAAE;AAC9B;AACA;AACA,QAAQ,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AACvC;AACA,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;AAC7K,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,mBAAmB,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,kBAAkB,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,gBAAgB,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,iRAAiR,EAAE,MAAM,EAAE,CAAC,i0CAAi0C,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,uBAAuB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,eAAe,EAAE,EAAE,CAAC,uBAAuB,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC;AAC19E;AACA,EAAE,CAAC,wBAAwB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC;AAC7H,YAAY,IAAI,EAAE,SAAS;AAC3B,YAAY,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,uBAAuB,CAAC,EAAE,eAAe,EAAE,uBAAuB,CAAC,MAAM,EAAE,QAAQ,EAAE,iRAAiR,EAAE,MAAM,EAAE,CAAC,i0CAAi0C,CAAC,EAAE;AACrxD,SAAS,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,CAAC;;ACrwBvC;AACA;AACA;;;;"}