@acorex/charts 21.0.1-next.57 → 21.0.1-next.59

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.
Files changed (33) hide show
  1. package/fesm2022/acorex-charts-bar-chart.mjs +15 -11
  2. package/fesm2022/acorex-charts-bar-chart.mjs.map +1 -1
  3. package/fesm2022/acorex-charts-chart-legend.mjs +5 -5
  4. package/fesm2022/acorex-charts-chart-legend.mjs.map +1 -1
  5. package/fesm2022/acorex-charts-chart-tooltip.mjs +4 -4
  6. package/fesm2022/acorex-charts-chart-tooltip.mjs.map +1 -1
  7. package/fesm2022/acorex-charts-donut-chart.mjs +16 -8
  8. package/fesm2022/acorex-charts-donut-chart.mjs.map +1 -1
  9. package/fesm2022/acorex-charts-funnel-chart.mjs +275 -0
  10. package/fesm2022/acorex-charts-funnel-chart.mjs.map +1 -0
  11. package/fesm2022/acorex-charts-gauge-chart.mjs +135 -73
  12. package/fesm2022/acorex-charts-gauge-chart.mjs.map +1 -1
  13. package/fesm2022/acorex-charts-heatmap-chart.mjs +281 -0
  14. package/fesm2022/acorex-charts-heatmap-chart.mjs.map +1 -0
  15. package/fesm2022/acorex-charts-hierarchy-chart.mjs +4 -4
  16. package/fesm2022/acorex-charts-hierarchy-chart.mjs.map +1 -1
  17. package/fesm2022/acorex-charts-line-chart.mjs +15 -17
  18. package/fesm2022/acorex-charts-line-chart.mjs.map +1 -1
  19. package/fesm2022/acorex-charts.mjs +3 -3
  20. package/fesm2022/acorex-charts.mjs.map +1 -1
  21. package/funnel-chart/README.md +3 -0
  22. package/heatmap-chart/README.md +3 -0
  23. package/package.json +18 -10
  24. package/{bar-chart/index.d.ts → types/acorex-charts-bar-chart.d.ts} +4 -1
  25. package/{donut-chart/index.d.ts → types/acorex-charts-donut-chart.d.ts} +3 -1
  26. package/types/acorex-charts-funnel-chart.d.ts +108 -0
  27. package/{gauge-chart/index.d.ts → types/acorex-charts-gauge-chart.d.ts} +14 -1
  28. package/types/acorex-charts-heatmap-chart.d.ts +111 -0
  29. package/{hierarchy-chart/index.d.ts → types/acorex-charts-hierarchy-chart.d.ts} +3 -2
  30. package/{line-chart/index.d.ts → types/acorex-charts-line-chart.d.ts} +3 -1
  31. /package/{chart-legend/index.d.ts → types/acorex-charts-chart-legend.d.ts} +0 -0
  32. /package/{chart-tooltip/index.d.ts → types/acorex-charts-chart-tooltip.d.ts} +0 -0
  33. /package/{index.d.ts → types/acorex-charts.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-charts-hierarchy-chart.mjs","sources":["../tmp-esm2022/hierarchy-chart/lib/hierarchy-chart.config.js","../tmp-esm2022/hierarchy-chart/lib/hierarchy-chart.component.js","../tmp-esm2022/hierarchy-chart/acorex-charts-hierarchy-chart.js"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nexport const AXHierarchyChartDefaultConfig = {\n direction: 'vertical',\n margin: { top: 40, right: 120, bottom: 40, left: 120 },\n nodeRadius: 30,\n nodeStrokeWidth: 1.5,\n linkWidth: 1.5,\n linkStyle: 'curved',\n nodeWidth: 120,\n nodeHeight: 60,\n nodeSpacingX: 80,\n nodeSpacingY: 120,\n showTooltip: true,\n collapsible: true,\n expandAll: false,\n animationDuration: 100,\n animationEasing: 'cubic-out',\n messages: {\n noData: 'No data available',\n noDataHelp: 'Please provide hierarchy data to display the chart',\n noDataIcon: 'fa-light fa-sitemap',\n },\n};\nexport const AX_HIERARCHY_CHART_CONFIG = new InjectionToken('AX_HIERARCHY_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXHierarchyChartDefaultConfig,\n});\nexport function hierarchyChartConfig(config = {}) {\n const result = {\n ...AXHierarchyChartDefaultConfig,\n ...config,\n };\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGllcmFyY2h5LWNoYXJ0LmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9oaWVyYXJjaHktY2hhcnQvc3JjL2xpYi9oaWVyYXJjaHktY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQTJCO0lBQ25FLFNBQVMsRUFBRSxVQUFVO0lBQ3JCLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7SUFDdEQsVUFBVSxFQUFFLEVBQUU7SUFDZCxlQUFlLEVBQUUsR0FBRztJQUNwQixTQUFTLEVBQUUsR0FBRztJQUNkLFNBQVMsRUFBRSxRQUFRO0lBQ25CLFNBQVMsRUFBRSxHQUFHO0lBQ2QsVUFBVSxFQUFFLEVBQUU7SUFDZCxZQUFZLEVBQUUsRUFBRTtJQUNoQixZQUFZLEVBQUUsR0FBRztJQUNqQixXQUFXLEVBQUUsSUFBSTtJQUNqQixXQUFXLEVBQUUsSUFBSTtJQUNqQixTQUFTLEVBQUUsS0FBSztJQUNoQixpQkFBaUIsRUFBRSxHQUFHO0lBQ3RCLGVBQWUsRUFBRSxXQUFXO0lBQzVCLFFBQVEsRUFBRTtRQUNSLE1BQU0sRUFBRSxtQkFBbUI7UUFDM0IsVUFBVSxFQUFFLG9EQUFvRDtRQUNoRSxVQUFVLEVBQUUscUJBQXFCO0tBQ2xDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLElBQUksY0FBYyxDQUF5QiwyQkFBMkIsRUFBRTtJQUMvRyxVQUFVLEVBQUUsTUFBTTtJQUNsQixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsNkJBQTZCO0NBQzdDLENBQUMsQ0FBQztBQUlILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxTQUFzQyxFQUFFO0lBQzNFLE1BQU0sTUFBTSxHQUFHO1FBQ2IsR0FBRyw2QkFBNkI7UUFDaEMsR0FBRyxNQUFNO0tBQ1YsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhIaWVyYXJjaHlDaGFydE9wdGlvbiB9IGZyb20gJy4vaGllcmFyY2h5LWNoYXJ0LnR5cGUnO1xuXG5leHBvcnQgY29uc3QgQVhIaWVyYXJjaHlDaGFydERlZmF1bHRDb25maWc6IEFYSGllcmFyY2h5Q2hhcnRPcHRpb24gPSB7XG4gIGRpcmVjdGlvbjogJ3ZlcnRpY2FsJyxcbiAgbWFyZ2luOiB7IHRvcDogNDAsIHJpZ2h0OiAxMjAsIGJvdHRvbTogNDAsIGxlZnQ6IDEyMCB9LFxuICBub2RlUmFkaXVzOiAzMCxcbiAgbm9kZVN0cm9rZVdpZHRoOiAxLjUsXG4gIGxpbmtXaWR0aDogMS41LFxuICBsaW5rU3R5bGU6ICdjdXJ2ZWQnLFxuICBub2RlV2lkdGg6IDEyMCxcbiAgbm9kZUhlaWdodDogNjAsXG4gIG5vZGVTcGFjaW5nWDogODAsXG4gIG5vZGVTcGFjaW5nWTogMTIwLFxuICBzaG93VG9vbHRpcDogdHJ1ZSxcbiAgY29sbGFwc2libGU6IHRydWUsXG4gIGV4cGFuZEFsbDogZmFsc2UsXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiAxMDAsXG4gIGFuaW1hdGlvbkVhc2luZzogJ2N1YmljLW91dCcsXG4gIG1lc3NhZ2VzOiB7XG4gICAgbm9EYXRhOiAnTm8gZGF0YSBhdmFpbGFibGUnLFxuICAgIG5vRGF0YUhlbHA6ICdQbGVhc2UgcHJvdmlkZSBoaWVyYXJjaHkgZGF0YSB0byBkaXNwbGF5IHRoZSBjaGFydCcsXG4gICAgbm9EYXRhSWNvbjogJ2ZhLWxpZ2h0IGZhLXNpdGVtYXAnLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEFYX0hJRVJBUkNIWV9DSEFSVF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48QVhIaWVyYXJjaHlDaGFydE9wdGlvbj4oJ0FYX0hJRVJBUkNIWV9DSEFSVF9DT05GSUcnLCB7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgZmFjdG9yeTogKCkgPT4gQVhIaWVyYXJjaHlDaGFydERlZmF1bHRDb25maWcsXG59KTtcblxuZXhwb3J0IHR5cGUgUGFydGlhbEhpZXJhcmNoeUNoYXJ0Q29uZmlnID0gUGFydGlhbDxBWEhpZXJhcmNoeUNoYXJ0T3B0aW9uPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGhpZXJhcmNoeUNoYXJ0Q29uZmlnKGNvbmZpZzogUGFydGlhbEhpZXJhcmNoeUNoYXJ0Q29uZmlnID0ge30pOiBBWEhpZXJhcmNoeUNoYXJ0T3B0aW9uIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIC4uLkFYSGllcmFyY2h5Q2hhcnREZWZhdWx0Q29uZmlnLFxuICAgIC4uLmNvbmZpZyxcbiAgfTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==","import { AXChartComponent } from '@acorex/charts';\nimport { ChangeDetectionStrategy, Component, NgZone, ViewContainerRef, ViewEncapsulation, afterNextRender, computed, contentChild, effect, inject, input, output, signal, viewChild, } from '@angular/core';\nimport { AX_HIERARCHY_CHART_CONFIG } from './hierarchy-chart.config';\nimport * as i0 from \"@angular/core\";\n/**\n * A highly customizable hierarchical visualization component that can be used for:\n * - Organization charts\n * - Tree diagrams\n * - Dependency visualizations\n * - Process flows\n *\n * Supports both default node styling and custom node templates.\n */\nexport class AXHierarchyChartComponent extends AXChartComponent {\n // Chart container reference\n chartContainer = viewChild.required('chartContainer');\n // Custom node template provided by the user\n customNodeTemplate = contentChild('nodeTemplate', ...(ngDevMode ? [{ debugName: \"customNodeTemplate\" }] : []));\n // Services\n ngZone = inject(NgZone);\n viewContainerRef = inject(ViewContainerRef);\n configToken = inject(AX_HIERARCHY_CHART_CONFIG);\n // D3 instance\n d3;\n // Internal state signals\n _expandedNodes = signal(new Map(), ...(ngDevMode ? [{ debugName: \"_expandedNodes\" }] : []));\n _initialized = signal(false, ...(ngDevMode ? [{ debugName: \"_initialized\" }] : []));\n _rendered = signal(false, ...(ngDevMode ? [{ debugName: \"_rendered\" }] : []));\n _dimensions = signal({ width: 0, height: 0 }, ...(ngDevMode ? [{ debugName: \"_dimensions\" }] : []));\n _nodeElements = signal(new Map(), ...(ngDevMode ? [{ debugName: \"_nodeElements\" }] : [])); // Store references to node elements\n _chartData = signal(null, ...(ngDevMode ? [{ debugName: \"_chartData\" }] : [])); // Store the current chart data and layout\n // Inputs\n data = input([], ...(ngDevMode ? [{ debugName: \"data\" }] : []));\n options = input({}, ...(ngDevMode ? [{ debugName: \"options\" }] : []));\n nodeTemplate = input(null, ...(ngDevMode ? [{ debugName: \"nodeTemplate\" }] : []));\n // Outputs\n itemClick = output();\n nodeToggle = output();\n // Computed values\n processedData = computed(() => {\n const data = this.data();\n // Handle both single node and array formats\n return Array.isArray(data) ? { id: 'root', children: data } : data;\n }, ...(ngDevMode ? [{ debugName: \"processedData\" }] : []));\n // Check if custom template is available\n hasCustomTemplate = computed(() => {\n return Boolean(this.customNodeTemplate() || this.nodeTemplate());\n }, ...(ngDevMode ? [{ debugName: \"hasCustomTemplate\" }] : []));\n effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\n // Messages with defaults\n effectiveMessages = computed(() => {\n const defaultMessages = {\n noData: 'No data available',\n noDataHelp: 'Please provide hierarchy data to display the chart',\n noDataIcon: 'fa-light fa-sitemap',\n };\n return {\n ...defaultMessages,\n ...this.effectiveOptions().messages,\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveMessages\" }] : []));\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 this.initializeExpandedState();\n });\n // Watch for changes to redraw the chart\n effect(() => {\n // Access these to track them\n this.processedData();\n this.nodeTemplate();\n this.customNodeTemplate();\n this.effectiveOptions();\n this._expandedNodes();\n if (this._initialized() && this.d3 && this._rendered()) {\n this.createChart();\n }\n });\n }\n /**\n * Initialize the expanded state for all nodes\n */\n initializeExpandedState() {\n const newExpandedNodes = new Map();\n const data = this.processedData();\n const expandAll = this.effectiveOptions().expandAll;\n // Helper function to recursively process nodes\n const processNode = (node) => {\n if (node.children && node.children.length > 0) {\n // Set initial expansion state based on node property or global option\n newExpandedNodes.set(node.id, node.isExpanded !== undefined ? node.isExpanded : expandAll);\n // Process children\n node.children.forEach((child) => processNode(child));\n }\n };\n // Start processing\n if (data.children) {\n data.children.forEach((node) => processNode(node));\n }\n else if (data.id) {\n processNode(data);\n }\n this._expandedNodes.set(newExpandedNodes);\n }\n /**\n * Dynamically load D3.js to reduce initial bundle size\n */\n async loadD3() {\n try {\n this.d3 = await import('d3');\n if (this._initialized() && this.chartContainer()) {\n this.updateDimensions();\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 * Update dimensions based on container size\n */\n updateDimensions() {\n const container = this.chartContainer().nativeElement;\n const options = this.effectiveOptions();\n const containerRect = container.getBoundingClientRect();\n const width = options.width || Math.max(containerRect.width, 300);\n const height = options.height || Math.max(containerRect.height, 400);\n this._dimensions.set({ width, height });\n }\n /**\n * Create and render the hierarchy chart\n */\n createChart() {\n if (!this.d3) {\n return;\n }\n // Clear any existing chart\n this.cleanupChart();\n const container = this.chartContainer().nativeElement;\n const data = this.processedData();\n // Check for null/undefined data or empty children\n if (!data || !data.children || data.children.length === 0) {\n this.showNoDataMessage(container);\n return;\n }\n const options = this.effectiveOptions();\n const dimensions = this._dimensions();\n const expandedNodes = this._expandedNodes();\n this.ngZone.runOutsideAngular(() => {\n // Get dimensions and options\n const { width, height } = dimensions;\n const margin = options.margin || { top: 40, right: 120, bottom: 40, left: 120 };\n const nodeWidth = options.nodeWidth || 120;\n const nodeHeight = options.nodeHeight || 60;\n const nodeSpacingX = options.nodeSpacingX || 80;\n const nodeSpacingY = options.nodeSpacingY || 120;\n const isHorizontal = options.direction === 'horizontal';\n // Create SVG container with viewBox for responsiveness\n const svg = this.d3\n .select(container)\n .append('svg')\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${width} ${height}`)\n .attr('preserveAspectRatio', 'xMidYMid meet')\n .style('overflow', 'visible')\n .classed(options.className || '', !!options.className);\n // Create hierarchy layout from data\n const rootData = this.processedData();\n const root = this.d3.hierarchy(rootData);\n // Apply expansion state to nodes\n root.descendants().forEach((node) => {\n if (node.data.id !== 'root' && node.children) {\n if (expandedNodes.has(node.data.id) && !expandedNodes.get(node.data.id)) {\n node._children = node.children; // Store children\n node.children = null; // Collapse node\n }\n }\n });\n // Set up the tree layout based on direction option\n const treeLayout = this.d3\n .tree()\n .nodeSize([\n isHorizontal ? nodeHeight + nodeSpacingY : nodeWidth + nodeSpacingX,\n isHorizontal ? nodeWidth + nodeSpacingX : nodeHeight + nodeSpacingY,\n ])\n .separation((a, b) => {\n return a.parent === b.parent ? 1.2 : 1.5;\n });\n treeLayout(root);\n // Store the current tree layout data for future updates\n this._chartData.set({\n root,\n treeLayout,\n isHorizontal,\n nodeWidth,\n nodeHeight,\n });\n // Adjust root position based on direction\n const rootX = isHorizontal ? margin.top : width / 2;\n const rootY = isHorizontal ? margin.left : margin.top;\n // Calculate bounds of the tree after layout\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n root.descendants().forEach((d) => {\n if (d.data.id === 'root')\n return;\n const x = isHorizontal ? d.x : d.x;\n const y = isHorizontal ? d.y : d.y;\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n // Calculate the center of the tree\n const centerX = (minX + maxX) / 2;\n const centerY = (minY + maxY) / 2;\n // Create a group for the chart content with proper centering\n const g = svg\n .append('g')\n .attr('transform', isHorizontal\n ? `translate(${margin.left}, ${height / 2 - centerX})`\n : `translate(${width / 2}, ${margin.top})`);\n // Add zoom and pan behavior (replaces AXPanViewDirective)\n const zoom = this.d3\n .zoom()\n .scaleExtent([0.1, 3]) // Min zoom: 10%, Max zoom: 300%\n .on('zoom', (event) => {\n g.attr('transform', event.transform);\n });\n // Apply zoom behavior to SVG\n svg.call(zoom);\n // Set initial transform to match the centering\n const initialTransform = this.d3.zoomIdentity\n .translate(isHorizontal ? margin.left : width / 2, isHorizontal ? height / 2 - centerX : margin.top);\n svg.call(zoom.transform, initialTransform);\n // Draw links between nodes\n const links = g\n .selectAll('.link')\n .data(root.links().filter((d) => d.source.data.id !== 'root'))\n .enter()\n .append('path')\n .attr('class', 'ax-hierarchy-chart-link')\n .attr('d', (d) => {\n // Get the link style from options\n const linkStyle = options.linkStyle || 'curved';\n // Source and target coordinates based on direction\n const sourceX = isHorizontal ? d.source.y : d.source.x;\n const sourceY = isHorizontal ? d.source.x : d.source.y;\n const targetX = isHorizontal ? d.target.y : d.target.x;\n const targetY = isHorizontal ? d.target.x : d.target.y;\n // Variables for rounded corners\n let xDistance, yDistance, cornerRadius, midX, midY;\n switch (linkStyle) {\n case 'straight':\n // Direct straight line\n return `M${sourceX},${sourceY}L${targetX},${targetY}`;\n case 'rounded':\n // Curved line with rounded corners\n xDistance = Math.abs(targetX - sourceX);\n yDistance = Math.abs(targetY - sourceY);\n cornerRadius = Math.min(xDistance, yDistance) * 0.2; // Reduced radius for better appearance\n if (isHorizontal) {\n // For horizontal layout\n const halfDistance = (targetX - sourceX) / 2;\n const xMid = sourceX + halfDistance;\n return `\n M${sourceX},${sourceY}\n H${xMid - cornerRadius}\n Q${xMid},${sourceY} ${xMid},${sourceY + Math.sign(targetY - sourceY) * cornerRadius}\n V${targetY - Math.sign(targetY - sourceY) * cornerRadius}\n Q${xMid},${targetY} ${xMid + cornerRadius},${targetY}\n H${targetX}\n `;\n }\n else {\n // For vertical layout\n const halfDistance = (targetY - sourceY) / 2;\n const yMid = sourceY + halfDistance;\n return `\n M${sourceX},${sourceY}\n V${yMid - cornerRadius}\n Q${sourceX},${yMid} ${sourceX + Math.sign(targetX - sourceX) * cornerRadius},${yMid}\n H${targetX - Math.sign(targetX - sourceX) * cornerRadius}\n Q${targetX},${yMid} ${targetX},${yMid + cornerRadius}\n V${targetY}\n `;\n }\n case 'step':\n // L-shaped stepped line\n if (isHorizontal) {\n return `M${sourceX},${sourceY}H${(sourceX + targetX) / 2}V${targetY}H${targetX}`;\n }\n else {\n return `M${sourceX},${sourceY}V${(sourceY + targetY) / 2}H${targetX}V${targetY}`;\n }\n case 'curved':\n default:\n // Default curved line using D3's built-in link generator\n if (isHorizontal) {\n return this.d3\n .linkHorizontal()\n .x((d) => d.y)\n .y((d) => d.x)(d);\n }\n else {\n return this.d3\n .linkVertical()\n .x((d) => d.x)\n .y((d) => d.y)(d);\n }\n }\n })\n .attr('stroke', `rgb(var(--ax-comp-hierarchy-chart-link-color))`)\n .attr('stroke-width', options.linkWidth)\n .attr('fill', 'none')\n .attr('opacity', 1);\n // Determine which template to use for rendering nodes\n const useCustomTemplate = this.hasCustomTemplate();\n const templateToUse = this.nodeTemplate() || this.customNodeTemplate();\n // Create a map to store node elements for future updates\n const nodeElementsMap = new Map();\n // Create node groups\n const nodeGroups = g\n .selectAll('.node-group')\n .data(root.descendants().filter((d) => d.data.id !== 'root'))\n .enter()\n .append('g')\n .attr('class', 'ax-hierarchy-chart-node-group')\n .attr('data-node-id', (d) => d.data.id) // Add a data attribute for easier selection\n .attr('transform', (d) => {\n const x = isHorizontal ? d.y : d.x;\n const y = isHorizontal ? d.x : d.y;\n return `translate(${x},${y})`;\n })\n .attr('opacity', 1); // Display nodes immediately with full opacity\n // Store node elements in the map\n nodeGroups.each(function (d) {\n nodeElementsMap.set(d.data.id, this);\n });\n // Update the node elements signal\n this._nodeElements.set(nodeElementsMap);\n if (useCustomTemplate && templateToUse) {\n // Render custom node templates\n nodeGroups.each((d, i, nodes) => {\n const node = d.data;\n const element = nodes[i];\n const hasChildren = !!(node.children && node.children.length > 0);\n const isExpanded = hasChildren && this._expandedNodes().has(node.id) && this._expandedNodes().get(node.id);\n // Enhance the node with expanded state and toggle function\n node.expanded = isExpanded || false;\n node.toggleExpanded = () => this.toggleNode(node.id);\n // Create a foreignObject for the template\n const foreignObject = this.d3\n .select(element)\n .append('foreignObject')\n .attr('x', -nodeWidth / 2)\n .attr('y', -nodeHeight / 2)\n .attr('width', nodeWidth)\n .attr('height', nodeHeight)\n .attr('class', 'ax-hierarchy-chart-node-container')\n .on('click', (event) => {\n // Don't propagate the event if it's coming from an interactive element\n // like a button inside the template\n const target = event.target;\n const isInteractive = target.tagName === 'BUTTON' || target.tagName === 'A' || target.closest('button, a, [role=\"button\"]');\n if (!isInteractive) {\n this.handleNodeClick(event, d);\n }\n });\n // Create a div to hold the template\n const div = foreignObject\n .append('xhtml:div')\n .attr('class', 'ax-hierarchy-chart-node-content')\n .style('width', '100%')\n .style('height', '100%');\n // Render the template into the div\n this.ngZone.run(() => {\n // Create context with enhanced node as the implicit value\n const context = {\n $implicit: node,\n };\n const viewRef = this.viewContainerRef.createEmbeddedView(templateToUse, context);\n viewRef.detectChanges();\n // Append template contents to the div\n const nodes = viewRef.rootNodes;\n for (const node of nodes) {\n div.node().appendChild(node);\n }\n });\n });\n }\n else {\n // Render enhanced default nodes (rectangles with text and icons)\n nodeGroups.each((d, i, nodes) => {\n const group = this.d3.select(nodes[i]);\n const node = d.data;\n const hasChildren = !!(node.children && node.children.length > 0);\n // Node background rect with rounded corners\n group\n .append('rect')\n .attr('x', -nodeWidth / 2)\n .attr('y', -nodeHeight / 2)\n .attr('width', nodeWidth)\n .attr('height', nodeHeight)\n .attr('rx', 6)\n .attr('ry', 6)\n .attr('fill', node.color || `rgb(var(--ax-comp-hierarchy-chart-node-color))`)\n .attr('stroke', `rgb(var(--ax-comp-hierarchy-chart-node-stroke-color))`)\n .attr('stroke-width', options.nodeStrokeWidth)\n .attr('class', 'ax-hierarchy-chart-node');\n // Main title/name\n group\n .append('text')\n .attr('y', -10)\n .attr('text-anchor', 'middle')\n .attr('class', 'ax-hierarchy-chart-node-title')\n .attr('fill', 'white')\n .attr('font-weight', 'bold')\n .text(node.name || node.label || '');\n // Subtitle if provided\n if (node.subtitle) {\n group\n .append('text')\n .attr('y', 10)\n .attr('text-anchor', 'middle')\n .attr('class', 'ax-hierarchy-chart-node-subtitle')\n .attr('fill', 'rgba(255, 255, 255, 0.8)')\n .attr('font-size', '0.8em')\n .text(node.subtitle);\n }\n // Type label if provided\n if (node.type) {\n group\n .append('text')\n .attr('y', 25)\n .attr('text-anchor', 'middle')\n .attr('class', 'ax-hierarchy-chart-node-type')\n .attr('fill', 'rgba(255, 255, 255, 0.7)')\n .attr('font-size', '0.7em')\n .text(node.type);\n }\n // Add expand/collapse indicator if node has children\n if (hasChildren && options.collapsible) {\n const isExpanded = this._expandedNodes().has(node.id) && this._expandedNodes().get(node.id);\n // Toggle button with better styling\n group\n .append('circle')\n .attr('r', 10)\n .attr('cx', nodeWidth / 2 - 12)\n .attr('cy', -nodeHeight / 2 + 12)\n .attr('fill', 'white')\n .attr('stroke', `rgb(var(--ax-comp-hierarchy-chart-node-stroke-color))`)\n .attr('stroke-width', 1)\n .attr('class', 'ax-hierarchy-chart-toggle-indicator')\n .style('cursor', 'pointer')\n .on('click', (event) => {\n event.stopPropagation();\n this.toggleNode(node.id);\n });\n // Toggle icon\n group\n .append('text')\n .attr('x', nodeWidth / 2 - 12)\n .attr('y', -nodeHeight / 2 + 12)\n .attr('dy', '0.32em')\n .attr('text-anchor', 'middle')\n .attr('class', 'ax-hierarchy-chart-toggle-icon')\n .attr('fill', node.color || `rgb(var(--ax-comp-hierarchy-chart-node-color))`)\n .attr('font-weight', 'bold')\n .style('cursor', 'pointer')\n .text(isExpanded ? '−' : '+')\n .on('click', (event) => {\n event.stopPropagation();\n this.toggleNode(node.id);\n });\n }\n // Icon if provided\n if (node.icon) {\n group\n .append('text')\n .attr('x', -nodeWidth / 2 + 15)\n .attr('y', 0)\n .attr('dy', '0.32em')\n .attr('class', 'ax-hierarchy-chart-node-icon')\n .attr('fill', 'white')\n .attr('class', node.icon);\n }\n // Add click handler to the whole node\n group.on('click', (event) => {\n this.handleNodeClick(event, d);\n });\n // Add tooltip if enabled\n if (options.showTooltip && (node.tooltip || node.description)) {\n group.append('title').text(node.tooltip || node.description || '');\n }\n });\n }\n });\n }\n /**\n * Toggle node expansion state\n */\n toggleNode(nodeId) {\n const expandedNodes = new Map(this._expandedNodes());\n const currentState = expandedNodes.get(nodeId);\n const newState = currentState === undefined ? false : !currentState;\n expandedNodes.set(nodeId, newState);\n this._expandedNodes.set(expandedNodes);\n // Emit toggle event\n this.findNodeById(this.processedData(), nodeId).then((node) => {\n if (node) {\n this.nodeToggle.emit({\n node: node,\n expanded: newState,\n });\n }\n });\n // Update toggle indicator immediately for better UX\n this.updateToggleIndicator(nodeId, newState);\n }\n /**\n * Update just the toggle indicator without redrawing the chart\n */\n updateToggleIndicator(nodeId, expanded) {\n if (!this.d3 || !this.chartContainer())\n return;\n this.ngZone.runOutsideAngular(() => {\n const container = this.chartContainer().nativeElement;\n const svg = container.querySelector('svg');\n if (!svg)\n return;\n // Find and update the toggle indicator for the specific node\n const nodeGroup = this.d3.select(svg).select(`[data-node-id=\"${nodeId}\"]`);\n if (nodeGroup.empty())\n return;\n // Update the toggle icon (if it exists)\n const toggleIcon = nodeGroup.select('.ax-hierarchy-chart-toggle-icon');\n if (!toggleIcon.empty()) {\n toggleIcon.text(expanded ? '−' : '+');\n }\n });\n // Force effect to run that will update the chart\n // This leverages Angular's reactivity rather than a direct method call\n // which is more consistent with Angular's reactive approach\n const expandedNodes = new Map(this._expandedNodes());\n this._expandedNodes.set(expandedNodes);\n }\n /**\n * Find a node by ID\n */\n async findNodeById(data, id) {\n if (data.id === id) {\n return data;\n }\n if (data.children) {\n for (const child of data.children) {\n const found = await this.findNodeById(child, id);\n if (found) {\n return found;\n }\n }\n }\n return null;\n }\n /**\n * Handle node click events\n */\n handleNodeClick(event, d) {\n const node = d.data;\n // Emit click event\n this.itemClick.emit({\n event: { nativeEvent: event, sender: this },\n item: node,\n element: event.currentTarget,\n });\n }\n /**\n * Clear existing chart\n */\n cleanupChart() {\n const container = this.chartContainer()?.nativeElement;\n if (!container)\n return;\n // Remove existing SVG\n const svg = container.querySelector('svg');\n if (svg) {\n svg.remove();\n }\n }\n updateChart() {\n this.createChart();\n }\n /**\n * Get D3 easing function from string name\n */\n getEasingFunction(easing) {\n if (!easing)\n return this.d3.easeCubicInOut;\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.easeCubicInOut;\n }\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 .attr('class', 'ax-hierarchy-chart-no-data-message')\n .style('position', 'absolute')\n .style('left', '50%')\n .style('top', '50%')\n .style('transform', 'translate(-50%, -50%)')\n .style('text-align', 'center')\n .style('background-color', 'rgb(var(--ax-comp-hierarchy-chart-bg-color))')\n .style('padding', '1.5rem')\n .style('border-radius', '0.5rem')\n .style('box-shadow', '0 2px 12px rgba(0, 0, 0, 0.08)')\n .style('width', '80%')\n .style('max-width', '300px');\n // Add an icon\n messageContainer\n .append('div')\n .attr('class', 'ax-hierarchy-chart-no-data-icon')\n .style('opacity', '0.6')\n .style('margin-bottom', '0.75rem')\n .html(`<i class=\"${this.effectiveMessages().noDataIcon} fa-2x\"></i>`);\n // Add text message\n messageContainer\n .append('div')\n .attr('class', 'ax-hierarchy-chart-no-data-text')\n .style('font-size', '1rem')\n .style('font-weight', '600')\n .style('margin-bottom', '0.5rem')\n .text(this.effectiveMessages().noData);\n // Add help text\n messageContainer\n .append('div')\n .attr('class', 'ax-hierarchy-chart-no-data-help')\n .style('font-size', '0.8rem')\n .style('opacity', '0.6')\n .text(this.effectiveMessages().noDataHelp);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXHierarchyChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.3.3\", type: AXHierarchyChartComponent, isStandalone: true, selector: \"ax-hierarchy-chart\", inputs: { data: { classPropertyName: \"data\", publicName: \"data\", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: \"options\", publicName: \"options\", isSignal: true, isRequired: false, transformFunction: null }, nodeTemplate: { classPropertyName: \"nodeTemplate\", publicName: \"nodeTemplate\", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: \"itemClick\", nodeToggle: \"nodeToggle\" }, queries: [{ propertyName: \"customNodeTemplate\", first: true, predicate: [\"nodeTemplate\"], descendants: true, isSignal: true }], viewQueries: [{ propertyName: \"chartContainer\", first: true, predicate: [\"chartContainer\"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: \"<div class=\\\"ax-hierarchy-chart\\\" role=\\\"img\\\" #chartContainer></div>\\n\", styles: [\"ax-hierarchy-chart{display:block;width:100%;height:100%;min-height:300px;--ax-comp-hierarchy-chart-node-color: var(--ax-sys-color-primary-500);--ax-comp-hierarchy-chart-node-stroke-color: var(--ax-sys-color-primary-400);--ax-comp-hierarchy-chart-link-color: var(--ax-sys-color-primary-400);--ax-comp-hierarchy-chart-text-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-hierarchy-chart-bg-color: 0, 0, 0, 0;color:rgb(var(--ax-comp-hierarchy-chart-text-color));background-color:rgba(var(--ax-comp-hierarchy-chart-bg-color))}ax-hierarchy-chart .ax-hierarchy-chart{width:100%;height:100%;min-height:300px;position:relative;overflow:hidden}ax-hierarchy-chart .ax-hierarchy-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}ax-hierarchy-chart .ax-hierarchy-chart svg g:has(text){font-family:inherit}ax-hierarchy-chart .ax-hierarchy-chart-no-data-message{position:absolute;text-align:center;transform:translate(-50%,-50%);background-color:rgb(var(--ax-comp-hierarchy-chart-bg-color));padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px}ax-hierarchy-chart .ax-hierarchy-chart-no-data-message .ax-hierarchy-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-hierarchy-chart .ax-hierarchy-chart-no-data-message .ax-hierarchy-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-hierarchy-chart .ax-hierarchy-chart-no-data-message .ax-hierarchy-chart-no-data-help{font-size:.8rem;opacity:.6}\\n\"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXHierarchyChartComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-hierarchy-chart', standalone: true, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"ax-hierarchy-chart\\\" role=\\\"img\\\" #chartContainer></div>\\n\", styles: [\"ax-hierarchy-chart{display:block;width:100%;height:100%;min-height:300px;--ax-comp-hierarchy-chart-node-color: var(--ax-sys-color-primary-500);--ax-comp-hierarchy-chart-node-stroke-color: var(--ax-sys-color-primary-400);--ax-comp-hierarchy-chart-link-color: var(--ax-sys-color-primary-400);--ax-comp-hierarchy-chart-text-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-hierarchy-chart-bg-color: 0, 0, 0, 0;color:rgb(var(--ax-comp-hierarchy-chart-text-color));background-color:rgba(var(--ax-comp-hierarchy-chart-bg-color))}ax-hierarchy-chart .ax-hierarchy-chart{width:100%;height:100%;min-height:300px;position:relative;overflow:hidden}ax-hierarchy-chart .ax-hierarchy-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}ax-hierarchy-chart .ax-hierarchy-chart svg g:has(text){font-family:inherit}ax-hierarchy-chart .ax-hierarchy-chart-no-data-message{position:absolute;text-align:center;transform:translate(-50%,-50%);background-color:rgb(var(--ax-comp-hierarchy-chart-bg-color));padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px}ax-hierarchy-chart .ax-hierarchy-chart-no-data-message .ax-hierarchy-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-hierarchy-chart .ax-hierarchy-chart-no-data-message .ax-hierarchy-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-hierarchy-chart .ax-hierarchy-chart-no-data-message .ax-hierarchy-chart-no-data-help{font-size:.8rem;opacity:.6}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGllcmFyY2h5LWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9oaWVyYXJjaHktY2hhcnQvc3JjL2xpYi9oaWVyYXJjaHktY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2hpZXJhcmNoeS1jaGFydC9zcmMvbGliL2hpZXJhcmNoeS1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQXdCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEUsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsTUFBTSxFQUVOLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLFFBQVEsRUFDUixZQUFZLEVBQ1osTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBU3JFOzs7Ozs7OztHQVFHO0FBU0gsTUFBTSxPQUFPLHlCQUEwQixTQUFRLGdCQUFnQjtJQUM3RCw0QkFBNEI7SUFDcEIsY0FBYyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQTZCLGdCQUFnQixDQUFDLENBQUM7SUFFMUYsNENBQTRDO0lBQzVDLGtCQUFrQixHQUFHLFlBQVksQ0FBMkMsY0FBYyw4REFBQyxDQUFDO0lBQzVGLFdBQVc7SUFDSCxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hCLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzVDLFdBQVcsR0FBRyxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUV4RCxjQUFjO0lBQ04sRUFBRSxDQUFNO0lBRWhC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O2FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV6QyxnQkFBZ0I7UUFDaEIsZ0JBQWdCO2FBQ2IsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNiLElBQUksQ0FBQyxPQUFPLEVBQUUsaUNBQWlDLENBQUM7YUFDaEQsS0FBSyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUM7YUFDNUIsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUM7YUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9DLENBQUM7dUdBdnZCVSx5QkFBeUI7MkZBQXpCLHlCQUF5QixrekJDOUN0Qyx5RUFDQTs7MkZENkNhLHlCQUF5QjtrQkFSckMsU0FBUzsrQkFDRSxvQkFBb0IsY0FHbEIsSUFBSSxpQkFDRCxpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVhDaGFydENvbXBvbmVudCwgQVhDaGFydENvbXBvbmVudEJhc2UgfSBmcm9tICdAYWNvcmV4L2NoYXJ0cyc7XG5cbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIE5nWm9uZSxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBhZnRlck5leHRSZW5kZXIsXG4gIGNvbXB1dGVkLFxuICBjb250ZW50Q2hpbGQsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBWF9ISUVSQVJDSFlfQ0hBUlRfQ09ORklHIH0gZnJvbSAnLi9oaWVyYXJjaHktY2hhcnQuY29uZmlnJztcbmltcG9ydCB7XG4gIEFYSGllcmFyY2h5Q2hhcnRDbGlja0V2ZW50LFxuICBBWEhpZXJhcmNoeUNoYXJ0RGF0YSxcbiAgQVhIaWVyYXJjaHlDaGFydE5vZGUsXG4gIEFYSGllcmFyY2h5Q2hhcnROb2RlQ29udGV4dCxcbiAgQVhIaWVyYXJjaHlDaGFydE9wdGlvbixcbiAgQVhIaWVyYXJjaHlDaGFydFRvZ2dsZUV2ZW50LFxufSBmcm9tICcuL2hpZXJhcmNoeS1jaGFydC50eXBlJztcbi8qKlxuICogQSBoaWdobHkgY3VzdG9taXphYmxlIGhpZXJhcmNoaWNhbCB2aXN1YWxpemF0aW9uIGNvbXBvbmVudCB0aGF0IGNhbiBiZSB1c2VkIGZvcjpcbiAqIC0gT3JnYW5pemF0aW9uIGNoYXJ0c1xuICogLSBUcmVlIGRpYWdyYW1zXG4gKiAtIERlcGVuZGVuY3kgdmlzdWFsaXphdGlvbnNcbiAqIC0gUHJvY2VzcyBmbG93c1xuICpcbiAqIFN1cHBvcnRzIGJvdGggZGVmYXVsdCBub2RlIHN0eWxpbmcgYW5kIGN1c3RvbSBub2RlIHRlbXBsYXRlcy5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXgtaGllcmFyY2h5LWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2hpZXJhcmNoeS1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2hpZXJhcmNoeS1jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQVhIaWVyYXJjaHlDaGFydENvbXBvbmVudCBleHRlbmRzIEFYQ2hhcnRDb21wb25lbnQgaW1wbGVtZW50cyBBWENoYXJ0Q29tcG9uZW50QmFzZSB7XG4gIC8vIENoYXJ0IGNvbnRhaW5lciByZWZlcmVuY2VcbiAgcHJpdmF0ZSBjaGFydENvbnRhaW5lciA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ2NoYXJ0Q29udGFpbmVyJyk7XG5cbiAgLy8gQ3VzdG9tIG5vZGUgdGVtcGxhdGUgcHJvdmlkZWQgYnkgdGhlIHVzZXJcbiAgY3VzdG9tTm9kZVRlbXBsYXRlID0gY29udGVudENoaWxkPFRlbXBsYXRlUmVmPEFYSGllcmFyY2h5Q2hhcnROb2RlQ29udGV4dD4+KCdub2RlVGVtcGxhdGUnKTtcbiAgLy8gU2VydmljZXNcbiAgcHJpdmF0ZSBuZ1pvbmUgPSBpbmplY3QoTmdab25lKTtcbiAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmID0gaW5qZWN0KFZpZXdDb250YWluZXJSZWYpO1xuICBwcml2YXRlIGNvbmZpZ1Rva2VuID0gaW5qZWN0KEFYX0hJRVJBUkNIWV9DSEFSVF9DT05GSUcpO1xuXG4gIC8vIEQzIGluc3RhbmNlXG4gIHByaXZhdGUgZDM6IGFueTtcblxuICAvLyBJbnRlcm5hbCBzdGF0ZSBzaWduYWxzXG4gIHByaXZhdGUgX2V4cGFuZGVkTm9kZXMgPSBzaWduYWw8TWFwPHN0cmluZywgYm9vbGVhbj4+KG5ldyBNYXAoKSk7XG4gIHByaXZhdGUgX2luaXRpYWxpemVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfcmVuZGVyZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9kaW1lbnNpb25zID0gc2lnbmFsKHsgd2lkdGg6IDAsIGhlaWdodDogMCB9KTtcbiAgcHJpdmF0ZSBfbm9kZUVsZW1lbnRzID0gc2lnbmFsPE1hcDxzdHJpbmcsIGFueT4+KG5ldyBNYXAoKSk7IC8vIFN0b3JlIHJlZmVyZW5jZXMgdG8gbm9kZSBlbGVtZW50c1xuICBwcml2YXRlIF9jaGFydERhdGEgPSBzaWduYWw8YW55PihudWxsKTsgLy8gU3RvcmUgdGhlIGN1cnJlbnQgY2hhcnQgZGF0YSBhbmQgbGF5b3V0XG5cbiAgLy8gSW5wdXRzXG4gIGRhdGEgPSBpbnB1dDxBWEhpZXJhcmNoeUNoYXJ0RGF0YSB8IEFYSGllcmFyY2h5Q2hhcnREYXRhW10+KFtdKTtcbiAgb3B0aW9ucyA9IGlucHV0PEFYSGllcmFyY2h5Q2hhcnRPcHRpb24+KHt9KTtcbiAgbm9kZVRlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8QVhIaWVyYXJjaHlDaGFydE5vZGVDb250ZXh0PiB8IG51bGw+KG51bGwpO1xuXG4gIC8vIE91dHB1dHNcbiAgaXRlbUNsaWNrID0gb3V0cHV0PEFYSGllcmFyY2h5Q2hhcnRDbGlja0V2ZW50PigpO1xuICBub2RlVG9nZ2xlID0gb3V0cHV0PEFYSGllcmFyY2h5Q2hhcnRUb2dnbGVFdmVudD4oKTtcblxuICAvLyBDb21wdXRlZCB2YWx1ZXNcbiAgcHJvdGVjdGVkIHByb2Nlc3NlZERhdGEgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YSgpO1xuICAgIC8vIEhhbmRsZSBib3RoIHNpbmdsZSBub2RlIGFuZCBhcnJheSBmb3JtYXRzXG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZGF0YSkgPyB7IGlkOiAncm9vdCcsIGNoaWxkcmVuOiBkYXRhIH0gOiBkYXRhO1xuICB9KTtcblxuICAvLyBDaGVjayBpZiBjdXN0b20gdGVtcGxhdGUgaXMgYXZhaWxhYmxlXG4gIHByb3RlY3RlZCBoYXNDdXN0b21UZW1wbGF0ZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLmN1c3RvbU5vZGVUZW1wbGF0ZSgpIHx8IHRoaXMubm9kZVRlbXBsYXRlKCkpO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgZWZmZWN0aXZlT3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25maWdUb2tlbixcbiAgICAgIC4uLnRoaXMub3B0aW9ucygpLFxuICAgIH07XG4gIH0pO1xuXG4gIC8vIE1lc3NhZ2VzIHdpdGggZGVmYXVsdHNcbiAgcHJvdGVjdGVkIGVmZmVjdGl2ZU1lc3NhZ2VzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHRNZXNzYWdlcyA9IHtcbiAgICAgIG5vRGF0YTogJ05vIGRhdGEgYXZhaWxhYmxlJyxcbiAgICAgIG5vRGF0YUhlbHA6ICdQbGVhc2UgcHJvdmlkZSBoaWVyYXJjaHkgZGF0YSB0byBkaXNwbGF5IHRoZSBjaGFydCcsXG4gICAgICBub0RhdGFJY29uOiAnZmEtbGlnaHQgZmEtc2l0ZW1hcCcsXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmYXVsdE1lc3NhZ2VzLFxuICAgICAgLi4udGhpcy5lZmZlY3RpdmVPcHRpb25zKCkubWVzc2FnZXMsXG4gICAgfTtcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvLyBEeW5hbWljYWxseSBsb2FkIEQzIGFuZCBpbml0aWFsaXplIHRoZSBjaGFydCB3aGVuIHRoZSBjb21wb25lbnQgaXMgcmVhZHlcbiAgICBhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQuc2V0KHRydWUpO1xuICAgICAgdGhpcy5sb2FkRDMoKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUV4cGFuZGVkU3RhdGUoKTtcbiAgICB9KTtcblxuICAgIC8vIFdhdGNoIGZvciBjaGFuZ2VzIHRvIHJlZHJhdyB0aGUgY2hhcnRcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgLy8gQWNjZXNzIHRoZXNlIHRvIHRyYWNrIHRoZW1cbiAgICAgIHRoaXMucHJvY2Vzc2VkRGF0YSgpO1xuICAgICAgdGhpcy5ub2RlVGVtcGxhdGUoKTtcbiAgICAgIHRoaXMuY3VzdG9tTm9kZVRlbXBsYXRlKCk7XG4gICAgICB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKTtcbiAgICAgIHRoaXMuX2V4cGFuZGVkTm9kZXMoKTtcblxuICAgICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKCkgJiYgdGhpcy5kMyAmJiB0aGlzLl9yZW5kZXJlZCgpKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBleHBhbmRlZCBzdGF0ZSBmb3IgYWxsIG5vZGVzXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpemVFeHBhbmRlZFN0YXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IG5ld0V4cGFuZGVkTm9kZXMgPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5wcm9jZXNzZWREYXRhKCk7XG4gICAgY29uc3QgZXhwYW5kQWxsID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuZXhwYW5kQWxsO1xuXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHJlY3Vyc2l2ZWx5IHByb2Nlc3Mgbm9kZXNcbiAgICBjb25zdCBwcm9jZXNzTm9kZSA9IChub2RlOiBBWEhpZXJhcmNoeUNoYXJ0RGF0YSkgPT4ge1xuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFNldCBpbml0aWFsIGV4cGFuc2lvbiBzdGF0ZSBiYXNlZCBvbiBub2RlIHByb3BlcnR5IG9yIGdsb2JhbCBvcHRpb25cbiAgICAgICAgbmV3RXhwYW5kZWROb2Rlcy5zZXQobm9kZS5pZCwgbm9kZS5pc0V4cGFuZGVkICE9PSB1bmRlZmluZWQgPyBub2RlLmlzRXhwYW5kZWQgOiBleHBhbmRBbGwpO1xuXG4gICAgICAgIC8vIFByb2Nlc3MgY2hpbGRyZW5cbiAgICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4gcHJvY2Vzc05vZGUoY2hpbGQpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gU3RhcnQgcHJvY2Vzc2luZ1xuICAgIGlmIChkYXRhLmNoaWxkcmVuKSB7XG4gICAgICBkYXRhLmNoaWxkcmVuLmZvckVhY2goKG5vZGUpID0+IHByb2Nlc3NOb2RlKG5vZGUpKTtcbiAgICB9IGVsc2UgaWYgKChkYXRhIGFzIGFueSkuaWQpIHtcbiAgICAgIHByb2Nlc3NOb2RlKGRhdGEgYXMgQVhIaWVyYXJjaHlDaGFydERhdGEpO1xuICAgIH1cblxuICAgIHRoaXMuX2V4cGFuZGVkTm9kZXMuc2V0KG5ld0V4cGFuZGVkTm9kZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIER5bmFtaWNhbGx5IGxvYWQgRDMuanMgdG8gcmVkdWNlIGluaXRpYWwgYnVuZGxlIHNpemVcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBsb2FkRDMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZDMgPSBhd2FpdCBpbXBvcnQoJ2QzJyk7XG4gICAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQoKSAmJiB0aGlzLmNoYXJ0Q29udGFpbmVyKCkpIHtcbiAgICAgICAgdGhpcy51cGRhdGVEaW1lbnNpb25zKCk7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZWQuc2V0KHRydWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBEMy5qczonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBkaW1lbnNpb25zIGJhc2VkIG9uIGNvbnRhaW5lciBzaXplXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZURpbWVuc2lvbnMoKTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jaGFydENvbnRhaW5lcigpLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuXG4gICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnMud2lkdGggfHwgTWF0aC5tYXgoY29udGFpbmVyUmVjdC53aWR0aCwgMzAwKTtcbiAgICBjb25zdCBoZWlnaHQgPSBvcHRpb25zLmhlaWdodCB8fCBNYXRoLm1heChjb250YWluZXJSZWN0LmhlaWdodCwgNDAwKTtcblxuICAgIHRoaXMuX2RpbWVuc2lvbnMuc2V0KHsgd2lkdGgsIGhlaWdodCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW5kIHJlbmRlciB0aGUgaGllcmFyY2h5IGNoYXJ0XG4gICAqL1xuICBwdWJsaWMgY3JlYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmQzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgYW55IGV4aXN0aW5nIGNoYXJ0XG4gICAgdGhpcy5jbGVhbnVwQ2hhcnQoKTtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY2hhcnRDb250YWluZXIoKS5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnByb2Nlc3NlZERhdGEoKTtcblxuICAgIC8vIENoZWNrIGZvciBudWxsL3VuZGVmaW5lZCBkYXRhIG9yIGVtcHR5IGNoaWxkcmVuXG4gICAgaWYgKCFkYXRhIHx8ICFkYXRhLmNoaWxkcmVuIHx8IGRhdGEuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnNob3dOb0RhdGFNZXNzYWdlKGNvbnRhaW5lcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuICAgIGNvbnN0IGRpbWVuc2lvbnMgPSB0aGlzLl9kaW1lbnNpb25zKCk7XG4gICAgY29uc3QgZXhwYW5kZWROb2RlcyA9IHRoaXMuX2V4cGFuZGVkTm9kZXMoKTtcblxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIC8vIEdldCBkaW1lbnNpb25zIGFuZCBvcHRpb25zXG4gICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGRpbWVuc2lvbnM7XG4gICAgICBjb25zdCBtYXJnaW4gPSBvcHRpb25zLm1hcmdpbiB8fCB7IHRvcDogNDAsIHJpZ2h0OiAxMjAsIGJvdHRvbTogNDAsIGxlZnQ6IDEyMCB9O1xuICAgICAgY29uc3Qgbm9kZVdpZHRoID0gb3B0aW9ucy5ub2RlV2lkdGggfHwgMTIwO1xuICAgICAgY29uc3Qgbm9kZUhlaWdodCA9IG9wdGlvbnMubm9kZUhlaWdodCB8fCA2MDtcbiAgICAgIGNvbnN0IG5vZGVTcGFjaW5nWCA9IG9wdGlvbnMubm9kZVNwYWNpbmdYIHx8IDgwO1xuICAgICAgY29uc3Qgbm9kZVNwYWNpbmdZID0gb3B0aW9ucy5ub2RlU3BhY2luZ1kgfHwgMTIwO1xuICAgICAgY29uc3QgaXNIb3Jpem9udGFsID0gb3B0aW9ucy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJztcblxuICAgICAgLy8gQ3JlYXRlIFNWRyBjb250YWluZXIgd2l0aCB2aWV3Qm94IGZvciByZXNwb25zaXZlbmVzc1xuICAgICAgY29uc3Qgc3ZnID0gdGhpcy5kM1xuICAgICAgICAuc2VsZWN0KGNvbnRhaW5lcilcbiAgICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgICAgLmF0dHIoJ3dpZHRoJywgJzEwMCUnKVxuICAgICAgICAuYXR0cignaGVpZ2h0JywgJzEwMCUnKVxuICAgICAgICAuYXR0cigndmlld0JveCcsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YClcbiAgICAgICAgLmF0dHIoJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLCAneE1pZFlNaWQgbWVldCcpXG4gICAgICAgIC5zdHlsZSgnb3ZlcmZsb3cnLCAndmlzaWJsZScpXG4gICAgICAgIC5jbGFzc2VkKG9wdGlvbnMuY2xhc3NOYW1lIHx8ICcnLCAhIW9wdGlvbnMuY2xhc3NOYW1lKTtcblxuICAgICAgLy8gQ3JlYXRlIGhpZXJhcmNoeSBsYXlvdXQgZnJvbSBkYXRhXG4gICAgICBjb25zdCByb290RGF0YSA9IHRoaXMucHJvY2Vzc2VkRGF0YSgpO1xuICAgICAgY29uc3Qgcm9vdCA9IHRoaXMuZDMuaGllcmFyY2h5KHJvb3REYXRhKTtcblxuICAgICAgLy8gQXBwbHkgZXhwYW5zaW9uIHN0YXRlIHRvIG5vZGVzXG4gICAgICByb290LmRlc2NlbmRhbnRzKCkuZm9yRWFjaCgobm9kZTogYW55KSA9PiB7XG4gICAgICAgIGlmIChub2RlLmRhdGEuaWQgIT09ICdyb290JyAmJiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgaWYgKGV4cGFuZGVkTm9kZXMuaGFzKG5vZGUuZGF0YS5pZCkgJiYgIWV4cGFuZGVkTm9kZXMuZ2V0KG5vZGUuZGF0YS5pZCkpIHtcbiAgICAgICAgICAgIG5vZGUuX2NoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsgLy8gU3RvcmUgY2hpbGRyZW5cbiAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBudWxsOyAvLyBDb2xsYXBzZSBub2RlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0IHVwIHRoZSB0cmVlIGxheW91dCBiYXNlZCBvbiBkaXJlY3Rpb24gb3B0aW9uXG4gICAgICBjb25zdCB0cmVlTGF5b3V0ID0gdGhpcy5kM1xuICAgICAgICAudHJlZSgpXG4gICAgICAgIC5ub2RlU2l6ZShbXG4gICAgICAgICAgaXNIb3Jpem9udGFsID8gbm9kZUhlaWdodCArIG5vZGVTcGFjaW5nWSA6IG5vZGVXaWR0aCArIG5vZGVTcGFjaW5nWCxcbiAgICAgICAgICBpc0hvcml6b250YWwgPyBub2RlV2lkdGggKyBub2RlU3BhY2luZ1ggOiBub2RlSGVpZ2h0ICsgbm9kZVNwYWNpbmdZLFxuICAgICAgICBdKVxuICAgICAgICAuc2VwYXJhdGlvbigoYTogYW55LCBiOiBhbnkpID0+IHtcbiAgICAgICAgICByZXR1cm4gYS5wYXJlbnQgPT09IGIucGFyZW50ID8gMS4yIDogMS41O1xuICAgICAgICB9KTtcblxuICAgICAgdHJlZUxheW91dChyb290KTtcblxuICAgICAgLy8gU3RvcmUgdGhlIGN1cnJlbnQgdHJlZSBsYXlvdXQgZGF0YSBmb3IgZnV0dXJlIHVwZGF0ZXNcbiAgICAgIHRoaXMuX2NoYXJ0RGF0YS5zZXQoe1xuICAgICAgICByb290LFxuICAgICAgICB0cmVlTGF5b3V0LFxuICAgICAgICBpc0hvcml6b250YWwsXG4gICAgICAgIG5vZGVXaWR0aCxcbiAgICAgICAgbm9kZUhlaWdodCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGp1c3Qgcm9vdCBwb3NpdGlvbiBiYXNlZCBvbiBkaXJlY3Rpb25cbiAgICAgIGNvbnN0IHJvb3RYID0gaXNIb3Jpem9udGFsID8gbWFyZ2luLnRvcCA6IHdpZHRoIC8gMjtcbiAgICAgIGNvbnN0IHJvb3RZID0gaXNIb3Jpem9udGFsID8gbWFyZ2luLmxlZnQgOiBtYXJnaW4udG9wO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgYm91bmRzIG9mIHRoZSB0cmVlIGFmdGVyIGxheW91dFxuICAgICAgbGV0IG1pblggPSBJbmZpbml0eTtcbiAgICAgIGxldCBtYXhYID0gLUluZmluaXR5O1xuICAgICAgbGV0IG1pblkgPSBJbmZpbml0eTtcbiAgICAgIGxldCBtYXhZID0gLUluZmluaXR5O1xuXG4gICAgICByb290LmRlc2NlbmRhbnRzKCkuZm9yRWFjaCgoZDogYW55KSA9PiB7XG4gICAgICAgIGlmIChkLmRhdGEuaWQgPT09ICdyb290JykgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHggPSBpc0hvcml6b250YWwgPyBkLnggOiBkLng7XG4gICAgICAgIGNvbnN0IHkgPSBpc0hvcml6b250YWwgPyBkLnkgOiBkLnk7XG5cbiAgICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIHgpO1xuICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgeCk7XG4gICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB5KTtcbiAgICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIHkpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgY2VudGVyIG9mIHRoZSB0cmVlXG4gICAgICBjb25zdCBjZW50ZXJYID0gKG1pblggKyBtYXhYKSAvIDI7XG4gICAgICBjb25zdCBjZW50ZXJZID0gKG1pblkgKyBtYXhZKSAvIDI7XG5cbiAgICAgIC8vIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgY2hhcnQgY29udGVudCB3aXRoIHByb3BlciBjZW50ZXJpbmdcbiAgICAgIGNvbnN0IGcgPSBzdmdcbiAgICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAgIC5hdHRyKFxuICAgICAgICAgICd0cmFuc2Zvcm0nLFxuICAgICAgICAgIGlzSG9yaXpvbnRhbFxuICAgICAgICAgICAgPyBgdHJhbnNsYXRlKCR7bWFyZ2luLmxlZnR9LCAke2hlaWdodCAvIDIgLSBjZW50ZXJYfSlgXG4gICAgICAgICAgICA6IGB0cmFuc2xhdGUoJHt3aWR0aCAvIDJ9LCAke21hcmdpbi50b3B9KWAsXG4gICAgICAgICk7XG5cbiAgICAgIC8vIEFkZCB6b29tIGFuZCBwYW4gYmVoYXZpb3IgKHJlcGxhY2VzIEFYUGFuVmlld0RpcmVjdGl2ZSlcbiAgICAgIGNvbnN0IHpvb20gPSB0aGlzLmQzXG4gICAgICAgIC56b29tKClcbiAgICAgICAgLnNjYWxlRXh0ZW50KFswLjEsIDNdKSAvLyBNaW4gem9vbTogMTAlLCBNYXggem9vbTogMzAwJVxuICAgICAgICAub24oJ3pvb20nLCAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgIGcuYXR0cigndHJhbnNmb3JtJywgZXZlbnQudHJhbnNmb3JtKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIEFwcGx5IHpvb20gYmVoYXZpb3IgdG8gU1ZHXG4gICAgICBzdmcuY2FsbCh6b29tKTtcblxuICAgICAgLy8gU2V0IGluaXRpYWwgdHJhbnNmb3JtIHRvIG1hdGNoIHRoZSBjZW50ZXJpbmdcbiAgICAgIGNvbnN0IGluaXRpYWxUcmFuc2Zvcm0gPSB0aGlzLmQzLnpvb21JZGVudGl0eVxuICAgICAgICAudHJhbnNsYXRlKFxuICAgICAgICAgIGlzSG9yaXpvbnRhbCA/IG1hcmdpbi5sZWZ0IDogd2lkdGggLyAyLFxuICAgICAgICAgIGlzSG9yaXpvbnRhbCA/IGhlaWdodCAvIDIgLSBjZW50ZXJYIDogbWFyZ2luLnRvcFxuICAgICAgICApO1xuICAgICAgc3ZnLmNhbGwoem9vbS50cmFuc2Zvcm0sIGluaXRpYWxUcmFuc2Zvcm0pO1xuXG4gICAgICAvLyBEcmF3IGxpbmtzIGJldHdlZW4gbm9kZXNcbiAgICAgIGNvbnN0IGxpbmtzID0gZ1xuICAgICAgICAuc2VsZWN0QWxsKCcubGluaycpXG4gICAgICAgIC5kYXRhKHJvb3QubGlua3MoKS5maWx0ZXIoKGQ6IGFueSkgPT4gZC5zb3VyY2UuZGF0YS5pZCAhPT0gJ3Jvb3QnKSlcbiAgICAgICAgLmVudGVyKClcbiAgICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1oaWVyYXJjaHktY2hhcnQtbGluaycpXG4gICAgICAgIC5hdHRyKCdkJywgKGQ6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIEdldCB0aGUgbGluayBzdHlsZSBmcm9tIG9wdGlvbnNcbiAgICAgICAgICBjb25zdCBsaW5rU3R5bGUgPSBvcHRpb25zLmxpbmtTdHlsZSB8fCAnY3VydmVkJztcblxuICAgICAgICAgIC8vIFNvdXJjZSBhbmQgdGFyZ2V0IGNvb3JkaW5hdGVzIGJhc2VkIG9uIGRpcmVjdGlvblxuICAgICAgICAgIGNvbnN0IHNvdXJjZVggPSBpc0hvcml6b250YWwgPyBkLnNvdXJjZS55IDogZC5zb3VyY2UueDtcbiAgICAgICAgICBjb25zdCBzb3VyY2VZID0gaXNIb3Jpem9udGFsID8gZC5zb3VyY2UueCA6IGQuc291cmNlLnk7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0WCA9IGlzSG9yaXpvbnRhbCA/IGQudGFyZ2V0LnkgOiBkLnRhcmdldC54O1xuICAgICAgICAgIGNvbnN0IHRhcmdldFkgPSBpc0hvcml6b250YWwgPyBkLnRhcmdldC54IDogZC50YXJnZXQueTtcblxuICAgICAgICAgIC8vIFZhcmlhYmxlcyBmb3Igcm91bmRlZCBjb3JuZXJzXG4gICAgICAgICAgbGV0IHhEaXN0YW5jZSwgeURpc3RhbmNlLCBjb3JuZXJSYWRpdXMsIG1pZFgsIG1pZFk7XG5cbiAgICAgICAgICBzd2l0Y2ggKGxpbmtTdHlsZSkge1xuICAgICAgICAgICAgY2FzZSAnc3RyYWlnaHQnOlxuICAgICAgICAgICAgICAvLyBEaXJlY3Qgc3RyYWlnaHQgbGluZVxuICAgICAgICAgICAgICByZXR1cm4gYE0ke3NvdXJjZVh9LCR7c291cmNlWX1MJHt0YXJnZXRYfSwke3RhcmdldFl9YDtcblxuICAgICAgICAgICAgY2FzZSAncm91bmRlZCc6XG4gICAgICAgICAgICAgIC8vIEN1cnZlZCBsaW5lIHdpdGggcm91bmRlZCBjb3JuZXJzXG4gICAgICAgICAgICAgIHhEaXN0YW5jZSA9IE1hdGguYWJzKHRhcmdldFggLSBzb3VyY2VYKTtcbiAgICAgICAgICAgICAgeURpc3RhbmNlID0gTWF0aC5hYnModGFyZ2V0WSAtIHNvdXJjZVkpO1xuICAgICAgICAgICAgICBjb3JuZXJSYWRpdXMgPSBNYXRoLm1pbih4RGlzdGFuY2UsIHlEaXN0YW5jZSkgKiAwLjI7IC8vIFJlZHVjZWQgcmFkaXVzIGZvciBiZXR0ZXIgYXBwZWFyYW5jZVxuXG4gICAgICAgICAgICAgIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgICAgICAgICAgICAvLyBGb3IgaG9yaXpvbnRhbCBsYXlvdXRcbiAgICAgICAgICAgICAgICBjb25zdCBoYWxmRGlzdGFuY2UgPSAodGFyZ2V0WCAtIHNvdXJjZVgpIC8gMjtcbiAgICAgICAgICAgICAgICBjb25zdCB4TWlkID0gc291cmNlWCArIGhhbGZEaXN0YW5jZTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBgXG4gICAgICAgICAgICAgICAgICBNJHtzb3VyY2VYfSwke3NvdXJjZVl9XG4gICAgICAgICAgICAgICAgICBIJHt4TWlkIC0gY29ybmVyUmFkaXVzfVxuICAgICAgICAgICAgICAgICAgUSR7eE1pZH0sJHtzb3VyY2VZfSAke3hNaWR9LCR7c291cmNlWSArIE1hdGguc2lnbih0YXJnZXRZIC0gc291cmNlWSkgKiBjb3JuZXJSYWRpdXN9XG4gICAgICAgICAgICAgICAgICBWJHt0YXJnZXRZIC0gTWF0aC5zaWduKHRhcmdldFkgLSBzb3VyY2VZKSAqIGNvcm5lclJhZGl1c31cbiAgICAgICAgICAgICAgICAgIFEke3hNaWR9LCR7dGFyZ2V0WX0gJHt4TWlkICsgY29ybmVyUmFkaXVzfSwke3RhcmdldFl9XG4gICAgICAgICAgICAgICAgICBIJHt0YXJnZXRYfVxuICAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRm9yIHZlcnRpY2FsIGxheW91dFxuICAgICAgICAgICAgICAgIGNvbnN0IGhhbGZEaXN0YW5jZSA9ICh0YXJnZXRZIC0gc291cmNlWSkgLyAyO1xuICAgICAgICAgICAgICAgIGNvbnN0IHlNaWQgPSBzb3VyY2VZICsgaGFsZkRpc3RhbmNlO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgICAgICAgIE0ke3NvdXJjZVh9LCR7c291cmNlWX1cbiAgICAgICAgICAgICAgICAgIFYke3lNaWQgLSBjb3JuZXJSYWRpdXN9XG4gICAgICAgICAgICAgICAgICBRJHtzb3VyY2VYfSwke3lNaWR9ICR7c291cmNlWCArIE1hdGguc2lnbih0YXJnZXRYIC0gc291cmNlWCkgKiBjb3JuZXJSYWRpdXN9LCR7eU1pZH1cbiAgICAgICAgICAgICAgICAgIEgke3RhcmdldFggLSBNYXRoLnNpZ24odGFyZ2V0WCAtIHNvdXJjZVgpICogY29ybmVyUmFkaXVzfVxuICAgICAgICAgICAgICAgICAgUSR7dGFyZ2V0WH0sJHt5TWlkfSAke3RhcmdldFh9LCR7eU1pZCArIGNvcm5lclJhZGl1c31cbiAgICAgICAgICAgICAgICAgIFYke3RhcmdldFl9XG4gICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdzdGVwJzpcbiAgICAgICAgICAgICAgLy8gTC1zaGFwZWQgc3RlcHBlZCBsaW5lXG4gICAgICAgICAgICAgIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYE0ke3NvdXJjZVh9LCR7c291cmNlWX1IJHsoc291cmNlWCArIHRhcmdldFgpIC8gMn1WJHt0YXJnZXRZfUgke3RhcmdldFh9YDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYE0ke3NvdXJjZVh9LCR7c291cmNlWX1WJHsoc291cmNlWSArIHRhcmdldFkpIC8gMn1IJHt0YXJnZXRYfVYke3RhcmdldFl9YDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdjdXJ2ZWQnOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgLy8gRGVmYXVsdCBjdXJ2ZWQgbGluZSB1c2luZyBEMydzIGJ1aWx0LWluIGxpbmsgZ2VuZXJhdG9yXG4gICAgICAgICAgICAgIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kM1xuICAgICAgICAgICAgICAgICAgLmxpbmtIb3Jpem9udGFsKClcbiAgICAgICAgICAgICAgICAgIC54KChkOiBhbnkpID0+IGQueSlcbiAgICAgICAgICAgICAgICAgIC55KChkOiBhbnkpID0+IGQueCkoZCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZDNcbiAgICAgICAgICAgICAgICAgIC5saW5rVmVydGljYWwoKVxuICAgICAgICAgICAgICAgICAgLngoKGQ6IGFueSkgPT4gZC54KVxuICAgICAgICAgICAgICAgICAgLnkoKGQ6IGFueSkgPT4gZC55KShkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmF0dHIoJ3N0cm9rZScsIGByZ2IodmFyKC0tYXgtY29tcC1oaWVyYXJjaHktY2hhcnQtbGluay1jb2xvcikpYClcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIG9wdGlvbnMubGlua1dpZHRoKVxuICAgICAgICAuYXR0cignZmlsbCcsICdub25lJylcbiAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAxKTtcblxuICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIHRlbXBsYXRlIHRvIHVzZSBmb3IgcmVuZGVyaW5nIG5vZGVzXG4gICAgICBjb25zdCB1c2VDdXN0b21UZW1wbGF0ZSA9IHRoaXMuaGFzQ3VzdG9tVGVtcGxhdGUoKTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlVG9Vc2UgPSB0aGlzLm5vZGVUZW1wbGF0ZSgpIHx8IHRoaXMuY3VzdG9tTm9kZVRlbXBsYXRlKCk7XG5cbiAgICAgIC8vIENyZWF0ZSBhIG1hcCB0byBzdG9yZSBub2RlIGVsZW1lbnRzIGZvciBmdXR1cmUgdXBkYXRlc1xuICAgICAgY29uc3Qgbm9kZUVsZW1lbnRzTWFwID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcblxuICAgICAgLy8gQ3JlYXRlIG5vZGUgZ3JvdXBzXG4gICAgICBjb25zdCBub2RlR3JvdXBzID0gZ1xuICAgICAgICAuc2VsZWN0QWxsKCcubm9kZS1ncm91cCcpXG4gICAgICAgIC5kYXRhKHJvb3QuZGVzY2VuZGFudHMoKS5maWx0ZXIoKGQ6IGFueSkgPT4gZC5kYXRhLmlkICE9PSAncm9vdCcpKVxuICAgICAgICAuZW50ZXIoKVxuICAgICAgICAuYXBwZW5kKCdnJylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWhpZXJhcmNoeS1jaGFydC1ub2RlLWdyb3VwJylcbiAgICAgICAgLmF0dHIoJ2RhdGEtbm9kZS1pZCcsIChkOiBhbnkpID0+IGQuZGF0YS5pZCkgLy8gQWRkIGEgZGF0YSBhdHRyaWJ1dGUgZm9yIGVhc2llciBzZWxlY3Rpb25cbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIChkOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCB4ID0gaXNIb3Jpem9udGFsID8gZC55IDogZC54O1xuICAgICAgICAgIGNvbnN0IHkgPSBpc0hvcml6b250YWwgPyBkLnggOiBkLnk7XG4gICAgICAgICAgcmV0dXJuIGB0cmFuc2xhdGUoJHt4fSwke3l9KWA7XG4gICAgICAgIH0pXG4gICAgICAgIC5hdHRyKCdvcGFjaXR5JywgMSk7IC8vIERpc3BsYXkgbm9kZXMgaW1tZWRpYXRlbHkgd2l0aCBmdWxsIG9wYWNpdHlcblxuICAgICAgLy8gU3RvcmUgbm9kZSBlbGVtZW50cyBpbiB0aGUgbWFwXG4gICAgICBub2RlR3JvdXBzLmVhY2goZnVuY3Rpb24gKHRoaXM6IFNWR0dFbGVtZW50LCBkOiBhbnkpIHtcbiAgICAgICAgbm9kZUVsZW1lbnRzTWFwLnNldChkLmRhdGEuaWQsIHRoaXMpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgbm9kZSBlbGVtZW50cyBzaWduYWxcbiAgICAgIHRoaXMuX25vZGVFbGVtZW50cy5zZXQobm9kZUVsZW1lbnRzTWFwKTtcblxuICAgICAgaWYgKHVzZUN1c3RvbVRlbXBsYXRlICYmIHRlbXBsYXRlVG9Vc2UpIHtcbiAgICAgICAgLy8gUmVuZGVyIGN1c3RvbSBub2RlIHRlbXBsYXRlc1xuICAgICAgICBub2RlR3JvdXBzLmVhY2goKGQ6IGFueSwgaTogbnVtYmVyLCBub2RlczogYW55W10pID0+IHtcbiAgICAgICAgICBjb25zdCBub2RlID0gZC5kYXRhO1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2Rlc1tpXTtcbiAgICAgICAgICBjb25zdCBoYXNDaGlsZHJlbiA9ICEhKG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKTtcbiAgICAgICAgICBjb25zdCBpc0V4cGFuZGVkID0gaGFzQ2hpbGRyZW4gJiYgdGhpcy5fZXhwYW5kZWROb2RlcygpLmhhcyhub2RlLmlkKSAmJiB0aGlzLl9leHBhbmRlZE5vZGVzKCkuZ2V0KG5vZGUuaWQpO1xuXG4gICAgICAgICAgLy8gRW5oYW5jZSB0aGUgbm9kZSB3aXRoIGV4cGFuZGVkIHN0YXRlIGFuZCB0b2dnbGUgZnVuY3Rpb25cbiAgICAgICAgICBub2RlLmV4cGFuZGVkID0gaXNFeHBhbmRlZCB8fCBmYWxzZTtcbiAgICAgICAgICBub2RlLnRvZ2dsZUV4cGFuZGVkID0gKCkgPT4gdGhpcy50b2dnbGVOb2RlKG5vZGUuaWQpO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgZm9yZWlnbk9iamVjdCBmb3IgdGhlIHRlbXBsYXRlXG4gICAgICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IHRoaXMuZDNcbiAgICAgICAgICAgIC5zZWxlY3QoZWxlbWVudClcbiAgICAgICAgICAgIC5hcHBlbmQoJ2ZvcmVpZ25PYmplY3QnKVxuICAgICAgICAgICAgLmF0dHIoJ3gnLCAtbm9kZVdpZHRoIC8gMilcbiAgICAgICAgICAgIC5hdHRyKCd5JywgLW5vZGVIZWlnaHQgLyAyKVxuICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgbm9kZVdpZHRoKVxuICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIG5vZGVIZWlnaHQpXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnYXgtaGllcmFyY2h5LWNoYXJ0LW5vZGUtY29udGFpbmVyJylcbiAgICAgICAgICAgIC5vbignY2xpY2snLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgLy8gRG9uJ3QgcHJvcGFnYXRlIHRoZSBldmVudCBpZiBpdCdzIGNvbWluZyBmcm9tIGFuIGludGVyYWN0aXZlIGVsZW1lbnRcbiAgICAgICAgICAgICAgLy8gbGlrZSBhIGJ1dHRvbiBpbnNpZGUgdGhlIHRlbXBsYXRlXG4gICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgY29uc3QgaXNJbnRlcmFjdGl2ZSA9XG4gICAgICAgICAgICAgICAgdGFyZ2V0LnRhZ05hbWUgPT09ICdCVVRUT04nIHx8IHRhcmdldC50YWdOYW1lID09PSAnQScgfHwgdGFyZ2V0LmNsb3Nlc3QoJ2J1dHRvbiwgYSwgW3JvbGU9XCJidXR0b25cIl0nKTtcblxuICAgICAgICAgICAgICBpZiAoIWlzSW50ZXJhY3RpdmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZU5vZGVDbGljayhldmVudCwgZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgZGl2IHRvIGhvbGQgdGhlIHRlbXBsYXRlXG4gICAgICAgICAgY29uc3QgZGl2ID0gZm9yZWlnbk9iamVjdFxuICAgICAgICAgICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcbiAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1oaWVyYXJjaHktY2hhcnQtbm9kZS1jb250ZW50JylcbiAgICAgICAgICAgIC5zdHlsZSgnd2lkdGgnLCAnMTAwJScpXG4gICAgICAgICAgICAuc3R5bGUoJ2hlaWdodCcsICcxMDAlJyk7XG5cbiAgICAgICAgICAvLyBSZW5kZXIgdGhlIHRlbXBsYXRlIGludG8gdGhlIGRpdlxuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgY29udGV4dCB3aXRoIGVuaGFuY2VkIG5vZGUgYXMgdGhlIGltcGxpY2l0IHZhbHVlXG4gICAgICAgICAgICBjb25zdCBjb250ZXh0OiBBWEhpZXJhcmNoeUNoYXJ0Tm9kZUNvbnRleHQgPSB7XG4gICAgICAgICAgICAgICRpbXBsaWNpdDogbm9kZSBhcyBBWEhpZXJhcmNoeUNoYXJ0Tm9kZSAmIHsgZXhwYW5kZWQ6IGJvb2xlYW47IHRvZ2dsZUV4cGFuZGVkOiAoKSA9PiB2b2lkIH0sXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCB2aWV3UmVmID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0ZW1wbGF0ZVRvVXNlISwgY29udGV4dCk7XG4gICAgICAgICAgICB2aWV3UmVmLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICAgICAgLy8gQXBwZW5kIHRlbXBsYXRlIGNvbnRlbnRzIHRvIHRoZSBkaXZcbiAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gdmlld1JlZi5yb290Tm9kZXM7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgICAgICAgICAgZGl2Lm5vZGUoKS5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZW5kZXIgZW5oYW5jZWQgZGVmYXVsdCBub2RlcyAocmVjdGFuZ2xlcyB3aXRoIHRleHQgYW5kIGljb25zKVxuICAgICAgICBub2RlR3JvdXBzLmVhY2goKGQ6IGFueSwgaTogbnVtYmVyLCBub2RlczogYW55W10pID0+IHtcbiAgICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZDMuc2VsZWN0KG5vZGVzW2ldKTtcbiAgICAgICAgICBjb25zdCBub2RlID0gZC5kYXRhO1xuICAgICAgICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gISEobm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApO1xuXG4gICAgICAgICAgLy8gTm9kZSBiYWNrZ3JvdW5kIHJlY3Qgd2l0aCByb3VuZGVkIGNvcm5lcnNcbiAgICAgICAgICBncm91cFxuICAgICAgICAgICAgLmFwcGVuZCgncmVjdCcpXG4gICAgICAgICAgICAuYXR0cigneCcsIC1ub2RlV2lkdGggLyAyKVxuICAgICAgICAgICAgLmF0dHIoJ3knLCAtbm9kZUhlaWdodCAvIDIpXG4gICAgICAgICAgICAuYXR0cignd2lkdGgnLCBub2RlV2lkdGgpXG4gICAgICAgICAgICAuYXR0cignaGVpZ2h0Jywgbm9kZUhlaWdodClcbiAgICAgICAgICAgIC5hdHRyKCdyeCcsIDYpXG4gICAgICAgICAgICAuYXR0cigncnknLCA2KVxuICAgICAgICAgICAgLmF0dHIoJ2ZpbGwnLCBub2RlLmNvbG9yIHx8IGByZ2IodmFyKC0tYXgtY29tcC1oaWVyYXJjaHktY2hhcnQtbm9kZS1jb2xvcikpYClcbiAgICAgICAgICAgIC5hdHRyKCdzdHJva2UnLCBgcmdiKHZhcigtLWF4LWNvbXAtaGllcmFyY2h5LWNoYXJ0LW5vZGUtc3Ryb2tlLWNvbG9yKSlgKVxuICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIG9wdGlvbnMubm9kZVN0cm9rZVdpZHRoKVxuICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWhpZXJhcmNoeS1jaGFydC1ub2RlJyk7XG5cbiAgICAgICAgICAvLyBNYWluIHRpdGxlL25hbWVcbiAgICAgICAgICBncm91cFxuICAgICAgICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAgICAgICAuYXR0cigneScsIC0xMClcbiAgICAgICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWhpZXJhcmNoeS1jaGFydC1ub2RlLXRpdGxlJylcbiAgICAgICAgICAgIC5hdHRyKCdmaWxsJywgJ3doaXRlJylcbiAgICAgICAgICAgIC5hdHRyKCdmb250LXdlaWdodCcsICdib2xkJylcbiAgICAgICAgICAgIC50ZXh0KG5vZGUubmFtZSB8fCBub2RlLmxhYmVsIHx8ICcnKTtcblxuICAgICAgICAgIC8vIFN1YnRpdGxlIGlmIHByb3ZpZGVkXG4gICAgICAgICAgaWYgKG5vZGUuc3VidGl0bGUpIHtcbiAgICAgICAgICAgIGdyb3VwXG4gICAgICAgICAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgICAgICAuYXR0cigneScsIDEwKVxuICAgICAgICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWhpZXJhcmNoeS1jaGFydC1ub2RlLXN1YnRpdGxlJylcbiAgICAgICAgICAgICAgLmF0dHIoJ2ZpbGwnLCAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpJylcbiAgICAgICAgICAgICAgLmF0dHIoJ2ZvbnQtc2l6ZScsICcwLjhlbScpXG4gICAgICAgICAgICAgIC50ZXh0KG5vZGUuc3VidGl0bGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFR5cGUgbGFiZWwgaWYgcHJvdmlkZWRcbiAgICAgICAgICBpZiAobm9kZS50eXBlKSB7XG4gICAgICAgICAgICBncm91cFxuICAgICAgICAgICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgICAgICAgLmF0dHIoJ3knLCAyNSlcbiAgICAgICAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1oaWVyYXJjaHktY2hhcnQtbm9kZS10eXBlJylcbiAgICAgICAgICAgICAgLmF0dHIoJ2ZpbGwnLCAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpJylcbiAgICAgICAgICAgICAgLmF0dHIoJ2ZvbnQtc2l6ZScsICcwLjdlbScpXG4gICAgICAgICAgICAgIC50ZXh0KG5vZGUudHlwZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQWRkIGV4cGFuZC9jb2xsYXBzZSBpbmRpY2F0b3IgaWYgbm9kZSBoYXMgY2hpbGRyZW5cbiAgICAgICAgICBpZiAoaGFzQ2hpbGRyZW4gJiYgb3B0aW9ucy5jb2xsYXBzaWJsZSkge1xuICAgICAgICAgICAgY29uc3QgaXNFeHBhbmRlZCA9IHRoaXMuX2V4cGFuZGVkTm9kZXMoKS5oYXMobm9kZS5pZCkgJiYgdGhpcy5fZXhwYW5kZWROb2RlcygpLmdldChub2RlLmlkKTtcblxuICAgICAgICAgICAgLy8gVG9nZ2xlIGJ1dHRvbiB3aXRoIGJldHRlciBzdHlsaW5nXG4gICAgICAgICAgICBncm91cFxuICAgICAgICAgICAgICAuYXBwZW5kKCdjaXJjbGUnKVxuICAgICAgICAgICAgICAuYXR0cigncicsIDEwKVxuICAgICAgICAgICAgICAuYXR0cignY3gnLCBub2RlV2lkdGggLyAyIC0gMTIpXG4gICAgICAgICAgICAgIC5hdHRyKCdjeScsIC1ub2RlSGVpZ2h0IC8gMiArIDEyKVxuICAgICAgICAgICAgICAuYXR0cignZmlsbCcsICd3aGl0ZScpXG4gICAgICAgICAgICAgIC5hdHRyKCdzdHJva2UnLCBgcmdiKHZhcigtLWF4LWNvbXAtaGllcmFyY2h5LWNoYXJ0LW5vZGUtc3Ryb2tlLWNvbG9yKSlgKVxuICAgICAgICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgMSlcbiAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWhpZXJhcmNoeS1jaGFydC10b2dnbGUtaW5kaWNhdG9yJylcbiAgICAgICAgICAgICAgLnN0eWxlKCdjdXJzb3InLCAncG9pbnRlcicpXG4gICAgICAgICAgICAgIC5vbignY2xpY2snLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZU5vZGUobm9kZS5pZCk7XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBUb2dnbGUgaWNvblxuICAgICAgICAgICAgZ3JvdXBcbiAgICAgICAgICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAgICAgICAgIC5hdHRyKCd4Jywgbm9kZVdpZHRoIC8gMiAtIDEyKVxuICAgICAgICAgICAgICAuYXR0cigneScsIC1ub2RlSGVpZ2h0IC8gMiArIDEyKVxuICAgICAgICAgICAgICAuYXR0cignZHknLCAnMC4zMmVtJylcbiAgICAgICAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1oaWVyYXJjaHktY2hhcnQtdG9nZ2xlLWljb24nKVxuICAgICAgICAgICAgICAuYXR0cignZmlsbCcsIG5vZGUuY29sb3IgfHwgYHJnYih2YXIoLS1heC1jb21wLWhpZXJhcmNoeS1jaGFydC1ub2RlLWNvbG9yKSlgKVxuICAgICAgICAgICAgICAuYXR0cignZm9udC13ZWlnaHQnLCAnYm9sZCcpXG4gICAgICAgICAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKVxuICAgICAgICAgICAgICAudGV4dChpc0V4cGFuZGVkID8gJ+KIkicgOiAnKycpXG4gICAgICAgICAgICAgIC5vbignY2xpY2snLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZU5vZGUobm9kZS5pZCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEljb24gaWYgcHJvdmlkZWRcbiAgICAgICAgICBpZiAobm9kZS5pY29uKSB7XG4gICAgICAgICAgICBncm91cFxuICAgICAgICAgICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgICAgICAgLmF0dHIoJ3gnLCAtbm9kZVdpZHRoIC8gMiArIDE1KVxuICAgICAgICAgICAgICAuYXR0cigneScsIDApXG4gICAgICAgICAgICAgIC5hdHRyKCdkeScsICcwLjMyZW0nKVxuICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnYXgtaGllcmFyY2h5LWNoYXJ0LW5vZGUtaWNvbicpXG4gICAgICAgICAgICAgIC5hdHRyKCdmaWxsJywgJ3doaXRlJylcbiAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgbm9kZS5pY29uKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBBZGQgY2xpY2sgaGFuZGxlciB0byB0aGUgd2hvbGUgbm9kZVxuICAgICAgICAgIGdyb3VwLm9uKCdjbGljaycsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVOb2RlQ2xpY2soZXZlbnQsIGQpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gQWRkIHRvb2x0aXAgaWYgZW5hYmxlZFxuICAgICAgICAgIGlmIChvcHRpb25zLnNob3dUb29sdGlwICYmIChub2RlLnRvb2x0aXAgfHwgbm9kZS5kZXNjcmlwdGlvbikpIHtcbiAgICAgICAgICAgIGdyb3VwLmFwcGVuZCgndGl0bGUnKS50ZXh0KG5vZGUudG9vbHRpcCB8fCBub2RlLmRlc2NyaXB0aW9uIHx8ICcnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBub2RlIGV4cGFuc2lvbiBzdGF0ZVxuICAgKi9cbiAgcHVibGljIHRvZ2dsZU5vZGUobm9kZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBleHBhbmRlZE5vZGVzID0gbmV3IE1hcCh0aGlzLl9leHBhbmRlZE5vZGVzKCkpO1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGV4cGFuZGVkTm9kZXMuZ2V0KG5vZGVJZCk7XG4gICAgY29uc3QgbmV3U3RhdGUgPSBjdXJyZW50U3RhdGUgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogIWN1cnJlbnRTdGF0ZTtcblxuICAgIGV4cGFuZGVkTm9kZXMuc2V0KG5vZGVJZCwgbmV3U3RhdGUpO1xuICAgIHRoaXMuX2V4cGFuZGVkTm9kZXMuc2V0KGV4cGFuZGVkTm9kZXMpO1xuXG4gICAgLy8gRW1pdCB0b2dnbGUgZXZlbnRcbiAgICB0aGlzLmZpbmROb2RlQnlJZCh0aGlzLnByb2Nlc3NlZERhdGEoKSwgbm9kZUlkKS50aGVuKChub2RlKSA9PiB7XG4gICAgICBpZiAobm9kZSkge1xuICAgICAgICB0aGlzLm5vZGVUb2dnbGUuZW1pdCh7XG4gICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICBleHBhbmRlZDogbmV3U3RhdGUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlIHRvZ2dsZSBpbmRpY2F0b3IgaW1tZWRpYXRlbHkgZm9yIGJldHRlciBVWFxuICAgIHRoaXMudXBkYXRlVG9nZ2xlSW5kaWNhdG9yKG5vZGVJZCwgbmV3U3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBqdXN0IHRoZSB0b2dnbGUgaW5kaWNhdG9yIHdpdGhvdXQgcmVkcmF3aW5nIHRoZSBjaGFydFxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVUb2dnbGVJbmRpY2F0b3Iobm9kZUlkOiBzdHJpbmcsIGV4cGFuZGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmQzIHx8ICF0aGlzLmNoYXJ0Q29udGFpbmVyKCkpIHJldHVybjtcblxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY2hhcnRDb250YWluZXIoKS5uYXRpdmVFbGVtZW50O1xuICAgICAgY29uc3Qgc3ZnID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpO1xuICAgICAgaWYgKCFzdmcpIHJldHVybjtcblxuICAgICAgLy8gRmluZCBhbmQgdXBkYXRlIHRoZSB0b2dnbGUgaW5kaWNhdG9yIGZvciB0aGUgc3BlY2lmaWMgbm9kZVxuICAgICAgY29uc3Qgbm9kZUdyb3VwID0gdGhpcy5kMy5zZWxlY3Qoc3ZnKS5zZWxlY3QoYFtkYXRhLW5vZGUtaWQ9XCIke25vZGVJZH1cIl1gKTtcbiAgICAgIGlmIChub2RlR3JvdXAuZW1wdHkoKSkgcmV0dXJuO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIHRvZ2dsZSBpY29uIChpZiBpdCBleGlzdHMpXG4gICAgICBjb25zdCB0b2dnbGVJY29uID0gbm9kZUdyb3VwLnNlbGVjdCgnLmF4LWhpZXJhcmNoeS1jaGFydC10b2dnbGUtaWNvbicpO1xuICAgICAgaWYgKCF0b2dnbGVJY29uLmVtcHR5KCkpIHtcbiAgICAgICAgdG9nZ2xlSWNvbi50ZXh0KGV4cGFuZGVkID8gJ+KIkicgOiAnKycpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRm9yY2UgZWZmZWN0IHRvIHJ1biB0aGF0IHdpbGwgdXBkYXRlIHRoZSBjaGFydFxuICAgIC8vIFRoaXMgbGV2ZXJhZ2VzIEFuZ3VsYXIncyByZWFjdGl2aXR5IHJhdGhlciB0aGFuIGEgZGlyZWN0IG1ldGhvZCBjYWxsXG4gICAgLy8gd2hpY2ggaXMgbW9yZSBjb25zaXN0ZW50IHdpdGggQW5ndWxhcidzIHJlYWN0aXZlIGFwcHJvYWNoXG4gICAgY29uc3QgZXhwYW5kZWROb2RlcyA9IG5ldyBNYXAodGhpcy5fZXhwYW5kZWROb2RlcygpKTtcbiAgICB0aGlzLl9leHBhbmRlZE5vZGVzLnNldChleHBhbmRlZE5vZGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgbm9kZSBieSBJRFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmaW5kTm9kZUJ5SWQoZGF0YTogQVhIaWVyYXJjaHlDaGFydERhdGEsIGlkOiBzdHJpbmcpOiBQcm9taXNlPEFYSGllcmFyY2h5Q2hhcnREYXRhIHwgbnVsbD4ge1xuICAgIGlmIChkYXRhLmlkID09PSBpZCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZGF0YS5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBmb3VuZCA9IGF3YWl0IHRoaXMuZmluZE5vZGVCeUlkKGNoaWxkLCBpZCk7XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgIHJldHVybiBmb3VuZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBub2RlIGNsaWNrIGV2ZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVOb2RlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IG5vZGUgPSBkLmRhdGE7XG5cbiAgICAvLyBFbWl0IGNsaWNrIGV2ZW50XG4gICAgdGhpcy5pdGVtQ2xpY2suZW1pdCh7XG4gICAgICBldmVudDogeyBuYXRpdmVFdmVudDogZXZlbnQsIHNlbmRlcjogdGhpcyB9LFxuICAgICAgaXRlbTogbm9kZSxcbiAgICAgIGVsZW1lbnQ6IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgZXhpc3RpbmcgY2hhcnRcbiAgICovXG4gIHB1YmxpYyBjbGVhbnVwQ2hhcnQoKTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jaGFydENvbnRhaW5lcigpPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgICAvLyBSZW1vdmUgZXhpc3RpbmcgU1ZHXG4gICAgY29uc3Qgc3ZnID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpO1xuICAgIGlmIChzdmcpIHtcbiAgICAgIHN2Zy5yZW1vdmUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBEMyBlYXNpbmcgZnVuY3Rpb24gZnJvbSBzdHJpbmcgbmFtZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFYXNpbmdGdW5jdGlvbihlYXNpbmc/OiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghZWFzaW5nKSByZXR1cm4gdGhpcy5kMy5lYXNlQ3ViaWNJbk91dDtcblxuICAgIHN3aXRjaCAoZWFzaW5nKSB7XG4gICAgICBjYXNlICdsaW5lYXInOlxuICAgICAgICByZXR1cm4gdGhpcy5kMy5lYXNlTGluZWFyO1xuICAgICAgY2FzZSAnZWFzZSc6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VQb2x5SW5PdXQ7XG4gICAgICBjYXNlICdlYXNlLWluJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZDMuZWFzZVBvbHlJbjtcbiAgICAgIGNhc2UgJ2Vhc2Utb3V0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZDMuZWFzZVBvbHlPdXQ7XG4gICAgICBjYXNlICdlYXNlLWluLW91dCc6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VQb2x5SW5PdXQ7XG4gICAgICBjYXNlICdjdWJpYyc6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VDdWJpYztcbiAgICAgIGNhc2UgJ2N1YmljLWluJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZDMuZWFzZUN1YmljSW47XG4gICAgICBjYXNlICdjdWJpYy1vdXQnOlxuICAgICAgICByZXR1cm4gdGhpcy5kMy5lYXNlQ3ViaWNPdXQ7XG4gICAgICBjYXNlICdjdWJpYy1pbi1vdXQnOlxuICAgICAgICByZXR1cm4gdGhpcy5kMy5lYXNlQ3ViaWNJbk91dDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VDdWJpY0luT3V0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG1lc3NhZ2Ugd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZVxuICAgKi9cbiAgcHJpdmF0ZSBzaG93Tm9EYXRhTWVzc2FnZShjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGV4aXN0aW5nIGNvbnRlbnRzIGZpcnN0XG4gICAgdGhpcy5kMy5zZWxlY3QoY29udGFpbmVyRWxlbWVudCkuc2VsZWN0QWxsKCcqJykucmVtb3ZlKCk7XG5cbiAgICBjb25zdCBtZXNzYWdlQ29udGFpbmVyID0gdGhpcy5kM1xuICAgICAgLnNlbGVjdChjb250YWluZXJFbGVtZW50KVxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1oaWVyYXJjaHktY2hhcnQtbm8tZGF0YS1tZXNzYWdlJylcbiAgICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxuICAgICAgLnN0eWxlKCdsZWZ0JywgJzUwJScpXG4gICAgICAuc3R5bGUoJ3RvcCcsICc1MCUnKVxuICAgICAgLnN0eWxlKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKC01MCUsIC01MCUpJylcbiAgICAgIC5zdHlsZSgndGV4dC1hbGlnbicsICdjZW50ZXInKVxuICAgICAgLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgJ3JnYih2YXIoLS1heC1jb21wLWhpZXJhcmNoeS1jaGFydC1iZy1jb2xvcikpJylcbiAgICAgIC5zdHlsZSgncGFkZGluZycsICcxLjVyZW0nKVxuICAgICAgLnN0eWxlKCdib3JkZXItcmFkaXVzJywgJzAuNXJlbScpXG4gICAgICAuc3R5bGUoJ2JveC1zaGFkb3cnLCAnMCAycHggMTJweCByZ2JhKDAsIDAsIDAsIDAuMDgpJylcbiAgICAgIC5zdHlsZSgnd2lkdGgnLCAnODAlJylcbiAgICAgIC5zdHlsZSgnbWF4LXdpZHRoJywgJzMwMHB4Jyk7XG5cbiAgICAvLyBBZGQgYW4gaWNvblxuICAgIG1lc3NhZ2VDb250YWluZXJcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtaGllcmFyY2h5LWNoYXJ0LW5vLWRhdGEtaWNvbicpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCAnMC42JylcbiAgICAgIC5zdHlsZSgnbWFyZ2luLWJvdHRvbScsICcwLjc1cmVtJylcbiAgICAgIC5odG1sKGA8aSBjbGFzcz1cIiR7dGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLm5vRGF0YUljb259IGZhLTJ4XCI+PC9pPmApO1xuXG4gICAgLy8gQWRkIHRleHQgbWVzc2FnZVxuICAgIG1lc3NhZ2VDb250YWluZXJcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtaGllcmFyY2h5LWNoYXJ0LW5vLWRhdGEtdGV4dCcpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcxcmVtJylcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNjAwJylcbiAgICAgIC5zdHlsZSgnbWFyZ2luLWJvdHRvbScsICcwLjVyZW0nKVxuICAgICAgLnRleHQodGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLm5vRGF0YSk7XG5cbiAgICAvLyBBZGQgaGVscCB0ZXh0XG4gICAgbWVzc2FnZUNvbnRhaW5lclxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1oaWVyYXJjaHktY2hhcnQtbm8tZGF0YS1oZWxwJylcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJzAuOHJlbScpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCAnMC42JylcbiAgICAgIC50ZXh0KHRoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKS5ub0RhdGFIZWxwKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImF4LWhpZXJhcmNoeS1jaGFydFwiIHJvbGU9XCJpbWdcIiAjY2hhcnRDb250YWluZXI+PC9kaXY+XG4iXX0=","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1oaWVyYXJjaHktY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jaGFydHMvaGllcmFyY2h5LWNoYXJ0L3NyYy9hY29yZXgtY2hhcnRzLWhpZXJhcmNoeS1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":";;;;AACY,MAAC,6BAA6B,GAAG;AAC7C,IAAI,SAAS,EAAE,UAAU;AACzB,IAAI,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE;AAC1D,IAAI,UAAU,EAAE,EAAE;AAClB,IAAI,eAAe,EAAE,GAAG;AACxB,IAAI,SAAS,EAAE,GAAG;AAClB,IAAI,SAAS,EAAE,QAAQ;AACvB,IAAI,SAAS,EAAE,GAAG;AAClB,IAAI,UAAU,EAAE,EAAE;AAClB,IAAI,YAAY,EAAE,EAAE;AACpB,IAAI,YAAY,EAAE,GAAG;AACrB,IAAI,WAAW,EAAE,IAAI;AACrB,IAAI,WAAW,EAAE,IAAI;AACrB,IAAI,SAAS,EAAE,KAAK;AACpB,IAAI,iBAAiB,EAAE,GAAG;AAC1B,IAAI,eAAe,EAAE,WAAW;AAChC,IAAI,QAAQ,EAAE;AACd,QAAQ,MAAM,EAAE,mBAAmB;AACnC,QAAQ,UAAU,EAAE,oDAAoD;AACxE,QAAQ,UAAU,EAAE,qBAAqB;AACzC,KAAK;AACL;AACY,MAAC,yBAAyB,GAAG,IAAI,cAAc,CAAC,2BAA2B,EAAE;AACzF,IAAI,UAAU,EAAE,MAAM;AACtB,IAAI,OAAO,EAAE,MAAM,6BAA6B;AAChD,CAAC;AACM,SAAS,oBAAoB,CAAC,MAAM,GAAG,EAAE,EAAE;AAClD,IAAI,MAAM,MAAM,GAAG;AACnB,QAAQ,GAAG,6BAA6B;AACxC,QAAQ,GAAG,MAAM;AACjB,KAAK;AACL,IAAI,OAAO,MAAM;AACjB;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,yBAAyB,SAAS,gBAAgB,CAAC;AAChE;AACA,IAAI,cAAc,GAAG,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC;AACzD;AACA,IAAI,kBAAkB,GAAG,YAAY,CAAC,cAAc,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAClH;AACA,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAC3B,IAAI,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC/C,IAAI,WAAW,GAAG,MAAM,CAAC,yBAAyB,CAAC;AACnD;AACA,IAAI,EAAE;AACN;AACA,IAAI,cAAc,GAAG,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC/F,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,IAAI,WAAW,GAAG,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACvG,IAAI,aAAa,GAAG,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAC9F,IAAI,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AACnF;AACA,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACnE,IAAI,OAAO,GAAG,KAAK,CAAC,EAAE,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACzE,IAAI,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACrF;AACA,IAAI,SAAS,GAAG,MAAM,EAAE;AACxB,IAAI,UAAU,GAAG,MAAM,EAAE;AACzB;AACA,IAAI,aAAa,GAAG,QAAQ,CAAC,MAAM;AACnC,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AAChC;AACA,QAAQ,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI;AAC1E,IAAI,CAAC,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC9D;AACA,IAAI,iBAAiB,GAAG,QAAQ,CAAC,MAAM;AACvC,QAAQ,OAAO,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;AACxE,IAAI,CAAC,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAClE,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,IAAI,CAAC,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACjE;AACA,IAAI,iBAAiB,GAAG,QAAQ,CAAC,MAAM;AACvC,QAAQ,MAAM,eAAe,GAAG;AAChC,YAAY,MAAM,EAAE,mBAAmB;AACvC,YAAY,UAAU,EAAE,oDAAoD;AAC5E,YAAY,UAAU,EAAE,qBAAqB;AAC7C,SAAS;AACT,QAAQ,OAAO;AACf,YAAY,GAAG,eAAe;AAC9B,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,QAAQ;AAC/C,SAAS;AACT,IAAI,CAAC,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAClE,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,YAAY,IAAI,CAAC,uBAAuB,EAAE;AAC1C,QAAQ,CAAC,CAAC;AACV;AACA,QAAQ,MAAM,CAAC,MAAM;AACrB;AACA,YAAY,IAAI,CAAC,aAAa,EAAE;AAChC,YAAY,IAAI,CAAC,YAAY,EAAE;AAC/B,YAAY,IAAI,CAAC,kBAAkB,EAAE;AACrC,YAAY,IAAI,CAAC,gBAAgB,EAAE;AACnC,YAAY,IAAI,CAAC,cAAc,EAAE;AACjC,YAAY,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpE,gBAAgB,IAAI,CAAC,WAAW,EAAE;AAClC,YAAY;AACZ,QAAQ,CAAC,CAAC;AACV,IAAI;AACJ;AACA;AACA;AACA,IAAI,uBAAuB,GAAG;AAC9B,QAAQ,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAE;AAC1C,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE;AACzC,QAAQ,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,SAAS;AAC3D;AACA,QAAQ,MAAM,WAAW,GAAG,CAAC,IAAI,KAAK;AACtC,YAAY,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3D;AACA,gBAAgB,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,KAAK,SAAS,GAAG,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;AAC1G;AACA,gBAAgB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC,KAAK,CAAC,CAAC;AACpE,YAAY;AACZ,QAAQ,CAAC;AACT;AACA,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE;AAC3B,YAAY,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC,CAAC;AAC9D,QAAQ;AACR,aAAa,IAAI,IAAI,CAAC,EAAE,EAAE;AAC1B,YAAY,WAAW,CAAC,IAAI,CAAC;AAC7B,QAAQ;AACR,QAAQ,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC;AACjD,IAAI;AACJ;AACA;AACA;AACA,IAAI,MAAM,MAAM,GAAG;AACnB,QAAQ,IAAI;AACZ,YAAY,IAAI,CAAC,EAAE,GAAG,MAAM,OAAO,IAAI,CAAC;AACxC,YAAY,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;AAC9D,gBAAgB,IAAI,CAAC,gBAAgB,EAAE;AACvC,gBAAgB,IAAI,CAAC,WAAW,EAAE;AAClC,gBAAgB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxC,YAAY;AACZ,QAAQ;AACR,QAAQ,OAAO,KAAK,EAAE;AACtB,YAAY,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC;AACzD,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA,IAAI,gBAAgB,GAAG;AACvB,QAAQ,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,aAAa;AAC7D,QAAQ,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAC/C,QAAQ,MAAM,aAAa,GAAG,SAAS,CAAC,qBAAqB,EAAE;AAC/D,QAAQ,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC;AACzE,QAAQ,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC;AAC5E,QAAQ,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC/C,IAAI;AACJ;AACA;AACA;AACA,IAAI,WAAW,GAAG;AAClB,QAAQ,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;AACtB,YAAY;AACZ,QAAQ;AACR;AACA,QAAQ,IAAI,CAAC,YAAY,EAAE;AAC3B,QAAQ,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,aAAa;AAC7D,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE;AACzC;AACA,QAAQ,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACnE,YAAY,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC;AAC7C,YAAY;AACZ,QAAQ;AACR,QAAQ,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAC/C,QAAQ,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE;AAC7C,QAAQ,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE;AACnD,QAAQ,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM;AAC5C;AACA,YAAY,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU;AAChD,YAAY,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE;AAC3F,YAAY,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,GAAG;AACtD,YAAY,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE;AACvD,YAAY,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE;AAC3D,YAAY,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,GAAG;AAC5D,YAAY,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,KAAK,YAAY;AACnE;AACA,YAAY,MAAM,GAAG,GAAG,IAAI,CAAC;AAC7B,iBAAiB,MAAM,CAAC,SAAS;AACjC,iBAAiB,MAAM,CAAC,KAAK;AAC7B,iBAAiB,IAAI,CAAC,OAAO,EAAE,MAAM;AACrC,iBAAiB,IAAI,CAAC,QAAQ,EAAE,MAAM;AACtC,iBAAiB,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACzD,iBAAiB,IAAI,CAAC,qBAAqB,EAAE,eAAe;AAC5D,iBAAiB,KAAK,CAAC,UAAU,EAAE,SAAS;AAC5C,iBAAiB,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;AACtE;AACA,YAAY,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE;AACjD,YAAY,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC;AACpD;AACA,YAAY,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK;AACjD,gBAAgB,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE;AAC9D,oBAAoB,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;AAC7F,wBAAwB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;AACvD,wBAAwB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;AAC7C,oBAAoB;AACpB,gBAAgB;AAChB,YAAY,CAAC,CAAC;AACd;AACA,YAAY,MAAM,UAAU,GAAG,IAAI,CAAC;AACpC,iBAAiB,IAAI;AACrB,iBAAiB,QAAQ,CAAC;AAC1B,gBAAgB,YAAY,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,GAAG,YAAY;AACnF,gBAAgB,YAAY,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU,GAAG,YAAY;AACnF,aAAa;AACb,iBAAiB,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK;AACtC,gBAAgB,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,GAAG,GAAG,GAAG,GAAG;AACxD,YAAY,CAAC,CAAC;AACd,YAAY,UAAU,CAAC,IAAI,CAAC;AAC5B;AACA,YAAY,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;AAChC,gBAAgB,IAAI;AACpB,gBAAgB,UAAU;AAC1B,gBAAgB,YAAY;AAC5B,gBAAgB,SAAS;AACzB,gBAAgB,UAAU;AAC1B,aAAa,CAAC;AACd;AACA,YAAY,MAAM,KAAK,GAAG,YAAY,GAAG,MAAM,CAAC,GAAG,GAAG,KAAK,GAAG,CAAC;AAC/D,YAAY,MAAM,KAAK,GAAG,YAAY,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG;AACjE;AACA,YAAY,IAAI,IAAI,GAAG,QAAQ;AAC/B,YAAY,IAAI,IAAI,GAAG,CAAC,QAAQ;AAChC,YAAY,IAAI,IAAI,GAAG,QAAQ;AAC/B,YAAY,IAAI,IAAI,GAAG,CAAC,QAAQ;AAChC,YAAY,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;AAC9C,gBAAgB,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM;AACxC,oBAAoB;AACpB,gBAAgB,MAAM,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAClD,gBAAgB,MAAM,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAClD,gBAAgB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AACxC,gBAAgB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AACxC,gBAAgB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AACxC,gBAAgB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AACxC,YAAY,CAAC,CAAC;AACd;AACA,YAAY,MAAM,OAAO,GAAG,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC;AAC7C,YAAY,MAAM,OAAO,GAAG,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC;AAC7C;AACA,YAAY,MAAM,CAAC,GAAG;AACtB,iBAAiB,MAAM,CAAC,GAAG;AAC3B,iBAAiB,IAAI,CAAC,WAAW,EAAE;AACnC,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;AACrE,kBAAkB,CAAC,UAAU,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC3D;AACA,YAAY,MAAM,IAAI,GAAG,IAAI,CAAC;AAC9B,iBAAiB,IAAI;AACrB,iBAAiB,WAAW,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AACtC,iBAAiB,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,KAAK;AACvC,gBAAgB,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC;AACpD,YAAY,CAAC,CAAC;AACd;AACA,YAAY,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AAC1B;AACA,YAAY,MAAM,gBAAgB,GAAG,IAAI,CAAC,EAAE,CAAC;AAC7C,iBAAiB,SAAS,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,GAAG,KAAK,GAAG,CAAC,EAAE,YAAY,GAAG,MAAM,GAAG,CAAC,GAAG,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC;AACpH,YAAY,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC;AACtD;AACA,YAAY,MAAM,KAAK,GAAG;AAC1B,iBAAiB,SAAS,CAAC,OAAO;AAClC,iBAAiB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC;AAC7E,iBAAiB,KAAK;AACtB,iBAAiB,MAAM,CAAC,MAAM;AAC9B,iBAAiB,IAAI,CAAC,OAAO,EAAE,yBAAyB;AACxD,iBAAiB,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK;AAClC;AACA,gBAAgB,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,QAAQ;AAC/D;AACA,gBAAgB,MAAM,OAAO,GAAG,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AACtE,gBAAgB,MAAM,OAAO,GAAG,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AACtE,gBAAgB,MAAM,OAAO,GAAG,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AACtE,gBAAgB,MAAM,OAAO,GAAG,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AACtE;AACA,gBAAgB,IAAI,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI;AAClE,gBAAgB,QAAQ,SAAS;AACjC,oBAAoB,KAAK,UAAU;AACnC;AACA,wBAAwB,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC7E,oBAAoB,KAAK,SAAS;AAClC;AACA,wBAAwB,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;AAC/D,wBAAwB,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;AAC/D,wBAAwB,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,GAAG,CAAC;AAC5E,wBAAwB,IAAI,YAAY,EAAE;AAC1C;AACA,4BAA4B,MAAM,YAAY,GAAG,CAAC,OAAO,GAAG,OAAO,IAAI,CAAC;AACxE,4BAA4B,MAAM,IAAI,GAAG,OAAO,GAAG,YAAY;AAC/D,4BAA4B,OAAO;AACnC,mBAAmB,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO;AACvC,mBAAmB,EAAE,IAAI,GAAG,YAAY;AACxC,mBAAmB,EAAE,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,YAAY;AACrG,mBAAmB,EAAE,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,YAAY;AAC1E,mBAAmB,EAAE,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,GAAG,YAAY,CAAC,CAAC,EAAE,OAAO;AACtE,mBAAmB,EAAE,OAAO;AAC5B,gBAAgB,CAAC;AACjB,wBAAwB;AACxB,6BAA6B;AAC7B;AACA,4BAA4B,MAAM,YAAY,GAAG,CAAC,OAAO,GAAG,OAAO,IAAI,CAAC;AACxE,4BAA4B,MAAM,IAAI,GAAG,OAAO,GAAG,YAAY;AAC/D,4BAA4B,OAAO;AACnC,mBAAmB,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO;AACvC,mBAAmB,EAAE,IAAI,GAAG,YAAY;AACxC,mBAAmB,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE,IAAI;AACrG,mBAAmB,EAAE,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,YAAY;AAC1E,mBAAmB,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,GAAG,YAAY;AACtE,mBAAmB,EAAE,OAAO;AAC5B,gBAAgB,CAAC;AACjB,wBAAwB;AACxB,oBAAoB,KAAK,MAAM;AAC/B;AACA,wBAAwB,IAAI,YAAY,EAAE;AAC1C,4BAA4B,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,OAAO,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5G,wBAAwB;AACxB,6BAA6B;AAC7B,4BAA4B,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,OAAO,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5G,wBAAwB;AACxB,oBAAoB,KAAK,QAAQ;AACjC,oBAAoB;AACpB;AACA,wBAAwB,IAAI,YAAY,EAAE;AAC1C,4BAA4B,OAAO,IAAI,CAAC;AACxC,iCAAiC,cAAc;AAC/C,iCAAiC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7C,iCAAiC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,wBAAwB;AACxB,6BAA6B;AAC7B,4BAA4B,OAAO,IAAI,CAAC;AACxC,iCAAiC,YAAY;AAC7C,iCAAiC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7C,iCAAiC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,wBAAwB;AACxB;AACA,YAAY,CAAC;AACb,iBAAiB,IAAI,CAAC,QAAQ,EAAE,CAAC,8CAA8C,CAAC;AAChF,iBAAiB,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,SAAS;AACvD,iBAAiB,IAAI,CAAC,MAAM,EAAE,MAAM;AACpC,iBAAiB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;AACnC;AACA,YAAY,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAC9D,YAAY,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAClF;AACA,YAAY,MAAM,eAAe,GAAG,IAAI,GAAG,EAAE;AAC7C;AACA,YAAY,MAAM,UAAU,GAAG;AAC/B,iBAAiB,SAAS,CAAC,aAAa;AACxC,iBAAiB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC;AAC5E,iBAAiB,KAAK;AACtB,iBAAiB,MAAM,CAAC,GAAG;AAC3B,iBAAiB,IAAI,CAAC,OAAO,EAAE,+BAA+B;AAC9D,iBAAiB,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;AACvD,iBAAiB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,KAAK;AAC1C,gBAAgB,MAAM,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAClD,gBAAgB,MAAM,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAClD,gBAAgB,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,YAAY,CAAC;AACb,iBAAiB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;AACpC;AACA,YAAY,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AACzC,gBAAgB,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC;AACpD,YAAY,CAAC,CAAC;AACd;AACA,YAAY,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC;AACnD,YAAY,IAAI,iBAAiB,IAAI,aAAa,EAAE;AACpD;AACA,gBAAgB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,KAAK;AACjD,oBAAoB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI;AACvC,oBAAoB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC;AAC5C,oBAAoB,MAAM,WAAW,GAAG,CAAC,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;AACrF,oBAAoB,MAAM,UAAU,GAAG,WAAW,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AAC9H;AACA,oBAAoB,IAAI,CAAC,QAAQ,GAAG,UAAU,IAAI,KAAK;AACvD,oBAAoB,IAAI,CAAC,cAAc,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;AACxE;AACA,oBAAoB,MAAM,aAAa,GAAG,IAAI,CAAC;AAC/C,yBAAyB,MAAM,CAAC,OAAO;AACvC,yBAAyB,MAAM,CAAC,eAAe;AAC/C,yBAAyB,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,GAAG,CAAC;AACjD,yBAAyB,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,GAAG,CAAC;AAClD,yBAAyB,IAAI,CAAC,OAAO,EAAE,SAAS;AAChD,yBAAyB,IAAI,CAAC,QAAQ,EAAE,UAAU;AAClD,yBAAyB,IAAI,CAAC,OAAO,EAAE,mCAAmC;AAC1E,yBAAyB,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAK;AAChD;AACA;AACA,wBAAwB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;AACnD,wBAAwB,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC;AACnJ,wBAAwB,IAAI,CAAC,aAAa,EAAE;AAC5C,4BAA4B,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC;AAC1D,wBAAwB;AACxB,oBAAoB,CAAC,CAAC;AACtB;AACA,oBAAoB,MAAM,GAAG,GAAG;AAChC,yBAAyB,MAAM,CAAC,WAAW;AAC3C,yBAAyB,IAAI,CAAC,OAAO,EAAE,iCAAiC;AACxE,yBAAyB,KAAK,CAAC,OAAO,EAAE,MAAM;AAC9C,yBAAyB,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC;AAChD;AACA,oBAAoB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM;AAC1C;AACA,wBAAwB,MAAM,OAAO,GAAG;AACxC,4BAA4B,SAAS,EAAE,IAAI;AAC3C,yBAAyB;AACzB,wBAAwB,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,aAAa,EAAE,OAAO,CAAC;AACxG,wBAAwB,OAAO,CAAC,aAAa,EAAE;AAC/C;AACA,wBAAwB,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS;AACvD,wBAAwB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AAClD,4BAA4B,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC;AACxD,wBAAwB;AACxB,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,YAAY;AACZ,iBAAiB;AACjB;AACA,gBAAgB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,KAAK;AACjD,oBAAoB,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1D,oBAAoB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI;AACvC,oBAAoB,MAAM,WAAW,GAAG,CAAC,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;AACrF;AACA,oBAAoB;AACpB,yBAAyB,MAAM,CAAC,MAAM;AACtC,yBAAyB,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,GAAG,CAAC;AACjD,yBAAyB,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,GAAG,CAAC;AAClD,yBAAyB,IAAI,CAAC,OAAO,EAAE,SAAS;AAChD,yBAAyB,IAAI,CAAC,QAAQ,EAAE,UAAU;AAClD,yBAAyB,IAAI,CAAC,IAAI,EAAE,CAAC;AACrC,yBAAyB,IAAI,CAAC,IAAI,EAAE,CAAC;AACrC,yBAAyB,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,8CAA8C,CAAC;AACpG,yBAAyB,IAAI,CAAC,QAAQ,EAAE,CAAC,qDAAqD,CAAC;AAC/F,yBAAyB,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,eAAe;AACrE,yBAAyB,IAAI,CAAC,OAAO,EAAE,yBAAyB,CAAC;AACjE;AACA,oBAAoB;AACpB,yBAAyB,MAAM,CAAC,MAAM;AACtC,yBAAyB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE;AACtC,yBAAyB,IAAI,CAAC,aAAa,EAAE,QAAQ;AACrD,yBAAyB,IAAI,CAAC,OAAO,EAAE,+BAA+B;AACtE,yBAAyB,IAAI,CAAC,MAAM,EAAE,OAAO;AAC7C,yBAAyB,IAAI,CAAC,aAAa,EAAE,MAAM;AACnD,yBAAyB,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;AAC5D;AACA,oBAAoB,IAAI,IAAI,CAAC,QAAQ,EAAE;AACvC,wBAAwB;AACxB,6BAA6B,MAAM,CAAC,MAAM;AAC1C,6BAA6B,IAAI,CAAC,GAAG,EAAE,EAAE;AACzC,6BAA6B,IAAI,CAAC,aAAa,EAAE,QAAQ;AACzD,6BAA6B,IAAI,CAAC,OAAO,EAAE,kCAAkC;AAC7E,6BAA6B,IAAI,CAAC,MAAM,EAAE,0BAA0B;AACpE,6BAA6B,IAAI,CAAC,WAAW,EAAE,OAAO;AACtD,6BAA6B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;AAChD,oBAAoB;AACpB;AACA,oBAAoB,IAAI,IAAI,CAAC,IAAI,EAAE;AACnC,wBAAwB;AACxB,6BAA6B,MAAM,CAAC,MAAM;AAC1C,6BAA6B,IAAI,CAAC,GAAG,EAAE,EAAE;AACzC,6BAA6B,IAAI,CAAC,aAAa,EAAE,QAAQ;AACzD,6BAA6B,IAAI,CAAC,OAAO,EAAE,8BAA8B;AACzE,6BAA6B,IAAI,CAAC,MAAM,EAAE,0BAA0B;AACpE,6BAA6B,IAAI,CAAC,WAAW,EAAE,OAAO;AACtD,6BAA6B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5C,oBAAoB;AACpB;AACA,oBAAoB,IAAI,WAAW,IAAI,OAAO,CAAC,WAAW,EAAE;AAC5D,wBAAwB,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AACnH;AACA,wBAAwB;AACxB,6BAA6B,MAAM,CAAC,QAAQ;AAC5C,6BAA6B,IAAI,CAAC,GAAG,EAAE,EAAE;AACzC,6BAA6B,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,CAAC,GAAG,EAAE;AAC1D,6BAA6B,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,GAAG,CAAC,GAAG,EAAE;AAC5D,6BAA6B,IAAI,CAAC,MAAM,EAAE,OAAO;AACjD,6BAA6B,IAAI,CAAC,QAAQ,EAAE,CAAC,qDAAqD,CAAC;AACnG,6BAA6B,IAAI,CAAC,cAAc,EAAE,CAAC;AACnD,6BAA6B,IAAI,CAAC,OAAO,EAAE,qCAAqC;AAChF,6BAA6B,KAAK,CAAC,QAAQ,EAAE,SAAS;AACtD,6BAA6B,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAK;AACpD,4BAA4B,KAAK,CAAC,eAAe,EAAE;AACnD,4BAA4B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;AACpD,wBAAwB,CAAC,CAAC;AAC1B;AACA,wBAAwB;AACxB,6BAA6B,MAAM,CAAC,MAAM;AAC1C,6BAA6B,IAAI,CAAC,GAAG,EAAE,SAAS,GAAG,CAAC,GAAG,EAAE;AACzD,6BAA6B,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,GAAG,CAAC,GAAG,EAAE;AAC3D,6BAA6B,IAAI,CAAC,IAAI,EAAE,QAAQ;AAChD,6BAA6B,IAAI,CAAC,aAAa,EAAE,QAAQ;AACzD,6BAA6B,IAAI,CAAC,OAAO,EAAE,gCAAgC;AAC3E,6BAA6B,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,8CAA8C,CAAC;AACxG,6BAA6B,IAAI,CAAC,aAAa,EAAE,MAAM;AACvD,6BAA6B,KAAK,CAAC,QAAQ,EAAE,SAAS;AACtD,6BAA6B,IAAI,CAAC,UAAU,GAAG,GAAG,GAAG,GAAG;AACxD,6BAA6B,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAK;AACpD,4BAA4B,KAAK,CAAC,eAAe,EAAE;AACnD,4BAA4B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;AACpD,wBAAwB,CAAC,CAAC;AAC1B,oBAAoB;AACpB;AACA,oBAAoB,IAAI,IAAI,CAAC,IAAI,EAAE;AACnC,wBAAwB;AACxB,6BAA6B,MAAM,CAAC,MAAM;AAC1C,6BAA6B,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,GAAG,CAAC,GAAG,EAAE;AAC1D,6BAA6B,IAAI,CAAC,GAAG,EAAE,CAAC;AACxC,6BAA6B,IAAI,CAAC,IAAI,EAAE,QAAQ;AAChD,6BAA6B,IAAI,CAAC,OAAO,EAAE,8BAA8B;AACzE,6BAA6B,IAAI,CAAC,MAAM,EAAE,OAAO;AACjD,6BAA6B,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;AACrD,oBAAoB;AACpB;AACA,oBAAoB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAK;AACjD,wBAAwB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC;AACtD,oBAAoB,CAAC,CAAC;AACtB;AACA,oBAAoB,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE;AACnF,wBAAwB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;AAC1F,oBAAoB;AACpB,gBAAgB,CAAC,CAAC;AAClB,YAAY;AACZ,QAAQ,CAAC,CAAC;AACV,IAAI;AACJ;AACA;AACA;AACA,IAAI,UAAU,CAAC,MAAM,EAAE;AACvB,QAAQ,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;AAC5D,QAAQ,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;AACtD,QAAQ,MAAM,QAAQ,GAAG,YAAY,KAAK,SAAS,GAAG,KAAK,GAAG,CAAC,YAAY;AAC3E,QAAQ,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;AAC3C,QAAQ,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC;AAC9C;AACA,QAAQ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK;AACvE,YAAY,IAAI,IAAI,EAAE;AACtB,gBAAgB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AACrC,oBAAoB,IAAI,EAAE,IAAI;AAC9B,oBAAoB,QAAQ,EAAE,QAAQ;AACtC,iBAAiB,CAAC;AAClB,YAAY;AACZ,QAAQ,CAAC,CAAC;AACV;AACA,QAAQ,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC;AACpD,IAAI;AACJ;AACA;AACA;AACA,IAAI,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE;AAC5C,QAAQ,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AAC9C,YAAY;AACZ,QAAQ,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM;AAC5C,YAAY,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,aAAa;AACjE,YAAY,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;AACtD,YAAY,IAAI,CAAC,GAAG;AACpB,gBAAgB;AAChB;AACA,YAAY,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AACtF,YAAY,IAAI,SAAS,CAAC,KAAK,EAAE;AACjC,gBAAgB;AAChB;AACA,YAAY,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,iCAAiC,CAAC;AAClF,YAAY,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE;AACrC,gBAAgB,UAAU,CAAC,IAAI,CAAC,QAAQ,GAAG,GAAG,GAAG,GAAG,CAAC;AACrD,YAAY;AACZ,QAAQ,CAAC,CAAC;AACV;AACA;AACA;AACA,QAAQ,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;AAC5D,QAAQ,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC;AAC9C,IAAI;AACJ;AACA;AACA;AACA,IAAI,MAAM,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE;AACjC,QAAQ,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE;AAC5B,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE;AAC3B,YAAY,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;AAC/C,gBAAgB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC;AAChE,gBAAgB,IAAI,KAAK,EAAE;AAC3B,oBAAoB,OAAO,KAAK;AAChC,gBAAgB;AAChB,YAAY;AACZ,QAAQ;AACR,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ;AACA;AACA;AACA,IAAI,eAAe,CAAC,KAAK,EAAE,CAAC,EAAE;AAC9B,QAAQ,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI;AAC3B;AACA,QAAQ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAC5B,YAAY,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;AACvD,YAAY,IAAI,EAAE,IAAI;AACtB,YAAY,OAAO,EAAE,KAAK,CAAC,aAAa;AACxC,SAAS,CAAC;AACV,IAAI;AACJ;AACA;AACA;AACA,IAAI,YAAY,GAAG;AACnB,QAAQ,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,EAAE,aAAa;AAC9D,QAAQ,IAAI,CAAC,SAAS;AACtB,YAAY;AACZ;AACA,QAAQ,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;AAClD,QAAQ,IAAI,GAAG,EAAE;AACjB,YAAY,GAAG,CAAC,MAAM,EAAE;AACxB,QAAQ;AACR,IAAI;AACJ,IAAI,WAAW,GAAG;AAClB,QAAQ,IAAI,CAAC,WAAW,EAAE;AAC1B,IAAI;AACJ;AACA;AACA;AACA,IAAI,iBAAiB,CAAC,MAAM,EAAE;AAC9B,QAAQ,IAAI,CAAC,MAAM;AACnB,YAAY,OAAO,IAAI,CAAC,EAAE,CAAC,cAAc;AACzC,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,cAAc;AAC7C;AACA,IAAI;AACJ;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,aAAa,IAAI,CAAC,OAAO,EAAE,oCAAoC;AAC/D,aAAa,KAAK,CAAC,UAAU,EAAE,UAAU;AACzC,aAAa,KAAK,CAAC,MAAM,EAAE,KAAK;AAChC,aAAa,KAAK,CAAC,KAAK,EAAE,KAAK;AAC/B,aAAa,KAAK,CAAC,WAAW,EAAE,uBAAuB;AACvD,aAAa,KAAK,CAAC,YAAY,EAAE,QAAQ;AACzC,aAAa,KAAK,CAAC,kBAAkB,EAAE,8CAA8C;AACrF,aAAa,KAAK,CAAC,SAAS,EAAE,QAAQ;AACtC,aAAa,KAAK,CAAC,eAAe,EAAE,QAAQ;AAC5C,aAAa,KAAK,CAAC,YAAY,EAAE,gCAAgC;AACjE,aAAa,KAAK,CAAC,OAAO,EAAE,KAAK;AACjC,aAAa,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC;AACxC;AACA,QAAQ;AACR,aAAa,MAAM,CAAC,KAAK;AACzB,aAAa,IAAI,CAAC,OAAO,EAAE,iCAAiC;AAC5D,aAAa,KAAK,CAAC,SAAS,EAAE,KAAK;AACnC,aAAa,KAAK,CAAC,eAAe,EAAE,SAAS;AAC7C,aAAa,IAAI,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjF;AACA,QAAQ;AACR,aAAa,MAAM,CAAC,KAAK;AACzB,aAAa,IAAI,CAAC,OAAO,EAAE,iCAAiC;AAC5D,aAAa,KAAK,CAAC,WAAW,EAAE,MAAM;AACtC,aAAa,KAAK,CAAC,aAAa,EAAE,KAAK;AACvC,aAAa,KAAK,CAAC,eAAe,EAAE,QAAQ;AAC5C,aAAa,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAAC;AAClD;AACA,QAAQ;AACR,aAAa,MAAM,CAAC,KAAK;AACzB,aAAa,IAAI,CAAC,OAAO,EAAE,iCAAiC;AAC5D,aAAa,KAAK,CAAC,WAAW,EAAE,QAAQ;AACxC,aAAa,KAAK,CAAC,SAAS,EAAE,KAAK;AACnC,aAAa,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,UAAU,CAAC;AACtD,IAAI;AACJ,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;AACnL,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,yBAAyB,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,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,YAAY,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,oBAAoB,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,gBAAgB,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,yEAAyE,EAAE,MAAM,EAAE,CAAC,m+CAAm+C,CAAC,EAAE,eAAe,EAAE,EAAE,CAAC,uBAAuB,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC;AAC/jF;AACA,EAAE,CAAC,wBAAwB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE,UAAU,EAAE,CAAC;AACnI,YAAY,IAAI,EAAE,SAAS;AAC3B,YAAY,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,oBAAoB,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,iBAAiB,CAAC,IAAI,EAAE,eAAe,EAAE,uBAAuB,CAAC,MAAM,EAAE,QAAQ,EAAE,yEAAyE,EAAE,MAAM,EAAE,CAAC,m+CAAm+C,CAAC,EAAE;AACnuD,SAAS,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,CAAC;;AC5qBvC;AACA;AACA;;;;"}
