{"version":3,"file":"select.mjs","sources":["../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/src/angular/select/select-animations.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/src/angular/select/select-errors.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/src/angular/select/select.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/src/angular/select/select.html","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/src/angular/select/select.module.ts"],"sourcesContent":["import {\n  animate,\n  AnimationTriggerMetadata,\n  state,\n  style,\n  transition,\n  trigger,\n} from '@angular/animations';\n\n/**\n * The following are all the animations for the sbb-select component, with each\n * const containing the metadata for one animation.\n *\n * @docs-private\n */\nexport const sbbSelectAnimations: {\n  readonly transformPanel: AnimationTriggerMetadata;\n} = {\n  /**\n   * This animation transforms the select's overlay panel on and off the page.\n   *\n   * When the panel is attached to the DOM, it fades in and when the panel is removed, it fades out.\n   */\n  transformPanel: trigger('transformPanel', [\n    state(\n      'void',\n      style({\n        opacity: 0,\n      }),\n    ),\n    state(\n      'showing',\n      style({\n        opacity: 1,\n      }),\n    ),\n    state(\n      'showing-multiple',\n      style({\n        opacity: 1,\n      }),\n    ),\n    transition('void => *', animate('120ms cubic-bezier(0, 0, 0.2, 1)')),\n    transition('* => void', animate('100ms 25ms linear', style({ opacity: 0 }))),\n  ]),\n};\n","/**\n * Returns an exception to be thrown when attempting to change a select's `multiple` option\n * after initialization.\n * @docs-private\n */\nexport function getSbbSelectDynamicMultipleError(): Error {\n  return Error('Cannot change `multiple` mode of select after initialization.');\n}\n\n/**\n * Returns an exception to be thrown when attempting to assign a non-array value to a select\n * in `multiple` mode. Note that `undefined` and `null` are still valid values to allow for\n * resetting the value.\n * @docs-private\n */\nexport function getSbbSelectNonArrayValueError(): Error {\n  return Error('Value must be an array in multiple-selection mode.');\n}\n\n/**\n * Returns an exception to be thrown when assigning a non-function value to the comparator\n * used to determine if a value corresponds to an option. Note that whether the function\n * actually takes two values and returns a boolean is not checked.\n * @docs-private\n */\nexport function getSbbSelectNonFunctionValueError(): Error {\n  return Error('`compareWith` must be a function.');\n}\n","import {\n  ActiveDescendantKeyManager,\n  addAriaReferencedId,\n  LiveAnnouncer,\n  removeAriaReferencedId,\n  _IdGenerator,\n} from '@angular/cdk/a11y';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport {\n  A,\n  DOWN_ARROW,\n  ENTER,\n  hasModifierKey,\n  LEFT_ARROW,\n  RIGHT_ARROW,\n  SPACE,\n  UP_ARROW,\n} from '@angular/cdk/keycodes';\nimport {\n  CdkConnectedOverlay,\n  CdkOverlayOrigin,\n  ConnectedPosition,\n  createRepositionScrollStrategy,\n  Overlay,\n  RepositionScrollStrategy,\n  ScrollStrategy,\n  ViewportRuler,\n} from '@angular/cdk/overlay';\nimport { AsyncPipe, NgClass } from '@angular/common';\nimport {\n  AfterContentInit,\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ContentChildren,\n  DoCheck,\n  ElementRef,\n  EventEmitter,\n  HostAttributeToken,\n  HostListener,\n  inject,\n  InjectionToken,\n  Injector,\n  Input,\n  numberAttribute,\n  OnChanges,\n  OnDestroy,\n  OnInit,\n  Output,\n  QueryList,\n  SimpleChanges,\n  ViewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport {\n  AbstractControl,\n  ControlValueAccessor,\n  FormGroupDirective,\n  NgControl,\n  NgForm,\n  Validators,\n} from '@angular/forms';\nimport {\n  getOptionScrollPosition,\n  mixinVariant,\n  SbbErrorStateMatcher,\n  SbbOptgroup,\n  SbbOption,\n  SbbOptionSelectionChange,\n  SBB_OPTION_PARENT_COMPONENT,\n  TypeRef,\n  _ErrorStateTracker,\n} from '@sbb-esta/angular/core';\nimport { SbbFormField, SbbFormFieldControl, SBB_FORM_FIELD } from '@sbb-esta/angular/form-field';\nimport { SbbIcon } from '@sbb-esta/angular/icon';\nimport { defer, merge, Observable, Subject } from 'rxjs';\nimport {\n  distinctUntilChanged,\n  filter,\n  map,\n  startWith,\n  switchMap,\n  take,\n  takeUntil,\n} from 'rxjs/operators';\n\nimport { sbbSelectAnimations } from './select-animations';\nimport {\n  getSbbSelectDynamicMultipleError,\n  getSbbSelectNonArrayValueError,\n  getSbbSelectNonFunctionValueError,\n} from './select-errors';\n\n/**\n * The following style constants are necessary to save here in order\n * to properly calculate the alignment of the selected option over\n * the trigger element.\n */\n\n/** Injection token that determines the scroll handling while a select is open. */\nexport const SBB_SELECT_SCROLL_STRATEGY = new InjectionToken<() => ScrollStrategy>(\n  'sbb-select-scroll-strategy',\n  {\n    providedIn: 'root',\n    factory: () => {\n      const injector = inject(Injector);\n      return () => createRepositionScrollStrategy(injector);\n    },\n  },\n);\n\n/**\n * @docs-private\n * @deprecated Will be removed in 22.0.0.\n * @breaking-change 22.0.0\n */\nexport function SBB_SELECT_SCROLL_STRATEGY_PROVIDER_FACTORY(\n  overlay: Overlay,\n): () => RepositionScrollStrategy {\n  return () => overlay.scrollStrategies.reposition();\n}\n\n/** Object that can be used to configure the default options for the select module. */\nexport interface SbbSelectConfig {\n  /** Time to wait in milliseconds after the last keystroke before moving focus to an item. */\n  typeaheadDebounceInterval?: number;\n\n  /** Class or list of classes to be applied to the menu's overlay panel. */\n  overlayPanelClass?: string | string[];\n\n  /**\n   * Whether nullable options can be selected by default.\n   * See `MatSelect.canSelectNullableOptions` for more information.\n   */\n  canSelectNullableOptions?: boolean;\n}\n\n/** Injection token that can be used to provide the default options the select module. */\nexport const SBB_SELECT_CONFIG = new InjectionToken<SbbSelectConfig>('SBB_SELECT_CONFIG');\n\n/**\n * @docs-private\n * @deprecated Will be removed in 22.0.0.\n * @breaking-change 22.0.0\n */\nexport const SBB_SELECT_SCROLL_STRATEGY_PROVIDER = {\n  provide: SBB_SELECT_SCROLL_STRATEGY,\n  deps: [Overlay],\n  useFactory: SBB_SELECT_SCROLL_STRATEGY_PROVIDER_FACTORY,\n};\n\n/** Change event object that is emitted when the select value has changed. */\nexport class SbbSelectChange<T = any> {\n  constructor(\n    /** Reference to the select that emitted the change event. */\n    public source: SbbSelect,\n    /** Current value of the select that emitted the event. */\n    public value: T,\n  ) {}\n}\n\nconst _SbbSelectMixinBase = mixinVariant(\n  class {\n    constructor(public _elementRef: ElementRef) {}\n  },\n);\n\n@Component({\n  selector: 'sbb-select',\n  exportAs: 'sbbSelect',\n  templateUrl: './select.html',\n  styleUrls: ['./select.css'],\n  inputs: ['disabled', 'tabIndex'],\n  encapsulation: ViewEncapsulation.None,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    role: 'combobox',\n    'aria-haspopup': 'listbox',\n    class: 'sbb-select sbb-input-element',\n    '[attr.id]': 'id',\n    '[attr.tabindex]': 'readonly || disabled ? -1 : tabIndex',\n    '[attr.aria-controls]': 'panelOpen ? id + \"-panel\" : null',\n    '[attr.aria-expanded]': 'panelOpen',\n    '[attr.aria-label]': 'ariaLabel || null',\n    '[attr.aria-required]': 'required.toString()',\n    '[attr.aria-disabled]': 'disabled.toString()',\n    '[attr.aria-invalid]': 'errorState',\n    '[attr.aria-activedescendant]': '_getAriaActiveDescendant()',\n    '[class.sbb-disabled]': 'disabled',\n    '[class.sbb-select-invalid]': 'errorState',\n    '[class.sbb-select-required]': 'required',\n    '[class.sbb-select-empty]': 'empty',\n    '[class.sbb-select-multiple]': 'multiple',\n    '[class.sbb-readonly]': 'readonly',\n    '[class.sbb-focused]': 'focused',\n    '[class.sbb-input-with-open-panel]': 'panelOpen',\n  },\n  animations: [sbbSelectAnimations.transformPanel],\n  providers: [\n    { provide: SbbFormFieldControl, useExisting: SbbSelect },\n    { provide: SBB_OPTION_PARENT_COMPONENT, useExisting: SbbSelect },\n  ],\n  imports: [SbbIcon, CdkConnectedOverlay, NgClass, AsyncPipe],\n})\nexport class SbbSelect\n  extends _SbbSelectMixinBase\n  implements\n    AfterContentInit,\n    OnChanges,\n    OnDestroy,\n    OnInit,\n    DoCheck,\n    ControlValueAccessor,\n    SbbFormFieldControl<any>\n{\n  private _viewportRuler = inject(ViewportRuler);\n  private _changeDetectorRef = inject(ChangeDetectorRef);\n  private _parentFormField = inject<SbbFormField>(SBB_FORM_FIELD, { optional: true });\n  ngControl: NgControl = inject(NgControl, { self: true, optional: true })!;\n  private _liveAnnouncer = inject(LiveAnnouncer);\n  private _defaultOptions = inject<SbbSelectConfig>(SBB_SELECT_CONFIG, { optional: true });\n  private _initialized = new Subject<void>();\n\n  /** The scroll position of the overlay panel, calculated to center the selected option. */\n  private _scrollTop = 0;\n\n  /** The last measured value for the trigger's client bounding rect. */\n  private _triggerRect: DOMRect;\n\n  /** The cached font-size of the trigger element. */\n  _triggerFontSize: number = 0;\n\n  /** The value of the select panel's transform-origin property. */\n  _transformOrigin: string = 'top';\n\n  /**\n   * The y-offset of the overlay panel in relation to the trigger's top start corner.\n   * This must be adjusted to align the selected option text over the trigger text.\n   * when the panel opens. Will change based on the y-position of the selected option.\n   */\n  _offsetY: number = 0;\n\n  /** All of the defined select options. */\n  @ContentChildren(SbbOption, { descendants: true }) options: QueryList<SbbOption>;\n\n  /** All of the defined groups of options. */\n  @ContentChildren(SbbOptgroup, { descendants: true }) optionGroups: QueryList<SbbOptgroup>;\n\n  /**\n   * This position config ensures that the top \"start\" corner of the overlay\n   * is aligned with with the top \"start\" of the origin by default (overlapping\n   * the trigger completely). If the panel cannot fit below the trigger, it\n   * will fall back to a position above the trigger.\n   */\n  _positions: ConnectedPosition[] = [\n    {\n      originX: 'start',\n      originY: 'bottom',\n      overlayX: 'start',\n      overlayY: 'top',\n    },\n    {\n      originX: 'start',\n      originY: 'top',\n      overlayX: 'start',\n      overlayY: 'bottom',\n    },\n  ];\n\n  _overlayOrigin: CdkOverlayOrigin;\n\n  /** Factory function used to create a scroll strategy for this select. */\n  private _scrollStrategyFactory = inject(SBB_SELECT_SCROLL_STRATEGY);\n\n  /** Whether or not the overlay panel is open. */\n  private _panelOpen = false;\n\n  /** Comparison function to specify which option is displayed. Defaults to object equality. */\n  private _compareWith = (o1: any, o2: any) => o1 === o2;\n\n  /** Unique id for this input. */\n  private _uid = inject(_IdGenerator).getId('sbb-select-');\n\n  /** Current `aria-labelledby` value for the select trigger. */\n  private _triggerAriaLabelledBy: string | null = null;\n\n  /**\n   * Keeps track of the previous form control assigned to the select.\n   * Used to detect if it has changed.\n   */\n  private _previousControl: AbstractControl | null | undefined;\n\n  /** Emits whenever the component is destroyed. */\n  private readonly _destroy = new Subject<void>();\n\n  /** Tracks the error state of the select. */\n  private _errorStateTracker: _ErrorStateTracker;\n\n  /**\n   * Emits whenever the component state changes and should cause the parent\n   * form-field to update. Implemented as part of `SbbFormFieldControl`.\n   * @docs-private\n   */\n  readonly stateChanges = new Subject<void>();\n\n  /**\n   * Disable the automatic labeling to avoid issues like #1918.\n   * @docs-private\n   */\n  readonly disableAutomaticLabeling = true;\n\n  /**\n   * Implemented as part of MatFormFieldControl.\n   * @docs-private\n   */\n  @Input('aria-describedby') userAriaDescribedBy: string;\n\n  /** Deals with the selection logic. */\n  _selectionModel: SelectionModel<SbbOption>;\n\n  /** Manages keyboard events for options in the panel. */\n  _keyManager: ActiveDescendantKeyManager<SbbOption>;\n\n  /** `View -> model callback called when value changes` */\n  _onChange: (value: any) => void = () => {};\n\n  /** `View -> model callback called when select has been touched` */\n  _onTouched: () => void = () => {};\n\n  /** ID for the DOM node containing the select's value. */\n  _valueId: string = inject(_IdGenerator).getId('sbb-select-value-');\n\n  /** Emits when the panel element is finished transforming in. */\n  readonly _panelDoneAnimatingStream: Subject<string> = new Subject<string>();\n\n  /** Strategy that will be used to handle scrolling while the select panel is open. */\n  _scrollStrategy: ScrollStrategy;\n\n  _overlayPanelClass: string | string[] =\n    this._defaultOptions?.overlayPanelClass || 'sbb-overlay-panel';\n\n  /** Whether the select is focused. */\n  get focused(): boolean {\n    return this._focused || this._panelOpen;\n  }\n  private _focused = false;\n\n  /** A name for this control that can be used by `sbb-form-field`. */\n  controlType: string = 'sbb-select';\n\n  /** Panel containing the select options. */\n  @ViewChild('panel') panel: ElementRef<HTMLElement>;\n\n  /** Overlay pane containing the options. */\n  @ViewChild(CdkConnectedOverlay) overlayDir: CdkConnectedOverlay;\n\n  /** Classes to be passed to the select panel. Supports the same syntax as `ngClass`. */\n  @Input() panelClass: string | string[] | Set<string> | { [key: string]: any };\n\n  /** Whether the select is disabled. */\n  @Input({ transform: booleanAttribute })\n  disabled: boolean = false; /** Placeholder to be shown if no value has been selected. */\n\n  /** Tab index of the select. */\n  @Input({ transform: (value: unknown) => (value == null ? 0 : numberAttribute(value)) })\n  tabIndex: number = 0;\n\n  @Input()\n  get placeholder(): string {\n    return this._placeholder;\n  }\n  set placeholder(value: string) {\n    this._placeholder = value;\n    this.stateChanges.next();\n  }\n  private _placeholder: string;\n\n  /** Whether the component is required. */\n  @Input({ transform: booleanAttribute })\n  get required(): boolean {\n    return this._required ?? this.ngControl?.control?.hasValidator(Validators.required) ?? false;\n  }\n  set required(value: boolean) {\n    this._required = value;\n    this.stateChanges.next();\n  }\n  private _required: boolean | undefined;\n\n  /** Whether the user should be allowed to select multiple options. */\n  @Input({ transform: booleanAttribute })\n  get multiple(): boolean {\n    return this._multiple;\n  }\n  set multiple(value: boolean) {\n    if (this._selectionModel && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n      throw getSbbSelectDynamicMultipleError();\n    }\n\n    this._multiple = value;\n  }\n  private _multiple: boolean = false;\n\n  /** Whether the element is readonly. */\n  @Input({ transform: booleanAttribute })\n  get readonly(): boolean {\n    return this._readonly;\n  }\n  set readonly(value: boolean) {\n    this._readonly = value;\n    this.stateChanges.next();\n  }\n  private _readonly: boolean = false;\n\n  /**\n   * Function to compare the option values with the selected values. The first argument\n   * is a value from an option. The second is a value from the selection. A boolean\n   * should be returned.\n   */\n  @Input()\n  get compareWith() {\n    return this._compareWith;\n  }\n  set compareWith(fn: (o1: any, o2: any) => boolean) {\n    if (typeof fn !== 'function' && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n      throw getSbbSelectNonFunctionValueError();\n    }\n    this._compareWith = fn;\n    if (this._selectionModel) {\n      // A different comparator means the selection could change.\n      this._initializeSelection();\n    }\n  }\n\n  /** Value of the select control. */\n  @Input()\n  get value(): any {\n    return this._value;\n  }\n  set value(newValue: any) {\n    const hasAssigned = this._assignValue(newValue);\n    if (hasAssigned) {\n      this._onChange(newValue);\n    }\n  }\n  private _value: any;\n\n  /** Aria label of the select. If not specified, the placeholder will be used as label. */\n  @Input('aria-label') ariaLabel: string = '';\n\n  /** Input that can be used to specify the `aria-labelledby` attribute. */\n  @Input('aria-labelledby') ariaLabelledby: string;\n\n  /** Object used to control when error messages are shown. */\n  @Input()\n  get errorStateMatcher() {\n    return this._errorStateTracker.matcher;\n  }\n  set errorStateMatcher(value: SbbErrorStateMatcher) {\n    this._errorStateTracker.matcher = value;\n  }\n\n  /** Time to wait in milliseconds after the last keystroke before moving focus to an item. */\n  @Input({ transform: numberAttribute })\n  typeaheadDebounceInterval: number;\n\n  /**\n   * Function used to sort the values in a select in multiple mode.\n   * Follows the same logic as `Array.prototype.sort`.\n   */\n  @Input() sortComparator: (a: SbbOption, b: SbbOption, options: SbbOption[]) => number;\n\n  /** Unique id of the element. */\n  @Input()\n  get id(): string {\n    return this._id;\n  }\n  set id(value: string) {\n    this._id = value || this._uid;\n    this.stateChanges.next();\n  }\n  private _id: string;\n\n  /** Whether the select is in an error state. */\n  get errorState() {\n    return this._errorStateTracker.errorState;\n  }\n  set errorState(value: boolean) {\n    this._errorStateTracker.errorState = value;\n  }\n\n  /**\n   * By default selecting an option with a `null` or `undefined` value will reset the select's\n   * value. Enable this option if the reset behavior doesn't match your requirements and instead\n   * the nullable options should become selected. The value of this input can be controlled app-wide\n   * using the `MAT_SELECT_CONFIG` injection token.\n   */\n  @Input({ transform: booleanAttribute })\n  canSelectNullableOptions: boolean = this._defaultOptions?.canSelectNullableOptions ?? false;\n\n  /** Combined stream of all of the child options' change events. */\n  readonly optionSelectionChanges: Observable<SbbOptionSelectionChange> = defer(() => {\n    const options = this.options;\n\n    if (options) {\n      return options.changes.pipe(\n        startWith(options),\n        switchMap(() => merge(...options.map((option) => option.onSelectionChange))),\n      );\n    }\n\n    return this._initialized.pipe(switchMap(() => this.optionSelectionChanges));\n  });\n\n  /** Event emitted when the select panel has been toggled. */\n  @Output() readonly openedChange: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n  /** Event emitted when the select has been opened. */\n  @Output('opened') readonly _openedStream: Observable<void> = this.openedChange.pipe(\n    filter((o) => o),\n    map(() => {}),\n  );\n\n  /** Event emitted when the select has been closed. */\n  @Output('closed') readonly _closedStream: Observable<void> = this.openedChange.pipe(\n    filter((o) => !o),\n    map(() => {}),\n  );\n\n  /** Event emitted when the selected value has been changed by the user. */\n  @Output()\n  readonly selectionChange: EventEmitter<SbbSelectChange> = new EventEmitter<SbbSelectChange>();\n\n  /**\n   * Event that emits whenever the raw value of the select changes. This is here primarily\n   * to facilitate the two-way binding for the `value` input.\n   * @docs-private\n   */\n  @Output() readonly valueChange: EventEmitter<any> = new EventEmitter<any>();\n\n  constructor(...args: unknown[]);\n  constructor() {\n    const defaultErrorStateMatcher = inject(SbbErrorStateMatcher);\n    const elementRef = inject(ElementRef);\n    const parentForm = inject(NgForm, { optional: true });\n    const parentFormGroup = inject(FormGroupDirective, { optional: true });\n    const tabIndex = inject(new HostAttributeToken('tabindex'), { optional: true });\n\n    super(elementRef);\n    const _defaultOptions = this._defaultOptions;\n\n    if (this.ngControl) {\n      // Note: we provide the value accessor through here, instead of\n      // the `providers` to avoid running into a circular import.\n      this.ngControl.valueAccessor = this;\n    }\n\n    // Note that we only want to set this when the defaults pass it in, otherwise it should\n    // stay as `undefined` so that it falls back to the default in the key manager.\n    if (_defaultOptions?.typeaheadDebounceInterval != null) {\n      this.typeaheadDebounceInterval = _defaultOptions.typeaheadDebounceInterval;\n    }\n\n    this._errorStateTracker = new _ErrorStateTracker(\n      defaultErrorStateMatcher,\n      this.ngControl,\n      parentFormGroup,\n      parentForm,\n      this.stateChanges,\n    );\n\n    this._scrollStrategy = this._scrollStrategyFactory();\n    this.tabIndex = tabIndex == null ? 0 : parseInt(tabIndex, 10) || 0;\n\n    // Force setter to be called in case id was not specified.\n    this.id = this.id;\n\n    this._overlayOrigin = new CdkOverlayOrigin(elementRef);\n  }\n\n  ngOnInit() {\n    this._selectionModel = new SelectionModel<SbbOption>(this.multiple);\n    this.stateChanges.next();\n\n    // We need `distinctUntilChanged` here, because some browsers will\n    // fire the animation end event twice for the same animation. See:\n    // https://github.com/angular/angular/issues/24084\n    this._panelDoneAnimatingStream\n      .pipe(distinctUntilChanged(), takeUntil(this._destroy))\n      .subscribe(() => this._panelDoneAnimating(this.panelOpen));\n\n    this._viewportRuler\n      .change()\n      .pipe(takeUntil(this._destroy))\n      .subscribe(() => {\n        if (this.panelOpen) {\n          this._triggerRect = this._elementRef.nativeElement.getBoundingClientRect();\n          this._changeDetectorRef.markForCheck();\n        }\n      });\n  }\n\n  ngAfterContentInit() {\n    this._initialized.next();\n    this._initialized.complete();\n\n    this._initKeyManager();\n\n    this._selectionModel.changed.pipe(takeUntil(this._destroy)).subscribe((event) => {\n      event.added.forEach((option) => option.select());\n      event.removed.forEach((option) => option.deselect());\n    });\n\n    this.options.changes.pipe(startWith(null), takeUntil(this._destroy)).subscribe(() => {\n      this._resetOptions();\n      this._initializeSelection();\n    });\n  }\n\n  ngDoCheck() {\n    const newAriaLabelledby = this._getTriggerAriaLabelledby();\n    const ngControl = this.ngControl;\n\n    // We have to manage setting the `aria-labelledby` ourselves, because part of its value\n    // is computed as a result of a content query which can cause this binding to trigger a\n    // \"changed after checked\" error.\n    if (newAriaLabelledby !== this._triggerAriaLabelledBy) {\n      const element: HTMLElement = this._elementRef.nativeElement;\n      this._triggerAriaLabelledBy = newAriaLabelledby;\n      if (newAriaLabelledby) {\n        element.setAttribute('aria-labelledby', newAriaLabelledby);\n      } else {\n        element.removeAttribute('aria-labelledby');\n      }\n    }\n\n    if (this.ngControl) {\n      // The disabled state might go out of sync if the form group is swapped out. See #17860.\n      if (this._previousControl !== ngControl.control) {\n        if (\n          this._previousControl !== undefined &&\n          ngControl.disabled !== null &&\n          ngControl.disabled !== this.disabled\n        ) {\n          this.disabled = ngControl.disabled;\n        }\n\n        this._previousControl = ngControl.control;\n      }\n\n      this.updateErrorState();\n    }\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    // Updating the disabled state is handled by the input, but we need to additionally let\n    // the parent form field know to run change detection when the disabled state changes.\n    if (changes['disabled'] || changes['userAriaDescribedBy']) {\n      this.stateChanges.next();\n    }\n\n    if (changes['typeaheadDebounceInterval'] && this._keyManager) {\n      this._keyManager.withTypeAhead(this.typeaheadDebounceInterval);\n    }\n  }\n\n  ngOnDestroy() {\n    this._destroy.next();\n    this._destroy.complete();\n    this.stateChanges.complete();\n    this._keyManager?.destroy();\n    this._clearFromModal();\n  }\n\n  /** Toggles the overlay panel open or closed. */\n  @HostListener('click')\n  toggle(): void {\n    this.panelOpen ? this.close() : this.open();\n  }\n\n  /** Opens the overlay panel. */\n  open(): void {\n    if (this._canOpen()) {\n      this._applyModalPanelOwnership();\n\n      this._panelOpen = true;\n      this._keyManager.withHorizontalOrientation(null);\n      this._highlightCorrectOption();\n      this._changeDetectorRef.markForCheck();\n\n      this._triggerRect = this._elementRef.nativeElement.getBoundingClientRect();\n      // Note: The computed font-size will be a string pixel value (e.g. \"16px\").\n      // `parseInt` ignores the trailing 'px' and converts this to a number.\n      this._triggerFontSize = parseInt(\n        getComputedStyle(this._elementRef.nativeElement).fontSize || '0',\n        10,\n      );\n\n      // Set the font size on the panel element once it exists.\n      this._initialized.subscribe(() => {\n        if (\n          this._triggerFontSize &&\n          this.overlayDir.overlayRef &&\n          this.overlayDir.overlayRef.overlayElement\n        ) {\n          this.overlayDir.overlayRef.overlayElement.style.fontSize = `${this._triggerFontSize}px`;\n        }\n        this._calculateOverlayPosition();\n      });\n    }\n  }\n\n  /**\n   * Track which modal we have modified the `aria-owns` attribute of. When the combobox trigger is\n   * inside an aria-modal, we apply aria-owns to the parent modal with the `id` of the options\n   * panel. Track the modal we have changed so we can undo the changes on destroy.\n   */\n  private _trackedModal: Element | null = null;\n\n  /**\n   * If the select trigger is inside of an `aria-modal` element, connect\n   * that modal to the options panel with `aria-owns`.\n   *\n   * For some browser + screen reader combinations, when navigation is inside\n   * of an `aria-modal` element, the screen reader treats everything outside\n   * of that modal as hidden or invisible.\n   *\n   * This causes a problem when the combobox trigger is _inside_ of a modal, because the\n   * options panel is rendered _outside_ of that modal, preventing screen reader navigation\n   * from reaching the panel.\n   *\n   * We can work around this issue by applying `aria-owns` to the modal with the `id` of\n   * the options panel. This effectively communicates to assistive technology that the\n   * options panel is part of the same interaction as the modal.\n   *\n   * At time of this writing, this issue is present in VoiceOver.\n   * See https://github.com/angular/components/issues/20694\n   */\n  private _applyModalPanelOwnership() {\n    // TODO(http://github.com/angular/components/issues/26853): consider de-duplicating this with\n    // the `LiveAnnouncer` and any other usages.\n    //\n    // Note that the selector here is limited to CDK overlays at the moment in order to reduce the\n    // section of the DOM we need to look through. This should cover all the cases we support, but\n    // the selector can be expanded if it turns out to be too narrow.\n    const modal = this._elementRef.nativeElement.closest(\n      'body > .cdk-overlay-container [aria-modal=\"true\"]',\n    );\n\n    if (!modal) {\n      // Most commonly, the select trigger is not inside a modal.\n      return;\n    }\n\n    const panelId = `${this.id}-panel`;\n\n    if (this._trackedModal) {\n      removeAriaReferencedId(this._trackedModal, 'aria-owns', panelId);\n    }\n\n    addAriaReferencedId(modal, 'aria-owns', panelId);\n    this._trackedModal = modal;\n  }\n\n  /** Clears the reference to the listbox overlay element from the modal it was added to. */\n  private _clearFromModal() {\n    if (!this._trackedModal) {\n      // Most commonly, the select trigger is not used inside a modal.\n      return;\n    }\n\n    const panelId = `${this.id}-panel`;\n\n    removeAriaReferencedId(this._trackedModal, 'aria-owns', panelId);\n    this._trackedModal = null;\n  }\n\n  /** Closes the overlay panel and focuses the host element. */\n  close(): void {\n    if (this._panelOpen) {\n      this._panelOpen = false;\n      this._keyManager.withHorizontalOrientation('ltr');\n      this._changeDetectorRef.markForCheck();\n      this._onTouched();\n    }\n  }\n\n  /**\n   * Sets the select's value. Part of the ControlValueAccessor interface\n   * required to integrate with Angular's core forms API.\n   *\n   * @param value New value to be written to the model.\n   */\n  writeValue(value: any): void {\n    this._assignValue(value);\n  }\n\n  /**\n   * Saves a callback function to be invoked when the select's value\n   * changes from user input. Part of the ControlValueAccessor interface\n   * required to integrate with Angular's core forms API.\n   *\n   * @param fn Callback to be triggered when the value changes.\n   */\n  registerOnChange(fn: (value: any) => void): void {\n    this._onChange = fn;\n  }\n\n  /**\n   * Saves a callback function to be invoked when the select is blurred\n   * by the user. Part of the ControlValueAccessor interface required\n   * to integrate with Angular's core forms API.\n   *\n   * @param fn Callback to be triggered when the component has been touched.\n   */\n  registerOnTouched(fn: () => {}): void {\n    this._onTouched = fn;\n  }\n\n  /**\n   * Disables the select. Part of the ControlValueAccessor interface required\n   * to integrate with Angular's core forms API.\n   *\n   * @param isDisabled Sets whether the component is disabled.\n   */\n  setDisabledState(isDisabled: boolean): void {\n    this.disabled = isDisabled;\n    this._changeDetectorRef.markForCheck();\n    this.stateChanges.next();\n  }\n\n  /** Whether or not the overlay panel is open. */\n  get panelOpen(): boolean {\n    return this._panelOpen;\n  }\n\n  /** The currently selected option. */\n  get selected(): SbbOption | SbbOption[] {\n    return this.multiple ? this._selectionModel?.selected || [] : this._selectionModel?.selected[0];\n  }\n\n  /** The value displayed in the trigger. */\n  get triggerValue(): string {\n    if (this.empty) {\n      return '';\n    }\n\n    if (this._multiple) {\n      const selectedOptions = this._selectionModel.selected.map((option) => option.viewValue);\n\n      return selectedOptions.join(', ');\n    }\n\n    return this._selectionModel.selected[0].viewValue;\n  }\n\n  /** Refreshes the error state of the select. */\n  updateErrorState() {\n    this._errorStateTracker.updateErrorState();\n  }\n\n  /** Handles all keydown events on the select. */\n  @HostListener('keydown', ['$event'])\n  _handleKeydown(event: TypeRef<KeyboardEvent>): void {\n    if (!this.disabled) {\n      this.panelOpen ? this._handleOpenKeydown(event) : this._handleClosedKeydown(event);\n    }\n  }\n\n  /** Handles keyboard events while the select is closed. */\n  private _handleClosedKeydown(event: KeyboardEvent): void {\n    const keyCode = event.keyCode;\n    const isArrowKey =\n      keyCode === DOWN_ARROW ||\n      keyCode === UP_ARROW ||\n      keyCode === LEFT_ARROW ||\n      keyCode === RIGHT_ARROW;\n    const isOpenKey = keyCode === ENTER || keyCode === SPACE;\n    const manager = this._keyManager;\n\n    // Open the select on ALT + arrow key to match the native <select>\n    if (\n      (!manager.isTyping() && isOpenKey && !hasModifierKey(event)) ||\n      ((this.multiple || event.altKey) && isArrowKey)\n    ) {\n      event.preventDefault(); // prevents the page from scrolling down when pressing space\n      this.open();\n    } else if (!this.multiple) {\n      const previouslySelectedOption = this.selected;\n      manager.onKeydown(event);\n      const selectedOption = this.selected;\n\n      // Since the value has changed, we need to announce it ourselves.\n      if (selectedOption && previouslySelectedOption !== selectedOption) {\n        // We set a duration on the live announcement, because we want the live element to be\n        // cleared after a while so that users can't navigate to it using the arrow keys.\n        this._liveAnnouncer.announce((selectedOption as SbbOption).viewValue, 10000);\n      }\n    }\n  }\n\n  /** Handles keyboard events when the selected is open. */\n  private _handleOpenKeydown(event: KeyboardEvent): void {\n    const manager = this._keyManager;\n    const keyCode = event.keyCode;\n    const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW;\n    const isTyping = manager.isTyping();\n\n    if (isArrowKey && event.altKey) {\n      // Close the select on ALT + arrow key to match the native <select>\n      event.preventDefault();\n      this.close();\n      // Don't do anything in this case if the user is typing,\n      // because the typing sequence can include the space key.\n    } else if (\n      !isTyping &&\n      (keyCode === ENTER || keyCode === SPACE) &&\n      manager.activeItem &&\n      !hasModifierKey(event)\n    ) {\n      event.preventDefault();\n      manager.activeItem._selectViaInteraction();\n    } else if (!isTyping && this._multiple && keyCode === A && event.ctrlKey) {\n      event.preventDefault();\n      const hasDeselectedOptions = this.options.some((opt) => !opt.disabled && !opt.selected);\n\n      this.options.forEach((option) => {\n        if (!option.disabled) {\n          hasDeselectedOptions ? option.select() : option.deselect();\n        }\n      });\n    } else {\n      const previouslyFocusedIndex = manager.activeItemIndex;\n\n      manager.onKeydown(event);\n\n      if (\n        this._multiple &&\n        isArrowKey &&\n        event.shiftKey &&\n        manager.activeItem &&\n        manager.activeItemIndex !== previouslyFocusedIndex\n      ) {\n        manager.activeItem._selectViaInteraction();\n      }\n    }\n  }\n\n  @HostListener('focus')\n  _onFocus() {\n    if (!this.disabled) {\n      this._focused = true;\n      this.stateChanges.next();\n    }\n  }\n\n  /**\n   * Calls the touched callback only if the panel is closed. Otherwise, the trigger will\n   * \"blur\" to the panel when it opens, causing a false positive.\n   */\n  @HostListener('blur')\n  _onBlur() {\n    this._focused = false;\n    this._keyManager?.cancelTypeahead();\n\n    if (!this.disabled && !this.panelOpen) {\n      this._onTouched();\n      this._changeDetectorRef.markForCheck();\n      this.stateChanges.next();\n    }\n  }\n\n  /** Callback that is invoked when the overlay panel has been attached. */\n  _onAttached(): void {\n    this.overlayDir.positionChange.pipe(take(1)).subscribe((positions) => {\n      if (positions.connectionPair.originY === 'top') {\n        this.panel.nativeElement.classList.add('sbb-panel-above');\n        this._elementRef.nativeElement.classList.add('sbb-input-with-open-panel-above');\n      } else {\n        this.panel.nativeElement.classList.remove('sbb-panel-above');\n        this._elementRef.nativeElement.classList.remove('sbb-input-with-open-panel-above');\n      }\n      this._changeDetectorRef.detectChanges();\n      this._positioningSettled();\n    });\n  }\n\n  /** Whether the select has a value. */\n  get empty(): boolean {\n    return !this._selectionModel || this._selectionModel.isEmpty();\n  }\n\n  private _initializeSelection(): void {\n    // Defer setting the value in order to avoid the \"Expression\n    // has changed after it was checked\" errors from Angular.\n    Promise.resolve().then(() => {\n      if (this.ngControl) {\n        this._value = this.ngControl.value;\n      }\n\n      this._setSelectionByValue(this._value);\n      this.stateChanges.next();\n    });\n  }\n\n  /**\n   * Sets the selected option based on a value. If no option can be\n   * found with the designated value, the select trigger is cleared.\n   */\n  private _setSelectionByValue(value: any | any[]): void {\n    this._selectionModel.selected.forEach((option) => option.setInactiveStyles());\n    this._selectionModel.clear();\n\n    if (this.multiple && value) {\n      if (!Array.isArray(value) && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n        throw getSbbSelectNonArrayValueError();\n      }\n\n      value.forEach((currentValue: any) => this._selectOptionByValue(currentValue));\n      this._sortValues();\n    } else {\n      const correspondingOption = this._selectOptionByValue(value);\n\n      // Shift focus to the active item. Note that we shouldn't do this in multiple\n      // mode, because we don't know what option the user interacted with last.\n      if (correspondingOption) {\n        this._keyManager.updateActiveItem(correspondingOption);\n      } else if (!this.panelOpen) {\n        // Otherwise reset the highlighted option. Note that we only want to do this while\n        // closed, because doing it while open can shift the user's focus unnecessarily.\n        this._keyManager.updateActiveItem(-1);\n      }\n    }\n\n    this._changeDetectorRef.markForCheck();\n  }\n\n  /**\n   * Finds and selects and option based on its value.\n   * @returns Option that has the corresponding value.\n   */\n  private _selectOptionByValue(value: any): SbbOption | undefined {\n    const correspondingOption = this.options.find((option: SbbOption) => {\n      // Skip options that are already in the model. This allows us to handle cases\n      // where the same primitive value is selected multiple times.\n      if (this._selectionModel.isSelected(option)) {\n        return false;\n      }\n\n      try {\n        // Treat null as a special reset value.\n        return (\n          (option.value != null || this.canSelectNullableOptions) &&\n          this._compareWith(option.value, value)\n        );\n      } catch (error) {\n        if (typeof ngDevMode === 'undefined' || ngDevMode) {\n          // Notify developers of errors in their comparator.\n          console.warn(error);\n        }\n        return false;\n      }\n    });\n\n    if (correspondingOption) {\n      this._selectionModel.select(correspondingOption);\n    }\n\n    return correspondingOption;\n  }\n\n  /** Assigns a specific value to the select. Returns whether the value has changed. */\n  private _assignValue(newValue: any | any[]): boolean {\n    // Always re-assign an array, because it might have been mutated.\n    if (newValue !== this._value || (this._multiple && Array.isArray(newValue))) {\n      if (this.options) {\n        this._setSelectionByValue(newValue);\n      }\n\n      this._value = newValue;\n      return true;\n    }\n    return false;\n  }\n\n  /** Sets up a key manager to listen to keyboard events on the overlay panel. */\n  private _initKeyManager() {\n    this._keyManager = new ActiveDescendantKeyManager<SbbOption>(this.options)\n      .withTypeAhead(this.typeaheadDebounceInterval)\n      .withVerticalOrientation()\n      .withHorizontalOrientation('ltr')\n      .withHomeAndEnd()\n      .withPageUpDown()\n      .withAllowedModifierKeys(['shiftKey']);\n\n    this._keyManager.tabOut.subscribe(() => {\n      if (this.panelOpen) {\n        // Select the active item when tabbing away. This is consistent with how the native\n        // select behaves. Note that we only want to do this in single selection mode.\n        if (!this.multiple && this._keyManager.activeItem) {\n          this._keyManager.activeItem._selectViaInteraction();\n        }\n\n        // Restore focus to the trigger before closing. Ensures that the focus\n        // position won't be lost if the user got focus into the overlay.\n        this.focus();\n        this.close();\n      }\n    });\n\n    this._keyManager.change.subscribe(() => {\n      if (this._panelOpen && this.panel) {\n        this._scrollOptionIntoView(this._keyManager.activeItemIndex || 0);\n      } else if (!this._panelOpen && !this.multiple && this._keyManager.activeItem) {\n        this._keyManager.activeItem._selectViaInteraction();\n      }\n    });\n  }\n\n  /** Drops current option subscriptions and IDs and resets from scratch. */\n  private _resetOptions(): void {\n    const changedOrDestroyed = merge(this.options.changes, this._destroy);\n\n    this.optionSelectionChanges.pipe(takeUntil(changedOrDestroyed)).subscribe((event) => {\n      this._onSelect(event.source, event.isUserInput);\n\n      if (event.isUserInput && !this.multiple && this._panelOpen) {\n        this.close();\n        this.focus();\n      }\n    });\n\n    // Listen to changes in the internal state of the options and react accordingly.\n    // Handles cases like the labels of the selected options changing.\n    merge(...this.options.map((option) => option._stateChanges))\n      .pipe(takeUntil(changedOrDestroyed))\n      .subscribe(() => {\n        // `_stateChanges` can fire as a result of a change in the label's DOM value which may\n        // be the result of an expression changing. We have to use `detectChanges` in order\n        // to avoid \"changed after checked\" errors (see #14793).\n        this._changeDetectorRef.detectChanges();\n        this.stateChanges.next();\n      });\n  }\n\n  /** Invoked when an option is clicked. */\n  private _onSelect(option: SbbOption, isUserInput: boolean): void {\n    const wasSelected = this._selectionModel.isSelected(option);\n\n    if (!this.canSelectNullableOptions && option.value == null && !this._multiple) {\n      option.deselect();\n      this._selectionModel.clear();\n\n      if (this.value != null) {\n        this._propagateChanges(option.value);\n      }\n    } else {\n      if (wasSelected !== option.selected) {\n        option.selected\n          ? this._selectionModel.select(option)\n          : this._selectionModel.deselect(option);\n      }\n\n      if (isUserInput) {\n        this._keyManager.setActiveItem(option);\n      }\n\n      if (this.multiple) {\n        this._sortValues();\n\n        if (isUserInput) {\n          // In case the user selected the option with their mouse, we\n          // want to restore focus back to the trigger, in order to\n          // prevent the select keyboard controls from clashing with\n          // the ones from `sbb-option`.\n          this.focus();\n        }\n      }\n    }\n\n    if (wasSelected !== this._selectionModel.isSelected(option)) {\n      this._propagateChanges();\n    }\n\n    this.stateChanges.next();\n  }\n\n  /** Sorts the selected values in the selected based on their order in the panel. */\n  private _sortValues() {\n    if (this.multiple) {\n      const options = this.options.toArray();\n\n      this._selectionModel.sort((a, b) => {\n        return this.sortComparator\n          ? this.sortComparator(a, b, options)\n          : options.indexOf(a) - options.indexOf(b);\n      });\n      this.stateChanges.next();\n    }\n  }\n\n  /** Emits change event to set the model value. */\n  private _propagateChanges(fallbackValue?: any): void {\n    let valueToEmit: any;\n\n    if (this.multiple) {\n      valueToEmit = (this.selected as SbbOption[]).map((option) => option.value);\n    } else {\n      valueToEmit = this.selected ? (this.selected as SbbOption).value : fallbackValue;\n    }\n\n    this._value = valueToEmit;\n    this.valueChange.emit(valueToEmit);\n    this._onChange(valueToEmit);\n    this.selectionChange.emit(new SbbSelectChange(this, valueToEmit));\n    this._changeDetectorRef.markForCheck();\n  }\n\n  /**\n   * Highlights the selected item. If no option is selected, it will highlight\n   * the first item instead.\n   */\n  private _highlightCorrectOption(): void {\n    if (this._keyManager) {\n      if (this.empty) {\n        this._keyManager.setFirstItemActive();\n      } else {\n        this._keyManager.setActiveItem(this._selectionModel.selected[0]);\n      }\n    }\n  }\n\n  /** Whether the panel is allowed to open. */\n  private _canOpen(): boolean {\n    return !this._panelOpen && !this.disabled && this.options?.length > 0 && !this.readonly;\n  }\n\n  /** Focuses the select element. */\n  focus(options?: FocusOptions): void {\n    this._elementRef.nativeElement.focus(options);\n  }\n\n  /** Gets the aria-labelledby for the select panel. */\n  _getPanelAriaLabelledby(): string | null {\n    if (this.ariaLabel) {\n      return null;\n    }\n\n    const labelId = this._parentFormField?.getLabelId() || null;\n    const labelExpression = labelId ? labelId + ' ' : '';\n    return this.ariaLabelledby ? labelExpression + this.ariaLabelledby : labelId;\n  }\n\n  /** Determines the `aria-activedescendant` to be set on the host. */\n  _getAriaActiveDescendant(): string | null {\n    if (this.panelOpen && this._keyManager && this._keyManager.activeItem) {\n      return this._keyManager.activeItem.id;\n    }\n\n    return null;\n  }\n\n  /** Gets the aria-labelledby of the select component trigger. */\n  private _getTriggerAriaLabelledby(): string | null {\n    if (this.ariaLabel) {\n      return null;\n    }\n\n    let value = this._parentFormField?.getLabelId() || '';\n\n    if (this.ariaLabelledby) {\n      value += ' ' + this.ariaLabelledby;\n    }\n\n    // The value should not be used for the trigger's aria-labelledby,\n    // but this currently \"breaks\" accessibility tests since they complain\n    // there is no aria-labelledby. This is because they are not setting an\n    // appropriate label on the form field or select.\n    // TODO: remove this conditional after fixing clients by ensuring their\n    // selects have a label applied.\n    if (!value) {\n      value = this._valueId;\n    }\n\n    return value;\n  }\n\n  /** Called when the overlay panel is done animating. */\n  _panelDoneAnimating(isOpen: boolean) {\n    if (this.panelOpen) {\n      this._scrollTop = 0;\n    } else {\n      this.overlayDir.offsetX = 0;\n      this._changeDetectorRef.markForCheck();\n    }\n\n    if (!isOpen) {\n      this._elementRef.nativeElement.classList.remove('sbb-input-with-open-panel-above');\n    }\n\n    this.openedChange.emit(isOpen);\n  }\n\n  protected _getOverlayMinWidth(): number {\n    return this._triggerRect?.width;\n  }\n\n  /**\n   * Implemented as part of SbbFormFieldControl.\n   * @docs-private\n   */\n  setDescribedByIds(ids: string[]) {\n    if (ids.length) {\n      this._elementRef.nativeElement.setAttribute('aria-describedby', ids.join(' '));\n    } else {\n      this._elementRef.nativeElement.removeAttribute('aria-describedby');\n    }\n  }\n\n  /**\n   * Forward focus if a user clicks on an associated label.\n   * Implemented as part of SbbFormFieldControl.\n   * @docs-private\n   */\n  onContainerClick() {\n    this.focus();\n    this.open();\n  }\n\n  /**\n   * Calculates the scroll position of the select's overlay panel.\n   *\n   * Attempts to center the selected option in the panel. If the option is\n   * too high or too low in the panel to be scrolled to the center, it clamps the\n   * scroll position to the min or max scroll positions respectively.\n   */\n  _calculateOverlayScroll(\n    selectedOption: SbbOption,\n    scrollBuffer: number,\n    maxScroll: number,\n  ): number {\n    const itemHeight = selectedOption._getHostElement().offsetHeight;\n    const optionOffsetFromScrollTop = selectedOption._getHostElement().offsetTop;\n    const halfOptionHeight = itemHeight / 2;\n\n    // Starts at the optionOffsetFromScrollTop, which scrolls the option to the top of the\n    // scroll container, then subtracts the scroll buffer to scroll the option down to\n    // the center of the overlay panel. Half the option height must be re-added to the\n    // scrollTop so the option is centered based on its middle, not its top edge.\n    const optimalScrollPosition = optionOffsetFromScrollTop - scrollBuffer + halfOptionHeight;\n    return Math.min(Math.max(0, optimalScrollPosition), maxScroll);\n  }\n\n  /** Scrolls the active option into view. */\n  private _scrollOptionIntoView(index: number): void {\n    if (index === 0) {\n      // Scroll to top if first index is selected. This would ensure that group labels are displayed.\n      this.panel.nativeElement.scrollTop = 0;\n    } else {\n      const option = this.options.toArray()[index];\n      if (option) {\n        const element = option._getHostElement();\n        this.panel.nativeElement.scrollTop = getOptionScrollPosition(\n          element.offsetTop,\n          element.offsetHeight,\n          this.panel.nativeElement.scrollTop,\n          this.panel.nativeElement.offsetHeight,\n        );\n      }\n    }\n  }\n\n  private _positioningSettled() {\n    this.panel.nativeElement.scrollTop = this._scrollTop;\n  }\n\n  /** Calculates the scroll position */\n  private _calculateOverlayPosition(): void {\n    if (!this.panel) {\n      return;\n    }\n    const panelHeight = this.panel.nativeElement.clientHeight;\n    const scrollContainerHeight = this.panel.nativeElement.scrollHeight;\n\n    // The farthest the panel can be scrolled before it hits the bottom\n    const maxScroll = scrollContainerHeight - panelHeight;\n\n    const firstSelectedOption = this._selectionModel.selected[0];\n\n    if (this.empty || this.options.toArray().indexOf(firstSelectedOption) === -1) {\n      this._scrollTop = 0;\n      return;\n    }\n\n    // We must maintain a scroll buffer so the selected option will be scrolled to the\n    // center of the overlay panel rather than the top.\n    const scrollBuffer = panelHeight / 2;\n    this._scrollTop = this._calculateOverlayScroll(firstSelectedOption, scrollBuffer, maxScroll);\n  }\n}\n","<div [attr.id]=\"_valueId\" class=\"sbb-select-value\" [class.sbb-select-value-empty]=\"empty\">\n  @switch (empty) {\n    @case (true) {\n      <span class=\"sbb-select-placeholder\">{{ !readonly ? placeholder || '\\u00A0' : '-' }}</span>\n    }\n    @case (false) {\n      <span class=\"sbb-select-value-text\">\n        <span>{{ triggerValue || '\\u00A0' }}</span>\n      </span>\n    }\n  }\n</div>\n\n@switch (variant | async) {\n  @case ('standard') {\n    <sbb-icon\n      class=\"sbb-icon-scaled sbb-select-arrow-icon\"\n      svgIcon=\"chevron-small-down-small\"\n    ></sbb-icon>\n  }\n  @default {\n    <sbb-icon\n      class=\"sbb-icon-scaled sbb-select-arrow-icon sbb-select-arrow-icon-lean\"\n      svgIcon=\"chevron-right-small\"\n    ></sbb-icon>\n  }\n}\n\n<ng-template\n  cdk-connected-overlay\n  cdkConnectedOverlayLockPosition\n  cdkConnectedOverlayFlexibleDimensions\n  cdkConnectedOverlayHasBackdrop\n  cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n  [cdkConnectedOverlayPanelClass]=\"_overlayPanelClass\"\n  [cdkConnectedOverlayScrollStrategy]=\"_scrollStrategy\"\n  [cdkConnectedOverlayOrigin]=\"_overlayOrigin\"\n  [cdkConnectedOverlayOpen]=\"panelOpen\"\n  [cdkConnectedOverlayPositions]=\"_positions\"\n  [cdkConnectedOverlayWidth]=\"_getOverlayMinWidth()\"\n  [cdkConnectedOverlayOffsetX]=\"0\"\n  [cdkConnectedOverlayOffsetY]=\"_offsetY\"\n  [cdkConnectedOverlayMinHeight]=\"30\"\n  (backdropClick)=\"close()\"\n  (attach)=\"_onAttached()\"\n  (detach)=\"close()\"\n>\n  <div\n    #panel\n    role=\"listbox\"\n    tabindex=\"-1\"\n    class=\"sbb-panel sbb-panel-padded sbb-select-panel sbb-scrollbar\"\n    [attr.id]=\"id + '-panel'\"\n    [attr.aria-multiselectable]=\"multiple\"\n    [attr.aria-label]=\"ariaLabel || null\"\n    [attr.aria-labelledby]=\"_getPanelAriaLabelledby()\"\n    [ngClass]=\"panelClass\"\n    [@transformPanel]=\"multiple ? 'showing-multiple' : 'showing'\"\n    (@transformPanel.done)=\"_panelDoneAnimatingStream.next($event.toState)\"\n    [style.transformOrigin]=\"_transformOrigin\"\n    [style.font-size.px]=\"_triggerFontSize\"\n    (keydown)=\"_handleKeydown($event)\"\n    [class.sbb-select-multiple]=\"multiple\"\n  >\n    <ng-content></ng-content>\n  </div>\n</ng-template>\n","import { OverlayModule } from '@angular/cdk/overlay';\nimport { NgModule } from '@angular/core';\nimport { SbbOptionModule } from '@sbb-esta/angular/core';\nimport { SbbCommonModule } from '@sbb-esta/angular/core';\nimport { SbbIconModule } from '@sbb-esta/angular/icon';\n\nimport { SbbSelect, SBB_SELECT_SCROLL_STRATEGY_PROVIDER } from './select';\n\n@NgModule({\n  imports: [OverlayModule, SbbCommonModule, SbbIconModule, SbbOptionModule, SbbSelect],\n  exports: [SbbOptionModule, OverlayModule, SbbSelect],\n  providers: [SBB_SELECT_SCROLL_STRATEGY_PROVIDER],\n})\nexport class SbbSelectModule {}\n"],"names":["sbbSelectAnimations","transformPanel","trigger","state","style","opacity","transition","animate","getSbbSelectDynamicMultipleError","Error","getSbbSelectNonArrayValueError","getSbbSelectNonFunctionValueError","SBB_SELECT_SCROLL_STRATEGY","InjectionToken","providedIn","factory","injector","inject","Injector","createRepositionScrollStrategy","SBB_SELECT_SCROLL_STRATEGY_PROVIDER_FACTORY","overlay","scrollStrategies","reposition","SBB_SELECT_CONFIG","SBB_SELECT_SCROLL_STRATEGY_PROVIDER","provide","deps","Overlay","useFactory","SbbSelectChange","source","value","constructor","_SbbSelectMixinBase","mixinVariant","_elementRef","SbbSelect","_viewportRuler","ViewportRuler","_changeDetectorRef","ChangeDetectorRef","_parentFormField","SBB_FORM_FIELD","optional","ngControl","NgControl","self","_liveAnnouncer","LiveAnnouncer","_defaultOptions","_initialized","Subject","_scrollTop","_triggerRect","_triggerFontSize","_transformOrigin","_offsetY","options","optionGroups","_positions","originX","originY","overlayX","overlayY","_overlayOrigin","_scrollStrategyFactory","_panelOpen","_compareWith","o1","o2","_uid","_IdGenerator","getId","_triggerAriaLabelledBy","_previousControl","_destroy","_errorStateTracker","stateChanges","disableAutomaticLabeling","userAriaDescribedBy","_selectionModel","_keyManager","_onChange","_onTouched","_valueId","_panelDoneAnimatingStream","_scrollStrategy","_overlayPanelClass","overlayPanelClass","focused","_focused","controlType","panel","overlayDir","panelClass","disabled","tabIndex","placeholder","_placeholder","next","required","_required","control","hasValidator","Validators","multiple","_multiple","ngDevMode","readonly","_readonly","compareWith","fn","_initializeSelection","_value","newValue","hasAssigned","_assignValue","ariaLabel","ariaLabelledby","errorStateMatcher","matcher","typeaheadDebounceInterval","sortComparator","id","_id","errorState","canSelectNullableOptions","optionSelectionChanges","defer","changes","pipe","startWith","switchMap","merge","map","option","onSelectionChange","openedChange","EventEmitter","_openedStream","filter","o","_closedStream","selectionChange","valueChange","defaultErrorStateMatcher","SbbErrorStateMatcher","elementRef","ElementRef","parentForm","NgForm","parentFormGroup","FormGroupDirective","HostAttributeToken","valueAccessor","_ErrorStateTracker","parseInt","CdkOverlayOrigin","ngOnInit","SelectionModel","distinctUntilChanged","takeUntil","subscribe","_panelDoneAnimating","panelOpen","change","nativeElement","getBoundingClientRect","markForCheck","ngAfterContentInit","complete","_initKeyManager","changed","event","added","forEach","select","removed","deselect","_resetOptions","ngDoCheck","newAriaLabelledby","_getTriggerAriaLabelledby","element","setAttribute","removeAttribute","undefined","updateErrorState","ngOnChanges","withTypeAhead","ngOnDestroy","destroy","_clearFromModal","toggle","close","open","_canOpen","_applyModalPanelOwnership","withHorizontalOrientation","_highlightCorrectOption","getComputedStyle","fontSize","overlayRef","overlayElement","_calculateOverlayPosition","_trackedModal","modal","closest","panelId","removeAriaReferencedId","addAriaReferencedId","writeValue","registerOnChange","registerOnTouched","setDisabledState","isDisabled","selected","triggerValue","empty","selectedOptions","viewValue","join","_handleKeydown","_handleOpenKeydown","_handleClosedKeydown","keyCode","isArrowKey","DOWN_ARROW","UP_ARROW","LEFT_ARROW","RIGHT_ARROW","isOpenKey","ENTER","SPACE","manager","isTyping","hasModifierKey","altKey","preventDefault","previouslySelectedOption","onKeydown","selectedOption","announce","activeItem","_selectViaInteraction","A","ctrlKey","hasDeselectedOptions","some","opt","previouslyFocusedIndex","activeItemIndex","shiftKey","_onFocus","_onBlur","cancelTypeahead","_onAttached","positionChange","take","positions","connectionPair","classList","add","remove","detectChanges","_positioningSettled","isEmpty","Promise","resolve","then","_setSelectionByValue","setInactiveStyles","clear","Array","isArray","currentValue","_selectOptionByValue","_sortValues","correspondingOption","updateActiveItem","find","isSelected","error","console","warn","ActiveDescendantKeyManager","withVerticalOrientation","withHomeAndEnd","withPageUpDown","withAllowedModifierKeys","tabOut","focus","_scrollOptionIntoView","changedOrDestroyed","_onSelect","isUserInput","_stateChanges","wasSelected","_propagateChanges","setActiveItem","toArray","sort","a","b","indexOf","fallbackValue","valueToEmit","emit","setFirstItemActive","length","_getPanelAriaLabelledby","labelId","getLabelId","labelExpression","_getAriaActiveDescendant","isOpen","offsetX","_getOverlayMinWidth","width","setDescribedByIds","ids","onContainerClick","_calculateOverlayScroll","scrollBuffer","maxScroll","itemHeight","_getHostElement","offsetHeight","optionOffsetFromScrollTop","offsetTop","halfOptionHeight","optimalScrollPosition","Math","min","max","index","scrollTop","getOptionScrollPosition","panelHeight","clientHeight","scrollContainerHeight","scrollHeight","firstSelectedOption","target","i0","ɵɵFactoryTarget","Component","ɵcmp","ɵɵngDeclareComponent","minVersion","version","type","isStandalone","selector","inputs","booleanAttribute","numberAttribute","outputs","host","attributes","listeners","properties","classAttribute","providers","SbbFormFieldControl","useExisting","SBB_OPTION_PARENT_COMPONENT","queries","propertyName","predicate","SbbOption","SbbOptgroup","descendants","viewQueries","first","CdkConnectedOverlay","exportAs","usesInheritance","usesOnChanges","ngImport","template","SbbIcon","kind","NgClass","AsyncPipe","name","animations","changeDetection","ChangeDetectionStrategy","OnPush","encapsulation","ViewEncapsulation","None","decorators","args","role","class","imports","styles","ContentChildren","Input","ViewChild","transform","Output","HostListener","SbbSelectModule","NgModule","ɵmod","ɵɵngDeclareNgModule","OverlayModule","SbbCommonModule","SbbIconModule","SbbOptionModule","exports","ɵinj","ɵɵngDeclareInjector"],"mappings":";;;;;;;;;;;;;;;AAeO,MAAMA,mBAAmB,GAE5B;EAMFC,cAAc,EAAEC,OAAO,CAAC,gBAAgB,EAAE,CACxCC,KAAK,CACH,MAAM,EACNC,KAAK,CAAC;AACJC,IAAAA,OAAO,EAAE;GACV,CAAC,CACH,EACDF,KAAK,CACH,SAAS,EACTC,KAAK,CAAC;AACJC,IAAAA,OAAO,EAAE;GACV,CAAC,CACH,EACDF,KAAK,CACH,kBAAkB,EAClBC,KAAK,CAAC;AACJC,IAAAA,OAAO,EAAE;GACV,CAAC,CACH,EACDC,UAAU,CAAC,WAAW,EAAEC,OAAO,CAAC,kCAAkC,CAAC,CAAC,EACpED,UAAU,CAAC,WAAW,EAAEC,OAAO,CAAC,mBAAmB,EAAEH,KAAK,CAAC;AAAEC,IAAAA,OAAO,EAAE;GAAG,CAAC,CAAC,CAAC,CAC7E;;;SCvCaG,gCAAgCA,GAAA;EAC9C,OAAOC,KAAK,CAAC,+DAA+D,CAAC;AAC/E;SAQgBC,8BAA8BA,GAAA;EAC5C,OAAOD,KAAK,CAAC,oDAAoD,CAAC;AACpE;SAQgBE,iCAAiCA,GAAA;EAC/C,OAAOF,KAAK,CAAC,mCAAmC,CAAC;AACnD;;MC0EaG,0BAA0B,GAAG,IAAIC,cAAc,CAC1D,4BAA4B,EAC5B;AACEC,EAAAA,UAAU,EAAE,MAAM;EAClBC,OAAO,EAAEA,MAAK;AACZ,IAAA,MAAMC,QAAQ,GAAGC,MAAM,CAACC,QAAQ,CAAC;AACjC,IAAA,OAAO,MAAMC,8BAA8B,CAACH,QAAQ,CAAC;AACvD;AACD,CAAA;AAQG,SAAUI,2CAA2CA,CACzDC,OAAgB,EAAA;AAEhB,EAAA,OAAO,MAAMA,OAAO,CAACC,gBAAgB,CAACC,UAAU,EAAE;AACpD;MAkBaC,iBAAiB,GAAG,IAAIX,cAAc,CAAkB,mBAAmB;AAOjF,MAAMY,mCAAmC,GAAG;AACjDC,EAAAA,OAAO,EAAEd,0BAA0B;EACnCe,IAAI,EAAE,CAACC,OAAO,CAAC;AACfC,EAAAA,UAAU,EAAET;;MAIDU,eAAe,CAAA;EAGjBC,MAAA;EAEAC,KAAA;AAJTC,EAAAA,WAAAA,CAESF,MAAiB,EAEjBC,KAAQ,EAAA;IAFR,IAAM,CAAAD,MAAA,GAANA,MAAM;IAEN,IAAK,CAAAC,KAAA,GAALA,KAAK;AACX;AACJ;AAED,MAAME,mBAAmB,GAAGC,YAAY,CACtC,MAAA;EACqBC,WAAA;EAAnBH,WAAAA,CAAmBG,WAAuB,EAAA;IAAvB,IAAW,CAAAA,WAAA,GAAXA,WAAW;AAAe;AAC9C,CAAA,CACF;AAuCK,MAAOC,SACX,SAAQH,mBAAmB,CAAA;AAUnBI,EAAAA,cAAc,GAAGrB,MAAM,CAACsB,aAAa,CAAC;AACtCC,EAAAA,kBAAkB,GAAGvB,MAAM,CAACwB,iBAAiB,CAAC;AAC9CC,EAAAA,gBAAgB,GAAGzB,MAAM,CAAe0B,cAAc,EAAE;AAAEC,IAAAA,QAAQ,EAAE;AAAM,GAAA,CAAC;AACnFC,EAAAA,SAAS,GAAc5B,MAAM,CAAC6B,SAAS,EAAE;AAAEC,IAAAA,IAAI,EAAE,IAAI;AAAEH,IAAAA,QAAQ,EAAE;AAAI,GAAE,CAAE;AACjEI,EAAAA,cAAc,GAAG/B,MAAM,CAACgC,aAAa,CAAC;AACtCC,EAAAA,eAAe,GAAGjC,MAAM,CAAkBO,iBAAiB,EAAE;AAAEoB,IAAAA,QAAQ,EAAE;AAAM,GAAA,CAAC;AAChFO,EAAAA,YAAY,GAAG,IAAIC,OAAO,EAAQ;AAGlCC,EAAAA,UAAU,GAAG,CAAC;EAGdC,YAAY;AAGpBC,EAAAA,gBAAgB,GAAW,CAAC;AAG5BC,EAAAA,gBAAgB,GAAW,KAAK;AAOhCC,EAAAA,QAAQ,GAAW,CAAC;EAG+BC,OAAO;EAGLC,YAAY;AAQjEC,EAAAA,UAAU,GAAwB,CAChC;AACEC,IAAAA,OAAO,EAAE,OAAO;AAChBC,IAAAA,OAAO,EAAE,QAAQ;AACjBC,IAAAA,QAAQ,EAAE,OAAO;AACjBC,IAAAA,QAAQ,EAAE;AACX,GAAA,EACD;AACEH,IAAAA,OAAO,EAAE,OAAO;AAChBC,IAAAA,OAAO,EAAE,KAAK;AACdC,IAAAA,QAAQ,EAAE,OAAO;AACjBC,IAAAA,QAAQ,EAAE;AACX,GAAA,CACF;EAEDC,cAAc;AAGNC,EAAAA,sBAAsB,GAAGjD,MAAM,CAACL,0BAA0B,CAAC;AAG3DuD,EAAAA,UAAU,GAAG,KAAK;EAGlBC,YAAY,GAAGA,CAACC,EAAO,EAAEC,EAAO,KAAKD,EAAE,KAAKC,EAAE;EAG9CC,IAAI,GAAGtD,MAAM,CAACuD,YAAY,CAAC,CAACC,KAAK,CAAC,aAAa,CAAC;AAGhDC,EAAAA,sBAAsB,GAAkB,IAAI;EAM5CC,gBAAgB;AAGPC,EAAAA,QAAQ,GAAG,IAAIxB,OAAO,EAAQ;EAGvCyB,kBAAkB;AAOjBC,EAAAA,YAAY,GAAG,IAAI1B,OAAO,EAAQ;AAMlC2B,EAAAA,wBAAwB,GAAG,IAAI;EAMbC,mBAAmB;EAG9CC,eAAe;EAGfC,WAAW;AAGXC,EAAAA,SAAS,GAAyBA,MAAK,EAAG;AAG1CC,EAAAA,UAAU,GAAeA,MAAK,EAAG;EAGjCC,QAAQ,GAAWpE,MAAM,CAACuD,YAAY,CAAC,CAACC,KAAK,CAAC,mBAAmB,CAAC;AAGzDa,EAAAA,yBAAyB,GAAoB,IAAIlC,OAAO,EAAU;EAG3EmC,eAAe;AAEfC,EAAAA,kBAAkB,GAChB,IAAI,CAACtC,eAAe,EAAEuC,iBAAiB,IAAI,mBAAmB;EAGhE,IAAIC,OAAOA,GAAA;AACT,IAAA,OAAO,IAAI,CAACC,QAAQ,IAAI,IAAI,CAACxB,UAAU;AACzC;AACQwB,EAAAA,QAAQ,GAAG,KAAK;AAGxBC,EAAAA,WAAW,GAAW,YAAY;EAGdC,KAAK;EAGOC,UAAU;EAGjCC,UAAU;AAInBC,EAAAA,QAAQ,GAAY,KAAK;AAIzBC,EAAAA,QAAQ,GAAW,CAAC;EAEpB,IACIC,WAAWA,GAAA;IACb,OAAO,IAAI,CAACC,YAAY;AAC1B;EACA,IAAID,WAAWA,CAAClE,KAAa,EAAA;IAC3B,IAAI,CAACmE,YAAY,GAAGnE,KAAK;AACzB,IAAA,IAAI,CAAC8C,YAAY,CAACsB,IAAI,EAAE;AAC1B;EACQD,YAAY;EAGpB,IACIE,QAAQA,GAAA;AACV,IAAA,OAAO,IAAI,CAACC,SAAS,IAAI,IAAI,CAACzD,SAAS,EAAE0D,OAAO,EAAEC,YAAY,CAACC,UAAU,CAACJ,QAAQ,CAAC,IAAI,KAAK;AAC9F;EACA,IAAIA,QAAQA,CAACrE,KAAc,EAAA;IACzB,IAAI,CAACsE,SAAS,GAAGtE,KAAK;AACtB,IAAA,IAAI,CAAC8C,YAAY,CAACsB,IAAI,EAAE;AAC1B;EACQE,SAAS;EAGjB,IACII,QAAQA,GAAA;IACV,OAAO,IAAI,CAACC,SAAS;AACvB;EACA,IAAID,QAAQA,CAAC1E,KAAc,EAAA;IACzB,IAAI,IAAI,CAACiD,eAAe,KAAK,OAAO2B,SAAS,KAAK,WAAW,IAAIA,SAAS,CAAC,EAAE;MAC3E,MAAMpG,gCAAgC,EAAE;AAC1C;IAEA,IAAI,CAACmG,SAAS,GAAG3E,KAAK;AACxB;AACQ2E,EAAAA,SAAS,GAAY,KAAK;EAGlC,IACIE,QAAQA,GAAA;IACV,OAAO,IAAI,CAACC,SAAS;AACvB;EACA,IAAID,QAAQA,CAAC7E,KAAc,EAAA;IACzB,IAAI,CAAC8E,SAAS,GAAG9E,KAAK;AACtB,IAAA,IAAI,CAAC8C,YAAY,CAACsB,IAAI,EAAE;AAC1B;AACQU,EAAAA,SAAS,GAAY,KAAK;EAOlC,IACIC,WAAWA,GAAA;IACb,OAAO,IAAI,CAAC3C,YAAY;AAC1B;EACA,IAAI2C,WAAWA,CAACC,EAAiC,EAAA;AAC/C,IAAA,IAAI,OAAOA,EAAE,KAAK,UAAU,KAAK,OAAOJ,SAAS,KAAK,WAAW,IAAIA,SAAS,CAAC,EAAE;MAC/E,MAAMjG,iCAAiC,EAAE;AAC3C;IACA,IAAI,CAACyD,YAAY,GAAG4C,EAAE;IACtB,IAAI,IAAI,CAAC/B,eAAe,EAAE;MAExB,IAAI,CAACgC,oBAAoB,EAAE;AAC7B;AACF;EAGA,IACIjF,KAAKA,GAAA;IACP,OAAO,IAAI,CAACkF,MAAM;AACpB;EACA,IAAIlF,KAAKA,CAACmF,QAAa,EAAA;AACrB,IAAA,MAAMC,WAAW,GAAG,IAAI,CAACC,YAAY,CAACF,QAAQ,CAAC;AAC/C,IAAA,IAAIC,WAAW,EAAE;AACf,MAAA,IAAI,CAACjC,SAAS,CAACgC,QAAQ,CAAC;AAC1B;AACF;EACQD,MAAM;AAGOI,EAAAA,SAAS,GAAW,EAAE;EAGjBC,cAAc;EAGxC,IACIC,iBAAiBA,GAAA;AACnB,IAAA,OAAO,IAAI,CAAC3C,kBAAkB,CAAC4C,OAAO;AACxC;EACA,IAAID,iBAAiBA,CAACxF,KAA2B,EAAA;AAC/C,IAAA,IAAI,CAAC6C,kBAAkB,CAAC4C,OAAO,GAAGzF,KAAK;AACzC;EAIA0F,yBAAyB;EAMhBC,cAAc;EAGvB,IACIC,EAAEA,GAAA;IACJ,OAAO,IAAI,CAACC,GAAG;AACjB;EACA,IAAID,EAAEA,CAAC5F,KAAa,EAAA;AAClB,IAAA,IAAI,CAAC6F,GAAG,GAAG7F,KAAK,IAAI,IAAI,CAACuC,IAAI;AAC7B,IAAA,IAAI,CAACO,YAAY,CAACsB,IAAI,EAAE;AAC1B;EACQyB,GAAG;EAGX,IAAIC,UAAUA,GAAA;AACZ,IAAA,OAAO,IAAI,CAACjD,kBAAkB,CAACiD,UAAU;AAC3C;EACA,IAAIA,UAAUA,CAAC9F,KAAc,EAAA;AAC3B,IAAA,IAAI,CAAC6C,kBAAkB,CAACiD,UAAU,GAAG9F,KAAK;AAC5C;AASA+F,EAAAA,wBAAwB,GAAY,IAAI,CAAC7E,eAAe,EAAE6E,wBAAwB,IAAI,KAAK;EAGlFC,sBAAsB,GAAyCC,KAAK,CAAC,MAAK;AACjF,IAAA,MAAMvE,OAAO,GAAG,IAAI,CAACA,OAAO;AAE5B,IAAA,IAAIA,OAAO,EAAE;AACX,MAAA,OAAOA,OAAO,CAACwE,OAAO,CAACC,IAAI,CACzBC,SAAS,CAAC1E,OAAO,CAAC,EAClB2E,SAAS,CAAC,MAAMC,KAAK,CAAC,GAAG5E,OAAO,CAAC6E,GAAG,CAAEC,MAAM,IAAKA,MAAM,CAACC,iBAAiB,CAAC,CAAC,CAAC,CAC7E;AACH;AAEA,IAAA,OAAO,IAAI,CAACtF,YAAY,CAACgF,IAAI,CAACE,SAAS,CAAC,MAAM,IAAI,CAACL,sBAAsB,CAAC,CAAC;AAC7E,GAAC,CAAC;AAGiBU,EAAAA,YAAY,GAA0B,IAAIC,YAAY,EAAW;EAGzDC,aAAa,GAAqB,IAAI,CAACF,YAAY,CAACP,IAAI,CACjFU,MAAM,CAAEC,CAAC,IAAKA,CAAC,CAAC,EAChBP,GAAG,CAAC,MAAO,EAAC,CAAC,CACd;EAG0BQ,aAAa,GAAqB,IAAI,CAACL,YAAY,CAACP,IAAI,CACjFU,MAAM,CAAEC,CAAC,IAAK,CAACA,CAAC,CAAC,EACjBP,GAAG,CAAC,MAAO,EAAC,CAAC,CACd;AAIQS,EAAAA,eAAe,GAAkC,IAAIL,YAAY,EAAmB;AAO1EM,EAAAA,WAAW,GAAsB,IAAIN,YAAY,EAAO;AAG3E1G,EAAAA,WAAAA,GAAA;AACE,IAAA,MAAMiH,wBAAwB,GAAGjI,MAAM,CAACkI,oBAAoB,CAAC;AAC7D,IAAA,MAAMC,UAAU,GAAGnI,MAAM,CAACoI,UAAU,CAAC;AACrC,IAAA,MAAMC,UAAU,GAAGrI,MAAM,CAACsI,MAAM,EAAE;AAAE3G,MAAAA,QAAQ,EAAE;AAAM,KAAA,CAAC;AACrD,IAAA,MAAM4G,eAAe,GAAGvI,MAAM,CAACwI,kBAAkB,EAAE;AAAE7G,MAAAA,QAAQ,EAAE;AAAM,KAAA,CAAC;IACtE,MAAMqD,QAAQ,GAAGhF,MAAM,CAAC,IAAIyI,kBAAkB,CAAC,UAAU,CAAC,EAAE;AAAE9G,MAAAA,QAAQ,EAAE;AAAI,KAAE,CAAC;IAE/E,KAAK,CAACwG,UAAU,CAAC;AACjB,IAAA,MAAMlG,eAAe,GAAG,IAAI,CAACA,eAAe;IAE5C,IAAI,IAAI,CAACL,SAAS,EAAE;AAGlB,MAAA,IAAI,CAACA,SAAS,CAAC8G,aAAa,GAAG,IAAI;AACrC;AAIA,IAAA,IAAIzG,eAAe,EAAEwE,yBAAyB,IAAI,IAAI,EAAE;AACtD,MAAA,IAAI,CAACA,yBAAyB,GAAGxE,eAAe,CAACwE,yBAAyB;AAC5E;AAEA,IAAA,IAAI,CAAC7C,kBAAkB,GAAG,IAAI+E,kBAAkB,CAC9CV,wBAAwB,EACxB,IAAI,CAACrG,SAAS,EACd2G,eAAe,EACfF,UAAU,EACV,IAAI,CAACxE,YAAY,CAClB;AAED,IAAA,IAAI,CAACS,eAAe,GAAG,IAAI,CAACrB,sBAAsB,EAAE;AACpD,IAAA,IAAI,CAAC+B,QAAQ,GAAGA,QAAQ,IAAI,IAAI,GAAG,CAAC,GAAG4D,QAAQ,CAAC5D,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC;AAGlE,IAAA,IAAI,CAAC2B,EAAE,GAAG,IAAI,CAACA,EAAE;AAEjB,IAAA,IAAI,CAAC3D,cAAc,GAAG,IAAI6F,gBAAgB,CAACV,UAAU,CAAC;AACxD;AAEAW,EAAAA,QAAQA,GAAA;IACN,IAAI,CAAC9E,eAAe,GAAG,IAAI+E,cAAc,CAAY,IAAI,CAACtD,QAAQ,CAAC;AACnE,IAAA,IAAI,CAAC5B,YAAY,CAACsB,IAAI,EAAE;AAKxB,IAAA,IAAI,CAACd,yBAAyB,CAC3B6C,IAAI,CAAC8B,oBAAoB,EAAE,EAAEC,SAAS,CAAC,IAAI,CAACtF,QAAQ,CAAC,CAAC,CACtDuF,SAAS,CAAC,MAAM,IAAI,CAACC,mBAAmB,CAAC,IAAI,CAACC,SAAS,CAAC,CAAC;AAE5D,IAAA,IAAI,CAAC/H,cAAc,CAChBgI,MAAM,EAAE,CACRnC,IAAI,CAAC+B,SAAS,CAAC,IAAI,CAACtF,QAAQ,CAAC,CAAC,CAC9BuF,SAAS,CAAC,MAAK;MACd,IAAI,IAAI,CAACE,SAAS,EAAE;QAClB,IAAI,CAAC/G,YAAY,GAAG,IAAI,CAAClB,WAAW,CAACmI,aAAa,CAACC,qBAAqB,EAAE;AAC1E,QAAA,IAAI,CAAChI,kBAAkB,CAACiI,YAAY,EAAE;AACxC;AACF,KAAC,CAAC;AACN;AAEAC,EAAAA,kBAAkBA,GAAA;AAChB,IAAA,IAAI,CAACvH,YAAY,CAACiD,IAAI,EAAE;AACxB,IAAA,IAAI,CAACjD,YAAY,CAACwH,QAAQ,EAAE;IAE5B,IAAI,CAACC,eAAe,EAAE;AAEtB,IAAA,IAAI,CAAC3F,eAAe,CAAC4F,OAAO,CAAC1C,IAAI,CAAC+B,SAAS,CAAC,IAAI,CAACtF,QAAQ,CAAC,CAAC,CAACuF,SAAS,CAAEW,KAAK,IAAI;AAC9EA,MAAAA,KAAK,CAACC,KAAK,CAACC,OAAO,CAAExC,MAAM,IAAKA,MAAM,CAACyC,MAAM,EAAE,CAAC;AAChDH,MAAAA,KAAK,CAACI,OAAO,CAACF,OAAO,CAAExC,MAAM,IAAKA,MAAM,CAAC2C,QAAQ,EAAE,CAAC;AACtD,KAAC,CAAC;IAEF,IAAI,CAACzH,OAAO,CAACwE,OAAO,CAACC,IAAI,CAACC,SAAS,CAAC,IAAI,CAAC,EAAE8B,SAAS,CAAC,IAAI,CAACtF,QAAQ,CAAC,CAAC,CAACuF,SAAS,CAAC,MAAK;MAClF,IAAI,CAACiB,aAAa,EAAE;MACpB,IAAI,CAACnE,oBAAoB,EAAE;AAC7B,KAAC,CAAC;AACJ;AAEAoE,EAAAA,SAASA,GAAA;AACP,IAAA,MAAMC,iBAAiB,GAAG,IAAI,CAACC,yBAAyB,EAAE;AAC1D,IAAA,MAAM1I,SAAS,GAAG,IAAI,CAACA,SAAS;AAKhC,IAAA,IAAIyI,iBAAiB,KAAK,IAAI,CAAC5G,sBAAsB,EAAE;AACrD,MAAA,MAAM8G,OAAO,GAAgB,IAAI,CAACpJ,WAAW,CAACmI,aAAa;MAC3D,IAAI,CAAC7F,sBAAsB,GAAG4G,iBAAiB;AAC/C,MAAA,IAAIA,iBAAiB,EAAE;AACrBE,QAAAA,OAAO,CAACC,YAAY,CAAC,iBAAiB,EAAEH,iBAAiB,CAAC;AAC5D,OAAC,MAAM;AACLE,QAAAA,OAAO,CAACE,eAAe,CAAC,iBAAiB,CAAC;AAC5C;AACF;IAEA,IAAI,IAAI,CAAC7I,SAAS,EAAE;AAElB,MAAA,IAAI,IAAI,CAAC8B,gBAAgB,KAAK9B,SAAS,CAAC0D,OAAO,EAAE;AAC/C,QAAA,IACE,IAAI,CAAC5B,gBAAgB,KAAKgH,SAAS,IACnC9I,SAAS,CAACmD,QAAQ,KAAK,IAAI,IAC3BnD,SAAS,CAACmD,QAAQ,KAAK,IAAI,CAACA,QAAQ,EACpC;AACA,UAAA,IAAI,CAACA,QAAQ,GAAGnD,SAAS,CAACmD,QAAQ;AACpC;AAEA,QAAA,IAAI,CAACrB,gBAAgB,GAAG9B,SAAS,CAAC0D,OAAO;AAC3C;MAEA,IAAI,CAACqF,gBAAgB,EAAE;AACzB;AACF;EAEAC,WAAWA,CAAC3D,OAAsB,EAAA;IAGhC,IAAIA,OAAO,CAAC,UAAU,CAAC,IAAIA,OAAO,CAAC,qBAAqB,CAAC,EAAE;AACzD,MAAA,IAAI,CAACpD,YAAY,CAACsB,IAAI,EAAE;AAC1B;IAEA,IAAI8B,OAAO,CAAC,2BAA2B,CAAC,IAAI,IAAI,CAAChD,WAAW,EAAE;MAC5D,IAAI,CAACA,WAAW,CAAC4G,aAAa,CAAC,IAAI,CAACpE,yBAAyB,CAAC;AAChE;AACF;AAEAqE,EAAAA,WAAWA,GAAA;AACT,IAAA,IAAI,CAACnH,QAAQ,CAACwB,IAAI,EAAE;AACpB,IAAA,IAAI,CAACxB,QAAQ,CAAC+F,QAAQ,EAAE;AACxB,IAAA,IAAI,CAAC7F,YAAY,CAAC6F,QAAQ,EAAE;AAC5B,IAAA,IAAI,CAACzF,WAAW,EAAE8G,OAAO,EAAE;IAC3B,IAAI,CAACC,eAAe,EAAE;AACxB;AAIAC,EAAAA,MAAMA,GAAA;AACJ,IAAA,IAAI,CAAC7B,SAAS,GAAG,IAAI,CAAC8B,KAAK,EAAE,GAAG,IAAI,CAACC,IAAI,EAAE;AAC7C;AAGAA,EAAAA,IAAIA,GAAA;AACF,IAAA,IAAI,IAAI,CAACC,QAAQ,EAAE,EAAE;MACnB,IAAI,CAACC,yBAAyB,EAAE;MAEhC,IAAI,CAACnI,UAAU,GAAG,IAAI;AACtB,MAAA,IAAI,CAACe,WAAW,CAACqH,yBAAyB,CAAC,IAAI,CAAC;MAChD,IAAI,CAACC,uBAAuB,EAAE;AAC9B,MAAA,IAAI,CAAChK,kBAAkB,CAACiI,YAAY,EAAE;MAEtC,IAAI,CAACnH,YAAY,GAAG,IAAI,CAAClB,WAAW,CAACmI,aAAa,CAACC,qBAAqB,EAAE;AAG1E,MAAA,IAAI,CAACjH,gBAAgB,GAAGsG,QAAQ,CAC9B4C,gBAAgB,CAAC,IAAI,CAACrK,WAAW,CAACmI,aAAa,CAAC,CAACmC,QAAQ,IAAI,GAAG,EAChE,EAAE,CACH;AAGD,MAAA,IAAI,CAACvJ,YAAY,CAACgH,SAAS,CAAC,MAAK;AAC/B,QAAA,IACE,IAAI,CAAC5G,gBAAgB,IACrB,IAAI,CAACuC,UAAU,CAAC6G,UAAU,IAC1B,IAAI,CAAC7G,UAAU,CAAC6G,UAAU,CAACC,cAAc,EACzC;AACA,UAAA,IAAI,CAAC9G,UAAU,CAAC6G,UAAU,CAACC,cAAc,CAACxM,KAAK,CAACsM,QAAQ,GAAG,CAAA,EAAG,IAAI,CAACnJ,gBAAgB,CAAI,EAAA,CAAA;AACzF;QACA,IAAI,CAACsJ,yBAAyB,EAAE;AAClC,OAAC,CAAC;AACJ;AACF;AAOQC,EAAAA,aAAa,GAAmB,IAAI;AAqBpCR,EAAAA,yBAAyBA,GAAA;IAO/B,MAAMS,KAAK,GAAG,IAAI,CAAC3K,WAAW,CAACmI,aAAa,CAACyC,OAAO,CAClD,mDAAmD,CACpD;IAED,IAAI,CAACD,KAAK,EAAE;AAEV,MAAA;AACF;AAEA,IAAA,MAAME,OAAO,GAAG,CAAA,EAAG,IAAI,CAACrF,EAAE,CAAQ,MAAA,CAAA;IAElC,IAAI,IAAI,CAACkF,aAAa,EAAE;MACtBI,sBAAsB,CAAC,IAAI,CAACJ,aAAa,EAAE,WAAW,EAAEG,OAAO,CAAC;AAClE;AAEAE,IAAAA,mBAAmB,CAACJ,KAAK,EAAE,WAAW,EAAEE,OAAO,CAAC;IAChD,IAAI,CAACH,aAAa,GAAGC,KAAK;AAC5B;AAGQd,EAAAA,eAAeA,GAAA;AACrB,IAAA,IAAI,CAAC,IAAI,CAACa,aAAa,EAAE;AAEvB,MAAA;AACF;AAEA,IAAA,MAAMG,OAAO,GAAG,CAAA,EAAG,IAAI,CAACrF,EAAE,CAAQ,MAAA,CAAA;IAElCsF,sBAAsB,CAAC,IAAI,CAACJ,aAAa,EAAE,WAAW,EAAEG,OAAO,CAAC;IAChE,IAAI,CAACH,aAAa,GAAG,IAAI;AAC3B;AAGAX,EAAAA,KAAKA,GAAA;IACH,IAAI,IAAI,CAAChI,UAAU,EAAE;MACnB,IAAI,CAACA,UAAU,GAAG,KAAK;AACvB,MAAA,IAAI,CAACe,WAAW,CAACqH,yBAAyB,CAAC,KAAK,CAAC;AACjD,MAAA,IAAI,CAAC/J,kBAAkB,CAACiI,YAAY,EAAE;MACtC,IAAI,CAACrF,UAAU,EAAE;AACnB;AACF;EAQAgI,UAAUA,CAACpL,KAAU,EAAA;AACnB,IAAA,IAAI,CAACqF,YAAY,CAACrF,KAAK,CAAC;AAC1B;EASAqL,gBAAgBA,CAACrG,EAAwB,EAAA;IACvC,IAAI,CAAC7B,SAAS,GAAG6B,EAAE;AACrB;EASAsG,iBAAiBA,CAACtG,EAAY,EAAA;IAC5B,IAAI,CAAC5B,UAAU,GAAG4B,EAAE;AACtB;EAQAuG,gBAAgBA,CAACC,UAAmB,EAAA;IAClC,IAAI,CAACxH,QAAQ,GAAGwH,UAAU;AAC1B,IAAA,IAAI,CAAChL,kBAAkB,CAACiI,YAAY,EAAE;AACtC,IAAA,IAAI,CAAC3F,YAAY,CAACsB,IAAI,EAAE;AAC1B;EAGA,IAAIiE,SAASA,GAAA;IACX,OAAO,IAAI,CAAClG,UAAU;AACxB;EAGA,IAAIsJ,QAAQA,GAAA;AACV,IAAA,OAAO,IAAI,CAAC/G,QAAQ,GAAG,IAAI,CAACzB,eAAe,EAAEwI,QAAQ,IAAI,EAAE,GAAG,IAAI,CAACxI,eAAe,EAAEwI,QAAQ,CAAC,CAAC,CAAC;AACjG;EAGA,IAAIC,YAAYA,GAAA;IACd,IAAI,IAAI,CAACC,KAAK,EAAE;AACd,MAAA,OAAO,EAAE;AACX;IAEA,IAAI,IAAI,CAAChH,SAAS,EAAE;AAClB,MAAA,MAAMiH,eAAe,GAAG,IAAI,CAAC3I,eAAe,CAACwI,QAAQ,CAAClF,GAAG,CAAEC,MAAM,IAAKA,MAAM,CAACqF,SAAS,CAAC;AAEvF,MAAA,OAAOD,eAAe,CAACE,IAAI,CAAC,IAAI,CAAC;AACnC;IAEA,OAAO,IAAI,CAAC7I,eAAe,CAACwI,QAAQ,CAAC,CAAC,CAAC,CAACI,SAAS;AACnD;AAGAjC,EAAAA,gBAAgBA,GAAA;AACd,IAAA,IAAI,CAAC/G,kBAAkB,CAAC+G,gBAAgB,EAAE;AAC5C;EAIAmC,cAAcA,CAACjD,KAA6B,EAAA;AAC1C,IAAA,IAAI,CAAC,IAAI,CAAC9E,QAAQ,EAAE;AAClB,MAAA,IAAI,CAACqE,SAAS,GAAG,IAAI,CAAC2D,kBAAkB,CAAClD,KAAK,CAAC,GAAG,IAAI,CAACmD,oBAAoB,CAACnD,KAAK,CAAC;AACpF;AACF;EAGQmD,oBAAoBA,CAACnD,KAAoB,EAAA;AAC/C,IAAA,MAAMoD,OAAO,GAAGpD,KAAK,CAACoD,OAAO;AAC7B,IAAA,MAAMC,UAAU,GACdD,OAAO,KAAKE,UAAU,IACtBF,OAAO,KAAKG,QAAQ,IACpBH,OAAO,KAAKI,UAAU,IACtBJ,OAAO,KAAKK,WAAW;IACzB,MAAMC,SAAS,GAAGN,OAAO,KAAKO,KAAK,IAAIP,OAAO,KAAKQ,KAAK;AACxD,IAAA,MAAMC,OAAO,GAAG,IAAI,CAACzJ,WAAW;IAGhC,IACG,CAACyJ,OAAO,CAACC,QAAQ,EAAE,IAAIJ,SAAS,IAAI,CAACK,cAAc,CAAC/D,KAAK,CAAC,IAC1D,CAAC,IAAI,CAACpE,QAAQ,IAAIoE,KAAK,CAACgE,MAAM,KAAKX,UAAW,EAC/C;MACArD,KAAK,CAACiE,cAAc,EAAE;MACtB,IAAI,CAAC3C,IAAI,EAAE;AACb,KAAC,MAAM,IAAI,CAAC,IAAI,CAAC1F,QAAQ,EAAE;AACzB,MAAA,MAAMsI,wBAAwB,GAAG,IAAI,CAACvB,QAAQ;AAC9CkB,MAAAA,OAAO,CAACM,SAAS,CAACnE,KAAK,CAAC;AACxB,MAAA,MAAMoE,cAAc,GAAG,IAAI,CAACzB,QAAQ;AAGpC,MAAA,IAAIyB,cAAc,IAAIF,wBAAwB,KAAKE,cAAc,EAAE;QAGjE,IAAI,CAAClM,cAAc,CAACmM,QAAQ,CAAED,cAA4B,CAACrB,SAAS,EAAE,KAAK,CAAC;AAC9E;AACF;AACF;EAGQG,kBAAkBA,CAAClD,KAAoB,EAAA;AAC7C,IAAA,MAAM6D,OAAO,GAAG,IAAI,CAACzJ,WAAW;AAChC,IAAA,MAAMgJ,OAAO,GAAGpD,KAAK,CAACoD,OAAO;IAC7B,MAAMC,UAAU,GAAGD,OAAO,KAAKE,UAAU,IAAIF,OAAO,KAAKG,QAAQ;AACjE,IAAA,MAAMO,QAAQ,GAAGD,OAAO,CAACC,QAAQ,EAAE;AAEnC,IAAA,IAAIT,UAAU,IAAIrD,KAAK,CAACgE,MAAM,EAAE;MAE9BhE,KAAK,CAACiE,cAAc,EAAE;MACtB,IAAI,CAAC5C,KAAK,EAAE;KAGb,MAAM,IACL,CAACyC,QAAQ,KACRV,OAAO,KAAKO,KAAK,IAAIP,OAAO,KAAKQ,KAAK,CAAC,IACxCC,OAAO,CAACS,UAAU,IAClB,CAACP,cAAc,CAAC/D,KAAK,CAAC,EACtB;MACAA,KAAK,CAACiE,cAAc,EAAE;AACtBJ,MAAAA,OAAO,CAACS,UAAU,CAACC,qBAAqB,EAAE;AAC5C,KAAC,MAAM,IAAI,CAACT,QAAQ,IAAI,IAAI,CAACjI,SAAS,IAAIuH,OAAO,KAAKoB,CAAC,IAAIxE,KAAK,CAACyE,OAAO,EAAE;MACxEzE,KAAK,CAACiE,cAAc,EAAE;AACtB,MAAA,MAAMS,oBAAoB,GAAG,IAAI,CAAC9L,OAAO,CAAC+L,IAAI,CAAEC,GAAG,IAAK,CAACA,GAAG,CAAC1J,QAAQ,IAAI,CAAC0J,GAAG,CAACjC,QAAQ,CAAC;AAEvF,MAAA,IAAI,CAAC/J,OAAO,CAACsH,OAAO,CAAExC,MAAM,IAAI;AAC9B,QAAA,IAAI,CAACA,MAAM,CAACxC,QAAQ,EAAE;UACpBwJ,oBAAoB,GAAGhH,MAAM,CAACyC,MAAM,EAAE,GAAGzC,MAAM,CAAC2C,QAAQ,EAAE;AAC5D;AACF,OAAC,CAAC;AACJ,KAAC,MAAM;AACL,MAAA,MAAMwE,sBAAsB,GAAGhB,OAAO,CAACiB,eAAe;AAEtDjB,MAAAA,OAAO,CAACM,SAAS,CAACnE,KAAK,CAAC;AAExB,MAAA,IACE,IAAI,CAACnE,SAAS,IACdwH,UAAU,IACVrD,KAAK,CAAC+E,QAAQ,IACdlB,OAAO,CAACS,UAAU,IAClBT,OAAO,CAACiB,eAAe,KAAKD,sBAAsB,EAClD;AACAhB,QAAAA,OAAO,CAACS,UAAU,CAACC,qBAAqB,EAAE;AAC5C;AACF;AACF;AAGAS,EAAAA,QAAQA,GAAA;AACN,IAAA,IAAI,CAAC,IAAI,CAAC9J,QAAQ,EAAE;MAClB,IAAI,CAACL,QAAQ,GAAG,IAAI;AACpB,MAAA,IAAI,CAACb,YAAY,CAACsB,IAAI,EAAE;AAC1B;AACF;AAOA2J,EAAAA,OAAOA,GAAA;IACL,IAAI,CAACpK,QAAQ,GAAG,KAAK;AACrB,IAAA,IAAI,CAACT,WAAW,EAAE8K,eAAe,EAAE;IAEnC,IAAI,CAAC,IAAI,CAAChK,QAAQ,IAAI,CAAC,IAAI,CAACqE,SAAS,EAAE;MACrC,IAAI,CAACjF,UAAU,EAAE;AACjB,MAAA,IAAI,CAAC5C,kBAAkB,CAACiI,YAAY,EAAE;AACtC,MAAA,IAAI,CAAC3F,YAAY,CAACsB,IAAI,EAAE;AAC1B;AACF;AAGA6J,EAAAA,WAAWA,GAAA;AACT,IAAA,IAAI,CAACnK,UAAU,CAACoK,cAAc,CAAC/H,IAAI,CAACgI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAChG,SAAS,CAAEiG,SAAS,IAAI;AACnE,MAAA,IAAIA,SAAS,CAACC,cAAc,CAACvM,OAAO,KAAK,KAAK,EAAE;QAC9C,IAAI,CAAC+B,KAAK,CAAC0E,aAAa,CAAC+F,SAAS,CAACC,GAAG,CAAC,iBAAiB,CAAC;QACzD,IAAI,CAACnO,WAAW,CAACmI,aAAa,CAAC+F,SAAS,CAACC,GAAG,CAAC,iCAAiC,CAAC;AACjF,OAAC,MAAM;QACL,IAAI,CAAC1K,KAAK,CAAC0E,aAAa,CAAC+F,SAAS,CAACE,MAAM,CAAC,iBAAiB,CAAC;QAC5D,IAAI,CAACpO,WAAW,CAACmI,aAAa,CAAC+F,SAAS,CAACE,MAAM,CAAC,iCAAiC,CAAC;AACpF;AACA,MAAA,IAAI,CAAChO,kBAAkB,CAACiO,aAAa,EAAE;MACvC,IAAI,CAACC,mBAAmB,EAAE;AAC5B,KAAC,CAAC;AACJ;EAGA,IAAI/C,KAAKA,GAAA;IACP,OAAO,CAAC,IAAI,CAAC1I,eAAe,IAAI,IAAI,CAACA,eAAe,CAAC0L,OAAO,EAAE;AAChE;AAEQ1J,EAAAA,oBAAoBA,GAAA;AAG1B2J,IAAAA,OAAO,CAACC,OAAO,EAAE,CAACC,IAAI,CAAC,MAAK;MAC1B,IAAI,IAAI,CAACjO,SAAS,EAAE;AAClB,QAAA,IAAI,CAACqE,MAAM,GAAG,IAAI,CAACrE,SAAS,CAACb,KAAK;AACpC;AAEA,MAAA,IAAI,CAAC+O,oBAAoB,CAAC,IAAI,CAAC7J,MAAM,CAAC;AACtC,MAAA,IAAI,CAACpC,YAAY,CAACsB,IAAI,EAAE;AAC1B,KAAC,CAAC;AACJ;EAMQ2K,oBAAoBA,CAAC/O,KAAkB,EAAA;AAC7C,IAAA,IAAI,CAACiD,eAAe,CAACwI,QAAQ,CAACzC,OAAO,CAAExC,MAAM,IAAKA,MAAM,CAACwI,iBAAiB,EAAE,CAAC;AAC7E,IAAA,IAAI,CAAC/L,eAAe,CAACgM,KAAK,EAAE;AAE5B,IAAA,IAAI,IAAI,CAACvK,QAAQ,IAAI1E,KAAK,EAAE;AAC1B,MAAA,IAAI,CAACkP,KAAK,CAACC,OAAO,CAACnP,KAAK,CAAC,KAAK,OAAO4E,SAAS,KAAK,WAAW,IAAIA,SAAS,CAAC,EAAE;QAC5E,MAAMlG,8BAA8B,EAAE;AACxC;MAEAsB,KAAK,CAACgJ,OAAO,CAAEoG,YAAiB,IAAK,IAAI,CAACC,oBAAoB,CAACD,YAAY,CAAC,CAAC;MAC7E,IAAI,CAACE,WAAW,EAAE;AACpB,KAAC,MAAM;AACL,MAAA,MAAMC,mBAAmB,GAAG,IAAI,CAACF,oBAAoB,CAACrP,KAAK,CAAC;AAI5D,MAAA,IAAIuP,mBAAmB,EAAE;AACvB,QAAA,IAAI,CAACrM,WAAW,CAACsM,gBAAgB,CAACD,mBAAmB,CAAC;AACxD,OAAC,MAAM,IAAI,CAAC,IAAI,CAAClH,SAAS,EAAE;AAG1B,QAAA,IAAI,CAACnF,WAAW,CAACsM,gBAAgB,CAAC,CAAC,CAAC,CAAC;AACvC;AACF;AAEA,IAAA,IAAI,CAAChP,kBAAkB,CAACiI,YAAY,EAAE;AACxC;EAMQ4G,oBAAoBA,CAACrP,KAAU,EAAA;IACrC,MAAMuP,mBAAmB,GAAG,IAAI,CAAC7N,OAAO,CAAC+N,IAAI,CAAEjJ,MAAiB,IAAI;MAGlE,IAAI,IAAI,CAACvD,eAAe,CAACyM,UAAU,CAAClJ,MAAM,CAAC,EAAE;AAC3C,QAAA,OAAO,KAAK;AACd;MAEA,IAAI;QAEF,OACE,CAACA,MAAM,CAACxG,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC+F,wBAAwB,KACtD,IAAI,CAAC3D,YAAY,CAACoE,MAAM,CAACxG,KAAK,EAAEA,KAAK,CAAC;OAEzC,CAAC,OAAO2P,KAAK,EAAE;AACd,QAAA,IAAI,OAAO/K,SAAS,KAAK,WAAW,IAAIA,SAAS,EAAE;AAEjDgL,UAAAA,OAAO,CAACC,IAAI,CAACF,KAAK,CAAC;AACrB;AACA,QAAA,OAAO,KAAK;AACd;AACF,KAAC,CAAC;AAEF,IAAA,IAAIJ,mBAAmB,EAAE;AACvB,MAAA,IAAI,CAACtM,eAAe,CAACgG,MAAM,CAACsG,mBAAmB,CAAC;AAClD;AAEA,IAAA,OAAOA,mBAAmB;AAC5B;EAGQlK,YAAYA,CAACF,QAAqB,EAAA;AAExC,IAAA,IAAIA,QAAQ,KAAK,IAAI,CAACD,MAAM,IAAK,IAAI,CAACP,SAAS,IAAIuK,KAAK,CAACC,OAAO,CAAChK,QAAQ,CAAE,EAAE;MAC3E,IAAI,IAAI,CAACzD,OAAO,EAAE;AAChB,QAAA,IAAI,CAACqN,oBAAoB,CAAC5J,QAAQ,CAAC;AACrC;MAEA,IAAI,CAACD,MAAM,GAAGC,QAAQ;AACtB,MAAA,OAAO,IAAI;AACb;AACA,IAAA,OAAO,KAAK;AACd;AAGQyD,EAAAA,eAAeA,GAAA;AACrB,IAAA,IAAI,CAAC1F,WAAW,GAAG,IAAI4M,0BAA0B,CAAY,IAAI,CAACpO,OAAO,CAAC,CACvEoI,aAAa,CAAC,IAAI,CAACpE,yBAAyB,CAAC,CAC7CqK,uBAAuB,EAAE,CACzBxF,yBAAyB,CAAC,KAAK,CAAC,CAChCyF,cAAc,EAAE,CAChBC,cAAc,EAAE,CAChBC,uBAAuB,CAAC,CAAC,UAAU,CAAC,CAAC;AAExC,IAAA,IAAI,CAAChN,WAAW,CAACiN,MAAM,CAAChI,SAAS,CAAC,MAAK;MACrC,IAAI,IAAI,CAACE,SAAS,EAAE;QAGlB,IAAI,CAAC,IAAI,CAAC3D,QAAQ,IAAI,IAAI,CAACxB,WAAW,CAACkK,UAAU,EAAE;AACjD,UAAA,IAAI,CAAClK,WAAW,CAACkK,UAAU,CAACC,qBAAqB,EAAE;AACrD;QAIA,IAAI,CAAC+C,KAAK,EAAE;QACZ,IAAI,CAACjG,KAAK,EAAE;AACd;AACF,KAAC,CAAC;AAEF,IAAA,IAAI,CAACjH,WAAW,CAACoF,MAAM,CAACH,SAAS,CAAC,MAAK;AACrC,MAAA,IAAI,IAAI,CAAChG,UAAU,IAAI,IAAI,CAAC0B,KAAK,EAAE;QACjC,IAAI,CAACwM,qBAAqB,CAAC,IAAI,CAACnN,WAAW,CAAC0K,eAAe,IAAI,CAAC,CAAC;AACnE,OAAC,MAAM,IAAI,CAAC,IAAI,CAACzL,UAAU,IAAI,CAAC,IAAI,CAACuC,QAAQ,IAAI,IAAI,CAACxB,WAAW,CAACkK,UAAU,EAAE;AAC5E,QAAA,IAAI,CAAClK,WAAW,CAACkK,UAAU,CAACC,qBAAqB,EAAE;AACrD;AACF,KAAC,CAAC;AACJ;AAGQjE,EAAAA,aAAaA,GAAA;AACnB,IAAA,MAAMkH,kBAAkB,GAAGhK,KAAK,CAAC,IAAI,CAAC5E,OAAO,CAACwE,OAAO,EAAE,IAAI,CAACtD,QAAQ,CAAC;AAErE,IAAA,IAAI,CAACoD,sBAAsB,CAACG,IAAI,CAAC+B,SAAS,CAACoI,kBAAkB,CAAC,CAAC,CAACnI,SAAS,CAAEW,KAAK,IAAI;MAClF,IAAI,CAACyH,SAAS,CAACzH,KAAK,CAAC/I,MAAM,EAAE+I,KAAK,CAAC0H,WAAW,CAAC;AAE/C,MAAA,IAAI1H,KAAK,CAAC0H,WAAW,IAAI,CAAC,IAAI,CAAC9L,QAAQ,IAAI,IAAI,CAACvC,UAAU,EAAE;QAC1D,IAAI,CAACgI,KAAK,EAAE;QACZ,IAAI,CAACiG,KAAK,EAAE;AACd;AACF,KAAC,CAAC;IAIF9J,KAAK,CAAC,GAAG,IAAI,CAAC5E,OAAO,CAAC6E,GAAG,CAAEC,MAAM,IAAKA,MAAM,CAACiK,aAAa,CAAC,CAAC,CACzDtK,IAAI,CAAC+B,SAAS,CAACoI,kBAAkB,CAAC,CAAC,CACnCnI,SAAS,CAAC,MAAK;AAId,MAAA,IAAI,CAAC3H,kBAAkB,CAACiO,aAAa,EAAE;AACvC,MAAA,IAAI,CAAC3L,YAAY,CAACsB,IAAI,EAAE;AAC1B,KAAC,CAAC;AACN;AAGQmM,EAAAA,SAASA,CAAC/J,MAAiB,EAAEgK,WAAoB,EAAA;IACvD,MAAME,WAAW,GAAG,IAAI,CAACzN,eAAe,CAACyM,UAAU,CAAClJ,MAAM,CAAC;AAE3D,IAAA,IAAI,CAAC,IAAI,CAACT,wBAAwB,IAAIS,MAAM,CAACxG,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC2E,SAAS,EAAE;MAC7E6B,MAAM,CAAC2C,QAAQ,EAAE;AACjB,MAAA,IAAI,CAAClG,eAAe,CAACgM,KAAK,EAAE;AAE5B,MAAA,IAAI,IAAI,CAACjP,KAAK,IAAI,IAAI,EAAE;AACtB,QAAA,IAAI,CAAC2Q,iBAAiB,CAACnK,MAAM,CAACxG,KAAK,CAAC;AACtC;AACF,KAAC,MAAM;AACL,MAAA,IAAI0Q,WAAW,KAAKlK,MAAM,CAACiF,QAAQ,EAAE;AACnCjF,QAAAA,MAAM,CAACiF,QAAQ,GACX,IAAI,CAACxI,eAAe,CAACgG,MAAM,CAACzC,MAAM,CAAC,GACnC,IAAI,CAACvD,eAAe,CAACkG,QAAQ,CAAC3C,MAAM,CAAC;AAC3C;AAEA,MAAA,IAAIgK,WAAW,EAAE;AACf,QAAA,IAAI,CAACtN,WAAW,CAAC0N,aAAa,CAACpK,MAAM,CAAC;AACxC;MAEA,IAAI,IAAI,CAAC9B,QAAQ,EAAE;QACjB,IAAI,CAAC4K,WAAW,EAAE;AAElB,QAAA,IAAIkB,WAAW,EAAE;UAKf,IAAI,CAACJ,KAAK,EAAE;AACd;AACF;AACF;IAEA,IAAIM,WAAW,KAAK,IAAI,CAACzN,eAAe,CAACyM,UAAU,CAAClJ,MAAM,CAAC,EAAE;MAC3D,IAAI,CAACmK,iBAAiB,EAAE;AAC1B;AAEA,IAAA,IAAI,CAAC7N,YAAY,CAACsB,IAAI,EAAE;AAC1B;AAGQkL,EAAAA,WAAWA,GAAA;IACjB,IAAI,IAAI,CAAC5K,QAAQ,EAAE;MACjB,MAAMhD,OAAO,GAAG,IAAI,CAACA,OAAO,CAACmP,OAAO,EAAE;MAEtC,IAAI,CAAC5N,eAAe,CAAC6N,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAI;QACjC,OAAO,IAAI,CAACrL,cAAc,GACtB,IAAI,CAACA,cAAc,CAACoL,CAAC,EAAEC,CAAC,EAAEtP,OAAO,CAAC,GAClCA,OAAO,CAACuP,OAAO,CAACF,CAAC,CAAC,GAAGrP,OAAO,CAACuP,OAAO,CAACD,CAAC,CAAC;AAC7C,OAAC,CAAC;AACF,MAAA,IAAI,CAAClO,YAAY,CAACsB,IAAI,EAAE;AAC1B;AACF;EAGQuM,iBAAiBA,CAACO,aAAmB,EAAA;AAC3C,IAAA,IAAIC,WAAgB;IAEpB,IAAI,IAAI,CAACzM,QAAQ,EAAE;AACjByM,MAAAA,WAAW,GAAI,IAAI,CAAC1F,QAAwB,CAAClF,GAAG,CAAEC,MAAM,IAAKA,MAAM,CAACxG,KAAK,CAAC;AAC5E,KAAC,MAAM;MACLmR,WAAW,GAAG,IAAI,CAAC1F,QAAQ,GAAI,IAAI,CAACA,QAAsB,CAACzL,KAAK,GAAGkR,aAAa;AAClF;IAEA,IAAI,CAAChM,MAAM,GAAGiM,WAAW;AACzB,IAAA,IAAI,CAAClK,WAAW,CAACmK,IAAI,CAACD,WAAW,CAAC;AAClC,IAAA,IAAI,CAAChO,SAAS,CAACgO,WAAW,CAAC;AAC3B,IAAA,IAAI,CAACnK,eAAe,CAACoK,IAAI,CAAC,IAAItR,eAAe,CAAC,IAAI,EAAEqR,WAAW,CAAC,CAAC;AACjE,IAAA,IAAI,CAAC3Q,kBAAkB,CAACiI,YAAY,EAAE;AACxC;AAMQ+B,EAAAA,uBAAuBA,GAAA;IAC7B,IAAI,IAAI,CAACtH,WAAW,EAAE;MACpB,IAAI,IAAI,CAACyI,KAAK,EAAE;AACd,QAAA,IAAI,CAACzI,WAAW,CAACmO,kBAAkB,EAAE;AACvC,OAAC,MAAM;AACL,QAAA,IAAI,CAACnO,WAAW,CAAC0N,aAAa,CAAC,IAAI,CAAC3N,eAAe,CAACwI,QAAQ,CAAC,CAAC,CAAC,CAAC;AAClE;AACF;AACF;AAGQpB,EAAAA,QAAQA,GAAA;IACd,OAAO,CAAC,IAAI,CAAClI,UAAU,IAAI,CAAC,IAAI,CAAC6B,QAAQ,IAAI,IAAI,CAACtC,OAAO,EAAE4P,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAACzM,QAAQ;AACzF;EAGAuL,KAAKA,CAAC1O,OAAsB,EAAA;IAC1B,IAAI,CAACtB,WAAW,CAACmI,aAAa,CAAC6H,KAAK,CAAC1O,OAAO,CAAC;AAC/C;AAGA6P,EAAAA,uBAAuBA,GAAA;IACrB,IAAI,IAAI,CAACjM,SAAS,EAAE;AAClB,MAAA,OAAO,IAAI;AACb;IAEA,MAAMkM,OAAO,GAAG,IAAI,CAAC9Q,gBAAgB,EAAE+Q,UAAU,EAAE,IAAI,IAAI;IAC3D,MAAMC,eAAe,GAAGF,OAAO,GAAGA,OAAO,GAAG,GAAG,GAAG,EAAE;IACpD,OAAO,IAAI,CAACjM,cAAc,GAAGmM,eAAe,GAAG,IAAI,CAACnM,cAAc,GAAGiM,OAAO;AAC9E;AAGAG,EAAAA,wBAAwBA,GAAA;AACtB,IAAA,IAAI,IAAI,CAACtJ,SAAS,IAAI,IAAI,CAACnF,WAAW,IAAI,IAAI,CAACA,WAAW,CAACkK,UAAU,EAAE;AACrE,MAAA,OAAO,IAAI,CAAClK,WAAW,CAACkK,UAAU,CAACxH,EAAE;AACvC;AAEA,IAAA,OAAO,IAAI;AACb;AAGQ2D,EAAAA,yBAAyBA,GAAA;IAC/B,IAAI,IAAI,CAACjE,SAAS,EAAE;AAClB,MAAA,OAAO,IAAI;AACb;IAEA,IAAItF,KAAK,GAAG,IAAI,CAACU,gBAAgB,EAAE+Q,UAAU,EAAE,IAAI,EAAE;IAErD,IAAI,IAAI,CAAClM,cAAc,EAAE;AACvBvF,MAAAA,KAAK,IAAI,GAAG,GAAG,IAAI,CAACuF,cAAc;AACpC;IAQA,IAAI,CAACvF,KAAK,EAAE;MACVA,KAAK,GAAG,IAAI,CAACqD,QAAQ;AACvB;AAEA,IAAA,OAAOrD,KAAK;AACd;EAGAoI,mBAAmBA,CAACwJ,MAAe,EAAA;IACjC,IAAI,IAAI,CAACvJ,SAAS,EAAE;MAClB,IAAI,CAAChH,UAAU,GAAG,CAAC;AACrB,KAAC,MAAM;AACL,MAAA,IAAI,CAACyC,UAAU,CAAC+N,OAAO,GAAG,CAAC;AAC3B,MAAA,IAAI,CAACrR,kBAAkB,CAACiI,YAAY,EAAE;AACxC;IAEA,IAAI,CAACmJ,MAAM,EAAE;MACX,IAAI,CAACxR,WAAW,CAACmI,aAAa,CAAC+F,SAAS,CAACE,MAAM,CAAC,iCAAiC,CAAC;AACpF;AAEA,IAAA,IAAI,CAAC9H,YAAY,CAAC0K,IAAI,CAACQ,MAAM,CAAC;AAChC;AAEUE,EAAAA,mBAAmBA,GAAA;AAC3B,IAAA,OAAO,IAAI,CAACxQ,YAAY,EAAEyQ,KAAK;AACjC;EAMAC,iBAAiBA,CAACC,GAAa,EAAA;IAC7B,IAAIA,GAAG,CAACX,MAAM,EAAE;AACd,MAAA,IAAI,CAAClR,WAAW,CAACmI,aAAa,CAACkB,YAAY,CAAC,kBAAkB,EAAEwI,GAAG,CAACnG,IAAI,CAAC,GAAG,CAAC,CAAC;AAChF,KAAC,MAAM;MACL,IAAI,CAAC1L,WAAW,CAACmI,aAAa,CAACmB,eAAe,CAAC,kBAAkB,CAAC;AACpE;AACF;AAOAwI,EAAAA,gBAAgBA,GAAA;IACd,IAAI,CAAC9B,KAAK,EAAE;IACZ,IAAI,CAAChG,IAAI,EAAE;AACb;AASA+H,EAAAA,uBAAuBA,CACrBjF,cAAyB,EACzBkF,YAAoB,EACpBC,SAAiB,EAAA;IAEjB,MAAMC,UAAU,GAAGpF,cAAc,CAACqF,eAAe,EAAE,CAACC,YAAY;IAChE,MAAMC,yBAAyB,GAAGvF,cAAc,CAACqF,eAAe,EAAE,CAACG,SAAS;AAC5E,IAAA,MAAMC,gBAAgB,GAAGL,UAAU,GAAG,CAAC;AAMvC,IAAA,MAAMM,qBAAqB,GAAGH,yBAAyB,GAAGL,YAAY,GAAGO,gBAAgB;AACzF,IAAA,OAAOE,IAAI,CAACC,GAAG,CAACD,IAAI,CAACE,GAAG,CAAC,CAAC,EAAEH,qBAAqB,CAAC,EAAEP,SAAS,CAAC;AAChE;EAGQhC,qBAAqBA,CAAC2C,KAAa,EAAA;IACzC,IAAIA,KAAK,KAAK,CAAC,EAAE;AAEf,MAAA,IAAI,CAACnP,KAAK,CAAC0E,aAAa,CAAC0K,SAAS,GAAG,CAAC;AACxC,KAAC,MAAM;MACL,MAAMzM,MAAM,GAAG,IAAI,CAAC9E,OAAO,CAACmP,OAAO,EAAE,CAACmC,KAAK,CAAC;AAC5C,MAAA,IAAIxM,MAAM,EAAE;AACV,QAAA,MAAMgD,OAAO,GAAGhD,MAAM,CAAC+L,eAAe,EAAE;AACxC,QAAA,IAAI,CAAC1O,KAAK,CAAC0E,aAAa,CAAC0K,SAAS,GAAGC,uBAAuB,CAC1D1J,OAAO,CAACkJ,SAAS,EACjBlJ,OAAO,CAACgJ,YAAY,EACpB,IAAI,CAAC3O,KAAK,CAAC0E,aAAa,CAAC0K,SAAS,EAClC,IAAI,CAACpP,KAAK,CAAC0E,aAAa,CAACiK,YAAY,CACtC;AACH;AACF;AACF;AAEQ9D,EAAAA,mBAAmBA,GAAA;IACzB,IAAI,CAAC7K,KAAK,CAAC0E,aAAa,CAAC0K,SAAS,GAAG,IAAI,CAAC5R,UAAU;AACtD;AAGQwJ,EAAAA,yBAAyBA,GAAA;AAC/B,IAAA,IAAI,CAAC,IAAI,CAAChH,KAAK,EAAE;AACf,MAAA;AACF;IACA,MAAMsP,WAAW,GAAG,IAAI,CAACtP,KAAK,CAAC0E,aAAa,CAAC6K,YAAY;IACzD,MAAMC,qBAAqB,GAAG,IAAI,CAACxP,KAAK,CAAC0E,aAAa,CAAC+K,YAAY;AAGnE,IAAA,MAAMjB,SAAS,GAAGgB,qBAAqB,GAAGF,WAAW;IAErD,MAAMI,mBAAmB,GAAG,IAAI,CAACtQ,eAAe,CAACwI,QAAQ,CAAC,CAAC,CAAC;AAE5D,IAAA,IAAI,IAAI,CAACE,KAAK,IAAI,IAAI,CAACjK,OAAO,CAACmP,OAAO,EAAE,CAACI,OAAO,CAACsC,mBAAmB,CAAC,KAAK,CAAC,CAAC,EAAE;MAC5E,IAAI,CAAClS,UAAU,GAAG,CAAC;AACnB,MAAA;AACF;AAIA,IAAA,MAAM+Q,YAAY,GAAGe,WAAW,GAAG,CAAC;AACpC,IAAA,IAAI,CAAC9R,UAAU,GAAG,IAAI,CAAC8Q,uBAAuB,CAACoB,mBAAmB,EAAEnB,YAAY,EAAEC,SAAS,CAAC;AAC9F;;;;;UAzqCWhS,SAAS;AAAAV,IAAAA,IAAA,EAAA,EAAA;AAAA6T,IAAAA,MAAA,EAAAC,EAAA,CAAAC,eAAA,CAAAC;AAAA,GAAA,CAAA;AAAT,EAAA,OAAAC,IAAA,GAAAH,EAAA,CAAAI,oBAAA,CAAA;AAAAC,IAAAA,UAAA,EAAA,QAAA;AAAAC,IAAAA,OAAA,EAAA,QAAA;AAAAC,IAAAA,IAAA,EAAA3T,SAAS;AA4JA4T,IAAAA,YAAA,EAAA,IAAA;AAAAC,IAAAA,QAAA,EAAA,YAAA;AAAAC,IAAAA,MAAA,EAAA;AAAAnQ,MAAAA,QAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAAoQ,gBAAgB,CAIhB;AAAAnQ,MAAAA,QAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAACjE,KAAc,IAAMA,KAAK,IAAI,IAAI,GAAG,CAAC,GAAGqU,eAAe,CAACrU,KAAK,CAAE,CAchE;AAAAgD,MAAAA,mBAAA,EAAA,CAAA,kBAAA,EAAA,qBAAA,CAAA;AAAAe,MAAAA,UAAA,EAAA,YAAA;AAAAG,MAAAA,WAAA,EAAA,aAAA;AAAAG,MAAAA,QAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA+P,gBAAgB,CAWhB;AAAA1P,MAAAA,QAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA0P,gBAAgB;yCAchBA,gBAAgB,CAAA;AAAArP,MAAAA,WAAA,EAAA,aAAA;AAAA/E,MAAAA,KAAA,EAAA,OAAA;AAAAsF,MAAAA,SAAA,EAAA,CAAA,YAAA,EAAA,WAAA,CAAA;AAAAC,MAAAA,cAAA,EAAA,CAAA,iBAAA,EAAA,gBAAA,CAAA;AAAAC,MAAAA,iBAAA,EAAA,mBAAA;AAAAE,MAAAA,yBAAA,EAAA,CAAA,2BAAA,EAAA,2BAAA,EA2DhB2O,eAAe,CAAA;AAAA1O,MAAAA,cAAA,EAAA,gBAAA;AAAAC,MAAAA,EAAA,EAAA,IAAA;AAAAG,MAAAA,wBAAA,EAAA,CAAA,0BAAA,EAAA,0BAAA,EAkCfqO,gBAAgB;KA1SzB;AAAAE,IAAAA,OAAA,EAAA;AAAA5N,MAAAA,YAAA,EAAA,cAAA;AAAAE,MAAAA,aAAA,EAAA,QAAA;AAAAG,MAAAA,aAAA,EAAA,QAAA;AAAAC,MAAAA,eAAA,EAAA,iBAAA;AAAAC,MAAAA,WAAA,EAAA;KAAA;AAAAsN,IAAAA,IAAA,EAAA;AAAAC,MAAAA,UAAA,EAAA;AAAA,QAAA,MAAA,EAAA,UAAA;AAAA,QAAA,eAAA,EAAA;OAAA;AAAAC,MAAAA,SAAA,EAAA;AAAA,QAAA,OAAA,EAAA,UAAA;AAAA,QAAA,SAAA,EAAA,wBAAA;AAAA,QAAA,OAAA,EAAA,YAAA;AAAA,QAAA,MAAA,EAAA;OAAA;AAAAC,MAAAA,UAAA,EAAA;AAAA,QAAA,SAAA,EAAA,IAAA;AAAA,QAAA,eAAA,EAAA,sCAAA;AAAA,QAAA,oBAAA,EAAA,oCAAA;AAAA,QAAA,oBAAA,EAAA,WAAA;AAAA,QAAA,iBAAA,EAAA,mBAAA;AAAA,QAAA,oBAAA,EAAA,qBAAA;AAAA,QAAA,oBAAA,EAAA,qBAAA;AAAA,QAAA,mBAAA,EAAA,YAAA;AAAA,QAAA,4BAAA,EAAA,4BAAA;AAAA,QAAA,oBAAA,EAAA,UAAA;AAAA,QAAA,0BAAA,EAAA,YAAA;AAAA,QAAA,2BAAA,EAAA,UAAA;AAAA,QAAA,wBAAA,EAAA,OAAA;AAAA,QAAA,2BAAA,EAAA,UAAA;AAAA,QAAA,oBAAA,EAAA,UAAA;AAAA,QAAA,mBAAA,EAAA,SAAA;AAAA,QAAA,iCAAA,EAAA;OAAA;AAAAC,MAAAA,cAAA,EAAA;KAAA;AAAAC,IAAAA,SAAA,EAAA,CACT;AAAElV,MAAAA,OAAO,EAAEmV,mBAAmB;AAAEC,MAAAA,WAAW,EAAEzU;AAAW,KAAA,EACxD;AAAEX,MAAAA,OAAO,EAAEqV,2BAA2B;AAAED,MAAAA,WAAW,EAAEzU;AAAW,KAAA,CACjE;AA0CgB2U,IAAAA,OAAA,EAAA,CAAA;AAAAC,MAAAA,YAAA,EAAA,SAAA;AAAAC,MAAAA,SAAA,EAAAC,SAAS;;;;iBAGTC,WAAW;AAAAC,MAAAA,WAAA,EAAA;AAAA,KAAA,CAAA;AAAAC,IAAAA,WAAA,EAAA,CAAA;AAAAL,MAAAA,YAAA,EAAA,OAAA;AAAAM,MAAAA,KAAA,EAAA,IAAA;MAAAL,SAAA,EAAA,CAAA,OAAA,CAAA;AAAAG,MAAAA,WAAA,EAAA;AAAA,KAAA,EAAA;AAAAJ,MAAAA,YAAA,EAAA,YAAA;AAAAM,MAAAA,KAAA,EAAA,IAAA;AAAAL,MAAAA,SAAA,EA4GjBM,mBAAmB;ACnWhCH,MAAAA,WAAA,EAAA;AAAA,KAAA,CAAA;IAAAI,QAAA,EAAA,CAAA,WAAA,CAAA;AAAAC,IAAAA,eAAA,EAAA,IAAA;AAAAC,IAAAA,aAAA,EAAA,IAAA;AAAAC,IAAAA,QAAA,EAAAnC,EAAA;AAAAoC,IAAAA,QAAA,EAAA,4tEAmEA;;;;YDwIYC,OAAO;AAAA5B,MAAAA,QAAA,EAAA,UAAA;AAAAC,MAAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,IAAA,CAAA;MAAAsB,QAAA,EAAA,CAAA,SAAA;AAAA,KAAA,EAAA;AAAAM,MAAAA,IAAA,EAAA,WAAA;AAAA/B,MAAAA,IAAA,EAAEwB,mBAAmB;AAAEtB,MAAAA,QAAA,EAAA,qEAAA;MAAAC,MAAA,EAAA,CAAA,2BAAA,EAAA,8BAAA,EAAA,qCAAA,EAAA,4BAAA,EAAA,4BAAA,EAAA,0BAAA,EAAA,2BAAA,EAAA,6BAAA,EAAA,8BAAA,EAAA,kCAAA,EAAA,+BAAA,EAAA,mCAAA,EAAA,mCAAA,EAAA,yBAAA,EAAA,iCAAA,EAAA,sCAAA,EAAA,gCAAA,EAAA,iCAAA,EAAA,uCAAA,EAAA,kCAAA,EAAA,yBAAA,EAAA,wCAAA,EAAA,+BAAA,EAAA,+BAAA,EAAA,qBAAA,CAAA;AAAAG,MAAAA,OAAA,EAAA,CAAA,eAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,qBAAA,CAAA;MAAAmB,QAAA,EAAA,CAAA,qBAAA;AAAA,KAAA,EAAA;AAAAM,MAAAA,IAAA,EAAA,WAAA;AAAA/B,MAAAA,IAAA,EAAAgC,OAAO;;;;;YAAEC,SAAS;AAAAC,MAAAA,IAAA,EAAA;AAAA,KAAA,CAAA;AAAAC,IAAAA,UAAA,EAL9C,CAACnY,mBAAmB,CAACC,cAAc,CAAC;AAAAmY,IAAAA,eAAA,EAAA3C,EAAA,CAAA4C,uBAAA,CAAAC,MAAA;AAAAC,IAAAA,aAAA,EAAA9C,EAAA,CAAA+C,iBAAA,CAAAC;AAAA,GAAA,CAAA;;;;;;QAOrCpW,SAAS;AAAAqW,EAAAA,UAAA,EAAA,CAAA;UArCrB/C,SAAS;AACEgD,IAAAA,IAAA,EAAA,CAAA;AAAAzC,MAAAA,QAAA,EAAA,YAAY;gBACZ,WAAW;AAAAC,MAAAA,MAAA,EAGb,CAAC,UAAU,EAAE,UAAU,CAAC;MACjBoC,aAAA,EAAAC,iBAAiB,CAACC,IAAI;MAAAL,eAAA,EACpBC,uBAAuB,CAACC,MAAM;AACzC/B,MAAAA,IAAA,EAAA;AACJqC,QAAAA,IAAI,EAAE,UAAU;AAChB,QAAA,eAAe,EAAE,SAAS;AAC1BC,QAAAA,KAAK,EAAE,8BAA8B;AACrC,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,iBAAiB,EAAE,sCAAsC;AACzD,QAAA,sBAAsB,EAAE,kCAAkC;AAC1D,QAAA,sBAAsB,EAAE,WAAW;AACnC,QAAA,mBAAmB,EAAE,mBAAmB;AACxC,QAAA,sBAAsB,EAAE,qBAAqB;AAC7C,QAAA,sBAAsB,EAAE,qBAAqB;AAC7C,QAAA,qBAAqB,EAAE,YAAY;AACnC,QAAA,8BAA8B,EAAE,4BAA4B;AAC5D,QAAA,sBAAsB,EAAE,UAAU;AAClC,QAAA,4BAA4B,EAAE,YAAY;AAC1C,QAAA,6BAA6B,EAAE,UAAU;AACzC,QAAA,0BAA0B,EAAE,OAAO;AACnC,QAAA,6BAA6B,EAAE,UAAU;AACzC,QAAA,sBAAsB,EAAE,UAAU;AAClC,QAAA,qBAAqB,EAAE,SAAS;AAChC,QAAA,mCAAmC,EAAE;OACtC;AAAAV,MAAAA,UAAA,EACW,CAACnY,mBAAmB,CAACC,cAAc,CAAC;AACrC2W,MAAAA,SAAA,EAAA,CACT;AAAElV,QAAAA,OAAO,EAAEmV,mBAAmB;AAAEC,QAAAA,WAAW;AAAa,OAAA,EACxD;AAAEpV,QAAAA,OAAO,EAAEqV,2BAA2B;AAAED,QAAAA,WAAW;AAAa,OAAA,CACjE;MACQgC,OAAA,EAAA,CAAChB,OAAO,EAAEN,mBAAmB,EAAEQ,OAAO,EAAEC,SAAS,CAAC;AAAAJ,MAAAA,QAAA,EAAA,4tEAAA;MAAAkB,MAAA,EAAA,CAAA,83CAAA;KAAA;;;;;YAyC1DC,eAAe;MAACL,IAAA,EAAA,CAAAxB,SAAS,EAAE;AAAEE,QAAAA,WAAW,EAAE;OAAM;;;YAGhD2B,eAAe;MAACL,IAAA,EAAA,CAAAvB,WAAW,EAAE;AAAEC,QAAAA,WAAW,EAAE;OAAM;;;YAqElD4B,KAAK;aAAC,kBAAkB;;;YAoCxBC,SAAS;aAAC,OAAO;;;YAGjBA,SAAS;aAAC1B,mBAAmB;;;YAG7ByB;;;YAGAA,KAAK;aAAC;AAAEE,QAAAA,SAAS,EAAE/C;OAAkB;;;YAIrC6C,KAAK;aAAC;QAAEE,SAAS,EAAGnX,KAAc,IAAMA,KAAK,IAAI,IAAI,GAAG,CAAC,GAAGqU,eAAe,CAACrU,KAAK;OAAI;;;YAGrFiX;;;YAWAA,KAAK;aAAC;AAAEE,QAAAA,SAAS,EAAE/C;OAAkB;;;YAWrC6C,KAAK;aAAC;AAAEE,QAAAA,SAAS,EAAE/C;OAAkB;;;YAcrC6C,KAAK;aAAC;AAAEE,QAAAA,SAAS,EAAE/C;OAAkB;;;YAerC6C;;;YAgBAA;;;YAaAA,KAAK;aAAC,YAAY;;;YAGlBA,KAAK;aAAC,iBAAiB;;;YAGvBA;;;YASAA,KAAK;aAAC;AAAEE,QAAAA,SAAS,EAAE9C;OAAiB;;;YAOpC4C;;;YAGAA;;;YAwBAA,KAAK;aAAC;AAAEE,QAAAA,SAAS,EAAE/C;OAAkB;;;YAkBrCgD;;;YAGAA,MAAM;aAAC,QAAQ;;;YAMfA,MAAM;aAAC,QAAQ;;;YAMfA;;;YAQAA;;;YAyIAC,YAAY;aAAC,OAAO;;;YA2LpBA,YAAY;aAAC,SAAS,EAAE,CAAC,QAAQ,CAAC;;;YAsFlCA,YAAY;aAAC,OAAO;;;YAYpBA,YAAY;aAAC,MAAM;;;;;MEn7BTC,eAAe,CAAA;;;;;UAAfA,eAAe;AAAA3X,IAAAA,IAAA,EAAA,EAAA;AAAA6T,IAAAA,MAAA,EAAAC,EAAA,CAAAC,eAAA,CAAA6D;AAAA,GAAA,CAAA;AAAf,EAAA,OAAAC,IAAA,GAAA/D,EAAA,CAAAgE,mBAAA,CAAA;AAAA3D,IAAAA,UAAA,EAAA,QAAA;AAAAC,IAAAA,OAAA,EAAA,QAAA;AAAA6B,IAAAA,QAAA,EAAAnC,EAAA;AAAAO,IAAAA,IAAA,EAAAsD,eAAe;IAJhBR,OAAA,EAAA,CAAAY,aAAa,EAAEC,eAAe,EAAEC,aAAa,EAAEC,eAAe,EAAExX,SAAS,CACzE;AAAAyX,IAAAA,OAAA,EAAA,CAAAD,eAAe,EAAEH,aAAa,EAAErX,SAAS;AAAA,GAAA,CAAA;AAGxC,EAAA,OAAA0X,IAAA,GAAAtE,EAAA,CAAAuE,mBAAA,CAAA;AAAAlE,IAAAA,UAAA,EAAA,QAAA;AAAAC,IAAAA,OAAA,EAAA,QAAA;AAAA6B,IAAAA,QAAA,EAAAnC,EAAA;AAAAO,IAAAA,IAAA,EAAAsD,eAAe;eAFf,CAAC7X,mCAAmC,CAAC;AAAAqX,IAAAA,OAAA,EAAA,CAFtCY,aAAa,EAAEC,eAAe,EAAEC,aAAa,EAAEC,eAAe,EAAExX,SAAS,EACzEwX,eAAe,EAAEH,aAAa;AAAA,GAAA,CAAA;;;;;;QAG7BJ,eAAe;AAAAZ,EAAAA,UAAA,EAAA,CAAA;UAL3Ba,QAAQ;AAACZ,IAAAA,IAAA,EAAA,CAAA;MACRG,OAAO,EAAE,CAACY,aAAa,EAAEC,eAAe,EAAEC,aAAa,EAAEC,eAAe,EAAExX,SAAS,CAAC;AACpFyX,MAAAA,OAAO,EAAE,CAACD,eAAe,EAAEH,aAAa,EAAErX,SAAS,CAAC;MACpDuU,SAAS,EAAE,CAACnV,mCAAmC;KAChD;;;;;;"}