{"version":3,"file":"cytoscape-angular-ng19.mjs","sources":["../../../projects/cytoscape-angular/src/lib/cytoscape-graph.component.ts","../../../projects/cytoscape-angular/src/lib/layout/layout-options-impl.ts","../../../projects/cytoscape-angular/src/lib/fluid-form/form-info.ts","../../../projects/cytoscape-angular/src/lib/fluid-form/fluid-form.component.ts","../../../projects/cytoscape-angular/src/lib/fluid-form/fluid-form.component.html","../../../projects/cytoscape-angular/src/lib/cytoscape-layout-tool/cytoscape-layout-tool.component.ts","../../../projects/cytoscape-angular/src/lib/style/style.ts","../../../projects/cytoscape-angular/src/lib/cytoscape-style-tool/cytoscape-style-tool.component.ts","../../../projects/cytoscape-angular/src/lib/cytoscape-graph-toolbar/cytoscape-graph-toolbar.component.ts","../../../projects/cytoscape-angular/src/lib/cytoscape-angular.module.ts","../../../projects/cytoscape-angular/src/public-api.ts","../../../projects/cytoscape-angular/src/cytoscape-angular-ng19.ts"],"sourcesContent":["import {\n  AfterViewInit,\n  Component,\n  ElementRef,\n  Input,\n  OnChanges,\n  SimpleChanges,\n  ViewChild,\n} from '@angular/core';\nimport * as cy from 'cytoscape';\nimport cytoscape, {\n  CytoscapeOptions,\n  EdgeDefinition,\n  LayoutOptions,\n  NodeDefinition,\n  Position,\n  SelectionType,\n  Stylesheet,\n} from 'cytoscape';\n\n\n/**\n * The API is a little odd to provide flexibility.\n * EITHER bind to cyOptions (type CytoscapeOptions), to control the options yourself\n * OR this component will build a CytoscapeOptions internally by using all the other inputs.\n * If cyOptions is supplied, all other inputs are ignored.\n * The cyOptions container (HTML element) is always ignored and set internally.\n */\n@Component({\n  selector: 'cytoscape-graph',\n  template: `\n    <p-progressSpinner\n      *ngIf=\"loading\"\n      class=\"spinner\"\n      strokeWidth=\"4\"\n      fill=\"#EEEEEE\"\n      animationDuration=\".5s\"\n    ></p-progressSpinner>\n    <div #cyGraph class=\"graphWrapper\"></div>\n  `,\n  styles: [\n    `\n      .spinner {\n        position: absolute;\n        left: '350px';\n        z-index: 10;\n        width: '250px';\n        height: '250px';\n      }\n      @keyframes ui-progress-spinner-color {\n        100%,\n        0% {\n          stroke: #d62d20;\n        }\n        40% {\n          stroke: #0057e7;\n        }\n        66% {\n          stroke: #008744;\n        }\n        80%,\n        90% {\n          stroke: #ffa700;\n        }\n      }\n      .graphWrapper {\n        height: 100%;\n        width: 100%;\n      }\n    `,\n  ],\n})\nexport class CytoscapeGraphComponent implements OnChanges {\n  @ViewChild('cyGraph')\n  cyGraph: ElementRef | undefined;\n\n  @Input()\n  debug = false;\n\n  @Input()\n  nodes: NodeDefinition[] | undefined;\n  @Input()\n  edges: EdgeDefinition[] | undefined;\n\n  @Input()\n  autolock: boolean | undefined;\n  @Input()\n  autoungrabify: boolean | undefined;\n  @Input()\n  autounselectify: boolean | undefined;\n  @Input()\n  boxSelectionEnabled: boolean | undefined;\n  @Input()\n  desktopTapThreshold: number | undefined;\n  @Input()\n  hideEdgesOnViewport: boolean | undefined;\n  @Input()\n  hideLabelsOnViewport: boolean | undefined;\n  @Input()\n  layoutOptions: LayoutOptions | undefined;\n  @Input()\n  maxZoom: number | undefined;\n  @Input()\n  minZoom: number | undefined;\n  @Input()\n  motionBlur: boolean | undefined;\n  @Input()\n  motionBlurOpacity: number | undefined;\n  @Input()\n  pan: Position | undefined;\n  @Input()\n  panningEnabled: boolean | undefined;\n  @Input()\n  pixelRatio: number | 'auto' | undefined;\n  @Input()\n  selectionType: SelectionType | undefined;\n  @Input()\n  style: Stylesheet[] | undefined;\n  @Input()\n  styleEnabled: boolean | undefined;\n  @Input()\n  textureOnViewport: boolean | undefined;\n  @Input()\n  touchTapThreshold: number | undefined;\n  @Input()\n  userPanningEnabled: boolean | undefined;\n  @Input()\n  userZoomingEnabled: boolean | undefined;\n  @Input()\n  wheelSensitivity: number | undefined;\n  @Input()\n  zoom: 1 | undefined;\n  @Input()\n  zoomingEnabled: boolean | undefined;\n  @Input()\n  showToolbar = true;\n\n  cyOptions: CytoscapeOptions | undefined;\n  private cy!: cy.Core;\n  loading: boolean = false;\n\n  constructor() {}\n\n  public ngOnChanges(changes: SimpleChanges): any {\n    console.log(\n      'cytoscape graph component ngOnChanges. changes:',\n      JSON.stringify(changes)\n    );\n    if (changes['style']) {\n      console.log('changes[\"style\"]:', JSON.stringify(changes['style']));\n      this.runWhileLoading(this.updateStyles.bind(this));\n    }\n  }\n\n  public getCy() {\n    return this.cy;\n  }\n\n  public centerElements(selector) {\n    if (!this.cy) {\n      return;\n    }\n    const elems = this.cy.$(selector);\n    this.cy.center(elems);\n  }\n\n  public zoomToElement(selector: string, level = 3) {\n    let position = this.cy?.$(selector)?.position();\n    if (!position) {\n      console.warn(`Cannot zoom to ${selector}`);\n    }\n    this.cy.zoom({\n      level: level,\n      position: position,\n    });\n  }\n\n  public render() {\n    this.runWhileLoading(this.rerender.bind(this));\n  }\n\n  public runWhileLoading(f: Function) {\n    this.loading = true;\n    setTimeout(() => {\n      f();\n      setTimeout(() => {\n        this.loading = false;\n      }, 30);\n    }, 0);\n  }\n\n  private updateStyles() {\n    if (this.cy && this.style) {\n      this.cy.style(this.style);\n    }\n  }\n\n  public rerender() {\n    //TODO : this takes a heavy-handed approach, refine for performance\n    if (!this.cyGraph) {\n      console.warn(`No cyGraph found`);\n      return;\n    }\n\n    const cyOptions = this.cyOptions || {\n      // ignored, use nodes and edges\n      // elements: this.elements,\n      autolock: this.autolock,\n      autoungrabify: this.autoungrabify,\n      autounselectify: this.autounselectify,\n      boxSelectionEnabled: this.boxSelectionEnabled,\n      container: this.cyGraph.nativeElement,\n      desktopTapThreshold: this.desktopTapThreshold,\n      hideEdgesOnViewport: this.hideEdgesOnViewport,\n      hideLabelsOnViewport: this.hideLabelsOnViewport,\n      layout: this.layoutOptions,\n      maxZoom: this.maxZoom,\n      minZoom: this.minZoom,\n      motionBlur: this.motionBlur,\n      motionBlurOpacity: this.motionBlurOpacity,\n      pan: this.pan,\n      panningEnabled: this.panningEnabled,\n      pixelRatio: this.pixelRatio,\n      selectionType: this.selectionType,\n      style: this.style,\n      styleEnabled: this.styleEnabled,\n      textureOnViewport: this.textureOnViewport,\n      touchTapThreshold: this.touchTapThreshold,\n      userPanningEnabled: this.userPanningEnabled,\n      userZoomingEnabled: this.userZoomingEnabled,\n      wheelSensitivity: this.wheelSensitivity,\n      zoomingEnabled: this.zoomingEnabled,\n      zoom: this.zoom,\n    };\n    // TODO do reset() instead?\n\n    if (!this.cy) {\n      this.cy = cytoscape(cyOptions);\n    }\n    this.cy.startBatch();\n    this.cy.boxSelectionEnabled(this.boxSelectionEnabled);\n    this.cy.nodes().remove();\n    this.cy.edges().remove();\n    if (this.nodes) {\n      this.cy.add(this.nodes);\n    }\n    if (this.edges) {\n      this.cy.add(this.edges);\n    }\n    this.cy.endBatch();\n    if (this.layoutOptions) {\n      this.cy.layout(this.layoutOptions).run();\n    }\n  }\n}\n\n/*\nGradient:\n\nbackground-gradient-stop-colors : The colours of the background gradient stops (e.g. cyan magenta yellow).\nbackground-gradient-stop-positions : The positions of the background gradient stops (e.g. 0% 50% 100%). If not specified or invalid, the stops will divide equally.\nbackground-gradient-direction : For background-fill: linear-gradient, this property defines the direction of the background gradient. The following values are accepted:\nto-bottom (default)\nto-top\nto-left\nto-right\nto-bottom-right\nto-bottom-left\nto-top-right\nto-top-left\n */\n","import {\n  AnimatedLayoutOptions,\n  BoundingBox12,\n  BoundingBoxWH,\n  SortingFunction,\n} from 'cytoscape';\n\nclass BaseLayoutOptionsImpl {\n  ready(e: cytoscape.LayoutEventObject): void {\n    // tslint:disable-next-line:no-console\n    console.debug(\n      `layout ready, cytoscape.LayoutEventObject: ${JSON.stringify(e)}`\n    ); // on layoutready\n  }\n\n  stop(e: cytoscape.LayoutEventObject): void {\n    // tslint:disable-next-line:no-console\n    console.debug(\n      `layout stop, cytoscape.LayoutEventObject: ${JSON.stringify(e)}`\n    ); // on layoutstop\n  }\n}\n\nexport class NullLayoutOptionsImpl extends BaseLayoutOptionsImpl {\n  name = 'null';\n}\n\nexport class AnimateLayoutOptionsImpl\n  extends BaseLayoutOptionsImpl\n  implements AnimatedLayoutOptions\n{\n  // the zoom level to set (prob want fit = false if set)\n  zoom?: number = undefined;\n  // the pan level to set (prob want fit = false if set)\n  pan?: number = undefined;\n  // whether to transition the node positions\n  animate = false;\n  // duration of animation in ms if enabled\n  animationDuration = 500;\n  // easing of animation if enabled\n  animationEasing = undefined;\n  // a function that determines whether the node should be animated.\n  // All nodes animated by default on animate enabled.  Non-animated nodes are\n  // positioned immediately when the layout starts\n  animateFilter = (node, i) => true;\n}\n\nexport class PresetLayoutOptionsImpl extends AnimateLayoutOptionsImpl {\n  name = 'preset';\n\n  fit?: boolean;\n  padding?: number;\n\n  // map of (node id) => (position obj); or function(node){ return somPos; }\n  positions?: null;\n  // transform a given node position. Useful for changing flow direction in discrete layouts\n  transform = (node, position) => position;\n}\n\nexport class ShapedLayoutOptionsImpl extends AnimateLayoutOptionsImpl {\n  // whether to fit to viewport\n  fit = true;\n  // fit padding\n  padding = 30;\n  // constrain layout bounds\n  boundingBox?: BoundingBox12 | BoundingBoxWH | undefined = undefined;\n\n  // prevents node overlap, may overflow boundingBox if not enough space\n  avoidOverlap = true;\n\n  // Excludes the label when calculating node bounding boxes for the layout algorithm\n  nodeDimensionsIncludeLabels = false;\n  // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up\n  spacingFactor = 1.75;\n\n  // a sorting function to order the nodes; e.g. function(a, b){ return a.data('weight') - b.data('weight') }\n  sort?: SortingFunction = undefined;\n  // transform a given node position. Useful for changing flow direction in discrete layouts\n  transform = (node, position) => position;\n}\n\nexport class GridLayoutOptionsImpl extends ShapedLayoutOptionsImpl {\n  name = 'grid';\n\n  // extra spacing around nodes when avoidOverlap: true\n  avoidOverlapPadding = 10;\n  // uses all available space on false, uses minimal space on true\n  condense = false;\n  // force num of rows in the grid\n  rows?: number | undefined = undefined;\n  // force num of columns in the grid\n  cols?: number | undefined = undefined;\n  // returns { row, col } for element\n  // (node: NodeSingular) => return { row: number; col: number; }\n  position = null;\n}\n\nexport class RandomLayoutOptionsImpl extends AnimateLayoutOptionsImpl {\n  name = 'random';\n\n  fit = true;\n  padding = 20;\n  // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }\n  boundingBox: cytoscape.BoundingBox12 | cytoscape.BoundingBoxWH | undefined =\n    undefined;\n  // transform a given node position. Useful for changing flow direction in discrete layouts\n  transform = (node, position) => position;\n}\n\nexport class CircleLayoutOptionsImpl extends ShapedLayoutOptionsImpl {\n  name = 'circle';\n\n  radius?: number; // the radius of the circle\n  startAngle: number = (3 / 2) * Math.PI; // where nodes start in radians\n  sweep?: number = undefined; // how many radians should be between the first and last node (defaults to full circle)\n  clockwise?: true; // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false)\n}\n\n// Note: \"radius\" is not part of concentric, imperfect extension\nexport class ConcentricLayoutOptionsImpl {\n  name = 'concentric';\n  // how many radians should be between the first and last node (defaults to full circle)\n  sweep?: number;\n  // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false)\n  clockwise?: boolean;\n  // where nodes start in radians, e.g. 3 / 2 * Math.PI,\n  startAngle: number = (3 / 2) * Math.PI;\n  fit?: boolean;\n  nodeDimensionsIncludeLabels?: true;\n  equidistant?: false; // whether levels have an equal radial distance betwen them, may cause bounding box overflow\n  minNodeSpacing? = 10; // min spacing between outside of nodes (used for radius adjustment)\n  boundingBox?: any; // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }\n  // height of layout area (overrides container height)\n  height = null;\n  // width of layout area (overrides container width)\n  width = null;\n  // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up\n  spacingFactor?: number;\n\n  concentric(node: { degree(): number }): number {\n    return 0;\n  }\n\n  levelWidth(node: { maxDegree(): number }): number {\n    return 0;\n  }\n}\n\nexport class BreadthFirstLayoutOptionsImpl extends ShapedLayoutOptionsImpl {\n  name = 'breadthfirst';\n\n  // whether the tree is directed downwards (or edges can point in any direction if false)\n  directed = false;\n  // put depths in concentric circles if true, put depths top down if false\n  circle = false;\n  // the roots of the trees\n  roots?: string;\n  // how many times to try to position the nodes in a maximal way (i.e. no backtracking)\n  maximalAdjustments?: number;\n  // whether to shift nodes down their natural BFS depths in order to avoid upwards edges (DAGS only)\n  maximal = false;\n  grid = false; // whether to create an even grid into which the DAG is placed (circle:false only)\n  override nodeDimensionsIncludeLabels = false; // Excludes the label when calculating node bounding boxes for the layout algorithm\n}\n\nexport class CoseLayoutOptionsImpl extends ShapedLayoutOptionsImpl {\n  name = 'cose';\n\n  // The layout animates only after this many milliseconds for animate:true\n  // (prevents flashing on fast runs)\n  animationThreshold = 250;\n\n  // Number of iterations between consecutive screen positions update\n  refresh = 20;\n\n  // Randomize the initial positions of the nodes (true) or use existing positions (false)\n  randomize = false;\n\n  // Extra spacing between components in non-compound graphs\n  componentSpacing = 40;\n\n  // Node repulsion (overlapping) multiplier\n  nodeOverlap = 4;\n\n  // Nesting factor (multiplier) to compute ideal edge length for nested edges\n  nestingFactor = 1.2;\n\n  // Gravity force (constant)\n  gravity = 1;\n\n  // Maximum number of iterations to perform\n  numIter = 1000;\n\n  // Initial temperature (maximum node displacement)\n  initialTemp = 1000;\n\n  // Cooling factor (how the temperature is reduced between consecutive iterations\n  coolingFactor = 0.99;\n\n  // Lower temperature threshold (below this point the layout will end)\n  minTemp = 1.0;\n\n  // Node repulsion (non overlapping) multiplier\n  nodeRepulsion = (node) => 2048;\n\n  // Ideal edge (non nested) length\n  idealEdgeLength = (edge) => 32;\n\n  // Divisor to compute edge forces\n  edgeElasticity = (edge) => 32;\n}\n\ntype RankDir = 'LR' | 'TB';\ntype Ranker = 'network-simplex' | 'tight-tree' | 'longest-path';\n\nexport class DagreLayoutOptionsImpl extends ShapedLayoutOptionsImpl {\n  constructor() {\n    super();\n  }\n\n  name = 'dagre';\n\n  nodeSep?: number = undefined; // the separation between adjacent nodes in the same rank\n  edgeSep?: number = undefined; // the separation between adjacent edges in the same rank\n  rankSep?: number = undefined; // the separation between each rank in the layout\n  // TB for top to bottom flow, 'LR' for left to right\n  rankDir: RankDir = 'TB';\n  // Type of algorithm to assign a rank to each node in the input graph.\n  // Possible values: 'network-simplex', 'tight-tree' or 'longest-path'\n  ranker?: Ranker = undefined;\n  // number of ranks to keep between the source and target of the edge\n  minLen = (edge) => 1;\n  edgeWeight = (edge) => 1; // higher weight edges are generally made shorter and straighter than lower weight edges\n}\n","/* tslint:disable:ban-types */\nimport { AsyncValidatorFn, ValidatorFn } from '@angular/forms';\nimport { EventEmitter } from '@angular/core';\n\nexport type FieldType =\n  | 'ShapePolygonPoints'\n  | 'percent'\n  | 'NodeShape'\n  | 'LineStyle'\n  | 'TextTransformation'\n  | 'FontStyle'\n  | 'FontWeight'\n  | 'options'\n  | 'Colour'\n  | 'undefined'\n  | 'object'\n  | 'boolean'\n  | 'number'\n  | 'string'\n  | 'function'\n  | 'symbol'\n  | 'bigint';\n\nexport class FormInfo {\n  constructor(\n    public title: string,\n    public fieldsets: FieldsetInfo[],\n    public showSubmitButton = false,\n    public submitText = 'Submit',\n    public disableSubmitOnFormInvalid = false,\n    /* if the model has a property that isn't in a fieldset, but it in an fieldset created by the form */\n    public otherFieldsetTitle = null\n  ) {}\n}\n\nexport class FieldsetInfo {\n  constructor(\n    public legend: string,\n    public fieldInfos: FieldInfo[],\n    public displayOnlyIfProperties?: string[]\n  ) {}\n\n  showFieldsetForModel(model: object): boolean {\n    if (!this.displayOnlyIfProperties) {\n      return true;\n    }\n    for (const fieldInfo of this.fieldInfos) {\n      for (const modelProperty of Object.keys(model)) {\n        if (fieldInfo.modelProperty === modelProperty) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n}\n\nexport class FieldInfo {\n  private fieldTypes = {};\n  updateOn: 'change' | 'blur' | 'submit' = 'submit'; // same as AbstractControlOptions\n  asyncValidators: AsyncValidatorFn[] | Function | undefined;\n\n  constructor(\n    /* label to show the user next to the field, can be a function for i18n/dynamic labels */\n    public label?: string | Function,\n    /* The form has a model, this is the name of the property on the form's model object that this field */\n    public modelProperty?: string,\n    /* computed from the model property type by default */\n    public type?: FieldType,\n    /* The tooltip to display on hover */\n    public tooltip?: string,\n    /* The list of Angular Form Validators for the control or a function that returns such an array */\n    public validators?: ValidatorFn[] | Function,\n    /* disable the field if it's not valid */\n    public disableWhenInvalid = false,\n    /* If true and model[modelProperty] is undefined, don't create a field.*/\n    public hideWhenNoModelProperty = true,\n    /* Input only - by default the label is used as a placeholder and floats (how to downcast in a template?) */\n    public placeholder?: string,\n    /* Input only - same as HTML input (how to downcast in a template?) */\n    public inputType: string = 'text',\n    /* Input only - same as HTML input (how to downcast in a template?) */\n    public inputSize: number = 8,\n    /* Select only either an array of object or the name of a model property or function that is/returns an array of objects */\n    public options?: object[],\n    /* In an options object, what field to display to the user (or function that returns a string\n              given the option object and the model) */\n    public optionArrayLabelField?: string,\n    /* In an options object, what field to return for the value of the option\n              (or function that returns a string given the option object and the model) */\n    public optionArrayValueField?: string | Function\n  ) {}\n\n  fieldType(model: object): FieldType {\n    if (!this.modelProperty) {\n      return this.fieldTypes[0]; // Return first field type if no model property\n    }\n    const cached = this.fieldTypes[this.modelProperty];\n    if (cached) {\n      return cached;\n    } else {\n      const fieldValueType = typeof model[this.modelProperty];\n      const result = this.type\n        ? this.type\n        : this.options\n        ? 'options'\n        : fieldValueType;\n      this.fieldTypes[this.modelProperty] = result;\n      return result;\n    }\n  }\n\n  setValue(newValue: any, model: object, modelChange: EventEmitter<any>) {\n    if (!this.modelProperty) {\n      return; // cannot set values that don't have a model property\n    }\n    model[this.modelProperty] = newValue;\n    modelChange.emit({ property: this.modelProperty, value: newValue });\n  }\n}\n","import {\n  AfterViewChecked,\n  AfterViewInit,\n  Component,\n  EventEmitter,\n  Input,\n  OnChanges,\n  OnInit,\n  Output,\n  SimpleChanges,\n} from '@angular/core';\nimport {\n  AsyncValidatorFn,\n  FormControl,\n  FormGroup,\n  ValidatorFn,\n} from '@angular/forms';\nimport { FormInfo } from './form-info';\n\n@Component({\n  selector: 'cyng-fluid-form',\n  templateUrl: `./fluid-form.component.html`,\n  styleUrls: [`./fluid-form.component.scss`],\n})\nexport class FluidFormComponent\n  implements OnInit, OnChanges, AfterViewInit, AfterViewChecked\n{\n  @Input()\n  model: object | undefined;\n  @Output()\n  modelChange: EventEmitter<object> = new EventEmitter<object>();\n\n  @Input()\n  modelProperty: string | undefined;\n  @Input()\n  formInfo!: FormInfo;\n\n  formGroup!: FormGroup;\n\n  constructor() {}\n\n  ngOnInit(): void {\n    console.debug(\n      'FluidFormComponent this.formInfo:',\n      JSON.stringify(this.formInfo)\n    );\n    let controls = {};\n    this.formInfo?.fieldsets.forEach((fieldsetInfo) => {\n      fieldsetInfo.fieldInfos.forEach((fieldInfo) => {\n        if (!this.model || !fieldInfo || !fieldInfo.modelProperty) {\n          return;\n        }\n        let modelValue = this.model[fieldInfo.modelProperty];\n        // console.log('fieldInfo.modelProperty:', fieldInfo.modelProperty, ', modelValue:', modelValue)\n        const validators: ValidatorFn[] =\n          typeof fieldInfo.validators === 'function'\n            ? fieldInfo.validators()\n            : fieldInfo.validators;\n        const asyncValidators: AsyncValidatorFn[] =\n          typeof fieldInfo.asyncValidators === 'function'\n            ? fieldInfo.asyncValidators()\n            : fieldInfo.asyncValidators;\n        const { updateOn } = fieldInfo;\n        let formControl = new FormControl(modelValue, {\n          validators,\n          asyncValidators,\n          updateOn,\n        });\n        formControl.valueChanges.subscribe((change) => {\n          if (!this.model || !fieldInfo || !fieldInfo.modelProperty) {\n            return;\n          }\n          console.debug(\n            'form control change ',\n            JSON.stringify(change),\n            ' for prop ',\n            fieldInfo.modelProperty,\n            ', changing current model value ',\n            this.model[fieldInfo.modelProperty],\n            ' to ',\n            change\n          );\n          fieldInfo.setValue(change, this.model, this.modelChange);\n        });\n        controls[fieldInfo.modelProperty] = formControl;\n      });\n    });\n    this.formGroup = new FormGroup(controls);\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    console.debug('ngOnChanges fluid-form changes:', JSON.stringify(changes));\n    if (changes['model']) {\n      const model = changes['model'].currentValue;\n      for (let key of Object.keys(model)) {\n        console.debug('ngOnChanges model key copying to form:', key);\n        const control = this.formGroup?.controls[key];\n        control\n          ? control.setValue(model[key], { emitEvent: false })\n          : console.warn('no control for model key ', key);\n      }\n    }\n  }\n\n  ngAfterViewInit(): void {\n    // console.debug(\"ngAfterViewInit\")\n  }\n\n  ngAfterViewChecked(): void {\n    // console.debug(\"ngAfterViewChecked\")\n  }\n\n  onSubmit() {\n    console.log(`Form submitted`);\n  }\n}\n","<form [formGroup]=\"formGroup\" [title]=\"formInfo?.title\" (ngSubmit)=\"onSubmit()\">\n  <ng-container *ngFor=\"let fieldSetInfo of formInfo.fieldsets\">\n    <p-fieldset\n      *ngIf=\"model && fieldSetInfo.showFieldsetForModel(model)\"\n      class=\"fieldset\"\n      legend=\"{{ fieldSetInfo.legend }}\"\n    >\n      <div class=\"ui-g ui-fluid\">\n        <div\n          class=\"ui-g-12 ui-md-4 field\"\n          *ngFor=\"let fieldInfo of fieldSetInfo.fieldInfos\"\n        >\n          <div class=\"ui-inputgroup\">\n            <ng-container *ngIf=\"fieldInfo.fieldType(model) === 'boolean'\">\n              <span class=\"ui-chkbox-label\">\n                {{ fieldInfo.label }}\n              </span>\n              <p-inputSwitch\n                name=\"{{ fieldInfo.modelProperty }}\"\n                pTooltip=\"{{ fieldInfo.tooltip }}\"\n                formControlName=\"{{ fieldInfo.modelProperty }}\"\n              >\n              </p-inputSwitch>\n            </ng-container>\n            <ng-container\n              *ngIf=\"\n                fieldInfo.fieldType(model) === 'string' ||\n                fieldInfo.fieldType(model) === 'number'\n              \"\n            >\n              <span class=\"ui-float-label\">\n                <input\n                  pInputText\n                  id=\"{{ fieldInfo.modelProperty }}\"\n                  name=\"{{ fieldInfo.modelProperty }}\"\n                  formControlName=\"{{ fieldInfo.modelProperty }}\"\n                  [pTooltip]=\"fieldInfo.tooltip\"\n                  [type]=\"fieldInfo.inputType\"\n                  [size]=\"fieldInfo.inputSize\"\n                />\n                <label for=\"{{ fieldInfo.modelProperty }}\">{{\n                  fieldInfo.label\n                }}</label>\n              </span>\n            </ng-container>\n            <ng-container\n              *ngIf=\"\n                fieldInfo.fieldType(model) === 'options' &&\n                fieldInfo.options &&\n                fieldInfo.optionArrayLabelField\n              \"\n            >\n              <span class=\"ui-float-label\">\n                <p-dropdown\n                  formControlName=\"{{ fieldInfo.modelProperty }}\"\n                  [name]=\"fieldInfo.modelProperty\"\n                  [options]=\"fieldInfo.options\"\n                  [optionLabel]=\"fieldInfo.optionArrayLabelField\"\n                  [pTooltip]=\"fieldInfo.tooltip\"\n                ></p-dropdown>\n                <label for=\"{{ fieldInfo.modelProperty }}\">{{\n                  fieldInfo.label\n                }}</label>\n              </span>\n            </ng-container>\n          </div>\n        </div>\n      </div>\n    </p-fieldset>\n  </ng-container>\n</form>\n<button\n  *ngIf=\"formInfo.showSubmitButton\"\n  pButton\n  [disabled]=\"formInfo.disableSubmitOnFormInvalid && !formGroup.valid\"\n  (submit)=\"onSubmit()\"\n>\n  {{ formInfo.submitText || \"Submit\" }}\n</button>\n","import {\n  AfterViewChecked,\n  AfterViewInit,\n  Component,\n  EventEmitter,\n  HostListener,\n  Input,\n  OnChanges,\n  OnInit,\n  Output,\n  SimpleChanges,\n  ViewChild,\n} from '@angular/core';\nimport { LayoutOptions } from 'cytoscape';\nimport {\n  BreadthFirstLayoutOptionsImpl,\n  CircleLayoutOptionsImpl,\n  ConcentricLayoutOptionsImpl,\n  CoseLayoutOptionsImpl,\n  DagreLayoutOptionsImpl,\n  GridLayoutOptionsImpl,\n  NullLayoutOptionsImpl,\n  PresetLayoutOptionsImpl,\n  RandomLayoutOptionsImpl,\n} from '../layout/layout-options-impl';\nimport { FieldInfo, FieldsetInfo, FormInfo } from '../fluid-form/form-info';\n\n@Component({\n  selector: 'cytoscape-layout-tool',\n  styles: [\n    `\n      :host {\n        width: 400px;\n        height: 2em;\n      }\n\n      .layout-header {\n        width: 100%;\n        height: 20px;\n      }\n\n      .layout-dropdown {\n        padding-right: 10px;\n      }\n\n      input:disabled {\n        background-color: rgba(204, 204, 204, 0.33);\n      }\n    `,\n  ],\n  template: `\n    <div>\n      <div style=\"display: flex;\">\n        <div class=\"layout-header\">Edit Layout</div>\n      </div>\n      <p-dropdown\n        class=\"layout-dropdown\"\n        name=\"selectedLayoutInfo\"\n        [options]=\"layoutOptionsList\"\n        [(ngModel)]=\"layoutOptions\"\n        optionLabel=\"name\"\n        (ngModelChange)=\"onLayoutModelChange()\"\n      >\n        ></p-dropdown\n      >\n      <button\n        class=\"apply-button\"\n        pButton\n        label=\"Apply\"\n        [disabled]=\"!changed\"\n        (click)=\"onApplyLayout()\"\n      ></button>\n    </div>\n    <cyng-fluid-form\n      [model]=\"layoutOptions\"\n      [formInfo]=\"formInfo\"\n      (modelChange)=\"onFormModelChange()\"\n    ></cyng-fluid-form>\n  `,\n})\nexport class CytoscapeLayoutToolComponent implements OnInit, OnChanges {\n  private static LAYOUT_FORM_INFO: FormInfo =\n    CytoscapeLayoutToolComponent.createLayoutFormInfo();\n\n  @ViewChild('layoutForm') layoutForm;\n\n  _layoutOptions: any;\n  changed = false;\n\n  @Input()\n  get layoutOptions(): any {\n    return this._layoutOptions;\n  }\n  set layoutOptions(value) {\n    console.log(`set layoutOptions: ${value?.name}`);\n    this._layoutOptions = value;\n  }\n  @Output() layoutOptionsChange: EventEmitter<LayoutOptions> =\n    new EventEmitter<LayoutOptions>();\n\n  public layoutOptionsList: LayoutOptions[] = [\n    new BreadthFirstLayoutOptionsImpl(),\n    new CoseLayoutOptionsImpl(),\n    new DagreLayoutOptionsImpl(),\n    new CircleLayoutOptionsImpl(),\n    new ConcentricLayoutOptionsImpl(),\n    new GridLayoutOptionsImpl(),\n    new PresetLayoutOptionsImpl(),\n    new RandomLayoutOptionsImpl(),\n    new NullLayoutOptionsImpl(),\n  ];\n\n  formInfo!: FormInfo;\n\n  constructor() {}\n\n  ngOnInit(): void {\n    this.formInfo = CytoscapeLayoutToolComponent.createLayoutFormInfo();\n    let layoutOptionsSelect = this.layoutOptionsList[5];\n    console.log(\n      'setting the initial selected layout, default: ',\n      layoutOptionsSelect.name\n    );\n    if (this.layoutOptions) {\n      console.log(\n        `setting  the initial selected layout based on input/output layout ${JSON.stringify(\n          this.layoutOptions\n        )}`\n      );\n      this.addOrReplaceInLayoutOptionsList(this.layoutOptions);\n    }\n    console.log(\n      'Initializing this.selectedLayoutInfo with layoutOptionsSelect ',\n      JSON.stringify(layoutOptionsSelect)\n    );\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    console.log('ngOnChanges layout changes:', JSON.stringify(changes));\n    if (changes['layoutOptions']) {\n    }\n  }\n\n  onLayoutModelChange() {\n    console.log('Layout model change: ', JSON.stringify(this.layoutOptions));\n    this.changed = true;\n  }\n\n  onFormModelChange() {\n    console.log('onFormModelChange');\n    this.changed = true;\n  }\n\n  onApplyLayout() {\n    this.changed = false;\n    this.layoutOptionsChange.emit(this.layoutOptions);\n  }\n\n  private addOrReplaceInLayoutOptionsList(layoutOptions: LayoutOptions): void {\n    let matchingOptions = this.layoutOptionsList.find(\n      (selectOption) => selectOption.name === layoutOptions.name\n    );\n    if (matchingOptions) {\n      console.log(\n        'got matching layoutOptions: ',\n        JSON.stringify(matchingOptions)\n      );\n      this.layoutOptionsList.splice(\n        this.layoutOptionsList.indexOf(matchingOptions),\n        1,\n        layoutOptions\n      );\n    } else {\n      console.info(\n        `Did you pass a new kind of layout?  The layout name ${name} was not found, adding a new one to the top of the list.`\n      );\n      this.layoutOptionsList.unshift(layoutOptions);\n    }\n  }\n\n  private static createLayoutFormInfo(): FormInfo {\n    let fit = new FieldInfo(\n      'Fit',\n      'fit',\n      'boolean',\n      'Whether to fit to viewport'\n    );\n    let padding = new FieldInfo(\n      'Padding',\n      'padding',\n      'number',\n      'When fit to viewport, padding inside the viewport.'\n    );\n\n    let fitFieldset = new FieldsetInfo('Fit', [fit, padding], ['fit']);\n\n    const zoom = new FieldInfo(\n      'Zoom',\n      'zoom',\n      'number',\n      'the zoom level to set (likely want fit = false if set)'\n    );\n    const pan = new FieldInfo(\n      'Pan',\n      'pan',\n      'number',\n      'the pan level to set (likely want fit = false if set)'\n    );\n    const animate = new FieldInfo(\n      'Animate',\n      'animate',\n      'boolean',\n      'whether to transition the node positions'\n    );\n    const animationDuration = new FieldInfo(\n      'Animation Duration',\n      'animationDuration',\n      'number',\n      'duration of animation in ms if enabled'\n    );\n    const animationEasing = new FieldInfo(\n      'Animation Easing',\n      'animationEasing',\n      'number',\n      'easing of animation if enabled'\n    );\n    let animationFieldset = new FieldsetInfo(\n      'Animation',\n      [zoom, pan, animate, animationDuration, animationEasing],\n      ['animate']\n    );\n\n    let avoidOverlap = new FieldInfo(\n      'Avoid Overlap',\n      'avoidOverlap',\n      'boolean',\n      'prevents node overlap, may overflow boundingBox if not enough space'\n    );\n    let spacingFactor = new FieldInfo(\n      'Spacing Factor',\n      'spacingFactor',\n      'number',\n      'Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up'\n    );\n    let nodeDimensionsIncludeLabels = new FieldInfo(\n      'Node Dimensions Include Labels',\n      'nodeDimensionsIncludeLabels',\n      'boolean',\n      'Excludes the label when calculating node bounding boxes for the layout algorithm'\n    );\n    let shapedFieldset = new FieldsetInfo(\n      'Shaped',\n      [avoidOverlap, spacingFactor, nodeDimensionsIncludeLabels],\n      ['avoidOverlap']\n    );\n\n    let directed = new FieldInfo(\n      'Directed',\n      'breadthFirst',\n      'boolean',\n      'whether the tree is breadthFirst downwards (or edges can point in any direction if false)'\n    );\n    let circle = new FieldInfo(\n      'Circle',\n      'circle',\n      'boolean',\n      'put depths in concentric circles if true, put depths top down if false'\n    );\n    let maximalAdjustments = new FieldInfo(\n      'Maximal Adjustments',\n      'maximalAdjustments',\n      'number',\n      'how many times to try to position the nodes in a maximal way (i.e. no backtracking)'\n    );\n    let maximal = new FieldInfo(\n      'Maximal',\n      'maximal',\n      'boolean',\n      'whether to shift nodes down their natural BFS depths in order to avoid upwards edges (DAGS only)'\n    );\n    let grid = new FieldInfo(\n      'Grid',\n      'grid',\n      'boolean',\n      'whether to shift nodes down their natural BFS depths in order to avoid upwards edges (DAGS only)'\n    );\n    let roots = new FieldInfo(\n      'Roots',\n      'roots',\n      'string',\n      'the roots of the trees'\n    );\n    let breadthFirstFieldset = new FieldsetInfo(\n      'Breadth First',\n      [directed, circle, maximalAdjustments, maximal, grid, roots],\n      ['breadthFirst']\n    );\n\n    let nodeSep = new FieldInfo(\n      'Node Separation',\n      'nodeSep',\n      'number',\n      'the separation between adjacent nodes in the same rank'\n    );\n    let edgeSep = new FieldInfo(\n      'Edge Separation',\n      'edgeSep',\n      'number',\n      'the separation between adjacent edges in the same rank'\n    );\n    let rankSep = new FieldInfo(\n      'Rank Separation',\n      'rankSep',\n      'number',\n      'the separation between each rank in the layout'\n    );\n    let ranker = new FieldInfo(\n      'Ranker',\n      'ranker',\n      'options',\n      'Type of algorithm to assign a rank to each node in the input graph.'\n    );\n    ranker.options = [\n      { name: '', label: '' },\n      { name: 'network-simplex', label: 'network-simplex' },\n      { name: 'tight-tree', label: 'tight-tree' },\n      { name: 'longest-path', label: 'longest-path' },\n    ];\n\n    let dagreFieldset = new FieldsetInfo(\n      'Dagre',\n      [nodeSep, edgeSep, rankSep, ranker],\n      ['nodeSep']\n    );\n\n    let animationThreshold = new FieldInfo(\n      'Animation Threshold',\n      'animationThreshold',\n      'number',\n      'The layout animates only after this many milliseconds when animate is true (prevents flashing on fast runs)'\n    );\n    let refresh = new FieldInfo(\n      'Refresh',\n      'refresh',\n      'number',\n      'Number of iterations between consecutive screen positions update'\n    );\n    let randomize = new FieldInfo(\n      'Randomize',\n      'randomize',\n      'boolean',\n      'Randomize the initial positions of the nodes (true) or use existing positions (false)'\n    );\n    let componentSpacing = new FieldInfo(\n      'Component Spacing',\n      'componentSpacing',\n      'number',\n      'Extra spacing between components in non-compound graphs'\n    );\n    let nodeOverlap = new FieldInfo(\n      'Node Overlap',\n      'nodeOverlap',\n      'number',\n      'Node repulsion (overlapping) multiplier'\n    );\n    let nestingFactor = new FieldInfo(\n      'Nesting Factor',\n      'nestingFactor',\n      'number',\n      'Nesting factor (multiplier) to compute ideal edge length for nested edges'\n    );\n    let gravity = new FieldInfo(\n      'Gravity',\n      'gravity',\n      'number',\n      'Gravity force (constant)'\n    );\n    let numIter = new FieldInfo(\n      'Max Iterations',\n      'numIter',\n      'number',\n      'Maximum number of iterations to perform'\n    );\n    let initialTemp = new FieldInfo(\n      'Initial Temp',\n      'initialTemp',\n      'number',\n      'Initial temperature (maximum node displacement)'\n    );\n    let coolingFactor = new FieldInfo(\n      'Cooling Factor',\n      'coolingFactor',\n      'number',\n      'Cooling factor (how the temperature is reduced between consecutive iterations'\n    );\n    let minTemp = new FieldInfo(\n      'Min. Temp',\n      'minTemp',\n      'number',\n      'Lower temperature threshold (below this point the layout will end)'\n    );\n    let coseFieldset = new FieldsetInfo(\n      'COSE',\n      [\n        animationThreshold,\n        refresh,\n        randomize,\n        componentSpacing,\n        nodeOverlap,\n        nestingFactor,\n        gravity,\n        numIter,\n        initialTemp,\n        coolingFactor,\n        minTemp,\n      ],\n      ['coolingFactor']\n    );\n\n    let avoidOverlapPadding = new FieldInfo(\n      'avoidOverlapPadding',\n      'avoidOverlapPadding',\n      'number',\n      'extra spacing around nodes when avoidOverlap: true'\n    );\n    let condense = new FieldInfo(\n      'condense',\n      'condense',\n      'boolean',\n      'uses all available space on false, uses minimal space on true'\n    );\n    let rows = new FieldInfo(\n      'Rows',\n      'rows',\n      'number',\n      'force num of rows in the grid'\n    );\n    let cols = new FieldInfo(\n      'Columns',\n      'cols',\n      'number',\n      'force num of columns in the grid'\n    );\n\n    let gridFieldset = new FieldsetInfo(\n      'Grid',\n      [avoidOverlapPadding, condense, rows, cols],\n      ['cols']\n    );\n\n    let radius = new FieldInfo(\n      'Radius',\n      'radius',\n      'number',\n      'the radius of the circle'\n    );\n    let startAngle = new FieldInfo(\n      'Start Angle',\n      'startAngle',\n      'number',\n      'where nodes start in radians (default:3 / 2 * Math.PI)'\n    );\n    let sweep = new FieldInfo(\n      'Sweep',\n      'sweep',\n      'number',\n      'how many radians should be between the first and last node (defaults to full circle)'\n    );\n    let clockwise = new FieldInfo(\n      'Clockwise',\n      'clockwise',\n      'number',\n      'whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false)'\n    );\n    let circularFieldSet = new FieldsetInfo(\n      'Circular',\n      [radius, startAngle, sweep, clockwise],\n      ['clockwise']\n    );\n\n    let equidistant = new FieldInfo(\n      'Equidistant',\n      'equidistant',\n      'boolean',\n      'whether levels have an equal radial distance betwen them, may cause bounding box overflow'\n    );\n    let minNodeSpacing = new FieldInfo(\n      'Min. Node Spacing',\n      'minNodeSpacing',\n      'number',\n      'min spacing between outside of nodes (used for radius adjustment)'\n    );\n    let height = new FieldInfo('Height', 'height', 'number', '');\n    let width = new FieldInfo('Width', 'width', 'number', '');\n    let concentricFieldSet = new FieldsetInfo(\n      'Concentric',\n      [equidistant, minNodeSpacing, startAngle, height, width],\n      ['equidistant']\n    );\n\n    //boundingBox: undefined // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }\n\n    return new FormInfo(\n      'Layout',\n      [\n        breadthFirstFieldset,\n        coseFieldset,\n        dagreFieldset,\n        gridFieldset,\n        circularFieldSet,\n        concentricFieldSet,\n        fitFieldset,\n        animationFieldset,\n        shapedFieldset,\n      ],\n      false\n    );\n  }\n}\n/*\n    <!--\n\n      Dagre\n        // Type of algorithm to assign a rank to each node in the input graph.\n        // Possible values:\n        c = undefined\n        // number of ranks to keep between the source and target of the edge\n        minLen = ( edge ) => { return 1 }\n        edgeWeight = ( edge ) => { return 1 } // higher weight edges are generally made shorter and straighter than lower weight edges\n\n    AnimateLayoutOptionsImpl\n      // a function that determines whether the node should be animated.\n      // All nodes animated by default on animate enabled.  Non-animated nodes are\n      // positioned immediately when the layout starts\n      animateFilter = ( node, i ) => true\n\n      Preset\n      // map of (node id) => (position obj); or function(node){ return somPos; }\n      positions: undefined\n\n      Shaped\n        // constrain layout bounds\n        boundingBox?: BoundingBox12 | BoundingBoxWH | undefined = undefined\n\n        // a sorting function to order the nodes; e.g. function(a, b){ return a.data('weight') - b.data('weight') }\n        sort?: SortingFunction = undefined\n        // transform a given node position. Useful for changing flow direction in discrete layouts\n        transform = (node, position ) => position\n\n      //Grid\n        // returns { row, col } for element\n        // (node: NodeSingular) => return { row: number; col: number; }\n        position = undefined\n\n      //Random\n        // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }\n        boundingBox: cytoscape.BoundingBox12 | cytoscape.BoundingBoxWH | undefined = undefined\n        // transform a given node position. Useful for changing flow direction in discrete layouts\n        transform = (node, position ) => position\n\n      //Circular\n      //Conecntric\n        concentric(node: { degree(): number }): number {\n          eturn 0\n        }\n\n        levelWidth(node: { maxDegree(): number }): number {\n          return 0\n        }\n\n        Breadth First\n\n         CoseLayoutOptionsImpl\n\n          // Node repulsion (non overlapping) multiplier\n          nodeRepulsion =  function( node ){ return 2048 }\n\n          // Ideal edge (non nested) length\n          idealEdgeLength = ( edge ) => { return 32 }\n\n          // Divisor to compute edge forces\n          edgeElasticity = ( edge ) => 32\n\n    -->\n */\n","import { StylesheetStyle } from 'cytoscape';\nimport {\n  FieldInfo,\n  FieldsetInfo,\n  FieldType,\n  FormInfo,\n} from '../fluid-form/form-info';\n\nclass StyleFieldInfo extends FieldInfo {\n  constructor(\n    styleName: string,\n    type: FieldType,\n    hint: string,\n    options?: object[]\n  ) {\n    super(styleName, styleName, type, hint);\n    this.options = options;\n  }\n\n  override fieldType(model: object): FieldType {\n    switch (this.type) {\n      case 'percent':\n        return 'number';\n      case 'ShapePolygonPoints':\n      case 'NodeShape':\n      case 'LineStyle':\n      case 'TextTransformation':\n      case 'FontStyle':\n      case 'FontWeight':\n      case 'Colour':\n        return 'string';\n      default:\n        return super.fieldType(model);\n    }\n  }\n}\n\nexport function createStyleCoreFormInfo() {\n  return new FormInfo(\n    'Core Styles',\n    [\n      new FieldsetInfo('Background', [\n        new StyleFieldInfo(\n          'active-bg-color',\n          'Colour',\n          'The colour of the indicator shown when the background is grabbed by the user.'\n        ),\n        new StyleFieldInfo(\n          'active-bg-opacity',\n          'number',\n          'The opacity of the active background indicator.'\n        ),\n        new StyleFieldInfo(\n          'active-bg-size',\n          'number',\n          'The size of the active background indicator..'\n        ),\n      ]),\n\n      new FieldsetInfo('Selection Box', [\n        new StyleFieldInfo(\n          'selection-box-color',\n          'Colour',\n          'The background colour of the selection box used for drag selection.'\n        ),\n        new StyleFieldInfo(\n          'selection-box-border-color',\n          'Colour',\n          'The colour of the border of the selection box used for drag selection.'\n        ),\n        new StyleFieldInfo(\n          'selection-box-border-width',\n          'number',\n          'The size of the border on the selection box.'\n        ),\n        new StyleFieldInfo(\n          'selection-box-opacity',\n          'number',\n          'The opacity of the selection box.'\n        ),\n        new StyleFieldInfo('', 'number', ''),\n      ]),\n      new FieldsetInfo('Texture During Viewport Gestures', [\n        new StyleFieldInfo(\n          'outside-texture-bg-color',\n          'Colour',\n          'The colour of the area outside the viewport texture when initOptions.textureOnViewport === true.'\n        ),\n        new StyleFieldInfo(\n          'outside-texture-bg-opacity',\n          'number',\n          'The opacity of the area outside the viewport texture.'\n        ),\n      ]),\n    ],\n    false\n  );\n}\n\nfunction fieldSorter(field1: FieldInfo, field2: FieldInfo): number {\n  if (!field1) {\n    return field2 ? 1 : 0;\n  } else if (!field2) {\n    return -1;\n  } else {\n    const label1 =\n      typeof field1.label === 'function' ? field1.label() : field1.label;\n    const label2 =\n      typeof field2.label === 'function' ? field2.label() : field2.label;\n    return label1.localeCompare(label2);\n  }\n}\n\nexport function createStyleEdgeFieldSets() {\n  const fieldsetInfos: FieldsetInfo[] = [];\n  return fieldsetInfos;\n}\n\nexport function createStyleNodeFieldSets() {\n  const fieldsetInfos: FieldsetInfo[] = [];\n\n  let nodeFieldInfos: FieldInfo[] = [];\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'label',\n      'string',\n      'The text to display for an element’s label.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'source-label',\n      'string',\n      'The text to display for a node’s source label.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'target-label',\n      'string',\n      'The text to display for a node’s target label.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo('color', 'Colour', 'The colour of the element’s label.')\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'font-family',\n      'string',\n      'A comma-separated list of font names to use on the label text.'\n    )\n  );\n  /**\n   * https://developer.mozilla.org/en-US/docs/Web/CSS/font-family\n   */\n  nodeFieldInfos.push(\n    new StyleFieldInfo('font-size', 'string', 'The size of the label text.')\n  );\n  /**\n   * https://developer.mozilla.org/en-US/docs/Web/CSS/font-style\n   */\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'font-style',\n      'FontStyle',\n      'A CSS font style to be applied to the label text.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'font-weight',\n      'FontWeight',\n      'A CSS font weight to be applied to the label text.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-max-width',\n      'string',\n      'The maximum width for wrapped text, applied when \"text-wrap\" is set to wrap. For only manual newlines (i.e.\\\\n), set a very large value like 1000px such that only your newline characters would apply.'\n    )\n  );\n  let textWrapStyleFieldInfo = new StyleFieldInfo(\n    'text-wrap',\n    'options',\n    'A wrapping style to apply to the label text; may be \"none\" for no wrapping (including manual newlines ) or \"wrap\" for manual and/ or autowrapping.'\n  );\n  textWrapStyleFieldInfo.options = [\n    { label: 'none', value: 'none' },\n    { label: 'wrap', value: 'wrap' },\n    { label: 'ellipsis', value: 'ellipsis' },\n  ];\n  nodeFieldInfos.push(textWrapStyleFieldInfo);\n  /**\n   * Node label alignment:\n   */\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-halign',\n      'options',\n      'The vertical alignment of a node’s label.',\n      [\n        { name: '', label: '' },\n        { label: 'left', value: 'left' },\n        { label: 'center', value: 'center' },\n        { labe: 'right', value: 'right' },\n      ]\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-valign',\n      'options',\n      'The vertical alignment of a node’s label.',\n      [\n        { name: '', label: '' },\n        { label: 'top', value: 'top' },\n        { label: 'center', value: 'center' },\n        { label: 'bottom', value: 'bottom' },\n      ]\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-opacity',\n      'number',\n      'The opacity of the label text, including its outline.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-transform',\n      'TextTransformation',\n      'A transformation to apply to the label text.'\n    )\n  );\n  fieldsetInfos.push(new FieldsetInfo('Label', nodeFieldInfos));\n  nodeFieldInfos = [];\n\n  nodeFieldInfos.push(\n    new StyleFieldInfo('content', 'string', 'The CSS content field')\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'width',\n      'string',\n      'The width of the node’s body. This property can take on the special value label so the width is automatically based on the node’s label.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'height',\n      'string',\n      'The height of the node’s body. This property can take on the special value label so the height is automatically based on the node’s label.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'background-color',\n      'Colour',\n      'The colour of the node’s body.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'background-blacken',\n      'number',\n      '   Blackens the node’s body for values from 0 to 1; whitens the node’s body for values from 0 to -1.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'background-opacity',\n      'number',\n      'The opacity level of the node’s background colour.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'border-width',\n      'string',\n      'The size of the node’s border.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'border-style',\n      'LineStyle',\n      'The style of the node’s border.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'border-color',\n      'Colour',\n      'The colour of the node’s border.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'border-opacity',\n      'percent',\n      'The opacity of the node’s border. A value between [0 1].'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo('shape', 'NodeShape', 'The shape of the node’s body.')\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo('shape-polygon-points', 'ShapePolygonPoints', '')\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'overlay-color',\n      'Colour',\n      'The colour of the overlay on top of nodes or edges.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'overlay-padding',\n      'string',\n      'The area outside of the element within which the overlay is shown.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'overlay-opacity',\n      'number',\n      'The opacity of the overlay.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'padding-left',\n      'string',\n      \"   Padding increases node dimensions by adding spacing around the label of nodes whose heights and widths are the value 'label', or it can be used to add spacing between a compound node parent and its children.\"\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'padding-right',\n      'string',\n      \"   Padding increases node dimensions by adding spacing around the label of nodes whose heights and widths are the value 'label', or it can be used to add spacing between a compound node parent and its children.\"\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'padding-top',\n      'string',\n      \"   Padding increases node dimensions by adding spacing around the label of nodes whose heights and widths are the value 'label', or it can be used to add spacing between a compound node parent and its children.\"\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'padding-bottom',\n      'string',\n      \"   Padding increases node dimensions by adding spacing around the label of nodes whose heights and widths are the value 'label', or it can be used to add spacing between a compound node parent and its children.\"\n    )\n  );\n  fieldsetInfos.push(new FieldsetInfo('Node', nodeFieldInfos));\n  nodeFieldInfos = [];\n\n  /**\n   * Edge label alignment:\n   */\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'source-text-offset',\n      'number',\n      'For the source label of an edge, how far from the source node the label should be placed.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'target-text-offset',\n      'number',\n      'For the target label of an edge, how far from the target node the label should be placed.'\n    )\n  );\n  /**\n   * Margins:\n   */\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-margin-x',\n      'number',\n      'A margin that shifts the label along the x- axis.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-margin-y',\n      'number',\n      'A margin that shifts the label along the y- axis.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'source-text-margin-x',\n      'number',\n      '(For the source label of an edge.)'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'source-text-margin-y',\n      'number',\n      '(For the source label of an edge.)'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'target-text-margin-x',\n      'number',\n      '(For the target label of an edge.)'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'target-text-margin-y',\n      'number',\n      '(For the target label of an edge.)'\n    )\n  );\n  /**\n   * Rotating text:\n   */\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-rotation',\n      'number',\n      'A rotation angle that is applied to the label. For edges, the special value autorotate can be used to align the label to the edge. For nodes, the label is rotated along its anchor point on the node, so a label margin may help for some usecases. The special value none can be used to denote 0deg. Rotations works best with left- to - right text.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'source-text-rotation',\n      'number',\n      '(For the source label of an edge.)'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'target-text-rotation',\n      'number',\n      '(For the target label of an edge.)'\n    )\n  );\n  /**\n   * Outline:\n   */\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-outline-color',\n      'Colour',\n      'The colour of the outline around the element’s label text.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-outline-opacity',\n      'number',\n      'The opacity of the outline on label text.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-outline-width',\n      'string',\n      'The size of the outline on label text.'\n    )\n  );\n  /**\n   * Shadow:\n   */\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-shadow-blur',\n      'number',\n      'The shadow blur distance.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-shadow-color',\n      'Colour',\n      'The colour of the shadow.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-shadow-offset-x',\n      'number',\n      'The x offset relative to the text where the shadow will be displayed, can be negative.  If you set blur to 0, add an offset to view your shadow.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-shadow-offset-y',\n      'number',\n      'The y offset relative to the text where the shadow will be displayed, can be negative.  If you set blur to 0, add an offset to view your shadow.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-shadow-opacity',\n      'number',\n      'The opacity of the shadow on the text; the shadow is disabled for 0 (default value).'\n    )\n  );\n  /**\n   * Background:\n   */\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-background-padding',\n      'string',\n      'The padding provides visual spacing between the text and the edge of the background.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-background-color',\n      'Colour',\n      'A colour to apply on the text background.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-background-opacity',\n      'number',\n      'The opacity of the label background; the background is disabled for 0 (default value).'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-background-shape',\n      'options',\n      'The shape to use for the label background.',\n      [\n        { name: '', label: '' },\n        { label: 'rectangle', value: 'rectangle' },\n        { label: 'roundrectangle', value: 'roundrectangle' },\n      ]\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-border-opacity',\n      'number',\n      'The width of the border around the label; the border is disabled for 0 (default value).'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-border-width',\n      'number',\n      'The width of the border around the label.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-border-style',\n      'LineStyle',\n      'The style of the border around the label.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-border-color',\n      'Colour',\n      'The colour of the border around the label.'\n    )\n  );\n  fieldsetInfos.push(new FieldsetInfo('Advanced Text', nodeFieldInfos));\n  nodeFieldInfos = [];\n\n  /**\n   * Interactivity:\n   */\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'min-zoomed-font-size',\n      'number',\n      'If zooming makes the effective font size of the label smaller than this, then no label is shown.Note that because of performance optimisations, the label may be shown at font sizes slightly smaller than this value. This effect is more pronounced at larger screen pixel ratios. However, it is guaranteed that the label will be shown at sizes equal to or greater than the value specified.'\n    )\n  );\n  nodeFieldInfos.push(\n    new StyleFieldInfo(\n      'text-events',\n      'options',\n      'Whether events should occur on an element if the label receives an event. You may want a style applied to the text onactive so you know the text is activatable.',\n      [\n        { label: 'yes', value: 'yes' },\n        { label: 'no', value: 'no' },\n      ]\n    )\n  );\n  fieldsetInfos.push(new FieldsetInfo('Interactivity', nodeFieldInfos));\n  return fieldsetInfos;\n}\n\n/**\n * Defaults to a blank node\n */\nexport class StylesheetImpl implements StylesheetStyle {\n  constructor(\n    public selector: string = 'node',\n    public style:\n      | cytoscape.Css.Node\n      | cytoscape.Css.Edge\n      | cytoscape.Css.Core = {}\n  ) {}\n}\n","import {\n  AfterViewChecked,\n  AfterViewInit,\n  Component,\n  EventEmitter,\n  HostListener,\n  Input,\n  OnChanges,\n  OnInit,\n  Output,\n  SimpleChanges,\n  ViewChild,\n} from '@angular/core';\nimport { Stylesheet, StylesheetStyle } from 'cytoscape';\nimport { FieldInfo, FieldsetInfo, FormInfo } from '../fluid-form/form-info';\nimport {\n  createStyleCoreFormInfo,\n  createStyleEdgeFieldSets,\n  createStyleNodeFieldSets,\n  StylesheetImpl,\n} from '../style/style';\n\n@Component({\n  selector: 'cytoscape-style-tool',\n  template: `\n    <div>\n      <div style=\"display: flex;\">\n        <h3 class=\"style-header\">Edit Styles</h3>\n      </div>\n      <div class=\"selectors-container\">\n        <button\n          class=\"add-button\"\n          pButton\n          label=\"&nbsp;&nbsp;Add&nbsp;&nbsp;\"\n          [disabled]=\"!enableAdd\"\n          (click)=\"onAddSelector()\"\n        ></button>\n        <span>&nbsp;&nbsp;</span>\n        <label for=\"selectorDropDown\"\n          ><a href=\"https://js.cytoscape.org/#selectors\">Selectors</a></label\n        >\n        <p-autoComplete\n          #selectorDropDown\n          id=\"selectorDropDown\"\n          class=\"selector-drop-down\"\n          placeholder=\"Selector\"\n          [(ngModel)]=\"selectedStyleSheet\"\n          [suggestions]=\"selectors || []\"\n          field=\"selector\"\n          dataKey=\"selector\"\n          [completeOnFocus]=\"true\"\n          [dropdown]=\"true\"\n          [autofocus]=\"true\"\n          [style]=\"{ width: '70%' }\"\n          [inputStyle]=\"{ width: '70%' }\"\n          (completeMethod)=\"search($event)\"\n          (ngModelChange)=\"onSelectorModelChange($event)\"\n        >\n        </p-autoComplete>\n      </div>\n    </div>\n    <hr />\n    <div class=\"apply-div\">\n      <button\n        class=\"apply-button\"\n        pButton\n        label=\"Apply\"\n        [disabled]=\"!changed\"\n        (click)=\"onApplyStyle()\"\n      ></button>\n      <span class=\"selector-span\">Selector </span\n      ><span>{{ selectedStyleSheet?.selector }}</span>\n    </div>\n    <ng-container *ngIf=\"!selectedStyleSheet\">\n      <div>\n        Please select a\n        <a href=\"https://js.cytoscape.org/#selectors\">selector</a> above or type\n        a selector name and click \"Add\" to create a new stylesheet for that\n        selector.\n      </div>\n    </ng-container>\n    <ng-container *ngIf=\"selectedStyleSheet?.selector?.startsWith('node')\">\n      <cyng-fluid-form\n        [model]=\"selectedStyleSheet?.style\"\n        [formInfo]=\"nodeFormInfo\"\n        (modelChange)=\"onFormModelChange()\"\n      >\n      </cyng-fluid-form>\n    </ng-container>\n    <ng-container *ngIf=\"selectedStyleSheet?.selector?.startsWith('edge')\">\n      <cyng-fluid-form\n        [model]=\"selectedStyleSheet?.style\"\n        [formInfo]=\"edgeFormInfo\"\n        (modelChange)=\"onFormModelChange()\"\n      >\n      </cyng-fluid-form>\n    </ng-container>\n    <ng-container *ngIf=\"selectedStyleSheet?.selector?.startsWith('core')\">\n      <cyng-fluid-form\n        [model]=\"selectedStyleSheet?.style\"\n        [formInfo]=\"coreFormInfo\"\n        (modelChange)=\"onFormModelChange()\"\n      >\n      </cyng-fluid-form>\n    </ng-container>\n  `,\n  styles: [\n    `\n      .selectors-container {\n        display: flex;\n        align-items: baseline;\n        flex-wrap: nowrap;\n        flex-grow: 0;\n      }\n\n      label[for='selectorDropDown'] {\n        font-size: 125%;\n        font-weight: bold;\n      }\n\n      .selector-drop-down {\n        flex-grow: 1;\n        padding: 10px;\n      }\n\n      .selector-span {\n        padding: 10px;\n        font-size: 125%;\n        font-weight: bold;\n      }\n      .add-button {\n      }\n      .apply-button {\n      }\n    `,\n  ],\n})\nexport class CytoscapeStyleToolComponent\n  implements OnInit, OnChanges, AfterViewInit, AfterViewChecked\n{\n  @ViewChild('styleForm') styleForm;\n  @ViewChild('selectorDropDown') selectorDropDown;\n\n  _styles: StylesheetStyle[] | undefined;\n  enableAdd = false;\n  private lastValidSelectorModelText: string | undefined;\n\n  @Input()\n  get styles(): StylesheetStyle[] | undefined {\n    return this._styles;\n  }\n  set styles(styles: StylesheetStyle[] | undefined) {\n    this._styles = styles;\n  }\n  @Output()\n  stylesChange: EventEmitter<StylesheetStyle[]> = new EventEmitter<\n    StylesheetStyle[]\n  >();\n\n  @Output()\n  styleSelectorChange: EventEmitter<string> = new EventEmitter<string>();\n\n  nodeFormInfo!: FormInfo;\n  edgeFormInfo!: FormInfo;\n  coreFormInfo!: FormInfo;\n\n  selectedStyleSheet: StylesheetStyle | undefined;\n  selectors: StylesheetStyle[] | undefined;\n  changed = false;\n\n  constructor() {}\n\n  ngOnInit(): void {\n    this.coreFormInfo = createStyleCoreFormInfo();\n    this.nodeFormInfo = new FormInfo('Node', createStyleNodeFieldSets());\n    this.edgeFormInfo = new FormInfo('Edge', createStyleEdgeFieldSets());\n    if (!this.styles) {\n      this.styles = [new StylesheetImpl()];\n    }\n    this.setSelectorsFromStyles(null);\n    if (this.selectors && this.selectors.length > 0) {\n      this.selectedStyleSheet = this.selectors[0];\n      console.log(`this.selectors.length:`, this.selectors.length);\n    }\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    console.log('ngOnChanges style changes:', JSON.stringify(changes));\n    if (changes['styles']) {\n      this.setSelectorsFromStyles(null);\n      if (this.selectors && this.selectors.length > 0) {\n        this.selectedStyleSheet = this.selectors[0];\n        console.log(\n          `styles updated this.selectors.length:`,\n          this.selectors.length\n        );\n      }\n    }\n  }\n\n  ngAfterViewInit(): void {\n    // console.debug(\"ngAfterViewInit\")\n  }\n\n  ngAfterViewChecked(): void {\n    // console.debug(\"ngAfterViewChecked\")\n  }\n\n  onFormModelChange() {\n    console.log('onFormModelChange');\n    this.changed = true;\n  }\n\n  onApplyStyle() {\n    this.changed = false;\n    this.stylesChange.emit(this.styles);\n  }\n\n  search(event) {\n    let searchString = event.query;\n    this.setSelectorsFromStyles(searchString);\n  }\n\n  private setSelectorsFromStyles(searchString: string | null) {\n    this.selectors = this.styles?.filter((stylesheet: StylesheetStyle) => {\n      return searchString ? stylesheet.selector.includes(searchString) : true;\n    });\n  }\n\n  onAddSelector() {\n    const newStylesheetStyle: StylesheetStyle = new StylesheetImpl();\n    newStylesheetStyle.selector = this.lastValidSelectorModelText || '';\n    console.log(\n      'Adding new style with selector:',\n      this.lastValidSelectorModelText\n    );\n    this.styles?.unshift(newStylesheetStyle);\n    this.selectedStyleSheet = newStylesheetStyle;\n  }\n\n  /*\n   * The param can be a selector object when the user selects a stylesheet entry from the dropdown and changes the\n   * selection (which will fire a selection change to let the graph, say, focus on the selected node).\n   * or the param is text if the user is just typing in the field, which doens't change the selector untl the user\n   * clicks Add.\n   */\n  onSelectorModelChange(param: any) {\n    console.log(`selectorModelChanged:${JSON.stringify(param)}`);\n    const selector = param.selector ? param.selector : param;\n    const stylesheet = param.selector\n      ? param\n      : this.getStylesheetForSelector(selector);\n    if (stylesheet) {\n      if (this.changed) {\n        this.onApplyStyle();\n      }\n      this.styleSelectorChange.emit(selector);\n    } else {\n      this.enableAdd = this.isValidSelector(selector);\n      if (this.enableAdd) {\n        this.lastValidSelectorModelText = selector;\n      } else {\n        this.lastValidSelectorModelText = undefined;\n      }\n    }\n  }\n\n  getStylesheetForSelector(selectorName): Stylesheet | undefined {\n    const stylesheet = this.selectors?.find(\n      (selector) => selector.selector === selectorName\n    );\n    return stylesheet;\n  }\n\n  isValidSelector(text: string) {\n    console.log('isValidSelector:', text);\n    if (\n      text?.startsWith('node') ||\n      text?.startsWith('edge') ||\n      text?.startsWith('core')\n    ) {\n      const openBracket = text.indexOf('[');\n      if (openBracket > -1) {\n        if (text.indexOf(']') < openBracket) {\n          return false;\n        }\n      }\n      const openQuote = text.indexOf(\"'\");\n      if (openQuote > -1) {\n        let closeQuote = text.indexOf(\"'\", openQuote + 1);\n        if (closeQuote < openQuote) {\n          return false;\n        }\n      }\n      return true;\n    }\n    return false;\n  }\n}\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport {\n  EdgeDefinition,\n  LayoutOptions,\n  NodeDefinition,\n  Stylesheet,\n  StylesheetStyle,\n} from 'cytoscape';\n@Component({\n  // tslint:disable-next-line:component-selector\n  selector: 'cytoscape-graph-toolbar',\n  template: `\n    <div\n      class=\"toolbar-container\"\n      [class.row-layout]=\"direction === 'row'\"\n      [class.column-layout]=\"direction === 'column'\"\n    >\n      <p-overlayPanel\n        #layoutToolbaroverlay\n        [dismissable]=\"true\"\n        [showCloseIcon]=\"true\"\n      >\n        <ng-template pTemplate>\n          <cytoscape-layout-tool\n            [(layoutOptions)]=\"layoutOptions\"\n          ></cytoscape-layout-tool>\n        </ng-template>\n      </p-overlayPanel>\n      <p-button\n        *ngIf=\"showToolbarButtons\"\n        label=\"{{ layoutOptions?.name | titlecase }} Layout\"\n        [class.max-button-width]=\"direction === 'column'\"\n        pTooltip=\"Layout Settings...\"\n        icon=\"pi pi-sliders-v\"\n        (click)=\"layoutToolbaroverlay.toggle($event)\"\n      ></p-button>\n      <p-overlayPanel\n        #styleToolbaroverlay\n        [dismissable]=\"true\"\n        [showCloseIcon]=\"true\"\n      >\n        <ng-template pTemplate>\n          <cytoscape-style-tool\n            [(styles)]=\"styles\"\n            (stylesChange)=\"onStylesChange($event)\"\n            (styleSelectorChange)=\"onStyleSelectorChange($event)\"\n          ></cytoscape-style-tool>\n        </ng-template>\n      </p-overlayPanel>\n      <p-button\n        *ngIf=\"showToolbarButtons\"\n        [class.max-button-width]=\"direction === 'column'\"\n        label=\"Style\"\n        pTooltip=\"Styling...\"\n        icon=\"pi pi-palette\"\n        (click)=\"styleToolbaroverlay.toggle($event)\"\n      >\n      </p-button>\n      <span class=\"graph-data\" *ngIf=\"nodes\"\n        >{{ nodes.length }} Nodes &nbsp;</span\n      >\n      <span class=\"graph-data\" *ngIf=\"edges\">{{ edges.length }} Edges</span>\n    </div>\n  `,\n  styles: [\n    `\n      .toolbar-container {\n        display: flex;\n      }\n\n      .row-layout {\n        flex-direction: row;\n        align-items: center;\n        padding-bottom: 4px;\n      }\n\n      .column-layout {\n        flex-direction: column;\n        align-items: stretch;\n        justify-content: flex-start;\n        padding-left: 4px;\n      }\n\n      p-button {\n        padding-bottom: 4px;\n        padding-right: 4px;\n      }\n    `,\n  ],\n})\nexport class CytoscapeGraphToolbarComponent implements OnInit {\n  @Input()\n  nodes: NodeDefinition[] | undefined;\n  @Input()\n  edges: EdgeDefinition[] | undefined;\n  @Input()\n  direction: 'column' | 'row' = 'row';\n\n  #_layoutOptions: LayoutOptions | undefined;\n  @Input()\n  get layoutOptions(): LayoutOptions | undefined {\n    return this.#_layoutOptions;\n  }\n  set layoutOptions(value) {\n    console.log(\n      `Graph toolbar gets new layout options ${JSON.stringify(value)}`\n    );\n    this.#_layoutOptions = value;\n    this.layoutOptionsChange.emit(this.#_layoutOptions);\n  }\n  @Output() layoutOptionsChange: EventEmitter<LayoutOptions> =\n    new EventEmitter<LayoutOptions>();\n\n  #_styles: StylesheetStyle[] | undefined;\n  @Input()\n  get styles(): StylesheetStyle[] | undefined {\n    return this.#_styles;\n  }\n  set styles(styles: StylesheetStyle[]) {\n    this.#_styles = styles;\n    this.stylesChange.emit(this.#_styles);\n  }\n  @Output() stylesChange: EventEmitter<StylesheetStyle[]> = new EventEmitter<\n    StylesheetStyle[]\n  >();\n\n  @Output() styleSelectorChange: EventEmitter<string> =\n    new EventEmitter<string>();\n\n  @Input()\n  showLayoutToolbarButton!: boolean;\n  @Input()\n  showStyleToolbarButton!: boolean;\n  @Input()\n  showToolbarButtons!: boolean;\n\n  constructor() {}\n\n  ngOnInit(): void {}\n\n  onStyleSelectorChange(selector: string) {\n    console.log(`onStyleSelectorChange: selector`);\n    this.styleSelectorChange.emit(selector);\n  }\n\n  onStylesChange(stylesheet: cytoscape.StylesheetStyle[]) {\n    console.log(`onStylesChange`);\n    this.styles = stylesheet;\n  }\n}\n","import { NgModule } from '@angular/core'\nimport { CytoscapeGraphComponent } from './cytoscape-graph.component'\nimport { CytoscapeGraphToolbarComponent } from './cytoscape-graph-toolbar/cytoscape-graph-toolbar.component'\nimport { AutoCompleteModule } from 'primeng/autocomplete'\nimport {  ButtonModule } from 'primeng/button'\nimport {  DropdownModule } from 'primeng/dropdown'\nimport {  FieldsetModule } from 'primeng/fieldset'\nimport {  InputSwitchModule } from 'primeng/inputswitch'\nimport { InputTextModule } from 'primeng/inputtext'\nimport {  OverlayPanelModule } from 'primeng/overlaypanel'\nimport { ProgressBarModule } from 'primeng/progressbar'\nimport { ProgressSpinnerModule } from 'primeng/progressspinner'\nimport { SpinnerModule  } from 'primeng/spinner'\nimport {  TooltipModule } from 'primeng/tooltip'\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms'\nimport { CytoscapeLayoutToolComponent } from './cytoscape-layout-tool/cytoscape-layout-tool.component'\nimport { CommonModule } from '@angular/common'\nimport { CytoscapeStyleToolComponent } from './cytoscape-style-tool/cytoscape-style-tool.component'\nimport { FluidFormComponent } from './fluid-form/fluid-form.component'\n\n@NgModule({\n  declarations: [\n    CytoscapeGraphComponent,\n    CytoscapeGraphToolbarComponent,\n    CytoscapeLayoutToolComponent,\n    CytoscapeStyleToolComponent,\n    FluidFormComponent\n  ],\n  imports: [\n    CommonModule,\n    FormsModule,\n    ReactiveFormsModule,\n    ButtonModule,\n    CommonModule,\n    DropdownModule,\n    FieldsetModule,\n    InputSwitchModule,\n    InputTextModule,\n    OverlayPanelModule,\n    ProgressBarModule,\n    ProgressSpinnerModule,\n    TooltipModule,\n    SpinnerModule,\n    AutoCompleteModule\n  ],\n  exports: [\n    CytoscapeGraphComponent,\n    CytoscapeGraphToolbarComponent,\n    CytoscapeLayoutToolComponent,\n    CytoscapeStyleToolComponent\n  ]\n})\nexport class CytoscapeAngularModule { }\n","/*\n * Public API Surface of cytoscape-angular\n */\n\nexport * from './lib/cytoscape-graph.component'\nexport * from './lib/cytoscape-graph-toolbar/cytoscape-graph-toolbar.component'\nexport * from './lib/cytoscape-layout-tool/cytoscape-layout-tool.component'\nexport * from './lib/cytoscape-style-tool/cytoscape-style-tool.component'\nexport * from './lib/fluid-form/fluid-form.component'\nexport * from './lib/fluid-form/form-info'\nexport * from './lib/layout/layout-options-impl'\nexport * from './lib/cytoscape-angular.module'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i1","i3","i4.FluidFormComponent","i4","i5.FluidFormComponent","i5","i6.CytoscapeLayoutToolComponent","i7.CytoscapeStyleToolComponent"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA;;;;;;AAMG;MA6CU,uBAAuB,CAAA;AAElC,IAAA,OAAO,CAAyB;IAGhC,KAAK,GAAG,KAAK,CAAC;AAGd,IAAA,KAAK,CAA+B;AAEpC,IAAA,KAAK,CAA+B;AAGpC,IAAA,QAAQ,CAAsB;AAE9B,IAAA,aAAa,CAAsB;AAEnC,IAAA,eAAe,CAAsB;AAErC,IAAA,mBAAmB,CAAsB;AAEzC,IAAA,mBAAmB,CAAqB;AAExC,IAAA,mBAAmB,CAAsB;AAEzC,IAAA,oBAAoB,CAAsB;AAE1C,IAAA,aAAa,CAA4B;AAEzC,IAAA,OAAO,CAAqB;AAE5B,IAAA,OAAO,CAAqB;AAE5B,IAAA,UAAU,CAAsB;AAEhC,IAAA,iBAAiB,CAAqB;AAEtC,IAAA,GAAG,CAAuB;AAE1B,IAAA,cAAc,CAAsB;AAEpC,IAAA,UAAU,CAA8B;AAExC,IAAA,aAAa,CAA4B;AAEzC,IAAA,KAAK,CAA2B;AAEhC,IAAA,YAAY,CAAsB;AAElC,IAAA,iBAAiB,CAAsB;AAEvC,IAAA,iBAAiB,CAAqB;AAEtC,IAAA,kBAAkB,CAAsB;AAExC,IAAA,kBAAkB,CAAsB;AAExC,IAAA,gBAAgB,CAAqB;AAErC,IAAA,IAAI,CAAgB;AAEpB,IAAA,cAAc,CAAsB;IAEpC,WAAW,GAAG,IAAI,CAAC;AAEnB,IAAA,SAAS,CAA+B;AAChC,IAAA,EAAE,CAAW;IACrB,OAAO,GAAY,KAAK,CAAC;AAEzB,IAAA,WAAA,GAAA,GAAgB;AAET,IAAA,WAAW,CAAC,OAAsB,EAAA;AACvC,QAAA,OAAO,CAAC,GAAG,CACT,iDAAiD,EACjD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CACxB,CAAC;AACF,QAAA,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;AACpB,YAAA,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACnE,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;SACpD;KACF;IAEM,KAAK,GAAA;QACV,OAAO,IAAI,CAAC,EAAE,CAAC;KAChB;AAEM,IAAA,cAAc,CAAC,QAAQ,EAAA;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;YACZ,OAAO;SACR;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAClC,QAAA,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KACvB;AAEM,IAAA,aAAa,CAAC,QAAgB,EAAE,KAAK,GAAG,CAAC,EAAA;AAC9C,QAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;QAChD,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,OAAO,CAAC,IAAI,CAAC,kBAAkB,QAAQ,CAAA,CAAE,CAAC,CAAC;SAC5C;AACD,QAAA,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;AACX,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,QAAQ,EAAE,QAAQ;AACnB,SAAA,CAAC,CAAC;KACJ;IAEM,MAAM,GAAA;AACX,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;KAChD;AAEM,IAAA,eAAe,CAAC,CAAW,EAAA;AAChC,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,UAAU,CAAC,MAAK;AACd,YAAA,CAAC,EAAE,CAAC;YACJ,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;aACtB,EAAE,EAAE,CAAC,CAAC;SACR,EAAE,CAAC,CAAC,CAAC;KACP;IAEO,YAAY,GAAA;QAClB,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE;YACzB,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC3B;KACF;IAEM,QAAQ,GAAA;;AAEb,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACjB,YAAA,OAAO,CAAC,IAAI,CAAC,CAAA,gBAAA,CAAkB,CAAC,CAAC;YACjC,OAAO;SACR;AAED,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI;;;YAGlC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;AAC7C,YAAA,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa;YACrC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;YAC/C,MAAM,EAAE,IAAI,CAAC,aAAa;YAC1B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;;AAGF,QAAA,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;AACZ,YAAA,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;SAChC;AACD,QAAA,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;QACrB,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACtD,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC;AACzB,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACzB;AACD,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACzB;AACD,QAAA,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;AACnB,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,EAAE,CAAC;SAC1C;KACF;uGArLU,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,EA1CxB,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,aAAA,EAAA,eAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,GAAA,EAAA,KAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,aAAA,EAAA,eAAA,EAAA,KAAA,EAAA,OAAA,EAAA,YAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,IAAA,EAAA,MAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;AAST,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,uPAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAiCU,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBA5CnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EACjB,QAAA,EAAA,CAAA;;;;;;;;;AAST,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,uPAAA,CAAA,EAAA,CAAA;wDAmCD,OAAO,EAAA,CAAA;sBADN,SAAS;uBAAC,SAAS,CAAA;gBAIpB,KAAK,EAAA,CAAA;sBADJ,KAAK;gBAIN,KAAK,EAAA,CAAA;sBADJ,KAAK;gBAGN,KAAK,EAAA,CAAA;sBADJ,KAAK;gBAIN,QAAQ,EAAA,CAAA;sBADP,KAAK;gBAGN,aAAa,EAAA,CAAA;sBADZ,KAAK;gBAGN,eAAe,EAAA,CAAA;sBADd,KAAK;gBAGN,mBAAmB,EAAA,CAAA;sBADlB,KAAK;gBAGN,mBAAmB,EAAA,CAAA;sBADlB,KAAK;gBAGN,mBAAmB,EAAA,CAAA;sBADlB,KAAK;gBAGN,oBAAoB,EAAA,CAAA;sBADnB,KAAK;gBAGN,aAAa,EAAA,CAAA;sBADZ,KAAK;gBAGN,OAAO,EAAA,CAAA;sBADN,KAAK;gBAGN,OAAO,EAAA,CAAA;sBADN,KAAK;gBAGN,UAAU,EAAA,CAAA;sBADT,KAAK;gBAGN,iBAAiB,EAAA,CAAA;sBADhB,KAAK;gBAGN,GAAG,EAAA,CAAA;sBADF,KAAK;gBAGN,cAAc,EAAA,CAAA;sBADb,KAAK;gBAGN,UAAU,EAAA,CAAA;sBADT,KAAK;gBAGN,aAAa,EAAA,CAAA;sBADZ,KAAK;gBAGN,KAAK,EAAA,CAAA;sBADJ,KAAK;gBAGN,YAAY,EAAA,CAAA;sBADX,KAAK;gBAGN,iBAAiB,EAAA,CAAA;sBADhB,KAAK;gBAGN,iBAAiB,EAAA,CAAA;sBADhB,KAAK;gBAGN,kBAAkB,EAAA,CAAA;sBADjB,KAAK;gBAGN,kBAAkB,EAAA,CAAA;sBADjB,KAAK;gBAGN,gBAAgB,EAAA,CAAA;sBADf,KAAK;gBAGN,IAAI,EAAA,CAAA;sBADH,KAAK;gBAGN,cAAc,EAAA,CAAA;sBADb,KAAK;gBAGN,WAAW,EAAA,CAAA;sBADV,KAAK;;;AC/HR,MAAM,qBAAqB,CAAA;AACzB,IAAA,KAAK,CAAC,CAA8B,EAAA;;AAElC,QAAA,OAAO,CAAC,KAAK,CACX,CAAA,2CAAA,EAA8C,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA,CAAE,CAClE,CAAC;KACH;AAED,IAAA,IAAI,CAAC,CAA8B,EAAA;;AAEjC,QAAA,OAAO,CAAC,KAAK,CACX,CAAA,0CAAA,EAA6C,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA,CAAE,CACjE,CAAC;KACH;AACF,CAAA;AAEK,MAAO,qBAAsB,SAAQ,qBAAqB,CAAA;IAC9D,IAAI,GAAG,MAAM,CAAC;AACf,CAAA;AAEK,MAAO,wBACX,SAAQ,qBAAqB,CAAA;;IAI7B,IAAI,GAAY,SAAS,CAAC;;IAE1B,GAAG,GAAY,SAAS,CAAC;;IAEzB,OAAO,GAAG,KAAK,CAAC;;IAEhB,iBAAiB,GAAG,GAAG,CAAC;;IAExB,eAAe,GAAG,SAAS,CAAC;;;;IAI5B,aAAa,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;AACnC,CAAA;AAEK,MAAO,uBAAwB,SAAQ,wBAAwB,CAAA;IACnE,IAAI,GAAG,QAAQ,CAAC;AAEhB,IAAA,GAAG,CAAW;AACd,IAAA,OAAO,CAAU;;AAGjB,IAAA,SAAS,CAAQ;;IAEjB,SAAS,GAAG,CAAC,IAAI,EAAE,QAAQ,KAAK,QAAQ,CAAC;AAC1C,CAAA;AAEK,MAAO,uBAAwB,SAAQ,wBAAwB,CAAA;;IAEnE,GAAG,GAAG,IAAI,CAAC;;IAEX,OAAO,GAAG,EAAE,CAAC;;IAEb,WAAW,GAA+C,SAAS,CAAC;;IAGpE,YAAY,GAAG,IAAI,CAAC;;IAGpB,2BAA2B,GAAG,KAAK,CAAC;;IAEpC,aAAa,GAAG,IAAI,CAAC;;IAGrB,IAAI,GAAqB,SAAS,CAAC;;IAEnC,SAAS,GAAG,CAAC,IAAI,EAAE,QAAQ,KAAK,QAAQ,CAAC;AAC1C,CAAA;AAEK,MAAO,qBAAsB,SAAQ,uBAAuB,CAAA;IAChE,IAAI,GAAG,MAAM,CAAC;;IAGd,mBAAmB,GAAG,EAAE,CAAC;;IAEzB,QAAQ,GAAG,KAAK,CAAC;;IAEjB,IAAI,GAAwB,SAAS,CAAC;;IAEtC,IAAI,GAAwB,SAAS,CAAC;;;IAGtC,QAAQ,GAAG,IAAI,CAAC;AACjB,CAAA;AAEK,MAAO,uBAAwB,SAAQ,wBAAwB,CAAA;IACnE,IAAI,GAAG,QAAQ,CAAC;IAEhB,GAAG,GAAG,IAAI,CAAC;IACX,OAAO,GAAG,EAAE,CAAC;;IAEb,WAAW,GACT,SAAS,CAAC;;IAEZ,SAAS,GAAG,CAAC,IAAI,EAAE,QAAQ,KAAK,QAAQ,CAAC;AAC1C,CAAA;AAEK,MAAO,uBAAwB,SAAQ,uBAAuB,CAAA;IAClE,IAAI,GAAG,QAAQ,CAAC;IAEhB,MAAM,CAAU;AAChB,IAAA,UAAU,GAAW,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;AACvC,IAAA,KAAK,GAAY,SAAS,CAAC;IAC3B,SAAS,CAAQ;AAClB,CAAA;AAED;MACa,2BAA2B,CAAA;IACtC,IAAI,GAAG,YAAY,CAAC;;AAEpB,IAAA,KAAK,CAAU;;AAEf,IAAA,SAAS,CAAW;;IAEpB,UAAU,GAAW,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;AACvC,IAAA,GAAG,CAAW;AACd,IAAA,2BAA2B,CAAQ;IACnC,WAAW,CAAS;AACpB,IAAA,cAAc,GAAI,EAAE,CAAC;IACrB,WAAW,CAAO;;IAElB,MAAM,GAAG,IAAI,CAAC;;IAEd,KAAK,GAAG,IAAI,CAAC;;AAEb,IAAA,aAAa,CAAU;AAEvB,IAAA,UAAU,CAAC,IAA0B,EAAA;AACnC,QAAA,OAAO,CAAC,CAAC;KACV;AAED,IAAA,UAAU,CAAC,IAA6B,EAAA;AACtC,QAAA,OAAO,CAAC,CAAC;KACV;AACF,CAAA;AAEK,MAAO,6BAA8B,SAAQ,uBAAuB,CAAA;IACxE,IAAI,GAAG,cAAc,CAAC;;IAGtB,QAAQ,GAAG,KAAK,CAAC;;IAEjB,MAAM,GAAG,KAAK,CAAC;;AAEf,IAAA,KAAK,CAAU;;AAEf,IAAA,kBAAkB,CAAU;;IAE5B,OAAO,GAAG,KAAK,CAAC;AAChB,IAAA,IAAI,GAAG,KAAK,CAAC;AACJ,IAAA,2BAA2B,GAAG,KAAK,CAAC;AAC9C,CAAA;AAEK,MAAO,qBAAsB,SAAQ,uBAAuB,CAAA;IAChE,IAAI,GAAG,MAAM,CAAC;;;IAId,kBAAkB,GAAG,GAAG,CAAC;;IAGzB,OAAO,GAAG,EAAE,CAAC;;IAGb,SAAS,GAAG,KAAK,CAAC;;IAGlB,gBAAgB,GAAG,EAAE,CAAC;;IAGtB,WAAW,GAAG,CAAC,CAAC;;IAGhB,aAAa,GAAG,GAAG,CAAC;;IAGpB,OAAO,GAAG,CAAC,CAAC;;IAGZ,OAAO,GAAG,IAAI,CAAC;;IAGf,WAAW,GAAG,IAAI,CAAC;;IAGnB,aAAa,GAAG,IAAI,CAAC;;IAGrB,OAAO,GAAG,GAAG,CAAC;;AAGd,IAAA,aAAa,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC;;AAG/B,IAAA,eAAe,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC;;AAG/B,IAAA,cAAc,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC;AAC/B,CAAA;AAKK,MAAO,sBAAuB,SAAQ,uBAAuB,CAAA;AACjE,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE,CAAC;KACT;IAED,IAAI,GAAG,OAAO,CAAC;AAEf,IAAA,OAAO,GAAY,SAAS,CAAC;AAC7B,IAAA,OAAO,GAAY,SAAS,CAAC;AAC7B,IAAA,OAAO,GAAY,SAAS,CAAC;;IAE7B,OAAO,GAAY,IAAI,CAAC;;;IAGxB,MAAM,GAAY,SAAS,CAAC;;AAE5B,IAAA,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC;IACrB,UAAU,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC;AAC1B;;MClNY,QAAQ,CAAA;AAEV,IAAA,KAAA,CAAA;AACA,IAAA,SAAA,CAAA;AACA,IAAA,gBAAA,CAAA;AACA,IAAA,UAAA,CAAA;AACA,IAAA,0BAAA,CAAA;AAEA,IAAA,kBAAA,CAAA;IAPT,WACS,CAAA,KAAa,EACb,SAAyB,EACzB,gBAAA,GAAmB,KAAK,EACxB,UAAa,GAAA,QAAQ,EACrB,0BAAA,GAA6B,KAAK;;AAElC,IAAA,kBAAA,GAAqB,IAAI,EAAA;QANzB,IAAK,CAAA,KAAA,GAAL,KAAK,CAAQ;QACb,IAAS,CAAA,SAAA,GAAT,SAAS,CAAgB;QACzB,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAQ;QACxB,IAAU,CAAA,UAAA,GAAV,UAAU,CAAW;QACrB,IAA0B,CAAA,0BAAA,GAA1B,0BAA0B,CAAQ;QAElC,IAAkB,CAAA,kBAAA,GAAlB,kBAAkB,CAAO;KAC9B;AACL,CAAA;MAEY,YAAY,CAAA;AAEd,IAAA,MAAA,CAAA;AACA,IAAA,UAAA,CAAA;AACA,IAAA,uBAAA,CAAA;AAHT,IAAA,WAAA,CACS,MAAc,EACd,UAAuB,EACvB,uBAAkC,EAAA;QAFlC,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;QACd,IAAU,CAAA,UAAA,GAAV,UAAU,CAAa;QACvB,IAAuB,CAAA,uBAAA,GAAvB,uBAAuB,CAAW;KACvC;AAEJ,IAAA,oBAAoB,CAAC,KAAa,EAAA;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE;AACjC,YAAA,OAAO,IAAI,CAAC;SACb;AACD,QAAA,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE;YACvC,KAAK,MAAM,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AAC9C,gBAAA,IAAI,SAAS,CAAC,aAAa,KAAK,aAAa,EAAE;AAC7C,oBAAA,OAAO,IAAI,CAAC;iBACb;aACF;SACF;AACD,QAAA,OAAO,KAAK,CAAC;KACd;AACF,CAAA;MAEY,SAAS,CAAA;AAOX,IAAA,KAAA,CAAA;AAEA,IAAA,aAAA,CAAA;AAEA,IAAA,IAAA,CAAA;AAEA,IAAA,OAAA,CAAA;AAEA,IAAA,UAAA,CAAA;AAEA,IAAA,kBAAA,CAAA;AAEA,IAAA,uBAAA,CAAA;AAEA,IAAA,WAAA,CAAA;AAEA,IAAA,SAAA,CAAA;AAEA,IAAA,SAAA,CAAA;AAEA,IAAA,OAAA,CAAA;AAGA,IAAA,qBAAA,CAAA;AAGA,IAAA,qBAAA,CAAA;IAhCD,UAAU,GAAG,EAAE,CAAC;AACxB,IAAA,QAAQ,GAAiC,QAAQ,CAAC;AAClD,IAAA,eAAe,CAA4C;AAE3D,IAAA,WAAA;;IAES,KAAyB;;IAEzB,aAAsB;;IAEtB,IAAgB;;IAEhB,OAAgB;;IAEhB,UAAqC;;AAErC,IAAA,kBAAA,GAAqB,KAAK;;AAE1B,IAAA,uBAAA,GAA0B,IAAI;;IAE9B,WAAoB;;AAEpB,IAAA,SAAA,GAAoB,MAAM;;AAE1B,IAAA,SAAA,GAAoB,CAAC;;IAErB,OAAkB;AACzB;AACmD;IAC5C,qBAA8B;AACrC;AACsF;IAC/E,qBAAyC,EAAA;QA1BzC,IAAK,CAAA,KAAA,GAAL,KAAK,CAAoB;QAEzB,IAAa,CAAA,aAAA,GAAb,aAAa,CAAS;QAEtB,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAY;QAEhB,IAAO,CAAA,OAAA,GAAP,OAAO,CAAS;QAEhB,IAAU,CAAA,UAAA,GAAV,UAAU,CAA2B;QAErC,IAAkB,CAAA,kBAAA,GAAlB,kBAAkB,CAAQ;QAE1B,IAAuB,CAAA,uBAAA,GAAvB,uBAAuB,CAAO;QAE9B,IAAW,CAAA,WAAA,GAAX,WAAW,CAAS;QAEpB,IAAS,CAAA,SAAA,GAAT,SAAS,CAAiB;QAE1B,IAAS,CAAA,SAAA,GAAT,SAAS,CAAY;QAErB,IAAO,CAAA,OAAA,GAAP,OAAO,CAAW;QAGlB,IAAqB,CAAA,qBAAA,GAArB,qBAAqB,CAAS;QAG9B,IAAqB,CAAA,qBAAA,GAArB,qBAAqB,CAAoB;KAC9C;AAEJ,IAAA,SAAS,CAAC,KAAa,EAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACvB,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;SAC3B;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnD,IAAI,MAAM,EAAE;AACV,YAAA,OAAO,MAAM,CAAC;SACf;aAAM;YACL,MAAM,cAAc,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACxD,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI;kBACpB,IAAI,CAAC,IAAI;kBACT,IAAI,CAAC,OAAO;AACd,sBAAE,SAAS;sBACT,cAAc,CAAC;YACnB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC;AAC7C,YAAA,OAAO,MAAM,CAAC;SACf;KACF;AAED,IAAA,QAAQ,CAAC,QAAa,EAAE,KAAa,EAAE,WAA8B,EAAA;AACnE,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACvB,YAAA,OAAO;SACR;AACD,QAAA,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC;AACrC,QAAA,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;KACrE;AACF;;MC/FY,kBAAkB,CAAA;AAI7B,IAAA,KAAK,CAAqB;AAE1B,IAAA,WAAW,GAAyB,IAAI,YAAY,EAAU,CAAC;AAG/D,IAAA,aAAa,CAAqB;AAElC,IAAA,QAAQ,CAAY;AAEpB,IAAA,SAAS,CAAa;AAEtB,IAAA,WAAA,GAAA,GAAgB;IAEhB,QAAQ,GAAA;AACN,QAAA,OAAO,CAAC,KAAK,CACX,mCAAmC,EACnC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAC9B,CAAC;QACF,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,YAAY,KAAI;YAChD,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,KAAI;AAC5C,gBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE;oBACzD,OAAO;iBACR;gBACD,IAAI,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;;AAErD,gBAAA,MAAM,UAAU,GACd,OAAO,SAAS,CAAC,UAAU,KAAK,UAAU;AACxC,sBAAE,SAAS,CAAC,UAAU,EAAE;AACxB,sBAAE,SAAS,CAAC,UAAU,CAAC;AAC3B,gBAAA,MAAM,eAAe,GACnB,OAAO,SAAS,CAAC,eAAe,KAAK,UAAU;AAC7C,sBAAE,SAAS,CAAC,eAAe,EAAE;AAC7B,sBAAE,SAAS,CAAC,eAAe,CAAC;AAChC,gBAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;AAC/B,gBAAA,IAAI,WAAW,GAAG,IAAI,WAAW,CAAC,UAAU,EAAE;oBAC5C,UAAU;oBACV,eAAe;oBACf,QAAQ;AACT,iBAAA,CAAC,CAAC;gBACH,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;AAC5C,oBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE;wBACzD,OAAO;qBACR;AACD,oBAAA,OAAO,CAAC,KAAK,CACX,sBAAsB,EACtB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EACtB,YAAY,EACZ,SAAS,CAAC,aAAa,EACvB,iCAAiC,EACjC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,EACnC,MAAM,EACN,MAAM,CACP,CAAC;AACF,oBAAA,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;AAC3D,iBAAC,CAAC,CAAC;AACH,gBAAA,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,WAAW,CAAC;AAClD,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC;KAC1C;AAED,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1E,QAAA,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YACpB,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC;YAC5C,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AAClC,gBAAA,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,GAAG,CAAC,CAAC;gBAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC9C,OAAO;AACL,sBAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;sBAClD,OAAO,CAAC,IAAI,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;aACpD;SACF;KACF;IAED,eAAe,GAAA;;KAEd;IAED,kBAAkB,GAAA;;KAEjB;IAED,QAAQ,GAAA;AACN,QAAA,OAAO,CAAC,GAAG,CAAC,CAAA,cAAA,CAAgB,CAAC,CAAC;KAC/B;uGA1FU,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,uMCxB/B,s5FA+EA,EAAA,MAAA,EAAA,CAAA,qIAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,cAAA,EAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,MAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,YAAA,EAAA,WAAA,EAAA,OAAA,EAAA,YAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,YAAA,EAAA,WAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,cAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,aAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FDvDa,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAL9B,SAAS;+BACE,iBAAiB,EAAA,QAAA,EAAA,s5FAAA,EAAA,MAAA,EAAA,CAAA,qIAAA,CAAA,EAAA,CAAA;wDAQ3B,KAAK,EAAA,CAAA;sBADJ,KAAK;gBAGN,WAAW,EAAA,CAAA;sBADV,MAAM;gBAIP,aAAa,EAAA,CAAA;sBADZ,KAAK;gBAGN,QAAQ,EAAA,CAAA;sBADP,KAAK;;;ME8CK,4BAA4B,CAAA;AAC/B,IAAA,OAAO,gBAAgB,GAC7B,4BAA4B,CAAC,oBAAoB,EAAE,CAAC;AAE7B,IAAA,UAAU,CAAC;AAEpC,IAAA,cAAc,CAAM;IACpB,OAAO,GAAG,KAAK,CAAC;AAEhB,IAAA,IACI,aAAa,GAAA;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;KAC5B;IACD,IAAI,aAAa,CAAC,KAAK,EAAA;QACrB,OAAO,CAAC,GAAG,CAAC,CAAA,mBAAA,EAAsB,KAAK,EAAE,IAAI,CAAE,CAAA,CAAC,CAAC;AACjD,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;KAC7B;AACS,IAAA,mBAAmB,GAC3B,IAAI,YAAY,EAAiB,CAAC;AAE7B,IAAA,iBAAiB,GAAoB;AAC1C,QAAA,IAAI,6BAA6B,EAAE;AACnC,QAAA,IAAI,qBAAqB,EAAE;AAC3B,QAAA,IAAI,sBAAsB,EAAE;AAC5B,QAAA,IAAI,uBAAuB,EAAE;AAC7B,QAAA,IAAI,2BAA2B,EAAE;AACjC,QAAA,IAAI,qBAAqB,EAAE;AAC3B,QAAA,IAAI,uBAAuB,EAAE;AAC7B,QAAA,IAAI,uBAAuB,EAAE;AAC7B,QAAA,IAAI,qBAAqB,EAAE;KAC5B,CAAC;AAEF,IAAA,QAAQ,CAAY;AAEpB,IAAA,WAAA,GAAA,GAAgB;IAEhB,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,QAAQ,GAAG,4BAA4B,CAAC,oBAAoB,EAAE,CAAC;QACpE,IAAI,mBAAmB,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CACT,gDAAgD,EAChD,mBAAmB,CAAC,IAAI,CACzB,CAAC;AACF,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,OAAO,CAAC,GAAG,CACT,CAAA,kEAAA,EAAqE,IAAI,CAAC,SAAS,CACjF,IAAI,CAAC,aAAa,CACnB,CAAA,CAAE,CACJ,CAAC;AACF,YAAA,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;SAC1D;AACD,QAAA,OAAO,CAAC,GAAG,CACT,gEAAgE,EAChE,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,CACpC,CAAC;KACH;AAED,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AACpE,QAAA,IAAI,OAAO,CAAC,eAAe,CAAC,EAAE;SAC7B;KACF;IAED,mBAAmB,GAAA;AACjB,QAAA,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AACzE,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;KACrB;IAED,iBAAiB,GAAA;AACf,QAAA,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AACjC,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;KACrB;IAED,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;KACnD;AAEO,IAAA,+BAA+B,CAAC,aAA4B,EAAA;QAClE,IAAI,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAC/C,CAAC,YAAY,KAAK,YAAY,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI,CAC3D,CAAC;QACF,IAAI,eAAe,EAAE;AACnB,YAAA,OAAO,CAAC,GAAG,CACT,8BAA8B,EAC9B,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAChC,CAAC;AACF,YAAA,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAC3B,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,eAAe,CAAC,EAC/C,CAAC,EACD,aAAa,CACd,CAAC;SACH;aAAM;AACL,YAAA,OAAO,CAAC,IAAI,CACV,uDAAuD,IAAI,CAAA,wDAAA,CAA0D,CACtH,CAAC;AACF,YAAA,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;SAC/C;KACF;AAEO,IAAA,OAAO,oBAAoB,GAAA;AACjC,QAAA,IAAI,GAAG,GAAG,IAAI,SAAS,CACrB,KAAK,EACL,KAAK,EACL,SAAS,EACT,4BAA4B,CAC7B,CAAC;AACF,QAAA,IAAI,OAAO,GAAG,IAAI,SAAS,CACzB,SAAS,EACT,SAAS,EACT,QAAQ,EACR,oDAAoD,CACrD,CAAC;AAEF,QAAA,IAAI,WAAW,GAAG,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAEnE,QAAA,MAAM,IAAI,GAAG,IAAI,SAAS,CACxB,MAAM,EACN,MAAM,EACN,QAAQ,EACR,wDAAwD,CACzD,CAAC;AACF,QAAA,MAAM,GAAG,GAAG,IAAI,SAAS,CACvB,KAAK,EACL,KAAK,EACL,QAAQ,EACR,uDAAuD,CACxD,CAAC;AACF,QAAA,MAAM,OAAO,GAAG,IAAI,SAAS,CAC3B,SAAS,EACT,SAAS,EACT,SAAS,EACT,0CAA0C,CAC3C,CAAC;AACF,QAAA,MAAM,iBAAiB,GAAG,IAAI,SAAS,CACrC,oBAAoB,EACpB,mBAAmB,EACnB,QAAQ,EACR,wCAAwC,CACzC,CAAC;AACF,QAAA,MAAM,eAAe,GAAG,IAAI,SAAS,CACnC,kBAAkB,EAClB,iBAAiB,EACjB,QAAQ,EACR,gCAAgC,CACjC,CAAC;QACF,IAAI,iBAAiB,GAAG,IAAI,YAAY,CACtC,WAAW,EACX,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,iBAAiB,EAAE,eAAe,CAAC,EACxD,CAAC,SAAS,CAAC,CACZ,CAAC;AAEF,QAAA,IAAI,YAAY,GAAG,IAAI,SAAS,CAC9B,eAAe,EACf,cAAc,EACd,SAAS,EACT,qEAAqE,CACtE,CAAC;AACF,QAAA,IAAI,aAAa,GAAG,IAAI,SAAS,CAC/B,gBAAgB,EAChB,eAAe,EACf,QAAQ,EACR,oGAAoG,CACrG,CAAC;AACF,QAAA,IAAI,2BAA2B,GAAG,IAAI,SAAS,CAC7C,gCAAgC,EAChC,6BAA6B,EAC7B,SAAS,EACT,kFAAkF,CACnF,CAAC;AACF,QAAA,IAAI,cAAc,GAAG,IAAI,YAAY,CACnC,QAAQ,EACR,CAAC,YAAY,EAAE,aAAa,EAAE,2BAA2B,CAAC,EAC1D,CAAC,cAAc,CAAC,CACjB,CAAC;AAEF,QAAA,IAAI,QAAQ,GAAG,IAAI,SAAS,CAC1B,UAAU,EACV,cAAc,EACd,SAAS,EACT,2FAA2F,CAC5F,CAAC;AACF,QAAA,IAAI,MAAM,GAAG,IAAI,SAAS,CACxB,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,wEAAwE,CACzE,CAAC;AACF,QAAA,IAAI,kBAAkB,GAAG,IAAI,SAAS,CACpC,qBAAqB,EACrB,oBAAoB,EACpB,QAAQ,EACR,qFAAqF,CACtF,CAAC;AACF,QAAA,IAAI,OAAO,GAAG,IAAI,SAAS,CACzB,SAAS,EACT,SAAS,EACT,SAAS,EACT,kGAAkG,CACnG,CAAC;AACF,QAAA,IAAI,IAAI,GAAG,IAAI,SAAS,CACtB,MAAM,EACN,MAAM,EACN,SAAS,EACT,kGAAkG,CACnG,CAAC;AACF,QAAA,IAAI,KAAK,GAAG,IAAI,SAAS,CACvB,OAAO,EACP,OAAO,EACP,QAAQ,EACR,wBAAwB,CACzB,CAAC;QACF,IAAI,oBAAoB,GAAG,IAAI,YAAY,CACzC,eAAe,EACf,CAAC,QAAQ,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,EAC5D,CAAC,cAAc,CAAC,CACjB,CAAC;AAEF,QAAA,IAAI,OAAO,GAAG,IAAI,SAAS,CACzB,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,wDAAwD,CACzD,CAAC;AACF,QAAA,IAAI,OAAO,GAAG,IAAI,SAAS,CACzB,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,wDAAwD,CACzD,CAAC;AACF,QAAA,IAAI,OAAO,GAAG,IAAI,SAAS,CACzB,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,gDAAgD,CACjD,CAAC;AACF,QAAA,IAAI,MAAM,GAAG,IAAI,SAAS,CACxB,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,qEAAqE,CACtE,CAAC;QACF,MAAM,CAAC,OAAO,GAAG;AACf,YAAA,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;AACvB,YAAA,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,iBAAiB,EAAE;AACrD,YAAA,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;AAC3C,YAAA,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE;SAChD,CAAC;QAEF,IAAI,aAAa,GAAG,IAAI,YAAY,CAClC,OAAO,EACP,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EACnC,CAAC,SAAS,CAAC,CACZ,CAAC;AAEF,QAAA,IAAI,kBAAkB,GAAG,IAAI,SAAS,CACpC,qBAAqB,EACrB,oBAAoB,EACpB,QAAQ,EACR,6GAA6G,CAC9G,CAAC;AACF,QAAA,IAAI,OAAO,GAAG,IAAI,SAAS,CACzB,SAAS,EACT,SAAS,EACT,QAAQ,EACR,kEAAkE,CACnE,CAAC;AACF,QAAA,IAAI,SAAS,GAAG,IAAI,SAAS,CAC3B,WAAW,EACX,WAAW,EACX,SAAS,EACT,uFAAuF,CACxF,CAAC;AACF,QAAA,IAAI,gBAAgB,GAAG,IAAI,SAAS,CAClC,mBAAmB,EACnB,kBAAkB,EAClB,QAAQ,EACR,yDAAyD,CAC1D,CAAC;AACF,QAAA,IAAI,WAAW,GAAG,IAAI,SAAS,CAC7B,cAAc,EACd,aAAa,EACb,QAAQ,EACR,yCAAyC,CAC1C,CAAC;AACF,QAAA,IAAI,aAAa,GAAG,IAAI,SAAS,CAC/B,gBAAgB,EAChB,eAAe,EACf,QAAQ,EACR,2EAA2E,CAC5E,CAAC;AACF,QAAA,IAAI,OAAO,GAAG,IAAI,SAAS,CACzB,SAAS,EACT,SAAS,EACT,QAAQ,EACR,0BAA0B,CAC3B,CAAC;AACF,QAAA,IAAI,OAAO,GAAG,IAAI,SAAS,CACzB,gBAAgB,EAChB,SAAS,EACT,QAAQ,EACR,yCAAyC,CAC1C,CAAC;AACF,QAAA,IAAI,WAAW,GAAG,IAAI,SAAS,CAC7B,cAAc,EACd,aAAa,EACb,QAAQ,EACR,iDAAiD,CAClD,CAAC;AACF,QAAA,IAAI,aAAa,GAAG,IAAI,SAAS,CAC/B,gBAAgB,EAChB,eAAe,EACf,QAAQ,EACR,+EAA+E,CAChF,CAAC;AACF,QAAA,IAAI,OAAO,GAAG,IAAI,SAAS,CACzB,WAAW,EACX,SAAS,EACT,QAAQ,EACR,oEAAoE,CACrE,CAAC;AACF,QAAA,IAAI,YAAY,GAAG,IAAI,YAAY,CACjC,MAAM,EACN;YACE,kBAAkB;YAClB,OAAO;YACP,SAAS;YACT,gBAAgB;YAChB,WAAW;YACX,aAAa;YACb,OAAO;YACP,OAAO;YACP,WAAW;YACX,aAAa;YACb,OAAO;AACR,SAAA,EACD,CAAC,eAAe,CAAC,CAClB,CAAC;AAEF,QAAA,IAAI,mBAAmB,GAAG,IAAI,SAAS,CACrC,qBAAqB,EACrB,qBAAqB,EACrB,QAAQ,EACR,oDAAoD,CACrD,CAAC;AACF,QAAA,IAAI,QAAQ,GAAG,IAAI,SAAS,CAC1B,UAAU,EACV,UAAU,EACV,SAAS,EACT,+DAA+D,CAChE,CAAC;AACF,QAAA,IAAI,IAAI,GAAG,IAAI,SAAS,CACtB,MAAM,EACN,MAAM,EACN,QAAQ,EACR,+BAA+B,CAChC,CAAC;AACF,QAAA,IAAI,IAAI,GAAG,IAAI,SAAS,CACtB,SAAS,EACT,MAAM,EACN,QAAQ,EACR,kCAAkC,CACnC,CAAC;QAEF,IAAI,YAAY,GAAG,IAAI,YAAY,CACjC,MAAM,EACN,CAAC,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,EAC3C,CAAC,MAAM,CAAC,CACT,CAAC;AAEF,QAAA,IAAI,MAAM,GAAG,IAAI,SAAS,CACxB,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,0BAA0B,CAC3B,CAAC;AACF,QAAA,IAAI,UAAU,GAAG,IAAI,SAAS,CAC5B,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,wDAAwD,CACzD,CAAC;AACF,QAAA,IAAI,KAAK,GAAG,IAAI,SAAS,CACvB,OAAO,EACP,OAAO,EACP,QAAQ,EACR,sFAAsF,CACvF,CAAC;AACF,QAAA,IAAI,SAAS,GAAG,IAAI,SAAS,CAC3B,WAAW,EACX,WAAW,EACX,QAAQ,EACR,yFAAyF,CAC1F,CAAC;QACF,IAAI,gBAAgB,GAAG,IAAI,YAAY,CACrC,UAAU,EACV,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,CAAC,EACtC,CAAC,WAAW,CAAC,CACd,CAAC;AAEF,QAAA,IAAI,WAAW,GAAG,IAAI,SAAS,CAC7B,aAAa,EACb,aAAa,EACb,SAAS,EACT,2FAA2F,CAC5F,CAAC;AACF,QAAA,IAAI,cAAc,GAAG,IAAI,SAAS,CAChC,mBAAmB,EACnB,gBAAgB,EAChB,QAAQ,EACR,mEAAmE,CACpE,CAAC;AACF,QAAA,IAAI,MAAM,GAAG,IAAI,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC7D,QAAA,IAAI,KAAK,GAAG,IAAI,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC1D,IAAI,kBAAkB,GAAG,IAAI,YAAY,CACvC,YAAY,EACZ,CAAC,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EACxD,CAAC,aAAa,CAAC,CAChB,CAAC;;AAIF,QAAA,OAAO,IAAI,QAAQ,CACjB,QAAQ,EACR;YACE,oBAAoB;YACpB,YAAY;YACZ,aAAa;YACb,YAAY;YACZ,gBAAgB;YAChB,kBAAkB;YAClB,WAAW;YACX,iBAAiB;YACjB,cAAc;SACf,EACD,KAAK,CACN,CAAC;KACH;uGArbU,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,4BAA4B,EA9B7B,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,OAAA,EAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,qJAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,cAAA,EAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,MAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,kBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,eAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAEU,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBArDxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAsBvB,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,qJAAA,CAAA,EAAA,CAAA;wDAMwB,UAAU,EAAA,CAAA;sBAAlC,SAAS;uBAAC,YAAY,CAAA;gBAMnB,aAAa,EAAA,CAAA;sBADhB,KAAK;gBAQI,mBAAmB,EAAA,CAAA;sBAA5B,MAAM;;;ACzFT,MAAM,cAAe,SAAQ,SAAS,CAAA;AACpC,IAAA,WAAA,CACE,SAAiB,EACjB,IAAe,EACf,IAAY,EACZ,OAAkB,EAAA;QAElB,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACxC,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;KACxB;AAEQ,IAAA,SAAS,CAAC,KAAa,EAAA;AAC9B,QAAA,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,QAAQ,CAAC;AAClB,YAAA,KAAK,oBAAoB,CAAC;AAC1B,YAAA,KAAK,WAAW,CAAC;AACjB,YAAA,KAAK,WAAW,CAAC;AACjB,YAAA,KAAK,oBAAoB,CAAC;AAC1B,YAAA,KAAK,WAAW,CAAC;AACjB,YAAA,KAAK,YAAY,CAAC;AAClB,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,QAAQ,CAAC;AAClB,YAAA;AACE,gBAAA,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;SACjC;KACF;AACF,CAAA;SAEe,uBAAuB,GAAA;AACrC,IAAA,OAAO,IAAI,QAAQ,CACjB,aAAa,EACb;QACE,IAAI,YAAY,CAAC,YAAY,EAAE;AAC7B,YAAA,IAAI,cAAc,CAChB,iBAAiB,EACjB,QAAQ,EACR,+EAA+E,CAChF;AACD,YAAA,IAAI,cAAc,CAChB,mBAAmB,EACnB,QAAQ,EACR,iDAAiD,CAClD;AACD,YAAA,IAAI,cAAc,CAChB,gBAAgB,EAChB,QAAQ,EACR,+CAA+C,CAChD;SACF,CAAC;QAEF,IAAI,YAAY,CAAC,eAAe,EAAE;AAChC,YAAA,IAAI,cAAc,CAChB,qBAAqB,EACrB,QAAQ,EACR,qEAAqE,CACtE;AACD,YAAA,IAAI,cAAc,CAChB,4BAA4B,EAC5B,QAAQ,EACR,wEAAwE,CACzE;AACD,YAAA,IAAI,cAAc,CAChB,4BAA4B,EAC5B,QAAQ,EACR,8CAA8C,CAC/C;AACD,YAAA,IAAI,cAAc,CAChB,uBAAuB,EACvB,QAAQ,EACR,mCAAmC,CACpC;AACD,YAAA,IAAI,cAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC;SACrC,CAAC;QACF,IAAI,YAAY,CAAC,kCAAkC,EAAE;AACnD,YAAA,IAAI,cAAc,CAChB,0BAA0B,EAC1B,QAAQ,EACR,kGAAkG,CACnG;AACD,YAAA,IAAI,cAAc,CAChB,4BAA4B,EAC5B,QAAQ,EACR,uDAAuD,CACxD;SACF,CAAC;KACH,EACD,KAAK,CACN,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,MAAiB,EAAE,MAAiB,EAAA;IACvD,IAAI,CAAC,MAAM,EAAE;QACX,OAAO,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;KACvB;SAAM,IAAI,CAAC,MAAM,EAAE;QAClB,OAAO,CAAC,CAAC,CAAC;KACX;SAAM;QACL,MAAM,MAAM,GACV,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU,GAAG,MAAM,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;QACrE,MAAM,MAAM,GACV,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU,GAAG,MAAM,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;AACrE,QAAA,OAAO,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;KACrC;AACH,CAAC;SAEe,wBAAwB,GAAA;IACtC,MAAM,aAAa,GAAmB,EAAE,CAAC;AACzC,IAAA,OAAO,aAAa,CAAC;AACvB,CAAC;SAEe,wBAAwB,GAAA;IACtC,MAAM,aAAa,GAAmB,EAAE,CAAC;IAEzC,IAAI,cAAc,GAAgB,EAAE,CAAC;AACrC,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,OAAO,EACP,QAAQ,EACR,6CAA6C,CAC9C,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,cAAc,EACd,QAAQ,EACR,gDAAgD,CACjD,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,cAAc,EACd,QAAQ,EACR,gDAAgD,CACjD,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,oCAAoC,CAAC,CAC5E,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,aAAa,EACb,QAAQ,EACR,gEAAgE,CACjE,CACF,CAAC;AACF;;AAEG;AACH,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAAC,WAAW,EAAE,QAAQ,EAAE,6BAA6B,CAAC,CACzE,CAAC;AACF;;AAEG;AACH,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,YAAY,EACZ,WAAW,EACX,mDAAmD,CACpD,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,aAAa,EACb,YAAY,EACZ,oDAAoD,CACrD,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,gBAAgB,EAChB,QAAQ,EACR,yMAAyM,CAC1M,CACF,CAAC;IACF,IAAI,sBAAsB,GAAG,IAAI,cAAc,CAC7C,WAAW,EACX,SAAS,EACT,oJAAoJ,CACrJ,CAAC;IACF,sBAAsB,CAAC,OAAO,GAAG;AAC/B,QAAA,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;AAChC,QAAA,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;AAChC,QAAA,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;KACzC,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;AAC5C;;AAEG;IACH,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,aAAa,EACb,SAAS,EACT,2CAA2C,EAC3C;AACE,QAAA,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;AACvB,QAAA,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;AAChC,QAAA,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;AACpC,QAAA,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;AAClC,KAAA,CACF,CACF,CAAC;IACF,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,aAAa,EACb,SAAS,EACT,2CAA2C,EAC3C;AACE,QAAA,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;AACvB,QAAA,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AAC9B,QAAA,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;AACpC,QAAA,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;AACrC,KAAA,CACF,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,cAAc,EACd,QAAQ,EACR,uDAAuD,CACxD,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,gBAAgB,EAChB,oBAAoB,EACpB,8CAA8C,CAC/C,CACF,CAAC;IACF,aAAa,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;IAC9D,cAAc,GAAG,EAAE,CAAC;AAEpB,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAAC,SAAS,EAAE,QAAQ,EAAE,uBAAuB,CAAC,CACjE,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,OAAO,EACP,QAAQ,EACR,0IAA0I,CAC3I,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,QAAQ,EACR,QAAQ,EACR,4IAA4I,CAC7I,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,kBAAkB,EAClB,QAAQ,EACR,gCAAgC,CACjC,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,oBAAoB,EACpB,QAAQ,EACR,sGAAsG,CACvG,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,oBAAoB,EACpB,QAAQ,EACR,oDAAoD,CACrD,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,cAAc,EACd,QAAQ,EACR,gCAAgC,CACjC,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,cAAc,EACd,WAAW,EACX,iCAAiC,CAClC,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,cAAc,EACd,QAAQ,EACR,kCAAkC,CACnC,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,gBAAgB,EAChB,SAAS,EACT,0DAA0D,CAC3D,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,+BAA+B,CAAC,CAC1E,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAAC,sBAAsB,EAAE,oBAAoB,EAAE,EAAE,CAAC,CACrE,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,eAAe,EACf,QAAQ,EACR,qDAAqD,CACtD,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,iBAAiB,EACjB,QAAQ,EACR,oEAAoE,CACrE,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,iBAAiB,EACjB,QAAQ,EACR,6BAA6B,CAC9B,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,cAAc,EACd,QAAQ,EACR,oNAAoN,CACrN,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,eAAe,EACf,QAAQ,EACR,oNAAoN,CACrN,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,aAAa,EACb,QAAQ,EACR,oNAAoN,CACrN,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,gBAAgB,EAChB,QAAQ,EACR,oNAAoN,CACrN,CACF,CAAC;IACF,aAAa,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAC7D,cAAc,GAAG,EAAE,CAAC;AAEpB;;AAEG;AACH,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,oBAAoB,EACpB,QAAQ,EACR,2FAA2F,CAC5F,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,oBAAoB,EACpB,QAAQ,EACR,2FAA2F,CAC5F,CACF,CAAC;AACF;;AAEG;AACH,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,eAAe,EACf,QAAQ,EACR,mDAAmD,CACpD,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,eAAe,EACf,QAAQ,EACR,mDAAmD,CACpD,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,sBAAsB,EACtB,QAAQ,EACR,oCAAoC,CACrC,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,sBAAsB,EACtB,QAAQ,EACR,oCAAoC,CACrC,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,sBAAsB,EACtB,QAAQ,EACR,oCAAoC,CACrC,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,sBAAsB,EACtB,QAAQ,EACR,oCAAoC,CACrC,CACF,CAAC;AACF;;AAEG;AACH,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,eAAe,EACf,QAAQ,EACR,0VAA0V,CAC3V,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,sBAAsB,EACtB,QAAQ,EACR,oCAAoC,CACrC,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,sBAAsB,EACtB,QAAQ,EACR,oCAAoC,CACrC,CACF,CAAC;AACF;;AAEG;AACH,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,oBAAoB,EACpB,QAAQ,EACR,4DAA4D,CAC7D,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,sBAAsB,EACtB,QAAQ,EACR,2CAA2C,CAC5C,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,oBAAoB,EACpB,QAAQ,EACR,wCAAwC,CACzC,CACF,CAAC;AACF;;AAEG;AACH,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,kBAAkB,EAClB,QAAQ,EACR,2BAA2B,CAC5B,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,mBAAmB,EACnB,QAAQ,EACR,2BAA2B,CAC5B,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,sBAAsB,EACtB,QAAQ,EACR,kJAAkJ,CACnJ,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,sBAAsB,EACtB,QAAQ,EACR,kJAAkJ,CACnJ,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,qBAAqB,EACrB,QAAQ,EACR,sFAAsF,CACvF,CACF,CAAC;AACF;;AAEG;AACH,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,yBAAyB,EACzB,QAAQ,EACR,sFAAsF,CACvF,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,uBAAuB,EACvB,QAAQ,EACR,2CAA2C,CAC5C,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,yBAAyB,EACzB,QAAQ,EACR,wFAAwF,CACzF,CACF,CAAC;IACF,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,uBAAuB,EACvB,SAAS,EACT,4CAA4C,EAC5C;AACE,QAAA,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;AACvB,QAAA,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;AAC1C,QAAA,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,gBAAgB,EAAE;AACrD,KAAA,CACF,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,qBAAqB,EACrB,QAAQ,EACR,yFAAyF,CAC1F,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,mBAAmB,EACnB,QAAQ,EACR,2CAA2C,CAC5C,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,mBAAmB,EACnB,WAAW,EACX,2CAA2C,CAC5C,CACF,CAAC;AACF,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,mBAAmB,EACnB,QAAQ,EACR,4CAA4C,CAC7C,CACF,CAAC;IACF,aAAa,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC,CAAC;IACtE,cAAc,GAAG,EAAE,CAAC;AAEpB;;AAEG;AACH,IAAA,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,sBAAsB,EACtB,QAAQ,EACR,oYAAoY,CACrY,CACF,CAAC;IACF,cAAc,CAAC,IAAI,CACjB,IAAI,cAAc,CAChB,aAAa,EACb,SAAS,EACT,kKAAkK,EAClK;AACE,QAAA,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AAC9B,QAAA,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;AAC7B,KAAA,CACF,CACF,CAAC;IACF,aAAa,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC,CAAC;AACtE,IAAA,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;AAEG;MACU,cAAc,CAAA;AAEhB,IAAA,QAAA,CAAA;AACA,IAAA,KAAA,CAAA;AAFT,IAAA,WAAA,CACS,QAAmB,GAAA,MAAM,EACzB,KAAA,GAGkB,EAAE,EAAA;QAJpB,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAiB;QACzB,IAAK,CAAA,KAAA,GAAL,KAAK,CAGe;KACzB;AACL;;MC9dY,2BAA2B,CAAA;AAGd,IAAA,SAAS,CAAC;AACH,IAAA,gBAAgB,CAAC;AAEhD,IAAA,OAAO,CAAgC;IACvC,SAAS,GAAG,KAAK,CAAC;AACV,IAAA,0BAA0B,CAAqB;AAEvD,IAAA,IACI,MAAM,GAAA;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;KACrB;IACD,IAAI,MAAM,CAAC,MAAqC,EAAA;AAC9C,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;KACvB;AAED,IAAA,YAAY,GAAoC,IAAI,YAAY,EAE7D,CAAC;AAGJ,IAAA,mBAAmB,GAAyB,IAAI,YAAY,EAAU,CAAC;AAEvE,IAAA,YAAY,CAAY;AACxB,IAAA,YAAY,CAAY;AACxB,IAAA,YAAY,CAAY;AAExB,IAAA,kBAAkB,CAA8B;AAChD,IAAA,SAAS,CAAgC;IACzC,OAAO,GAAG,KAAK,CAAC;AAEhB,IAAA,WAAA,GAAA,GAAgB;IAEhB,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,YAAY,GAAG,uBAAuB,EAAE,CAAC;QAC9C,IAAI,CAAC,YAAY,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,wBAAwB,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,YAAY,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,wBAAwB,EAAE,CAAC,CAAC;AACrE,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC;SACtC;AACD,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;AAClC,QAAA,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;YAC/C,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,CAAwB,sBAAA,CAAA,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;SAC9D;KACF;AAED,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AACnE,QAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE;AACrB,YAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;AAClC,YAAA,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC/C,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAC5C,OAAO,CAAC,GAAG,CACT,CAAuC,qCAAA,CAAA,EACvC,IAAI,CAAC,SAAS,CAAC,MAAM,CACtB,CAAC;aACH;SACF;KACF;IAED,eAAe,GAAA;;KAEd;IAED,kBAAkB,GAAA;;KAEjB;IAED,iBAAiB,GAAA;AACf,QAAA,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AACjC,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;KACrB;IAED,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KACrC;AAED,IAAA,MAAM,CAAC,KAAK,EAAA;AACV,QAAA,IAAI,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;KAC3C;AAEO,IAAA,sBAAsB,CAAC,YAA2B,EAAA;AACxD,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,UAA2B,KAAI;AACnE,YAAA,OAAO,YAAY,GAAG,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;AAC1E,SAAC,CAAC,CAAC;KACJ;IAED,aAAa,GAAA;AACX,QAAA,MAAM,kBAAkB,GAAoB,IAAI,cAAc,EAAE,CAAC;QACjE,kBAAkB,CAAC,QAAQ,GAAG,IAAI,CAAC,0BAA0B,IAAI,EAAE,CAAC;QACpE,OAAO,CAAC,GAAG,CACT,iCAAiC,EACjC,IAAI,CAAC,0BAA0B,CAChC,CAAC;AACF,QAAA,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;KAC9C;AAED;;;;;AAKG;AACH,IAAA,qBAAqB,CAAC,KAAU,EAAA;AAC9B,QAAA,OAAO,CAAC,GAAG,CAAC,CAAA,qBAAA,EAAwB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAE,CAAA,CAAC,CAAC;AAC7D,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;AACzD,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ;AAC/B,cAAE,KAAK;AACP,cAAE,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,UAAU,EAAE;AACd,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE;gBAChB,IAAI,CAAC,YAAY,EAAE,CAAC;aACrB;AACD,YAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACzC;aAAM;YACL,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;AAChD,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,gBAAA,IAAI,CAAC,0BAA0B,GAAG,QAAQ,CAAC;aAC5C;iBAAM;AACL,gBAAA,IAAI,CAAC,0BAA0B,GAAG,SAAS,CAAC;aAC7C;SACF;KACF;AAED,IAAA,wBAAwB,CAAC,YAAY,EAAA;AACnC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CACrC,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,KAAK,YAAY,CACjD,CAAC;AACF,QAAA,OAAO,UAAU,CAAC;KACnB;AAED,IAAA,eAAe,CAAC,IAAY,EAAA;AAC1B,QAAA,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;AACtC,QAAA,IACE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;AACxB,YAAA,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;AACxB,YAAA,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,EACxB;YACA,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACtC,YAAA,IAAI,WAAW,GAAG,CAAC,CAAC,EAAE;gBACpB,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,EAAE;AACnC,oBAAA,OAAO,KAAK,CAAC;iBACd;aACF;YACD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACpC,YAAA,IAAI,SAAS,GAAG,CAAC,CAAC,EAAE;AAClB,gBAAA,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;AAClD,gBAAA,IAAI,UAAU,GAAG,SAAS,EAAE;AAC1B,oBAAA,OAAO,KAAK,CAAC;iBACd;aACF;AACD,YAAA,OAAO,IAAI,CAAC;SACb;AACD,QAAA,OAAO,KAAK,CAAC;KACd;uGAhKU,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,2BAA2B,EAjH5B,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiFT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,2PAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,OAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,cAAA,EAAA,MAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,sBAAA,EAAA,WAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,YAAA,EAAA,YAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,QAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,OAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,cAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,WAAA,EAAA,cAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,IAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,SAAA,EAAA,QAAA,EAAA,QAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,kBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,eAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAgCU,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAnHvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EACtB,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiFT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,2PAAA,CAAA,EAAA,CAAA;wDAmCuB,SAAS,EAAA,CAAA;sBAAhC,SAAS;uBAAC,WAAW,CAAA;gBACS,gBAAgB,EAAA,CAAA;sBAA9C,SAAS;uBAAC,kBAAkB,CAAA;gBAOzB,MAAM,EAAA,CAAA;sBADT,KAAK;gBAQN,YAAY,EAAA,CAAA;sBADX,MAAM;gBAMP,mBAAmB,EAAA,CAAA;sBADlB,MAAM;;;MCrEI,8BAA8B,CAAA;AAEzC,IAAA,KAAK,CAA+B;AAEpC,IAAA,KAAK,CAA+B;IAEpC,SAAS,GAAqB,KAAK,CAAC;AAEpC,IAAA,eAAe,CAA4B;AAC3C,IAAA,IACI,aAAa,GAAA;QACf,OAAO,IAAI,CAAC,eAAe,CAAC;KAC7B;IACD,IAAI,aAAa,CAAC,KAAK,EAAA;AACrB,QAAA,OAAO,CAAC,GAAG,CACT,CAAA,sCAAA,EAAyC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAE,CAAA,CACjE,CAAC;AACF,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;KACrD;AACS,IAAA,mBAAmB,GAC3B,IAAI,YAAY,EAAiB,CAAC;AAEpC,IAAA,QAAQ,CAAgC;AACxC,IAAA,IACI,MAAM,GAAA;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC;KACtB;IACD,IAAI,MAAM,CAAC,MAAyB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;QACvB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACvC;AACS,IAAA,YAAY,GAAoC,IAAI,YAAY,EAEvE,CAAC;AAEM,IAAA,mBAAmB,GAC3B,IAAI,YAAY,EAAU,CAAC;AAG7B,IAAA,uBAAuB,CAAW;AAElC,IAAA,sBAAsB,CAAW;AAEjC,IAAA,kBAAkB,CAAW;AAE7B,IAAA,WAAA,GAAA,GAAgB;AAEhB,IAAA,QAAQ,MAAW;AAEnB,IAAA,qBAAqB,CAAC,QAAgB,EAAA;AACpC,QAAA,OAAO,CAAC,GAAG,CAAC,CAAA,+BAAA,CAAiC,CAAC,CAAC;AAC/C,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACzC;AAED,IAAA,cAAc,CAAC,UAAuC,EAAA;AACpD,QAAA,OAAO,CAAC,GAAG,CAAC,CAAA,cAAA,CAAgB,CAAC,CAAC;AAC9B,QAAA,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;KAC1B;uGA1DU,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA9B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,8BAA8B,EA/E/B,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,eAAA,EAAA,MAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,4PAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,UAAA,EAAA,SAAA,EAAA,aAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,OAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,uBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,aAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,4BAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,2BAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FA2BU,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAlF1C,SAAS;AAEE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,EACzB,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,4PAAA,CAAA,EAAA,CAAA;wDA6BD,KAAK,EAAA,CAAA;sBADJ,KAAK;gBAGN,KAAK,EAAA,CAAA;sBADJ,KAAK;gBAGN,SAAS,EAAA,CAAA;sBADR,KAAK;gBAKF,aAAa,EAAA,CAAA;sBADhB,KAAK;gBAWI,mBAAmB,EAAA,CAAA;sBAA5B,MAAM;gBAKH,MAAM,EAAA,CAAA;sBADT,KAAK;gBAQI,YAAY,EAAA,CAAA;sBAArB,MAAM;gBAIG,mBAAmB,EAAA,CAAA;sBAA5B,MAAM;gBAIP,uBAAuB,EAAA,CAAA;sBADtB,KAAK;gBAGN,sBAAsB,EAAA,CAAA;sBADrB,KAAK;gBAGN,kBAAkB,EAAA,CAAA;sBADjB,KAAK;;;MCjFK,sBAAsB,CAAA;uGAAtB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,iBA9B/B,uBAAuB;YACvB,8BAA8B;YAC9B,4BAA4B;YAC5B,2BAA2B;AAC3B,YAAA,kBAAkB,aAGlB,YAAY;YACZ,WAAW;YACX,mBAAmB;YACnB,YAAY;YACZ,YAAY;YACZ,cAAc;YACd,cAAc;YACd,iBAAiB;YACjB,eAAe;YACf,kBAAkB;YAClB,iBAAiB;YACjB,qBAAqB;YACrB,aAAa;YACb,aAAa;AACb,YAAA,kBAAkB,aAGlB,uBAAuB;YACvB,8BAA8B;YAC9B,4BAA4B;YAC5B,2BAA2B,CAAA,EAAA,CAAA,CAAA;AAGlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,YAvB/B,YAAY;YACZ,WAAW;YACX,mBAAmB;YACnB,YAAY;YACZ,YAAY;YACZ,cAAc;YACd,cAAc;YACd,iBAAiB;YACjB,eAAe;YACf,kBAAkB;YAClB,iBAAiB;YACjB,qBAAqB;YACrB,aAAa;YACb,aAAa;YACb,kBAAkB,CAAA,EAAA,CAAA,CAAA;;2FAST,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAhClC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE;wBACZ,uBAAuB;wBACvB,8BAA8B;wBAC9B,4BAA4B;wBAC5B,2BAA2B;wBAC3B,kBAAkB;AACnB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,WAAW;wBACX,mBAAmB;wBACnB,YAAY;wBACZ,YAAY;wBACZ,cAAc;wBACd,cAAc;wBACd,iBAAiB;wBACjB,eAAe;wBACf,kBAAkB;wBAClB,iBAAiB;wBACjB,qBAAqB;wBACrB,aAAa;wBACb,aAAa;wBACb,kBAAkB;AACnB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,uBAAuB;wBACvB,8BAA8B;wBAC9B,4BAA4B;wBAC5B,2BAA2B;AAC5B,qBAAA;AACF,iBAAA,CAAA;;;ACnDD;;AAEG;;ACFH;;AAEG;;;;"}