1
+ {"version":3,"file":"acorex-charts-hierarchy-chart.mjs","sources":["../../../../packages/charts/hierarchy-chart/src/lib/hierarchy-chart.config.ts","../../../../packages/charts/hierarchy-chart/src/lib/hierarchy-chart.component.ts","../../../../packages/charts/hierarchy-chart/src/lib/hierarchy-chart.component.html","../../../../packages/charts/hierarchy-chart/src/acorex-charts-hierarchy-chart.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { AXHierarchyChartOption } from './hierarchy-chart.type';\n\nexport const AXHierarchyChartDefaultConfig: AXHierarchyChartOption = {\n direction: 'vertical',\n margin: { top: 40, right: 120, bottom: 40, left: 120 },\n nodeRadius: 30,\n nodeStrokeWidth: 1.5,\n linkWidth: 1.5,\n linkStyle: 'curved',\n nodeWidth: 120,\n nodeHeight: 60,\n nodeSpacingX: 80,\n nodeSpacingY: 120,\n showTooltip: true,\n collapsible: true,\n expandAll: false,\n animationDuration: 100,\n animationEasing: 'cubic-out',\n messages: {\n noData: 'No data available',\n noDataHelp: 'Please provide hierarchy data to display the chart',\n noDataIcon: 'fa-light fa-sitemap',\n },\n};\n\nexport const AX_HIERARCHY_CHART_CONFIG = new InjectionToken<AXHierarchyChartOption>('AX_HIERARCHY_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXHierarchyChartDefaultConfig,\n});\n\nexport type PartialHierarchyChartConfig = Partial<AXHierarchyChartOption>;\n\nexport function hierarchyChartConfig(config: PartialHierarchyChartConfig = {}): AXHierarchyChartOption {\n const result = {\n ...AXHierarchyChartDefaultConfig,\n ...config,\n };\n return result;\n}\n","import { AXChartComponent, AXChartComponentBase } from '@acorex/charts';\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n NgZone,\n TemplateRef,\n ViewContainerRef,\n ViewEncapsulation,\n afterNextRender,\n computed,\n contentChild,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { AX_HIERARCHY_CHART_CONFIG } from './hierarchy-chart.config';\nimport {\n AXHierarchyChartClickEvent,\n AXHierarchyChartData,\n AXHierarchyChartNode,\n AXHierarchyChartNodeContext,\n AXHierarchyChartOption,\n AXHierarchyChartToggleEvent,\n} from './hierarchy-chart.type';\n/**\n * A highly customizable hierarchical visualization component that can be used for:\n * - Organization charts\n * - Tree diagrams\n * - Dependency visualizations\n * - Process flows\n *\n * Supports both default node styling and custom node templates.\n */\n@Component({\n selector: 'ax-hierarchy-chart',\n templateUrl: './hierarchy-chart.component.html',\n styleUrls: ['./hierarchy-chart.component.scss'],\n standalone: true,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXHierarchyChartComponent extends AXChartComponent implements AXChartComponentBase {\n // Chart container reference\n private chartContainer = viewChild.required<ElementRef<HTMLDivElement>>('chartContainer');\n\n // Custom node template provided by the user\n customNodeTemplate = contentChild<TemplateRef<AXHierarchyChartNodeContext>>('nodeTemplate');\n // Services\n private ngZone = inject(NgZone);\n private viewContainerRef = inject(ViewContainerRef);\n private configToken = inject(AX_HIERARCHY_CHART_CONFIG);\n\n // D3 instance\n private d3: any;\n\n // Internal state signals\n private _expandedNodes = signal<Map<string, boolean>>(new Map());\n private _initialized = signal(false);\n private _rendered = signal(false);\n private _dimensions = signal({ width: 0, height: 0 });\n private _nodeElements = signal<Map<string, any>>(new Map()); // Store references to node elements\n private _chartData = signal<any>(null); // Store the current chart data and layout\n\n // Inputs\n data = input<AXHierarchyChartData | AXHierarchyChartData[]>([]);\n options = input<AXHierarchyChartOption>({});\n nodeTemplate = input<TemplateRef<AXHierarchyChartNodeContext> | null>(null);\n\n // Outputs\n itemClick = output<AXHierarchyChartClickEvent>();\n nodeToggle = output<AXHierarchyChartToggleEvent>();\n\n // Computed values\n protected processedData = computed(() => {\n const data = this.data();\n // Handle both single node and array formats\n return Array.isArray(data) ? { id: 'root', children: data } : data;\n });\n\n // Check if custom template is available\n protected hasCustomTemplate = computed(() => {\n return Boolean(this.customNodeTemplate() || this.nodeTemplate());\n });\n\n protected effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n });\n\n // Messages with defaults\n protected effectiveMessages = computed(() => {\n const defaultMessages = {\n noData: 'No data available',\n noDataHelp: 'Please provide hierarchy data to display the chart',\n noDataIcon: 'fa-light fa-sitemap',\n };\n return {\n ...defaultMessages,\n ...this.effectiveOptions().messages,\n };\n });\n\n constructor() {\n super();\n // Dynamically load D3 and initialize the chart when the component is ready\n afterNextRender(() => {\n this._initialized.set(true);\n this.loadD3();\n this.initializeExpandedState();\n });\n\n // Watch for changes to redraw the chart\n effect(() => {\n // Access these to track them\n this.processedData();\n this.nodeTemplate();\n this.customNodeTemplate();\n this.effectiveOptions();\n this._expandedNodes();\n\n if (this._initialized() && this.d3 && this._rendered()) {\n this.createChart();\n }\n });\n }\n\n /**\n * Initialize the expanded state for all nodes\n */\n private initializeExpandedState(): void {\n const newExpandedNodes = new Map<string, boolean>();\n const data = this.processedData();\n const expandAll = this.effectiveOptions().expandAll;\n\n // Helper function to recursively process nodes\n const processNode = (node: AXHierarchyChartData) => {\n if (node.children && node.children.length > 0) {\n // Set initial expansion state based on node property or global option\n newExpandedNodes.set(node.id, node.isExpanded !== undefined ? node.isExpanded : expandAll);\n\n // Process children\n node.children.forEach((child) => processNode(child));\n }\n };\n\n // Start processing\n if (data.children) {\n data.children.forEach((node) => processNode(node));\n } else if ((data as any).id) {\n processNode(data as AXHierarchyChartData);\n }\n\n this._expandedNodes.set(newExpandedNodes);\n }\n\n /**\n * Dynamically load D3.js to reduce initial bundle size\n */\n protected async loadD3(): Promise<void> {\n try {\n this.d3 = await import('d3');\n if (this._initialized() && this.chartContainer()) {\n this.updateDimensions();\n this.createChart();\n this._rendered.set(true);\n }\n } catch (error) {\n console.error('Failed to load D3.js:', error);\n }\n }\n\n /**\n * Update dimensions based on container size\n */\n private updateDimensions(): void {\n const container = this.chartContainer().nativeElement;\n const options = this.effectiveOptions();\n\n const containerRect = container.getBoundingClientRect();\n const width = options.width || Math.max(containerRect.width, 300);\n const height = options.height || Math.max(containerRect.height, 400);\n\n this._dimensions.set({ width, height });\n }\n\n /**\n * Create and render the hierarchy chart\n */\n public createChart(): void {\n if (!this.d3) {\n return;\n }\n\n // Clear any existing chart\n this.cleanupChart();\n\n const container = this.chartContainer().nativeElement;\n const data = this.processedData();\n\n // Check for null/undefined data or empty children\n if (!data || !data.children || data.children.length === 0) {\n this.showNoDataMessage(container);\n return;\n }\n\n const options = this.effectiveOptions();\n const dimensions = this._dimensions();\n const expandedNodes = this._expandedNodes();\n\n this.ngZone.runOutsideAngular(() => {\n // Get dimensions and options\n const { width, height } = dimensions;\n const margin = options.margin || { top: 40, right: 120, bottom: 40, left: 120 };\n const nodeWidth = options.nodeWidth || 120;\n const nodeHeight = options.nodeHeight || 60;\n const nodeSpacingX = options.nodeSpacingX || 80;\n const nodeSpacingY = options.nodeSpacingY || 120;\n const isHorizontal = options.direction === 'horizontal';\n\n // Create SVG container with viewBox for responsiveness\n const svg = this.d3\n .select(container)\n .append('svg')\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${width} ${height}`)\n .attr('preserveAspectRatio', 'xMidYMid meet')\n .style('overflow', 'visible')\n .classed(options.className || '', !!options.className);\n\n // Create hierarchy layout from data\n const rootData = this.processedData();\n const root = this.d3.hierarchy(rootData);\n\n // Apply expansion state to nodes\n root.descendants().forEach((node: any) => {\n if (node.data.id !== 'root' && node.children) {\n if (expandedNodes.has(node.data.id) && !expandedNodes.get(node.data.id)) {\n node._children = node.children; // Store children\n node.children = null; // Collapse node\n }\n }\n });\n\n // Set up the tree layout based on direction option\n const treeLayout = this.d3\n .tree()\n .nodeSize([\n isHorizontal ? nodeHeight + nodeSpacingY : nodeWidth + nodeSpacingX,\n isHorizontal ? nodeWidth + nodeSpacingX : nodeHeight + nodeSpacingY,\n ])\n .separation((a: any, b: any) => {\n return a.parent === b.parent ? 1.2 : 1.5;\n });\n\n treeLayout(root);\n\n // Store the current tree layout data for future updates\n this._chartData.set({\n root,\n treeLayout,\n isHorizontal,\n nodeWidth,\n nodeHeight,\n });\n\n // Adjust root position based on direction\n const rootX = isHorizontal ? margin.top : width / 2;\n const rootY = isHorizontal ? margin.left : margin.top;\n\n // Calculate bounds of the tree after layout\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n\n root.descendants().forEach((d: any) => {\n if (d.data.id === 'root') return;\n\n const x = isHorizontal ? d.x : d.x;\n const y = isHorizontal ? d.y : d.y;\n\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n\n // Calculate the center of the tree\n const centerX = (minX + maxX) / 2;\n const centerY = (minY + maxY) / 2;\n\n // Create a group for the chart content with proper centering\n const g = svg\n .append('g')\n .attr(\n 'transform',\n isHorizontal\n ? `translate(${margin.left}, ${height / 2 - centerX})`\n : `translate(${width / 2}, ${margin.top})`,\n );\n\n // Add zoom and pan behavior (replaces AXPanViewDirective)\n const zoom = this.d3\n .zoom()\n .scaleExtent([0.1, 3]) // Min zoom: 10%, Max zoom: 300%\n .on('zoom', (event: any) => {\n g.attr('transform', event.transform);\n });\n\n // Apply zoom behavior to SVG\n svg.call(zoom);\n\n // Set initial transform to match the centering\n const initialTransform = this.d3.zoomIdentity\n .translate(\n isHorizontal ? margin.left : width / 2,\n isHorizontal ? height / 2 - centerX : margin.top\n );\n svg.call(zoom.transform, initialTransform);\n\n // Draw links between nodes\n const links = g\n .selectAll('.link')\n .data(root.links().filter((d: any) => d.source.data.id !== 'root'))\n .enter()\n .append('path')\n .attr('class', 'ax-hierarchy-chart-link')\n .attr('d', (d: any) => {\n // Get the link style from options\n const linkStyle = options.linkStyle || 'curved';\n\n // Source and target coordinates based on direction\n const sourceX = isHorizontal ? d.source.y : d.source.x;\n const sourceY = isHorizontal ? d.source.x : d.source.y;\n const targetX = isHorizontal ? d.target.y : d.target.x;\n const targetY = isHorizontal ? d.target.x : d.target.y;\n\n // Variables for rounded corners\n let xDistance, yDistance, cornerRadius, midX, midY;\n\n switch (linkStyle) {\n case 'straight':\n // Direct straight line\n return `M${sourceX},${sourceY}L${targetX},${targetY}`;\n\n case 'rounded':\n // Curved line with rounded corners\n xDistance = Math.abs(targetX - sourceX);\n yDistance = Math.abs(targetY - sourceY);\n cornerRadius = Math.min(xDistance, yDistance) * 0.2; // Reduced radius for better appearance\n\n if (isHorizontal) {\n // For horizontal layout\n const halfDistance = (targetX - sourceX) / 2;\n const xMid = sourceX + halfDistance;\n\n return `\n M${sourceX},${sourceY}\n H${xMid - cornerRadius}\n Q${xMid},${sourceY} ${xMid},${sourceY + Math.sign(targetY - sourceY) * cornerRadius}\n V${targetY - Math.sign(targetY - sourceY) * cornerRadius}\n Q${xMid},${targetY} ${xMid + cornerRadius},${targetY}\n H${targetX}\n `;\n } else {\n // For vertical layout\n const halfDistance = (targetY - sourceY) / 2;\n const yMid = sourceY + halfDistance;\n\n return `\n M${sourceX},${sourceY}\n V${yMid - cornerRadius}\n Q${sourceX},${yMid} ${sourceX + Math.sign(targetX - sourceX) * cornerRadius},${yMid}\n H${targetX - Math.sign(targetX - sourceX) * cornerRadius}\n Q${targetX},${yMid} ${targetX},${yMid + cornerRadius}\n V${targetY}\n `;\n }\n\n case 'step':\n // L-shaped stepped line\n if (isHorizontal) {\n return `M${sourceX},${sourceY}H${(sourceX + targetX) / 2}V${targetY}H${targetX}`;\n } else {\n return `M${sourceX},${sourceY}V${(sourceY + targetY) / 2}H${targetX}V${targetY}`;\n }\n\n case 'curved':\n default:\n // Default curved line using D3's built-in link generator\n if (isHorizontal) {\n return this.d3\n .linkHorizontal()\n .x((d: any) => d.y)\n .y((d: any) => d.x)(d);\n } else {\n return this.d3\n .linkVertical()\n .x((d: any) => d.x)\n .y((d: any) => d.y)(d);\n }\n }\n })\n .attr('stroke', `rgb(var(--ax-comp-hierarchy-chart-link-color))`)\n .attr('stroke-width', options.linkWidth)\n .attr('fill', 'none')\n .attr('opacity', 1);\n\n // Determine which template to use for rendering nodes\n const useCustomTemplate = this.hasCustomTemplate();\n const templateToUse = this.nodeTemplate() || this.customNodeTemplate();\n\n // Create a map to store node elements for future updates\n const nodeElementsMap = new Map<string, any>();\n\n // Create node groups\n const nodeGroups = g\n .selectAll('.node-group')\n .data(root.descendants().filter((d: any) => d.data.id !== 'root'))\n .enter()\n .append('g')\n .attr('class', 'ax-hierarchy-chart-node-group')\n .attr('data-node-id', (d: any) => d.data.id) // Add a data attribute for easier selection\n .attr('transform', (d: any) => {\n const x = isHorizontal ? d.y : d.x;\n const y = isHorizontal ? d.x : d.y;\n return `translate(${x},${y})`;\n })\n .attr('opacity', 1); // Display nodes immediately with full opacity\n\n // Store node elements in the map\n nodeGroups.each(function (this: SVGGElement, d: any) {\n nodeElementsMap.set(d.data.id, this);\n });\n\n // Update the node elements signal\n this._nodeElements.set(nodeElementsMap);\n\n if (useCustomTemplate && templateToUse) {\n // Render custom node templates\n nodeGroups.each((d: any, i: number, nodes: any[]) => {\n const node = d.data;\n const element = nodes[i];\n const hasChildren = !!(node.children && node.children.length > 0);\n const isExpanded = hasChildren && this._expandedNodes().has(node.id) && this._expandedNodes().get(node.id);\n\n // Enhance the node with expanded state and toggle function\n node.expanded = isExpanded || false;\n node.toggleExpanded = () => this.toggleNode(node.id);\n\n // Create a foreignObject for the template\n const foreignObject = this.d3\n .select(element)\n .append('foreignObject')\n .attr('x', -nodeWidth / 2)\n .attr('y', -nodeHeight / 2)\n .attr('width', nodeWidth)\n .attr('height', nodeHeight)\n .attr('class', 'ax-hierarchy-chart-node-container')\n .on('click', (event: MouseEvent) => {\n // Don't propagate the event if it's coming from an interactive element\n // like a button inside the template\n const target = event.target as HTMLElement;\n const isInteractive =\n target.tagName === 'BUTTON' || target.tagName === 'A' || target.closest('button, a, [role=\"button\"]');\n\n if (!isInteractive) {\n this.handleNodeClick(event, d);\n }\n });\n\n // Create a div to hold the template\n const div = foreignObject\n .append('xhtml:div')\n .attr('class', 'ax-hierarchy-chart-node-content')\n .style('width', '100%')\n .style('height', '100%');\n\n // Render the template into the div\n this.ngZone.run(() => {\n // Create context with enhanced node as the implicit value\n const context: AXHierarchyChartNodeContext = {\n $implicit: node as AXHierarchyChartNode & { expanded: boolean; toggleExpanded: () => void },\n };\n\n const viewRef = this.viewContainerRef.createEmbeddedView(templateToUse!, context);\n viewRef.detectChanges();\n\n // Append template contents to the div\n const nodes = viewRef.rootNodes;\n for (const node of nodes) {\n div.node().appendChild(node);\n }\n });\n });\n } else {\n // Render enhanced default nodes (rectangles with text and icons)\n nodeGroups.each((d: any, i: number, nodes: any[]) => {\n const group = this.d3.select(nodes[i]);\n const node = d.data;\n const hasChildren = !!(node.children && node.children.length > 0);\n\n // Node background rect with rounded corners\n group\n .append('rect')\n .attr('x', -nodeWidth / 2)\n .attr('y', -nodeHeight / 2)\n .attr('width', nodeWidth)\n .attr('height', nodeHeight)\n .attr('rx', 6)\n .attr('ry', 6)\n .attr('fill', node.color || `rgb(var(--ax-comp-hierarchy-chart-node-color))`)\n .attr('stroke', `rgb(var(--ax-comp-hierarchy-chart-node-stroke-color))`)\n .attr('stroke-width', options.nodeStrokeWidth)\n .attr('class', 'ax-hierarchy-chart-node');\n\n // Main title/name\n group\n .append('text')\n .attr('y', -10)\n .attr('text-anchor', 'middle')\n .attr('class', 'ax-hierarchy-chart-node-title')\n .attr('fill', 'white')\n .attr('font-weight', 'bold')\n .text(node.name || node.label || '');\n\n // Subtitle if provided\n if (node.subtitle) {\n group\n .append('text')\n .attr('y', 10)\n .attr('text-anchor', 'middle')\n .attr('class', 'ax-hierarchy-chart-node-subtitle')\n .attr('fill', 'rgba(255, 255, 255, 0.8)')\n .attr('font-size', '0.8em')\n .text(node.subtitle);\n }\n\n // Type label if provided\n if (node.type) {\n group\n .append('text')\n .attr('y', 25)\n .attr('text-anchor', 'middle')\n .attr('class', 'ax-hierarchy-chart-node-type')\n .attr('fill', 'rgba(255, 255, 255, 0.7)')\n .attr('font-size', '0.7em')\n .text(node.type);\n }\n\n // Add expand/collapse indicator if node has children\n if (hasChildren && options.collapsible) {\n const isExpanded = this._expandedNodes().has(node.id) && this._expandedNodes().get(node.id);\n\n // Toggle button with better styling\n group\n .append('circle')\n .attr('r', 10)\n .attr('cx', nodeWidth / 2 - 12)\n .attr('cy', -nodeHeight / 2 + 12)\n .attr('fill', 'white')\n .attr('stroke', `rgb(var(--ax-comp-hierarchy-chart-node-stroke-color))`)\n .attr('stroke-width', 1)\n .attr('class', 'ax-hierarchy-chart-toggle-indicator')\n .style('cursor', 'pointer')\n .on('click', (event: MouseEvent) => {\n event.stopPropagation();\n this.toggleNode(node.id);\n });\n\n // Toggle icon\n group\n .append('text')\n .attr('x', nodeWidth / 2 - 12)\n .attr('y', -nodeHeight / 2 + 12)\n .attr('dy', '0.32em')\n .attr('text-anchor', 'middle')\n .attr('class', 'ax-hierarchy-chart-toggle-icon')\n .attr('fill', node.color || `rgb(var(--ax-comp-hierarchy-chart-node-color))`)\n .attr('font-weight', 'bold')\n .style('cursor', 'pointer')\n .text(isExpanded ? '−' : '+')\n .on('click', (event: MouseEvent) => {\n event.stopPropagation();\n this.toggleNode(node.id);\n });\n }\n\n // Icon if provided\n if (node.icon) {\n group\n .append('text')\n .attr('x', -nodeWidth / 2 + 15)\n .attr('y', 0)\n .attr('dy', '0.32em')\n .attr('class', 'ax-hierarchy-chart-node-icon')\n .attr('fill', 'white')\n .attr('class', node.icon);\n }\n\n // Add click handler to the whole node\n group.on('click', (event: MouseEvent) => {\n this.handleNodeClick(event, d);\n });\n\n // Add tooltip if enabled\n if (options.showTooltip && (node.tooltip || node.description)) {\n group.append('title').text(node.tooltip || node.description || '');\n }\n });\n }\n });\n }\n\n /**\n * Toggle node expansion state\n */\n public toggleNode(nodeId: string): void {\n const expandedNodes = new Map(this._expandedNodes());\n const currentState = expandedNodes.get(nodeId);\n const newState = currentState === undefined ? false : !currentState;\n\n expandedNodes.set(nodeId, newState);\n this._expandedNodes.set(expandedNodes);\n\n // Emit toggle event\n this.findNodeById(this.processedData(), nodeId).then((node) => {\n if (node) {\n this.nodeToggle.emit({\n node: node,\n expanded: newState,\n });\n }\n });\n\n // Update toggle indicator immediately for better UX\n this.updateToggleIndicator(nodeId, newState);\n }\n\n /**\n * Update just the toggle indicator without redrawing the chart\n */\n private updateToggleIndicator(nodeId: string, expanded: boolean): void {\n if (!this.d3 || !this.chartContainer()) return;\n\n this.ngZone.runOutsideAngular(() => {\n const container = this.chartContainer().nativeElement;\n const svg = container.querySelector('svg');\n if (!svg) return;\n\n // Find and update the toggle indicator for the specific node\n const nodeGroup = this.d3.select(svg).select(`[data-node-id=\"${nodeId}\"]`);\n if (nodeGroup.empty()) return;\n\n // Update the toggle icon (if it exists)\n const toggleIcon = nodeGroup.select('.ax-hierarchy-chart-toggle-icon');\n if (!toggleIcon.empty()) {\n toggleIcon.text(expanded ? '−' : '+');\n }\n });\n\n // Force effect to run that will update the chart\n // This leverages Angular's reactivity rather than a direct method call\n // which is more consistent with Angular's reactive approach\n const expandedNodes = new Map(this._expandedNodes());\n this._expandedNodes.set(expandedNodes);\n }\n\n /**\n * Find a node by ID\n */\n private async findNodeById(data: AXHierarchyChartData, id: string): Promise<AXHierarchyChartData | null> {\n if (data.id === id) {\n return data;\n }\n\n if (data.children) {\n for (const child of data.children) {\n const found = await this.findNodeById(child, id);\n if (found) {\n return found;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Handle node click events\n */\n private handleNodeClick(event: MouseEvent, d: any): void {\n const node = d.data;\n\n // Emit click event\n this.itemClick.emit({\n event: { nativeEvent: event, sender: this },\n item: node,\n element: event.currentTarget as HTMLElement,\n });\n }\n\n /**\n * Clear existing chart\n */\n public cleanupChart(): void {\n const container = this.chartContainer()?.nativeElement;\n if (!container) return;\n\n // Remove existing SVG\n const svg = container.querySelector('svg');\n if (svg) {\n svg.remove();\n }\n }\n\n public updateChart(): void {\n this.createChart();\n }\n\n /**\n * Get D3 easing function from string name\n */\n private getEasingFunction(easing?: string): any {\n if (!easing) return this.d3.easeCubicInOut;\n\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.easeCubicInOut;\n }\n }\n\n /**\n * Shows a message when no data is available\n */\n private showNoDataMessage(containerElement: HTMLElement): void {\n // Clear existing contents first\n this.d3.select(containerElement).selectAll('*').remove();\n\n const messageContainer = this.d3\n .select(containerElement)\n .append('div')\n .attr('class', 'ax-hierarchy-chart-no-data-message')\n .style('position', 'absolute')\n .style('left', '50%')\n .style('top', '50%')\n .style('transform', 'translate(-50%, -50%)')\n .style('text-align', 'center')\n .style('background-color', 'rgb(var(--ax-comp-hierarchy-chart-bg-color))')\n .style('padding', '1.5rem')\n .style('border-radius', '0.5rem')\n .style('box-shadow', '0 2px 12px rgba(0, 0, 0, 0.08)')\n .style('width', '80%')\n .style('max-width', '300px');\n\n // Add an icon\n messageContainer\n .append('div')\n .attr('class', 'ax-hierarchy-chart-no-data-icon')\n .style('opacity', '0.6')\n .style('margin-bottom', '0.75rem')\n .html(`<i class=\"${this.effectiveMessages().noDataIcon} fa-2x\"></i>`);\n\n // Add text message\n messageContainer\n .append('div')\n .attr('class', 'ax-hierarchy-chart-no-data-text')\n .style('font-size', '1rem')\n .style('font-weight', '600')\n .style('margin-bottom', '0.5rem')\n .text(this.effectiveMessages().noData);\n\n // Add help text\n messageContainer\n .append('div')\n .attr('class', 'ax-hierarchy-chart-no-data-help')\n .style('font-size', '0.8rem')\n .style('opacity', '0.6')\n .text(this.effectiveMessages().noDataHelp);\n }\n}\n","<div class=\"ax-hierarchy-chart\" role=\"img\" #chartContainer></div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -117,6 +117,7 @@ class AXLineChartComponent extends AXChartComponent {
117
117
  MIN_MARGIN_BOTTOM = 45;
118
118
  MIN_MARGIN_LEFT = 55;
119
119
  MAX_EXTRA_MARGIN = 60;
120
+ CHART_EDGE_PADDING = 12;
120
121
  // Styling & Visual
121
122
  DEFAULT_LINE_WIDTH = 2;
122
123
  DEFAULT_POINT_RADIUS = 4;
@@ -381,22 +382,19 @@ class AXLineChartComponent extends AXChartComponent {
381
382
  this.height = Math.max(this.height, this.MIN_DIMENSION);
382
383
  const totalWidth = this.width + this.margin.left + this.margin.right;
383
384
  const totalHeight = this.height + this.margin.top + this.margin.bottom;
385
+ const viewBoxWidth = totalWidth + this.CHART_EDGE_PADDING * 2;
386
+ const viewBoxHeight = totalHeight + this.CHART_EDGE_PADDING * 2;
384
387
  const svg = this.d3
385
388
  .select(containerElement)
386
389
  .append('svg')
387
- .attr('width', totalWidth)
388
- .attr('height', totalHeight)
389
- .attr('viewBox', `0 0 ${totalWidth} ${totalHeight}`)
390
- .attr('preserveAspectRatio', 'xMidYMid meet')
391
- .attr('style', `
392
- width: ${totalWidth}px;
393
- height: ${totalHeight}px;
394
- max-width: 100%;
395
- max-height: 100%;
396
- overflow: visible;
397
- `);
390
+ .attr('width', '100%')
391
+ .attr('height', '100%')
392
+ .attr('viewBox', `0 0 ${viewBoxWidth} ${viewBoxHeight}`)
393
+ .attr('preserveAspectRatio', 'xMidYMid meet');
398
394
  this.svg = svg;
399
- this.chart = this.svg.append('g').attr('transform', `translate(${this.margin.left},${this.margin.top})`);
395
+ this.chart = this.svg
396
+ .append('g')
397
+ .attr('transform', `translate(${this.margin.left + this.CHART_EDGE_PADDING},${this.margin.top + this.CHART_EDGE_PADDING})`);
400
398
  }
401
399
  calculateMargins(options, containerWidth) {
402
400
  this.margin = {
@@ -1166,13 +1164,13 @@ class AXLineChartComponent extends AXChartComponent {
1166
1164
  this.showCrosshairLines(overlappingPoints[0].point);
1167
1165
  }
1168
1166
  }
1169
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXLineChartComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1170
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.3.3", type: AXLineChartComponent, isStandalone: true, selector: "ax-line-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: { pointClick: "pointClick" }, viewQueries: [{ propertyName: "chartContainerEl", first: true, predicate: ["chartContainer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"ax-line-chart\" #chartContainer>\n <!-- Shared tooltip component -->\n <ax-chart-tooltip\n [visible]=\"tooltipVisible()\"\n [position]=\"tooltipPosition()\"\n [data]=\"tooltipData()\"\n [showPercentage]=\"false\"\n ></ax-chart-tooltip>\n</div>\n", styles: ["ax-line-chart{display:block;width:100%;height:100%;min-height:200px;--ax-comp-line-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-axis-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-grid-lines-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-bg-color: 0, 0, 0, 0;--ax-comp-line-chart-text-color: var(--ax-sys-color-on-lightest-surface)}ax-line-chart .ax-line-chart{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;border-radius:.5rem;color:rgba(var(--ax-comp-line-chart-text-color));background-color:rgb(var(--ax-comp-line-chart-bg-color))}ax-line-chart .ax-line-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}ax-line-chart .ax-line-chart svg g:has(text){font-family:inherit}ax-line-chart .ax-line-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-line-chart-bg-color));padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-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 });
1167
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXLineChartComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1168
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.1.3", type: AXLineChartComponent, isStandalone: true, selector: "ax-line-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: { pointClick: "pointClick" }, viewQueries: [{ propertyName: "chartContainerEl", first: true, predicate: ["chartContainer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"ax-line-chart\" #chartContainer>\n <!-- Shared tooltip component -->\n <ax-chart-tooltip\n [visible]=\"tooltipVisible()\"\n [position]=\"tooltipPosition()\"\n [data]=\"tooltipData()\"\n [showPercentage]=\"false\"\n ></ax-chart-tooltip>\n</div>\n", styles: ["ax-line-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);--ax-comp-line-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-axis-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-grid-lines-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-bg-color: 0, 0, 0, 0;--ax-comp-line-chart-text-color: var(--ax-sys-color-on-lightest-surface)}ax-line-chart .ax-line-chart{width:100%;height:100%;position:relative;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);border-radius:.5rem;overflow:hidden;color:rgba(var(--ax-comp-line-chart-text-color));background-color:rgb(var(--ax-comp-line-chart-bg-color))}ax-line-chart .ax-line-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-line-chart .ax-line-chart svg g:has(text){font-family:inherit}ax-line-chart .ax-line-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-line-chart-bg-color));padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-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 });
1171
1169
  }
1172
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXLineChartComponent, decorators: [{
1170
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXLineChartComponent, decorators: [{
1173
1171
  type: Component,
1174
- args: [{ selector: 'ax-line-chart', standalone: true, encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ax-line-chart\" #chartContainer>\n <!-- Shared tooltip component -->\n <ax-chart-tooltip\n [visible]=\"tooltipVisible()\"\n [position]=\"tooltipPosition()\"\n [data]=\"tooltipData()\"\n [showPercentage]=\"false\"\n ></ax-chart-tooltip>\n</div>\n", styles: ["ax-line-chart{display:block;width:100%;height:100%;min-height:200px;--ax-comp-line-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-axis-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-grid-lines-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-bg-color: 0, 0, 0, 0;--ax-comp-line-chart-text-color: var(--ax-sys-color-on-lightest-surface)}ax-line-chart .ax-line-chart{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;border-radius:.5rem;color:rgba(var(--ax-comp-line-chart-text-color));background-color:rgb(var(--ax-comp-line-chart-bg-color))}ax-line-chart .ax-line-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}ax-line-chart .ax-line-chart svg g:has(text){font-family:inherit}ax-line-chart .ax-line-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-line-chart-bg-color));padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-help{font-size:.8rem;opacity:.6}\n"] }]
1175
- }] });
1172
+ args: [{ selector: 'ax-line-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ax-line-chart\" #chartContainer>\n <!-- Shared tooltip component -->\n <ax-chart-tooltip\n [visible]=\"tooltipVisible()\"\n [position]=\"tooltipPosition()\"\n [data]=\"tooltipData()\"\n [showPercentage]=\"false\"\n ></ax-chart-tooltip>\n</div>\n", styles: ["ax-line-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);--ax-comp-line-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-axis-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-grid-lines-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-bg-color: 0, 0, 0, 0;--ax-comp-line-chart-text-color: var(--ax-sys-color-on-lightest-surface)}ax-line-chart .ax-line-chart{width:100%;height:100%;position:relative;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);border-radius:.5rem;overflow:hidden;color:rgba(var(--ax-comp-line-chart-text-color));background-color:rgb(var(--ax-comp-line-chart-bg-color))}ax-line-chart .ax-line-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-line-chart .ax-line-chart svg g:has(text){font-family:inherit}ax-line-chart .ax-line-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-line-chart-bg-color));padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-help{font-size:.8rem;opacity:.6}\n"] }]
1173
+ }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], pointClick: [{ type: i0.Output, args: ["pointClick"] }], chartContainerEl: [{ type: i0.ViewChild, args: ['chartContainer', { isSignal: true }] }] } });
1176
1174
 
1177
1175
  /**
1178
1176
  * Generated bundle index. Do not edit.