{"version":3,"file":"juvo-rafa-library.mjs","sources":["../../../projects/ui-components/src/lib/juvo-button-action/juvo-button-action.component.ts","../../../projects/ui-components/src/lib/juvo-button-action/juvo-button-action.component.html","../../../projects/ui-components/src/lib/juvo-loading/juvo-loading.component.ts","../../../projects/ui-components/src/lib/juvo-loading/juvo-loading.component.html","../../../projects/ui-components/src/lib/juvo-screen-loading/juvo-screen-loading.component.ts","../../../projects/ui-components/src/lib/juvo-screen-loading/juvo-screen-loading.component.html","../../../projects/ui-components/src/lib/juvo-input/juvo-input.component.ts","../../../projects/ui-components/src/lib/juvo-input/juvo-input.component.html","../../../projects/ui-components/src/lib/juvo-list/juvo-list.component.ts","../../../projects/ui-components/src/lib/juvo-list/juvo-list.component.html","../../../projects/ui-components/src/lib/juvo-table/juvo-table.component.ts","../../../projects/ui-components/src/lib/juvo-table/juvo-table.component.html","../../../projects/ui-components/src/lib/juvo-tab-menu/juvo-tab-menu.component.ts","../../../projects/ui-components/src/lib/juvo-tab-menu/juvo-tab-menu.component.html","../../../projects/ui-components/src/lib/juvo-notification/juvo-notification.component.ts","../../../projects/ui-components/src/lib/juvo-notification/juvo-notification.component.html","../../../projects/ui-components/src/lib/juvo-confirmation-dialog/juvo-confirmation-dialog.component.ts","../../../projects/ui-components/src/lib/juvo-confirmation-dialog/juvo-confirmation-dialog.component.html","../../../projects/ui-components/src/lib/juvo-image-picker/juvo-image-picker.component.ts","../../../projects/ui-components/src/lib/juvo-image-picker/juvo-image-picker.component.html","../../../projects/ui-components/src/lib/validators/ip-address.validator.ts","../../../projects/ui-components/src/lib/validators/mac-address.validator.ts","../../../projects/ui-components/src/lib/validators/port.validator.ts","../../../projects/ui-components/src/lib/validators/serial-port.validator.ts","../../../projects/ui-components/src/lib/validators/index.ts","../../../projects/ui-components/src/public-api.ts","../../../projects/ui-components/src/juvo-rafa-library.ts"],"sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Observable } from 'rxjs';\n\n/**\n * Configuration interface for JuvoButtonActionComponent\n * \n * @interface ButtonActionConfig\n * @since 2.0.0\n */\nexport interface ButtonActionConfig {\n  /** Show Create button */\n  buttonCreate?: boolean;\n  /** Show Create and Copy button */\n  buttonCreateCopy?: boolean;\n  /** Show Save and Copy button */\n  buttonSaveCopy?: boolean;\n  /** Show Save button */\n  buttonSave?: boolean;\n  /** Disable all action buttons */\n  disable?: boolean;\n  /** Custom text for Save button */\n  saveText?: string;\n  /** Button style: true for solid, false for outlined */\n  buttonType?: boolean;\n}\n\n/**\n * Action Button Group Component\n * \n * @description\n * A reusable button group component commonly used in forms and data entry screens.\n * Provides standard actions like Save, Create, Create Copy, Save Copy, and Cancel.\n * Originally designed for backoffice applications where consistent form actions are needed.\n * \n * @example\n * ```html\n * <!-- Basic usage -->\n * <juvo-button-action\n *   [buttonSave]=\"true\"\n *   [buttonCreate]=\"true\"\n *   (actionSaveTriggered)=\"onSave()\"\n *   (actionCreateTriggered)=\"onCreate()\"\n *   (actionCancelTriggered)=\"onCancel()\">\n * </juvo-button-action>\n * \n * <!-- Advanced usage with loading state -->\n * <juvo-button-action\n *   [loading$]=\"loadingObservable$\"\n *   [buttonSave]=\"true\"\n *   [buttonCreateCopy]=\"true\"\n *   [buttonType]=\"true\"\n *   [disable]=\"!form.valid\"\n *   saveText=\"Update Record\"\n *   (actionSaveTriggered)=\"onUpdate()\"\n *   (actionCreateCopyTriggered)=\"onDuplicate()\">\n * </juvo-button-action>\n * ```\n * \n * @selector juvo-button-action\n * @since 2.0.0\n * @author Juvo Rafa Team\n */\n@Component({\n  selector: 'juvo-button-action',\n  standalone: true,\n  imports: [CommonModule],\n  templateUrl: './juvo-button-action.component.html',\n  styleUrl: './juvo-button-action.component.css'\n})\nexport class JuvoButtonActionComponent {\n  /** Observable for loading state of buttons */\n  @Input() loading$?: Observable<boolean>;\n  \n  /** Configuration object for button visibility and behavior */\n  @Input() config: ButtonActionConfig = {};\n  \n  /** Show Create button */\n  @Input() buttonCreate?: boolean;\n  \n  /** Show Create and Copy button */\n  @Input() buttonCreateCopy?: boolean;\n  \n  /** Show Save and Copy button */\n  @Input() buttonSaveCopy?: boolean;\n  \n  /** Show Save button */\n  @Input() buttonSave?: boolean;\n  \n  /** Disable all action buttons */\n  @Input() disable: boolean = false;\n  \n  /** Custom text for Save button @default \"Save\" */\n  @Input() saveText: string = \"Save\";\n  \n  /** Button style: true for solid, false for outlined @default false */\n  @Input() buttonType: boolean = false;\n  \n  /** Emitted when Save button is clicked */\n  @Output() actionSaveTriggered = new EventEmitter<void>();\n  \n  /** Emitted when Create button is clicked */\n  @Output() actionCreateTriggered = new EventEmitter<void>();\n  \n  /** Emitted when Create and Copy button is clicked */\n  @Output() actionCreateCopyTriggered = new EventEmitter<void>();\n  \n  /** Emitted when Save and Copy button is clicked */\n  @Output() actionSaveCopyTriggered = new EventEmitter<void>();\n  \n  /** Emitted when Cancel button is clicked */\n  @Output() actionCancelTriggered = new EventEmitter<void>();\n\n  /**\n   * Gets the current loading state\n   * @returns true if loading, false otherwise\n   */\n  get isLoading(): boolean {\n    return this.loading$ ? false : false; // Simplified for now\n  }\n\n  /**\n   * Handles Save button click\n   * @emits actionSaveTriggered\n   */\n  onSave(): void {\n    this.actionSaveTriggered.emit();\n  }\n\n  /**\n   * Handles Create button click\n   * @emits actionCreateTriggered\n   */\n  onCreate(): void {\n    this.actionCreateTriggered.emit();\n  }\n\n  /**\n   * Handles Create and Copy button click\n   * @emits actionCreateCopyTriggered\n   */\n  onCreateCopy(): void {\n    this.actionCreateCopyTriggered.emit();\n  }\n\n  /**\n   * Handles Save and Copy button click\n   * @emits actionSaveCopyTriggered\n   */\n  onSaveCopy(): void {\n    this.actionSaveCopyTriggered.emit();\n  }\n\n  /**\n   * Handles Cancel button click\n   * @emits actionCancelTriggered\n   */\n  onCancel(): void {\n    this.actionCancelTriggered.emit();\n  }\n} ","<div class=\"juvo-button-action\">\n  <button\n    type=\"button\"\n    class=\"btn btn-outlined\"\n    (click)=\"onCancel()\">\n    Cancel\n  </button>\n\n  <button\n    *ngIf=\"buttonCreateCopy\"\n    type=\"button\"\n    class=\"btn btn-outlined\"\n    [disabled]=\"isLoading\"\n    (click)=\"onCreateCopy()\">\n    <span *ngIf=\"isLoading\" class=\"spinner\"></span>\n    Create and copy\n  </button>\n\n  <button\n    *ngIf=\"buttonSaveCopy\"\n    type=\"button\"\n    class=\"btn btn-outlined\"\n    [disabled]=\"isLoading\"\n    (click)=\"onSaveCopy()\">\n    <span *ngIf=\"isLoading\" class=\"spinner\"></span>\n    Save and copy\n  </button>\n\n  <button\n    *ngIf=\"buttonCreate\"\n    type=\"button\"\n    class=\"btn btn-outlined\"\n    [disabled]=\"disable || isLoading\"\n    (click)=\"onCreate()\">\n    <span *ngIf=\"isLoading\" class=\"spinner\"></span>\n    Create\n  </button>\n  \n  <button\n    *ngIf=\"buttonSave\"\n    type=\"button\"\n    [disabled]=\"disable || isLoading\"\n    [class]=\"buttonType ? 'btn btn-primary' : 'btn btn-outlined'\"\n    (click)=\"onSave()\">\n    <span *ngIf=\"isLoading\" class=\"spinner\"></span>\n    {{ saveText }}\n  </button>\n</div> ","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n/**\n * Loading size options\n * @type LoadingSize\n * @since 2.0.0\n */\nexport type LoadingSize = 'small' | 'medium' | 'large';\n\n/**\n * Loading Component\n * \n * @description\n * A flexible loading indicator component that can be used inline or as an overlay.\n * Originally designed for backoffice applications to provide consistent loading states.\n * Supports different sizes, custom colors, and overlay modes.\n * \n * @example\n * ```html\n * <!-- Inline loading -->\n * <juvo-loading \n *   message=\"Loading data...\" \n *   size=\"medium\" \n *   [overlay]=\"false\">\n * </juvo-loading>\n * \n * <!-- Overlay loading -->\n * <juvo-loading \n *   *ngIf=\"isLoading\"\n *   message=\"Please wait...\" \n *   size=\"large\" \n *   [overlay]=\"true\">\n * </juvo-loading>\n * \n * <!-- Custom styled loading -->\n * <juvo-loading \n *   message=\"Processing...\" \n *   size=\"small\" \n *   color=\"#10b981\" \n *   [transparent]=\"true\">\n * </juvo-loading>\n * ```\n * \n * @selector juvo-loading\n * @since 2.0.0\n * @author Juvo Rafa Team\n */\n@Component({\n  selector: 'juvo-loading',\n  standalone: true,\n  imports: [CommonModule],\n  templateUrl: './juvo-loading.component.html',\n  styleUrl: './juvo-loading.component.css'\n})\nexport class JuvoLoadingComponent {\n  /** Loading message to display @default \"Loading...\" */\n  @Input() message: string = 'Loading...';\n  \n  /** Size of the loading spinner @default \"medium\" */\n  @Input() size: LoadingSize = 'medium';\n  \n  /** Color of the spinner @default \"#3b82f6\" */\n  @Input() color: string = '#3b82f6';\n  \n  /** Whether to display as overlay covering the entire screen @default true */\n  @Input() overlay: boolean = true;\n  \n  /** Whether the overlay background should be transparent @default false */\n  @Input() transparent: boolean = false;\n\n  /**\n   * Gets the CSS class for the spinner size\n   * @returns CSS class name for the current size\n   */\n  get sizeClass(): string {\n    return `loading-${this.size}`;\n  }\n\n  /**\n   * Gets the CSS classes for the container\n   * @returns Combined CSS classes for the container\n   */\n  get containerClass(): string {\n    let classes = 'juvo-loading';\n    if (this.overlay) classes += ' overlay';\n    if (this.transparent) classes += ' transparent';\n    return classes;\n  }\n} ","<div [class]=\"containerClass\">\n  <div class=\"loading-content\">\n    <div [class]=\"sizeClass\" class=\"loading-spinner\">\n      <div class=\"spinner-circle\" [style.border-top-color]=\"color\"></div>\n    </div>\n    <p class=\"loading-message\" *ngIf=\"message\">{{ message }}</p>\n  </div>\n</div> ","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Observable, combineLatest, map } from 'rxjs';\n\n/**\n * Screen Loading Component\n * \n * @description\n * A screen-wide loading overlay component for blocking UI interactions during operations.\n * Originally designed for backoffice applications to handle multiple loading states.\n * Can combine multiple observables to show loading when any operation is in progress.\n * \n * @example\n * ```html\n * <!-- Single loading state -->\n * <juvo-screen-loading\n *   [loading$]=\"dataLoading$\"\n *   message=\"Loading data...\">\n * </juvo-screen-loading>\n * \n * <!-- Multiple loading states -->\n * <juvo-screen-loading\n *   [loadingList$]=\"[saveLoading$, deleteLoading$, updateLoading$]\"\n *   message=\"Processing operations...\"\n *   [backdrop]=\"true\">\n * </juvo-screen-loading>\n * \n * <!-- Custom styled loading -->\n * <juvo-screen-loading\n *   [loading$]=\"criticalOperation$\"\n *   message=\"Critical operation in progress. Please do not refresh the page.\"\n *   color=\"#dc2626\"\n *   size=\"large\">\n * </juvo-screen-loading>\n * ```\n * \n * @selector juvo-screen-loading\n * @since 2.1.0\n * @author Juvo Rafa Team\n */\n@Component({\n  selector: 'juvo-screen-loading',\n  standalone: true,\n  imports: [CommonModule],\n  templateUrl: './juvo-screen-loading.component.html',\n  styleUrl: './juvo-screen-loading.component.css'\n})\nexport class JuvoScreenLoadingComponent {\n  /** Single loading observable */\n  @Input() loading$?: Observable<boolean>;\n  \n  /** Array of loading observables to combine */\n  @Input() loadingList$: Observable<boolean>[] = [];\n  \n  /** Loading message to display @default \"Loading...\" */\n  @Input() message: string = 'Loading...';\n  \n  /** Size of the loading spinner @default \"large\" */\n  @Input() size: 'small' | 'medium' | 'large' = 'large';\n  \n  /** Color of the spinner @default \"#3b82f6\" */\n  @Input() color: string = '#3b82f6';\n  \n  /** Whether to show backdrop @default true */\n  @Input() backdrop: boolean = true;\n  \n  /** Backdrop opacity @default 0.8 */\n  @Input() backdropOpacity: number = 0.8;\n  \n  /** Whether to show the loading message @default true */\n  @Input() showMessage: boolean = true;\n\n  /**\n   * Gets the combined loading state from all sources\n   * @returns Observable<boolean> indicating if any loading is in progress\n   */\n  get combinedLoading$(): Observable<boolean> {\n    const observables: Observable<boolean>[] = [];\n    \n    if (this.loading$) {\n      observables.push(this.loading$);\n    }\n    \n    if (this.loadingList$ && this.loadingList$.length > 0) {\n      observables.push(...this.loadingList$);\n    }\n    \n    if (observables.length === 0) {\n      return new Observable(subscriber => subscriber.next(false));\n    }\n    \n    if (observables.length === 1) {\n      return observables[0];\n    }\n    \n    return combineLatest(observables).pipe(\n      map(loadingStates => loadingStates.some(loading => loading))\n    );\n  }\n\n  /**\n   * Gets the CSS class for the spinner size\n   * @returns CSS class name for the current size\n   */\n  get sizeClass(): string {\n    return `spinner-${this.size}`;\n  }\n\n  /**\n   * Gets the backdrop style\n   * @returns CSS style object for backdrop\n   */\n  get backdropStyle(): any {\n    return {\n      'background-color': `rgba(255, 255, 255, ${this.backdropOpacity})`\n    };\n  }\n} ","<div class=\"screen-loading-overlay\" \n     *ngIf=\"combinedLoading$ | async\"\n     [class.with-backdrop]=\"backdrop\"\n     [ngStyle]=\"backdrop ? backdropStyle : null\">\n  \n  <div class=\"screen-loading-content\">\n    <div class=\"spinner-container\">\n      <div [class]=\"sizeClass\" \n           class=\"loading-spinner\">\n        <div class=\"spinner-circle\" \n             [style.border-top-color]=\"color\"\n             [style.border-right-color]=\"color\">\n        </div>\n      </div>\n    </div>\n    \n    <div class=\"loading-message\" \n         *ngIf=\"showMessage && message\">\n      {{ message }}\n    </div>\n  </div>\n</div> ","import { Component, Input, Output, EventEmitter, forwardRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, ReactiveFormsModule, FormsModule } from '@angular/forms';\n\n/**\n * Input types supported by JuvoInputComponent\n * @type InputType\n * @since 2.1.0\n */\nexport type InputType = 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | 'search' | 'textarea' | 'select';\n\n/**\n * Input sizes\n * @type InputSize\n * @since 2.1.0\n */\nexport type InputSize = 'small' | 'medium' | 'large';\n\n/**\n * Select option interface\n * @interface SelectOption\n * @since 2.1.0\n */\nexport interface SelectOption {\n  label: string;\n  value: any;\n  disabled?: boolean;\n}\n\n/**\n * Input Component\n * \n * @description\n * A comprehensive input component supporting various input types and form integration.\n * Includes support for text, email, password, number, textarea, and select inputs.\n * Originally designed for backoffice applications with extensive form requirements.\n * \n * @example\n * ```html\n * <!-- Basic text input -->\n * <juvo-input\n *   label=\"Full Name\"\n *   placeholder=\"Enter your full name\"\n *   [(ngModel)]=\"name\">\n * </juvo-input>\n * \n * <!-- Email input with validation -->\n * <juvo-input\n *   type=\"email\"\n *   label=\"Email Address\"\n *   placeholder=\"user@example.com\"\n *   [required]=\"true\"\n *   [error]=\"emailError\"\n *   [(ngModel)]=\"email\">\n * </juvo-input>\n * \n * <!-- Select dropdown -->\n * <juvo-input\n *   type=\"select\"\n *   label=\"Country\"\n *   [options]=\"countryOptions\"\n *   [(ngModel)]=\"selectedCountry\">\n * </juvo-input>\n * \n * <!-- Textarea -->\n * <juvo-input\n *   type=\"textarea\"\n *   label=\"Description\"\n *   [rows]=\"4\"\n *   placeholder=\"Enter description...\"\n *   [(ngModel)]=\"description\">\n * </juvo-input>\n * ```\n * \n * @selector juvo-input\n * @since 2.1.0\n * @author Juvo Rafa Team\n */\n@Component({\n  selector: 'juvo-input',\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule, FormsModule],\n  templateUrl: './juvo-input.component.html',\n  styleUrl: './juvo-input.component.css',\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => JuvoInputComponent),\n      multi: true\n    }\n  ]\n})\nexport class JuvoInputComponent implements ControlValueAccessor {\n  /** Input label */\n  @Input() label?: string;\n  \n  /** Input placeholder text */\n  @Input() placeholder: string = '';\n  \n  /** Input type @default \"text\" */\n  @Input() type: InputType = 'text';\n  \n  /** Input size @default \"medium\" */\n  @Input() size: InputSize = 'medium';\n  \n  /** Whether input is disabled @default false */\n  @Input() disabled: boolean = false;\n  \n  /** Whether input is readonly @default false */\n  @Input() readonly: boolean = false;\n  \n  /** Whether input is required @default false */\n  @Input() required: boolean = false;\n  \n  /** Error message to display */\n  @Input() error?: string;\n  \n  /** Hint text to display */\n  @Input() hint?: string;\n  \n  /** Maximum length for text inputs */\n  @Input() maxLength?: number;\n  \n  /** Minimum value for number inputs */\n  @Input() min?: number;\n  \n  /** Maximum value for number inputs */\n  @Input() max?: number;\n  \n  /** Step value for number inputs */\n  @Input() step?: number;\n  \n  /** Number of rows for textarea @default 3 */\n  @Input() rows: number = 3;\n  \n  /** Options for select input */\n  @Input() options: SelectOption[] = [];\n  \n  /** Prefix text or icon */\n  @Input() prefix?: string;\n  \n  /** Suffix text or icon */\n  @Input() suffix?: string;\n  \n  /** Whether to show character counter @default false */\n  @Input() showCounter: boolean = false;\n  \n  /** Emitted when value changes */\n  @Output() valueChange = new EventEmitter<any>();\n  \n  /** Emitted when input receives focus */\n  @Output() onFocus = new EventEmitter<void>();\n  \n  /** Emitted when input loses focus */\n  @Output() onBlur = new EventEmitter<void>();\n\n  private _value: any = '';\n  private _onChange = (value: any) => {};\n  private _onTouched = () => {};\n\n  get value(): any {\n    return this._value;\n  }\n\n  set value(val: any) {\n    if (val !== this._value) {\n      this._value = val;\n      this._onChange(val);\n      this.valueChange.emit(val);\n    }\n  }\n\n  /**\n   * Gets CSS classes for the input container\n   * @returns Combined CSS classes\n   */\n  get containerClasses(): string {\n    let classes = `input-container input-${this.size}`;\n    if (this.disabled) classes += ' disabled';\n    if (this.error) classes += ' error';\n    if (this.readonly) classes += ' readonly';\n    return classes;\n  }\n\n  /**\n   * Gets CSS classes for the input element\n   * @returns Combined CSS classes\n   */\n  get inputClasses(): string {\n    let classes = 'input-element';\n    if (this.prefix) classes += ' has-prefix';\n    if (this.suffix) classes += ' has-suffix';\n    return classes;\n  }\n\n  /**\n   * Handles input value changes\n   */\n  onInput(event: Event): void {\n    const target = event.target as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n    this.value = target.value;\n  }\n\n  /**\n   * Handles input focus\n   */\n  handleFocus(): void {\n    this.onFocus.emit();\n  }\n\n  /**\n   * Handles input blur\n   */\n  handleBlur(): void {\n    this._onTouched();\n    this.onBlur.emit();\n  }\n\n  /**\n   * Gets the character count for display\n   * @returns Current character count\n   */\n  get characterCount(): number {\n    return this.value ? this.value.toString().length : 0;\n  }\n\n  // ControlValueAccessor implementation\n  writeValue(value: any): void {\n    this._value = value || '';\n  }\n\n  registerOnChange(fn: (value: any) => void): void {\n    this._onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this._onTouched = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    this.disabled = isDisabled;\n  }\n} ","<div [class]=\"containerClasses\">\n  <!-- Label -->\n  <label class=\"input-label\" *ngIf=\"label\">\n    {{ label }}\n    <span class=\"required-indicator\" *ngIf=\"required\">*</span>\n  </label>\n\n  <!-- Input wrapper -->\n  <div class=\"input-wrapper\">\n    <!-- Prefix -->\n    <span class=\"input-prefix\" *ngIf=\"prefix\">{{ prefix }}</span>\n\n    <!-- Text Input -->\n    <input\n      *ngIf=\"type !== 'textarea' && type !== 'select'\"\n      [class]=\"inputClasses\"\n      [type]=\"type\"\n      [placeholder]=\"placeholder\"\n      [disabled]=\"disabled\"\n      [readonly]=\"readonly\"\n      [required]=\"required\"\n      [attr.maxlength]=\"maxLength\"\n      [min]=\"min\"\n      [max]=\"max\"\n      [step]=\"step\"\n      [value]=\"value\"\n      (input)=\"onInput($event)\"\n      (focus)=\"handleFocus()\"\n      (blur)=\"handleBlur()\"\n    />\n\n    <!-- Textarea -->\n    <textarea\n      *ngIf=\"type === 'textarea'\"\n      [class]=\"inputClasses\"\n      [placeholder]=\"placeholder\"\n      [disabled]=\"disabled\"\n      [readonly]=\"readonly\"\n      [required]=\"required\"\n      [attr.maxlength]=\"maxLength\"\n      [rows]=\"rows\"\n      [value]=\"value\"\n      (input)=\"onInput($event)\"\n      (focus)=\"handleFocus()\"\n      (blur)=\"handleBlur()\">\n    </textarea>\n\n    <!-- Select -->\n    <select\n      *ngIf=\"type === 'select'\"\n      [class]=\"inputClasses\"\n      [disabled]=\"disabled\"\n      [required]=\"required\"\n      [value]=\"value\"\n      (change)=\"onInput($event)\"\n      (focus)=\"handleFocus()\"\n      (blur)=\"handleBlur()\">\n      <option value=\"\" disabled *ngIf=\"placeholder\">{{ placeholder }}</option>\n      <option \n        *ngFor=\"let option of options\"\n        [value]=\"option.value\"\n        [disabled]=\"option.disabled\">\n        {{ option.label }}\n      </option>\n    </select>\n\n    <!-- Suffix -->\n    <span class=\"input-suffix\" *ngIf=\"suffix\">{{ suffix }}</span>\n  </div>\n\n  <!-- Footer -->\n  <div class=\"input-footer\" *ngIf=\"error || hint || (showCounter && maxLength)\">\n    <!-- Error message -->\n    <div class=\"input-error\" *ngIf=\"error\">\n      {{ error }}\n    </div>\n    \n    <!-- Hint text -->\n    <div class=\"input-hint\" *ngIf=\"hint && !error\">\n      {{ hint }}\n    </div>\n    \n    <!-- Character counter -->\n    <div class=\"input-counter\" *ngIf=\"showCounter && maxLength && !error\">\n      {{ characterCount }}/{{ maxLength }}\n    </div>\n  </div>\n</div> ","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Observable, of } from 'rxjs';\n\n/**\n * List column configuration interface\n * @interface ListColumn\n * @since 2.1.0\n */\nexport interface ListColumn {\n  key: string;\n  label: string;\n  sortable?: boolean;\n  width?: string;\n  type?: 'text' | 'number' | 'date' | 'boolean' | 'custom';\n}\n\n/**\n * List Component\n * \n * @description\n * A simple list component for displaying tabular data with basic functionality.\n * Originally designed for backoffice applications requiring data presentation.\n * Supports sorting, custom columns, and item selection.\n * \n * @example\n * ```html\n * <!-- Basic list -->\n * <juvo-list\n *   [data$]=\"listData$\"\n *   [columns]=\"[\n *     { key: 'name', label: 'Name', sortable: true },\n *     { key: 'email', label: 'Email' },\n *     { key: 'status', label: 'Status', type: 'boolean' }\n *   ]\"\n *   (itemSelected)=\"onItemSelected($event)\">\n * </juvo-list>\n * \n * <!-- List with loading state -->\n * <juvo-list\n *   [data$]=\"userData$\"\n *   [columns]=\"userColumns\"\n *   [loading$]=\"userLoading$\"\n *   [selectable]=\"true\"\n *   (itemSelected)=\"handleSelection($event)\">\n * </juvo-list>\n * ```\n * \n * @selector juvo-list\n * @since 2.1.0\n * @author Juvo Rafa Team\n */\n@Component({\n  selector: 'juvo-list',\n  standalone: true,\n  imports: [CommonModule],\n  templateUrl: './juvo-list.component.html',\n  styleUrl: './juvo-list.component.css'\n})\nexport class JuvoListComponent {\n  /** Observable data source */\n  @Input() data$: Observable<any[]> = of([]);\n  \n  /** Column configuration */\n  @Input() columns: ListColumn[] = [];\n  \n  /** Loading state observable */\n  @Input() loading$: Observable<boolean> = of(false);\n  \n  /** Whether items are selectable @default false */\n  @Input() selectable: boolean = false;\n  \n  /** Whether to show header @default true */\n  @Input() showHeader: boolean = true;\n  \n  /** Empty state message */\n  @Input() emptyMessage: string = 'No data available';\n  \n  /** Loading message */\n  @Input() loadingMessage: string = 'Loading...';\n  \n  /** List size variant @default \"medium\" */\n  @Input() size: 'small' | 'medium' | 'large' = 'medium';\n  \n  /** Whether to show borders @default true */\n  @Input() bordered: boolean = true;\n  \n  /** Whether to show striped rows @default true */\n  @Input() striped: boolean = true;\n  \n  /** Emitted when an item is selected */\n  @Output() itemSelected = new EventEmitter<any>();\n  \n  /** Emitted when an item is clicked */\n  @Output() itemClicked = new EventEmitter<any>();\n  \n  /** Emitted when column header is clicked for sorting */\n  @Output() columnSort = new EventEmitter<{ column: ListColumn, direction: 'asc' | 'desc' }>();\n\n  selectedItems: any[] = [];\n  sortColumn?: string;\n  sortDirection: 'asc' | 'desc' = 'asc';\n\n  /**\n   * Gets CSS classes for the list container\n   * @returns Combined CSS classes\n   */\n  get containerClasses(): string {\n    let classes = `juvo-list juvo-list-${this.size}`;\n    if (this.bordered) classes += ' bordered';\n    if (this.striped) classes += ' striped';\n    return classes;\n  }\n\n  /**\n   * Handles item selection\n   */\n  onItemSelect(item: any): void {\n    if (!this.selectable) return;\n    \n    const index = this.selectedItems.findIndex(selected => selected === item);\n    if (index > -1) {\n      this.selectedItems.splice(index, 1);\n    } else {\n      this.selectedItems.push(item);\n    }\n    \n    this.itemSelected.emit(item);\n  }\n\n  /**\n   * Handles item click\n   */\n  onItemClick(item: any): void {\n    this.itemClicked.emit(item);\n  }\n\n  /**\n   * Handles column header click for sorting\n   */\n  onColumnHeaderClick(column: ListColumn): void {\n    if (!column.sortable) return;\n    \n    if (this.sortColumn === column.key) {\n      this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';\n    } else {\n      this.sortColumn = column.key;\n      this.sortDirection = 'asc';\n    }\n    \n    this.columnSort.emit({ column, direction: this.sortDirection });\n  }\n\n  /**\n   * Checks if an item is selected\n   */\n  isSelected(item: any): boolean {\n    return this.selectedItems.includes(item);\n  }\n\n  /**\n   * Gets the display value for a cell\n   */\n  getCellValue(item: any, column: ListColumn): string {\n    const value = item[column.key];\n    \n    switch (column.type) {\n      case 'boolean':\n        return value ? '✅' : '❌';\n      case 'date':\n        return value ? new Date(value).toLocaleDateString() : '';\n      case 'number':\n        return typeof value === 'number' ? value.toLocaleString() : '';\n      default:\n        return value?.toString() || '';\n    }\n  }\n\n  /**\n   * Gets CSS classes for column header\n   */\n  getHeaderClasses(column: ListColumn): string {\n    let classes = 'list-header-cell';\n    if (column.sortable) classes += ' sortable';\n    if (this.sortColumn === column.key) classes += ` sorted-${this.sortDirection}`;\n    return classes;\n  }\n\n  /**\n   * Track by function for ngFor performance\n   */\n  trackByFn(index: number, item: any): any {\n    return item.id || index;\n  }\n} ","<div [class]=\"containerClasses\">\n  <!-- Loading State -->\n  <div class=\"list-loading\" *ngIf=\"loading$ | async\">\n    <div class=\"loading-spinner\"></div>\n    <div class=\"loading-text\">{{ loadingMessage }}</div>\n  </div>\n\n  <!-- List Content -->\n  <div class=\"list-content\" *ngIf=\"!(loading$ | async)\">\n    <!-- Header -->\n    <div class=\"list-header\" *ngIf=\"showHeader && columns.length > 0\">\n      <div class=\"list-header-row\">\n        <div \n          *ngIf=\"selectable\" \n          class=\"list-header-cell checkbox-cell\">\n          <!-- Checkbox for select all could go here -->\n        </div>\n        <div\n          *ngFor=\"let column of columns\"\n          [class]=\"getHeaderClasses(column)\"\n          [style.width]=\"column.width\"\n          (click)=\"onColumnHeaderClick(column)\">\n          {{ column.label }}\n          <span class=\"sort-indicator\" *ngIf=\"column.sortable && sortColumn === column.key\">\n            {{ sortDirection === 'asc' ? '↑' : '↓' }}\n          </span>\n        </div>\n      </div>\n    </div>\n\n    <!-- Body -->\n    <div class=\"list-body\">\n      <!-- Data Rows -->\n      <div \n        class=\"list-row\"\n        *ngFor=\"let item of data$ | async; trackBy: trackByFn\"\n        [class.selected]=\"isSelected(item)\"\n        (click)=\"onItemClick(item)\">\n        \n        <!-- Selection checkbox -->\n        <div \n          *ngIf=\"selectable\" \n          class=\"list-cell checkbox-cell\"\n          (click)=\"onItemSelect(item); $event.stopPropagation()\">\n          <input \n            type=\"checkbox\" \n            [checked]=\"isSelected(item)\"\n            (change)=\"onItemSelect(item)\">\n        </div>\n\n        <!-- Data cells -->\n        <div\n          *ngFor=\"let column of columns\"\n          class=\"list-cell\"\n          [style.width]=\"column.width\">\n          {{ getCellValue(item, column) }}\n        </div>\n      </div>\n\n      <!-- Empty State -->\n      <div class=\"list-empty\" *ngIf=\"(data$ | async)?.length === 0\">\n        <div class=\"empty-icon\">📋</div>\n        <div class=\"empty-text\">{{ emptyMessage }}</div>\n      </div>\n    </div>\n  </div>\n</div> ","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Observable, of } from 'rxjs';\n\n/**\n * Table column configuration interface\n * @interface TableColumn\n * @since 2.1.0\n */\nexport interface TableColumn {\n  key: string;\n  label: string;\n  sortable?: boolean;\n  width?: string;\n  type?: 'text' | 'number' | 'date' | 'boolean' | 'actions';\n  align?: 'left' | 'center' | 'right';\n}\n\n/**\n * Table Component\n * \n * @description\n * A comprehensive table component for displaying and managing tabular data.\n * Originally designed for backoffice applications with data management needs.\n * Supports pagination, sorting, selection, and custom actions.\n * \n * @example\n * ```html\n * <!-- Basic table -->\n * <juvo-table\n *   [data$]=\"tableData$\"\n *   [columns]=\"[\n *     { key: 'id', label: 'ID', width: '80px' },\n *     { key: 'name', label: 'Name', sortable: true },\n *     { key: 'email', label: 'Email', sortable: true },\n *     { key: 'actions', label: 'Actions', type: 'actions' }\n *   ]\"\n *   [paginator]=\"true\"\n *   [rows]=\"10\"\n *   (rowSelected)=\"onRowSelected($event)\"\n *   (actionTriggered)=\"onActionTriggered($event)\">\n * </juvo-table>\n * \n * <!-- Table with selection -->\n * <juvo-table\n *   [data$]=\"userData$\"\n *   [columns]=\"userColumns\"\n *   [loading$]=\"userLoading$\"\n *   [selectionMode]=\"'multiple'\"\n *   [paginator]=\"true\"\n *   [sortMode]=\"'single'\"\n *   (selectionChange)=\"onSelectionChange($event)\">\n * </juvo-table>\n * ```\n * \n * @selector juvo-table\n * @since 2.1.0\n * @author Juvo Rafa Team\n */\n@Component({\n  selector: 'juvo-table',\n  standalone: true,\n  imports: [CommonModule],\n  templateUrl: './juvo-table.component.html',\n  styleUrl: './juvo-table.component.css'\n})\nexport class JuvoTableComponent {\n  /** Observable data source */\n  @Input() data$: Observable<any[]> = of([]);\n  \n  /** Column configuration */\n  @Input() columns: TableColumn[] = [];\n  \n  /** Loading state observable */\n  @Input() loading$: Observable<boolean> = of(false);\n  \n  /** Selection mode @default \"none\" */\n  @Input() selectionMode: 'none' | 'single' | 'multiple' = 'none';\n  \n  /** Whether to show paginator @default false */\n  @Input() paginator: boolean = false;\n  \n  /** Number of rows per page @default 10 */\n  @Input() rows: number = 10;\n  \n  /** Sort mode @default \"single\" */\n  @Input() sortMode: 'none' | 'single' | 'multiple' = 'single';\n  \n  /** Whether to show grid lines @default true */\n  @Input() showGridlines: boolean = true;\n  \n  /** Whether to show striped rows @default true */\n  @Input() striped: boolean = true;\n  \n  /** Whether to show hover effect @default true */\n  @Input() hoverable: boolean = true;\n  \n  /** Table size variant @default \"medium\" */\n  @Input() size: 'small' | 'medium' | 'large' = 'medium';\n  \n  /** Empty state message */\n  @Input() emptyMessage: string = 'No records found';\n  \n  /** Loading message */\n  @Input() loadingMessage: string = 'Loading data...';\n  \n  /** Emitted when a row is selected */\n  @Output() rowSelected = new EventEmitter<any>();\n  \n  /** Emitted when selection changes */\n  @Output() selectionChange = new EventEmitter<any[]>();\n  \n  /** Emitted when a row is clicked */\n  @Output() rowClicked = new EventEmitter<any>();\n  \n  /** Emitted when column is sorted */\n  @Output() sortChange = new EventEmitter<{ field: string, order: 'asc' | 'desc' }>();\n  \n  /** Emitted when page changes */\n  @Output() pageChange = new EventEmitter<{ first: number, rows: number }>();\n  \n  /** Emitted when an action is triggered */\n  @Output() actionTriggered = new EventEmitter<{ action: string, item: any }>();\n\n  selectedRows: any[] = [];\n  currentPage = 0;\n  sortField?: string;\n  sortOrder: 'asc' | 'desc' = 'asc';\n  paginatedData: any[] = [];\n  totalRecords = 0;\n\n  // Expose Math for template\n  Math = Math;\n\n  /**\n   * Gets CSS classes for the table container\n   * @returns Combined CSS classes\n   */\n  get containerClasses(): string {\n    let classes = `juvo-table juvo-table-${this.size}`;\n    if (this.showGridlines) classes += ' gridlines';\n    if (this.striped) classes += ' striped';\n    if (this.hoverable) classes += ' hoverable';\n    return classes;\n  }\n\n  /**\n   * Handles row selection\n   */\n  onRowSelect(row: any, event?: Event): void {\n    if (this.selectionMode === 'none') return;\n    \n    if (event) {\n      event.stopPropagation();\n    }\n    \n    const index = this.selectedRows.findIndex(selected => selected === row);\n    \n    if (this.selectionMode === 'single') {\n      this.selectedRows = index > -1 ? [] : [row];\n    } else if (this.selectionMode === 'multiple') {\n      if (index > -1) {\n        this.selectedRows.splice(index, 1);\n      } else {\n        this.selectedRows.push(row);\n      }\n    }\n    \n    this.rowSelected.emit(row);\n    this.selectionChange.emit(this.selectedRows);\n  }\n\n  /**\n   * Handles row click\n   */\n  onRowClick(row: any): void {\n    this.rowClicked.emit(row);\n  }\n\n  /**\n   * Handles column sort\n   */\n  onSort(column: TableColumn): void {\n    if (!column.sortable || this.sortMode === 'none') return;\n    \n    if (this.sortField === column.key) {\n      this.sortOrder = this.sortOrder === 'asc' ? 'desc' : 'asc';\n    } else {\n      this.sortField = column.key;\n      this.sortOrder = 'asc';\n    }\n    \n    this.sortChange.emit({ field: column.key, order: this.sortOrder });\n  }\n\n  /**\n   * Handles select all checkbox\n   */\n  selectAll(event: Event): void {\n    const checkbox = event.target as HTMLInputElement;\n    // This would need to be implemented based on current data\n    // For now, just emit the selection change\n    this.selectionChange.emit(this.selectedRows);\n  }\n\n  /**\n   * Handles previous page navigation\n   */\n  previousPage(): void {\n    if (this.currentPage > 0) {\n      this.currentPage--;\n      this.pageChange.emit({ first: this.currentPage * this.rows, rows: this.rows });\n    }\n  }\n\n  /**\n   * Handles next page navigation\n   */\n  nextPage(): void {\n    this.currentPage++;\n    this.pageChange.emit({ first: this.currentPage * this.rows, rows: this.rows });\n  }\n\n  /**\n   * Checks if a row is selected\n   */\n  isSelected(row: any): boolean {\n    return this.selectedRows.includes(row);\n  }\n\n  /**\n   * Gets the display value for a cell\n   */\n  getCellValue(item: any, column: TableColumn): string {\n    const value = item[column.key];\n    \n    switch (column.type) {\n      case 'boolean':\n        return value ? '✅' : '❌';\n      case 'date':\n        return value ? new Date(value).toLocaleDateString() : '';\n      case 'number':\n        return typeof value === 'number' ? value.toLocaleString() : '';\n      case 'actions':\n        return ''; // Actions are handled separately\n      default:\n        return value?.toString() || '';\n    }\n  }\n\n  /**\n   * Gets CSS classes for column header\n   */\n  getHeaderClasses(column: TableColumn): string {\n    let classes = 'table-header-cell';\n    if (column.sortable) classes += ' sortable';\n    if (this.sortField === column.key) classes += ` sorted-${this.sortOrder}`;\n    if (column.align) classes += ` text-${column.align}`;\n    return classes;\n  }\n\n  /**\n   * Gets CSS classes for table cell\n   */\n  getCellClasses(column: TableColumn): string {\n    let classes = 'table-cell';\n    if (column.align) classes += ` text-${column.align}`;\n    return classes;\n  }\n\n  /**\n   * Handles action button click\n   */\n  onAction(action: string, item: any): void {\n    this.actionTriggered.emit({ action, item });\n  }\n\n  /**\n   * Track by function for ngFor\n   */\n  trackByFn(index: number, item: any): any {\n    return item.id || index;\n  }\n} ","<div [class]=\"containerClasses\">\n  <!-- Loading State -->\n  <div class=\"table-loading\" *ngIf=\"loading$ | async\">\n    <div class=\"loading-spinner\"></div>\n    <div class=\"loading-text\">{{ loadingMessage }}</div>\n  </div>\n\n  <!-- Table Content -->\n  <div class=\"table-wrapper\" *ngIf=\"!(loading$ | async)\">\n    <table class=\"table\">\n      <!-- Header -->\n      <thead>\n        <tr>\n          <!-- Selection column -->\n          <th *ngIf=\"selectionMode !== 'none'\" class=\"selection-column\">\n            <input \n              *ngIf=\"selectionMode === 'multiple'\"\n              type=\"checkbox\" \n              (change)=\"selectAll($event)\">\n          </th>\n          \n          <!-- Data columns -->\n          <th \n            *ngFor=\"let column of columns\"\n            [class]=\"getHeaderClasses(column)\"\n            [style.width]=\"column.width\"\n            (click)=\"onSort(column)\">\n            {{ column.label }}\n            <span class=\"sort-indicator\" *ngIf=\"column.sortable && sortField === column.key\">\n              {{ sortOrder === 'asc' ? '↑' : '↓' }}\n            </span>\n          </th>\n        </tr>\n      </thead>\n\n      <!-- Body -->\n      <tbody>\n        <!-- Data rows -->\n        <tr \n          *ngFor=\"let row of data$ | async; trackBy: trackByFn\"\n          class=\"table-row\"\n          [class.selected]=\"isSelected(row)\"\n          (click)=\"onRowClick(row)\">\n          \n          <!-- Selection cell -->\n          <td *ngIf=\"selectionMode !== 'none'\" class=\"selection-cell\">\n            <input \n              type=\"checkbox\" \n              [checked]=\"isSelected(row)\"\n              (change)=\"onRowSelect(row, $event)\"\n              (click)=\"$event.stopPropagation()\">\n          </td>\n\n          <!-- Data cells -->\n          <td \n            *ngFor=\"let column of columns\"\n            [class]=\"getCellClasses(column)\"\n            [style.width]=\"column.width\">\n            \n            <!-- Regular content -->\n            <span *ngIf=\"column.type !== 'actions'\">\n              {{ getCellValue(row, column) }}\n            </span>\n            \n            <!-- Actions column -->\n            <div *ngIf=\"column.type === 'actions'\" class=\"action-buttons\">\n              <button \n                type=\"button\" \n                class=\"action-btn edit-btn\"\n                (click)=\"onAction('edit', row); $event.stopPropagation()\"\n                title=\"Edit\">\n                ✏️\n              </button>\n              <button \n                type=\"button\" \n                class=\"action-btn delete-btn\"\n                (click)=\"onAction('delete', row); $event.stopPropagation()\"\n                title=\"Delete\">\n                🗑️\n              </button>\n            </div>\n          </td>\n        </tr>\n\n        <!-- Empty state -->\n        <tr *ngIf=\"(data$ | async)?.length === 0\" class=\"empty-row\">\n          <td [attr.colspan]=\"columns.length + (selectionMode !== 'none' ? 1 : 0)\">\n            <div class=\"empty-state\">\n              <div class=\"empty-icon\">📄</div>\n              <div class=\"empty-text\">{{ emptyMessage }}</div>\n            </div>\n          </td>\n        </tr>\n      </tbody>\n    </table>\n  </div>\n\n  <!-- Pagination -->\n  <div class=\"table-pagination\" *ngIf=\"paginator && ((data$ | async)?.length || 0) > 0\">\n    <div class=\"pagination-info\">\n      Showing {{ currentPage * rows + 1 }} to {{ Math.min((currentPage + 1) * rows, totalRecords) }} of {{ totalRecords }} entries\n    </div>\n    <div class=\"pagination-controls\">\n      <button \n        type=\"button\" \n        class=\"page-btn\"\n        [disabled]=\"currentPage === 0\"\n        (click)=\"previousPage()\">\n        Previous\n      </button>\n      <span class=\"page-info\">Page {{ currentPage + 1 }}</span>\n      <button \n        type=\"button\" \n        class=\"page-btn\"\n        [disabled]=\"(currentPage + 1) * rows >= totalRecords\"\n        (click)=\"nextPage()\">\n        Next\n      </button>\n    </div>\n  </div>\n</div> ","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n/**\n * Tab menu item interface\n * @interface TabMenuItem\n * @since 2.1.0\n */\nexport interface TabMenuItem {\n  id: string;\n  label: string;\n  icon?: string;\n  disabled?: boolean;\n  badge?: string | number;\n  routerLink?: string;\n}\n\n/**\n * Tab Menu Component\n * \n * @description\n * A horizontal tab navigation component for organizing content into tabs.\n * Originally designed for backoffice applications with multiple content sections.\n * Supports icons, badges, disabled states, and router integration.\n * \n * @example\n * ```html\n * <!-- Basic tab menu -->\n * <juvo-tab-menu\n *   [items]=\"tabItems\"\n *   [activeItemId]=\"activeTab\"\n *   (tabChange)=\"onTabChange($event)\">\n * </juvo-tab-menu>\n * \n * <!-- Tab menu with icons and badges -->\n * <juvo-tab-menu\n *   [items]=\"[\n *     { id: 'overview', label: 'Overview', icon: '📊' },\n *     { id: 'users', label: 'Users', icon: '👥', badge: '12' },\n *     { id: 'settings', label: 'Settings', icon: '⚙️', disabled: true }\n *   ]\"\n *   [activeItemId]=\"currentTab\"\n *   (tabChange)=\"handleTabChange($event)\">\n * </juvo-tab-menu>\n * ```\n * \n * @selector juvo-tab-menu\n * @since 2.1.0\n * @author Juvo Rafa Team\n */\n@Component({\n  selector: 'juvo-tab-menu',\n  standalone: true,\n  imports: [CommonModule],\n  templateUrl: './juvo-tab-menu.component.html',\n  styleUrl: './juvo-tab-menu.component.css'\n})\nexport class JuvoTabMenuComponent {\n  /** Array of tab menu items */\n  @Input() items: TabMenuItem[] = [];\n  \n  /** ID of the currently active tab */\n  @Input() activeItemId?: string;\n  \n  /** Tab menu style variant @default \"line\" */\n  @Input() variant: 'line' | 'pills' | 'cards' = 'line';\n  \n  /** Tab menu size @default \"medium\" */\n  @Input() size: 'small' | 'medium' | 'large' = 'medium';\n  \n  /** Whether tabs are scrollable on overflow @default false */\n  @Input() scrollable: boolean = false;\n  \n  /** Emitted when a tab is clicked */\n  @Output() tabChange = new EventEmitter<TabMenuItem>();\n  \n  /** Emitted when active tab changes */\n  @Output() activeItemChange = new EventEmitter<TabMenuItem>();\n\n  /**\n   * Gets CSS classes for the tab menu container\n   * @returns Combined CSS classes\n   */\n  get containerClasses(): string {\n    let classes = `tab-menu tab-menu-${this.variant} tab-menu-${this.size}`;\n    if (this.scrollable) classes += ' scrollable';\n    return classes;\n  }\n\n  /**\n   * Gets CSS classes for a specific tab item\n   * @param item Tab menu item\n   * @returns Combined CSS classes\n   */\n  getTabClasses(item: TabMenuItem): string {\n    let classes = 'tab-item';\n    if (item.id === this.activeItemId) classes += ' active';\n    if (item.disabled) classes += ' disabled';\n    return classes;\n  }\n\n  /**\n   * Handles tab click\n   * @param item Clicked tab item\n   */\n  onTabClick(item: TabMenuItem): void {\n    if (item.disabled) return;\n    \n    this.activeItemId = item.id;\n    this.tabChange.emit(item);\n    this.activeItemChange.emit(item);\n  }\n\n  /**\n   * Checks if a tab is active\n   * @param item Tab menu item\n   * @returns Whether the tab is active\n   */\n  isActive(item: TabMenuItem): boolean {\n    return item.id === this.activeItemId;\n  }\n} ","<div [class]=\"containerClasses\">\n  <div class=\"tab-list\" role=\"tablist\">\n    <button\n      *ngFor=\"let item of items\"\n      [class]=\"getTabClasses(item)\"\n      [disabled]=\"item.disabled\"\n      [attr.aria-selected]=\"isActive(item)\"\n      [attr.aria-controls]=\"item.id + '-panel'\"\n      role=\"tab\"\n      type=\"button\"\n      (click)=\"onTabClick(item)\">\n      \n      <!-- Icon -->\n      <span class=\"tab-icon\" *ngIf=\"item.icon\">\n        {{ item.icon }}\n      </span>\n      \n      <!-- Label -->\n      <span class=\"tab-label\">\n        {{ item.label }}\n      </span>\n      \n      <!-- Badge -->\n      <span class=\"tab-badge\" *ngIf=\"item.badge\">\n        {{ item.badge }}\n      </span>\n    </button>\n  </div>\n</div> ","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n/**\n * Notification types\n * @type NotificationType\n * @since 2.1.0\n */\nexport type NotificationType = 'success' | 'error' | 'warning' | 'info';\n\n/**\n * Notification position options\n * @type NotificationPosition\n * @since 2.1.0\n */\nexport type NotificationPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top-center' | 'bottom-center';\n\n/**\n * Notification interface\n * @interface Notification\n * @since 2.1.0\n */\nexport interface Notification {\n  id?: string;\n  type: NotificationType;\n  title: string;\n  message?: string;\n  duration?: number;\n  persistent?: boolean;\n}\n\n/**\n * Notification Component\n * \n * @description\n * A flexible notification system for displaying messages to users.\n * Supports different types (success, error, warning, info) and positions.\n * Originally designed for backoffice applications to provide user feedback.\n * \n * @example\n * ```html\n * <!-- Basic notification -->\n * <juvo-notification\n *   type=\"success\"\n *   title=\"Operation successful\"\n *   message=\"The item was saved successfully.\"\n *   [duration]=\"5000\"\n *   (onClose)=\"onNotificationClose()\">\n * </juvo-notification>\n * \n * <!-- Multiple notifications container -->\n * <juvo-notification\n *   *ngFor=\"let notification of notifications\"\n *   [type]=\"notification.type\"\n *   [title]=\"notification.title\"\n *   [message]=\"notification.message\"\n *   [duration]=\"notification.duration\"\n *   position=\"top-right\"\n *   (onClose)=\"removeNotification(notification.id)\">\n * </juvo-notification>\n * ```\n * \n * @selector juvo-notification\n * @since 2.1.0\n * @author Juvo Rafa Team\n */\n@Component({\n  selector: 'juvo-notification',\n  standalone: true,\n  imports: [CommonModule],\n  templateUrl: './juvo-notification.component.html',\n  styleUrl: './juvo-notification.component.css'\n})\nexport class JuvoNotificationComponent {\n  /** Notification type @default \"info\" */\n  @Input() type: NotificationType = 'info';\n  \n  /** Notification title */\n  @Input() title: string = '';\n  \n  /** Notification message content */\n  @Input() message?: string;\n  \n  /** Auto-dismiss duration in milliseconds. 0 means no auto-dismiss @default 5000 */\n  @Input() duration: number = 5000;\n  \n  /** Whether the notification persists until manually closed @default false */\n  @Input() persistent: boolean = false;\n  \n  /** Position of the notification @default \"top-right\" */\n  @Input() position: NotificationPosition = 'top-right';\n  \n  /** Whether to show close button @default true */\n  @Input() closable: boolean = true;\n  \n  /** Whether the notification is visible @default true */\n  @Input() visible: boolean = true;\n  \n  /** Emitted when notification is closed */\n  @Output() onClose = new EventEmitter<void>();\n  \n  /** Emitted when notification is clicked */\n  @Output() onClick = new EventEmitter<void>();\n\n  private timeoutId?: number;\n\n  ngOnInit(): void {\n    if (!this.persistent && this.duration > 0) {\n      this.timeoutId = window.setTimeout(() => {\n        this.close();\n      }, this.duration);\n    }\n  }\n\n  ngOnDestroy(): void {\n    if (this.timeoutId) {\n      clearTimeout(this.timeoutId);\n    }\n  }\n\n  /**\n   * Gets the icon for the notification type\n   * @returns Icon string for the notification type\n   */\n  get icon(): string {\n    switch (this.type) {\n      case 'success': return '✅';\n      case 'error': return '❌';\n      case 'warning': return '⚠️';\n      case 'info': return 'ℹ️';\n      default: return 'ℹ️';\n    }\n  }\n\n  /**\n   * Gets CSS classes for the notification\n   * @returns Combined CSS classes\n   */\n  get notificationClasses(): string {\n    return `notification notification-${this.type} notification-${this.position}`;\n  }\n\n  /**\n   * Closes the notification\n   * @emits onClose\n   */\n  close(): void {\n    this.visible = false;\n    this.onClose.emit();\n    \n    if (this.timeoutId) {\n      clearTimeout(this.timeoutId);\n    }\n  }\n\n  /**\n   * Handles notification click\n   * @emits onClick\n   */\n  handleClick(): void {\n    this.onClick.emit();\n  }\n} ","<div class=\"notification-container\" \n     [class]=\"notificationClasses\" \n     *ngIf=\"visible\"\n     (click)=\"handleClick()\">\n  \n  <div class=\"notification-content\">\n    <div class=\"notification-icon\">\n      {{ icon }}\n    </div>\n    \n    <div class=\"notification-body\">\n      <div class=\"notification-title\" *ngIf=\"title\">\n        {{ title }}\n      </div>\n      <div class=\"notification-message\" *ngIf=\"message\">\n        {{ message }}\n      </div>\n    </div>\n    \n    <button class=\"notification-close\" \n            *ngIf=\"closable\"\n            (click)=\"close(); $event.stopPropagation()\" \n            type=\"button\"\n            aria-label=\"Close notification\">\n      ✕\n    </button>\n  </div>\n  \n  <div class=\"notification-progress\" \n       *ngIf=\"!persistent && duration > 0\"\n       [style.animation-duration]=\"duration + 'ms'\">\n  </div>\n</div> ","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n/**\n * Confirmation Dialog Component\n * \n * @description\n * A confirmation dialog component for user confirmations in enterprise applications.\n * Provides a modal dialog with customizable header, message, and icon.\n * Originally designed for critical actions that require user confirmation.\n * \n * @example\n * ```html\n * <!-- Basic confirmation dialog -->\n * <juvo-confirmation-dialog\n *   *ngIf=\"showDialog\"\n *   header=\"Delete Item\"\n *   message=\"Are you sure you want to delete this item? This action cannot be undone.\"\n *   icon=\"⚠️\"\n *   (actionAcceptTriggered)=\"onConfirm()\"\n *   (actionCancelTriggered)=\"onCancel()\">\n * </juvo-confirmation-dialog>\n * \n * <!-- Custom styled dialog -->\n * <juvo-confirmation-dialog\n *   *ngIf=\"showWarning\"\n *   header=\"Warning\"\n *   message=\"This action will affect multiple records.\"\n *   icon=\"🚨\"\n *   acceptText=\"Continue\"\n *   cancelText=\"Go Back\"\n *   (actionAcceptTriggered)=\"onProceed()\"\n *   (actionCancelTriggered)=\"onGoBack()\">\n * </juvo-confirmation-dialog>\n * ```\n * \n * @selector juvo-confirmation-dialog\n * @since 2.1.0\n * @author Juvo Rafa Team\n */\n@Component({\n  selector: 'juvo-confirmation-dialog',\n  standalone: true,\n  imports: [CommonModule],\n  templateUrl: './juvo-confirmation-dialog.component.html',\n  styleUrl: './juvo-confirmation-dialog.component.css'\n})\nexport class JuvoConfirmationDialogComponent {\n  /** Dialog header text @default \"Confirmation\" */\n  @Input() header: string = 'Confirmation';\n  \n  /** Icon to display in the dialog @default \"⚠️\" */\n  @Input() icon: string = '⚠️';\n  \n  /** Main confirmation message @default \"Are you sure you want to proceed?\" */\n  @Input() message: string = 'Are you sure you want to proceed?';\n  \n  /** Text for accept button @default \"Yes\" */\n  @Input() acceptText: string = 'Yes';\n  \n  /** Text for cancel button @default \"No\" */\n  @Input() cancelText: string = 'No';\n  \n  /** Whether to show the dialog @default true */\n  @Input() visible: boolean = true;\n  \n  /** Dialog width @default \"400px\" */\n  @Input() width: string = '400px';\n  \n  /** Emitted when user confirms the action */\n  @Output() actionAcceptTriggered = new EventEmitter<void>();\n  \n  /** Emitted when user cancels the action */\n  @Output() actionCancelTriggered = new EventEmitter<void>();\n  \n  /** Emitted when dialog is closed */\n  @Output() onClose = new EventEmitter<void>();\n\n  /**\n   * Handles accept button click\n   * @emits actionAcceptTriggered\n   */\n  onAccept(): void {\n    this.actionAcceptTriggered.emit();\n    this.close();\n  }\n\n  /**\n   * Handles cancel button click\n   * @emits actionCancelTriggered\n   */\n  onCancel(): void {\n    this.actionCancelTriggered.emit();\n    this.close();\n  }\n\n  /**\n   * Closes the dialog\n   * @emits onClose\n   */\n  close(): void {\n    this.visible = false;\n    this.onClose.emit();\n  }\n\n  /**\n   * Handles backdrop click\n   */\n  onBackdropClick(): void {\n    this.onCancel();\n  }\n\n  /**\n   * Prevents dialog content click from closing dialog\n   */\n  onContentClick(event: Event): void {\n    event.stopPropagation();\n  }\n} ","<div class=\"dialog-overlay\" \n     *ngIf=\"visible\" \n     (click)=\"onBackdropClick()\">\n  <div class=\"dialog-container\" \n       [style.width]=\"width\"\n       (click)=\"onContentClick($event)\">\n    \n    <div class=\"dialog-header\">\n      <span class=\"dialog-icon\">{{ icon }}</span>\n      <h3 class=\"dialog-title\">{{ header }}</h3>\n      <button class=\"dialog-close\" \n              (click)=\"onCancel()\" \n              type=\"button\"\n              aria-label=\"Close\">\n        ✕\n      </button>\n    </div>\n    \n    <div class=\"dialog-body\">\n      <p class=\"dialog-message\">{{ message }}</p>\n    </div>\n    \n    <div class=\"dialog-footer\">\n      <button class=\"btn btn-secondary\" \n              (click)=\"onCancel()\" \n              type=\"button\">\n        {{ cancelText }}\n      </button>\n      <button class=\"btn btn-primary\" \n              (click)=\"onAccept()\" \n              type=\"button\">\n        {{ acceptText }}\n      </button>\n    </div>\n  </div>\n</div> ","import { Component, Input, Output, EventEmitter, forwardRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/**\n * File upload interface\n * @interface UploadedFile\n * @since 2.1.0\n */\nexport interface UploadedFile {\n  name: string;\n  size: number;\n  type: string;\n  url?: string;\n  file?: File;\n}\n\n/**\n * Image Picker Component\n * \n * @description\n * A drag-and-drop image picker component for file uploads.\n * Supports multiple file selection, preview, and validation.\n * Originally designed for backoffice applications with image management needs.\n * \n * @example\n * ```html\n * <!-- Basic image picker -->\n * <juvo-image-picker\n *   [multiple]=\"false\"\n *   [maxSize]=\"5242880\"\n *   (filesSelected)=\"onFilesSelected($event)\"\n *   (fileRemoved)=\"onFileRemoved($event)\">\n * </juvo-image-picker>\n * \n * <!-- Multiple images with preview -->\n * <juvo-image-picker\n *   [multiple]=\"true\"\n *   [maxFiles]=\"5\"\n *   [showPreview]=\"true\"\n *   acceptedTypes=\"image/*\"\n *   [(ngModel)]=\"selectedFiles\">\n * </juvo-image-picker>\n * ```\n * \n * @selector juvo-image-picker\n * @since 2.1.0\n * @author Juvo Rafa Team\n */\n@Component({\n  selector: 'juvo-image-picker',\n  standalone: true,\n  imports: [CommonModule],\n  templateUrl: './juvo-image-picker.component.html',\n  styleUrl: './juvo-image-picker.component.css',\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => JuvoImagePickerComponent),\n      multi: true\n    }\n  ]\n})\nexport class JuvoImagePickerComponent implements ControlValueAccessor {\n  /** Whether multiple files can be selected @default false */\n  @Input() multiple: boolean = false;\n  \n  /** Maximum file size in bytes @default 5MB */\n  @Input() maxSize: number = 5 * 1024 * 1024;\n  \n  /** Maximum number of files (for multiple mode) @default 10 */\n  @Input() maxFiles: number = 10;\n  \n  /** Accepted file types @default \"image/*\" */\n  @Input() acceptedTypes: string = 'image/*';\n  \n  /** Whether to show file preview @default true */\n  @Input() showPreview: boolean = true;\n  \n  /** Whether component is disabled @default false */\n  @Input() disabled: boolean = false;\n  \n  /** Placeholder text */\n  @Input() placeholder: string = 'Drop images here or click to browse';\n  \n  /** Upload button text */\n  @Input() buttonText: string = 'Choose Files';\n  \n  /** Whether to show file details @default true */\n  @Input() showFileDetails: boolean = true;\n  \n  /** Emitted when files are selected */\n  @Output() filesSelected = new EventEmitter<UploadedFile[]>();\n  \n  /** Emitted when a file is removed */\n  @Output() fileRemoved = new EventEmitter<UploadedFile>();\n  \n  /** Emitted when validation errors occur */\n  @Output() validationError = new EventEmitter<string>();\n\n  files: UploadedFile[] = [];\n  isDragOver = false;\n\n  private _onChange = (value: UploadedFile[]) => {};\n  private _onTouched = () => {};\n\n  /**\n   * Gets CSS classes for the drop zone\n   * @returns Combined CSS classes\n   */\n  get dropZoneClasses(): string {\n    let classes = 'drop-zone';\n    if (this.isDragOver) classes += ' drag-over';\n    if (this.disabled) classes += ' disabled';\n    if (this.files.length > 0) classes += ' has-files';\n    return classes;\n  }\n\n  /**\n   * Handles drag over event\n   */\n  onDragOver(event: DragEvent): void {\n    if (this.disabled) return;\n    \n    event.preventDefault();\n    event.stopPropagation();\n    this.isDragOver = true;\n  }\n\n  /**\n   * Handles drag leave event\n   */\n  onDragLeave(event: DragEvent): void {\n    if (this.disabled) return;\n    \n    event.preventDefault();\n    event.stopPropagation();\n    this.isDragOver = false;\n  }\n\n  /**\n   * Handles file drop event\n   */\n  onDrop(event: DragEvent): void {\n    if (this.disabled) return;\n    \n    event.preventDefault();\n    event.stopPropagation();\n    this.isDragOver = false;\n\n    const files = Array.from(event.dataTransfer?.files || []);\n    this.handleFiles(files);\n  }\n\n  /**\n   * Handles file input change\n   */\n  onFileInputChange(event: Event): void {\n    const input = event.target as HTMLInputElement;\n    const files = Array.from(input.files || []);\n    this.handleFiles(files);\n    \n    // Reset input value\n    input.value = '';\n  }\n\n  /**\n   * Processes selected files\n   */\n  private handleFiles(selectedFiles: File[]): void {\n    const validFiles: UploadedFile[] = [];\n\n    for (const file of selectedFiles) {\n      // Validate file type\n      if (!this.isValidFileType(file)) {\n        this.validationError.emit(`Invalid file type: ${file.name}`);\n        continue;\n      }\n\n      // Validate file size\n      if (file.size > this.maxSize) {\n        this.validationError.emit(`File too large: ${file.name}`);\n        continue;\n      }\n\n      const uploadedFile: UploadedFile = {\n        name: file.name,\n        size: file.size,\n        type: file.type,\n        file: file,\n        url: URL.createObjectURL(file)\n      };\n\n      validFiles.push(uploadedFile);\n    }\n\n    if (this.multiple) {\n      // Check max files limit\n      const totalFiles = this.files.length + validFiles.length;\n      if (totalFiles > this.maxFiles) {\n        this.validationError.emit(`Maximum ${this.maxFiles} files allowed`);\n        return;\n      }\n      \n      this.files = [...this.files, ...validFiles];\n    } else {\n      // Single file mode - replace existing\n      if (this.files.length > 0) {\n        this.files.forEach(file => {\n          if (file.url) URL.revokeObjectURL(file.url);\n        });\n      }\n      this.files = validFiles.slice(0, 1);\n    }\n\n    this.updateValue();\n    this.filesSelected.emit(this.files);\n  }\n\n  /**\n   * Validates file type\n   */\n  private isValidFileType(file: File): boolean {\n    if (this.acceptedTypes === '*') return true;\n    \n    const types = this.acceptedTypes.split(',').map(t => t.trim());\n    return types.some(type => {\n      if (type.endsWith('/*')) {\n        return file.type.startsWith(type.slice(0, -1));\n      }\n      return file.type === type;\n    });\n  }\n\n  /**\n   * Removes a file\n   */\n  removeFile(file: UploadedFile): void {\n    if (this.disabled) return;\n    \n    const index = this.files.findIndex(f => f === file);\n    if (index > -1) {\n      if (file.url) URL.revokeObjectURL(file.url);\n      this.files.splice(index, 1);\n      this.updateValue();\n      this.fileRemoved.emit(file);\n    }\n  }\n\n  /**\n   * Formats file size for display\n   */\n  formatFileSize(size: number): string {\n    if (size === 0) return '0 B';\n    \n    const k = 1024;\n    const sizes = ['B', 'KB', 'MB', 'GB'];\n    const i = Math.floor(Math.log(size) / Math.log(k));\n    \n    return parseFloat((size / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];\n  }\n\n  /**\n   * Updates form control value\n   */\n  private updateValue(): void {\n    this._onChange(this.files);\n    this._onTouched();\n  }\n\n  // ControlValueAccessor implementation\n  writeValue(value: UploadedFile[]): void {\n    this.files = value || [];\n  }\n\n  registerOnChange(fn: (value: UploadedFile[]) => void): void {\n    this._onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this._onTouched = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    this.disabled = isDisabled;\n  }\n\n  ngOnDestroy(): void {\n    // Clean up object URLs\n    this.files.forEach(file => {\n      if (file.url) URL.revokeObjectURL(file.url);\n    });\n  }\n} ","<div class=\"image-picker-container\">\n  <!-- Drop Zone -->\n  <div \n    [class]=\"dropZoneClasses\"\n    (dragover)=\"onDragOver($event)\"\n    (dragleave)=\"onDragLeave($event)\"\n    (drop)=\"onDrop($event)\"\n    (click)=\"fileInput.click()\">\n    \n    <div class=\"drop-zone-content\">\n      <div class=\"drop-zone-icon\">📁</div>\n      <div class=\"drop-zone-text\">{{ placeholder }}</div>\n      <button type=\"button\" class=\"upload-button\" [disabled]=\"disabled\">\n        {{ buttonText }}\n      </button>\n    </div>\n\n    <!-- Hidden file input -->\n    <input\n      #fileInput\n      type=\"file\"\n      [accept]=\"acceptedTypes\"\n      [multiple]=\"multiple\"\n      [disabled]=\"disabled\"\n      (change)=\"onFileInputChange($event)\"\n      style=\"display: none;\">\n  </div>\n\n  <!-- File Preview -->\n  <div class=\"file-list\" *ngIf=\"files.length > 0\">\n    <div class=\"file-item\" *ngFor=\"let file of files\">\n      <!-- Image Preview -->\n      <div class=\"file-preview\" *ngIf=\"showPreview && file.url\">\n        <img [src]=\"file.url\" [alt]=\"file.name\" />\n      </div>\n\n      <!-- File Details -->\n      <div class=\"file-details\" *ngIf=\"showFileDetails\">\n        <div class=\"file-name\">{{ file.name }}</div>\n        <div class=\"file-info\">\n          <span class=\"file-size\">{{ formatFileSize(file.size) }}</span>\n          <span class=\"file-type\">{{ file.type }}</span>\n        </div>\n      </div>\n\n      <!-- Remove Button -->\n      <button \n        type=\"button\" \n        class=\"remove-button\"\n        [disabled]=\"disabled\"\n        (click)=\"removeFile(file)\"\n        aria-label=\"Remove file\">\n        ✕\n      </button>\n    </div>\n  </div>\n</div> ","import { AbstractControl, ValidatorFn } from '@angular/forms';\n\n/**\n * Validator function for IPv4 addresses\n * \n * @description\n * Validates that the input value matches a valid IPv4 address format.\n * Supports standard IPv4 notation (e.g., 192.168.1.1, 10.0.0.1, 255.255.255.255).\n * \n * @example\n * ```typescript\n * // Basic usage in FormControl\n * const ipControl = new FormControl('', [ipAddressValidator()]);\n * \n * // Usage in reactive forms\n * this.networkForm = this.fb.group({\n *   serverIp: ['', [Validators.required, ipAddressValidator()]]\n * });\n * \n * // Valid inputs: '192.168.1.1', '10.0.0.1', '127.0.0.1'\n * // Invalid inputs: '256.1.1.1', '192.168.1', 'invalid-ip'\n * ```\n * \n * @returns ValidatorFn that returns null if valid, or validation error object if invalid\n * \n * @since 2.0.0\n * @author Juvo Rafa Team\n */\nexport function ipAddressValidator(): ValidatorFn {\n  return (control: AbstractControl): { [key: string]: unknown } | null => {\n    // Allow empty values (use Validators.required for required validation)\n    if (!control.value) return null;\n    \n    // IPv4 pattern: each octet must be 0-255\n    const ipv4Pattern = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\n    const isValid = ipv4Pattern.test(control.value);\n    \n    return isValid ? null : { invalidIpAddress: { value: control.value, message: 'Invalid IPv4 address format' } };\n  };\n} ","import { AbstractControl, ValidatorFn } from '@angular/forms';\n\n/**\n * Validator function for MAC addresses\n * \n * @description\n * Validates that the input value matches a valid MAC address format.\n * Supports both colon-separated (AA:BB:CC:DD:EE:FF) and hyphen-separated (AA-BB-CC-DD-EE-FF) formats.\n * \n * @example\n * ```typescript\n * // Basic usage in FormControl\n * const macControl = new FormControl('', [macAddressValidator()]);\n * \n * // Usage in reactive forms\n * this.deviceForm = this.fb.group({\n *   macAddress: ['', [Validators.required, macAddressValidator()]]\n * });\n * \n * // Valid inputs: 'AA:BB:CC:DD:EE:FF', 'aa:bb:cc:dd:ee:ff', 'AA-BB-CC-DD-EE-FF'\n * // Invalid inputs: 'invalid-mac', 'AA:BB:CC:DD:EE', 'GG:HH:II:JJ:KK:LL'\n * ```\n * \n * @returns ValidatorFn that returns null if valid, or validation error object if invalid\n * \n * @since 2.0.0\n * @author Juvo Rafa Team\n */\nexport function macAddressValidator(): ValidatorFn {\n  return (control: AbstractControl): { [key: string]: unknown } | null => {\n    // Allow empty values (use Validators.required for required validation)\n    if (!control.value) return null;\n    \n    // MAC address pattern: 6 groups of 2 hex digits separated by : or -\n    const macPattern = /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/;\n    \n    const isValid = macPattern.test(control.value);\n    return isValid ? null : { \n      invalidMacAddress: { \n        value: control.value, \n        message: 'Invalid MAC address format. Use AA:BB:CC:DD:EE:FF or AA-BB-CC-DD-EE-FF format' \n      } \n    };\n  };\n} ","import { AbstractControl, ValidatorFn } from '@angular/forms';\n\n/**\n * Validator function for network ports\n * \n * @description\n * Validates that the input value is a valid network port number.\n * Accepts port numbers in the range 0-65535 (standard TCP/UDP port range).\n * \n * @example\n * ```typescript\n * // Basic usage in FormControl\n * const portControl = new FormControl('', [portValidator()]);\n * \n * // Usage in reactive forms\n * this.serverForm = this.fb.group({\n *   port: ['', [Validators.required, portValidator()]]\n * });\n * \n * // Valid inputs: 80, 443, 8080, 3000, 65535\n * // Invalid inputs: -1, 65536, 'abc', 'port'\n * ```\n * \n * @returns ValidatorFn that returns null if valid, or validation error object if invalid\n * \n * @since 2.0.0\n * @author Juvo Rafa Team\n */\nexport function portValidator(): ValidatorFn {\n  return (control: AbstractControl): { [key: string]: unknown } | null => {\n    // Allow empty values and explicit 0 (use Validators.required for required validation)\n    if (!control.value && control.value !== 0) return null;\n\n    const port = Number(control.value);\n    \n    // Check if it's a valid number and within port range\n    if (isNaN(port) || port < 0 || port > 65535) {\n      return { \n        invalidPort: { \n          value: control.value, \n          message: 'Port must be a number between 0 and 65535' \n        } \n      };\n    }\n\n    return null;\n  };\n} ","import { AbstractControl, ValidatorFn } from '@angular/forms';\n\n/**\n * Validator function for serial port names\n * \n * @description\n * Validates that the input value matches a valid serial port naming format.\n * Supports Windows (COM1-COM99999), Linux/Unix (ttyUSB0, ttyACM0, ttyS0), and macOS (cu.*) formats.\n * \n * @example\n * ```typescript\n * // Basic usage in FormControl\n * const serialControl = new FormControl('', [serialPortValidator()]);\n * \n * // Usage in reactive forms\n * this.deviceForm = this.fb.group({\n *   serialPort: ['', [Validators.required, serialPortValidator()]]\n * });\n * \n * // Valid inputs:\n * // Windows: 'COM1', 'COM10', 'COM99999'\n * // Linux: 'ttyUSB0', 'ttyACM0', 'ttyS1'\n * // macOS: 'cu.usbserial-1410', 'cu.Bluetooth-Incoming-Port'\n * \n * // Invalid inputs: 'invalid-port', 'COM', 'tty', 'random-string'\n * ```\n * \n * @returns ValidatorFn that returns null if valid, or validation error object if invalid\n * \n * @since 2.0.0\n * @author Juvo Rafa Team\n */\nexport function serialPortValidator(): ValidatorFn {\n  return (control: AbstractControl): { [key: string]: unknown } | null => {\n    // Allow empty values (use Validators.required for required validation)\n    if (!control.value) return null;\n\n    // Serial port patterns for different operating systems:\n    // Windows: COM1-COM99999 (case insensitive)\n    // Linux/Unix: ttyUSB*, ttyACM*, ttyS* with numbers\n    // macOS: cu.* (anything starting with cu.)\n    const serialPortPattern = /^(COM[0-9]{1,5}|tty(USB|ACM|S)[0-9]{1,5}|cu\\..+)$/i;    \n    const isValid = serialPortPattern.test(control.value);\n    \n    return isValid ? null : { \n      invalidSerialPort: { \n        value: control.value, \n        message: 'Invalid serial port format. Use COM1-COM99999 (Windows), ttyUSB*/ttyACM*/ttyS* (Linux), or cu.* (macOS)' \n      } \n    };\n  };\n} ","/**\n * @fileoverview Juvo Rafa Library Validators\n * \n * @description\n * Collection of Angular form validators commonly used in enterprise applications.\n * All validators are originally from the Juvo Rafa backoffice project and provide\n * robust validation for network-related inputs.\n * \n * @since 2.0.0\n * @author Juvo Rafa Team\n */\n\n// Network and Device Validators\nexport * from './ip-address.validator';\nexport * from './mac-address.validator';\nexport * from './port.validator';\nexport * from './serial-port.validator'; ","/**\n * @fileoverview Public API Surface of Juvo Rafa Library\n * \n * @description\n * A comprehensive Angular component library featuring real-world components\n * and validators extracted from the Juvo Rafa backoffice application.\n * \n * This library provides enterprise-grade components and validation utilities\n * that have been battle-tested in production environments.\n * \n * @version 2.1.0\n * @author Juvo Rafa Team\n * @license MIT\n */\n\n// Action Components\nexport * from './lib/juvo-button-action/juvo-button-action.component';\n\n// Loading Components  \nexport * from './lib/juvo-loading/juvo-loading.component';\nexport * from './lib/juvo-screen-loading/juvo-screen-loading.component';\n\n// Form Components\nexport * from './lib/juvo-input/juvo-input.component';\n\n// Data Display Components\nexport * from './lib/juvo-list/juvo-list.component';\nexport * from './lib/juvo-table/juvo-table.component';\n\n// Navigation Components\nexport * from './lib/juvo-tab-menu/juvo-tab-menu.component';\n\n// Feedback Components\nexport * from './lib/juvo-notification/juvo-notification.component';\nexport * from './lib/juvo-confirmation-dialog/juvo-confirmation-dialog.component';\n\n// File Upload Components\nexport * from './lib/juvo-image-picker/juvo-image-picker.component';\n\n// Validators Collection\nexport * from './lib/validators';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;AA2BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCG;MAQU,yBAAyB,CAAA;AAPtC,IAAA,WAAA,GAAA;;QAYW,IAAA,CAAA,MAAM,GAAuB,EAAE;;QAe/B,IAAA,CAAA,OAAO,GAAY,KAAK;;QAGxB,IAAA,CAAA,QAAQ,GAAW,MAAM;;QAGzB,IAAA,CAAA,UAAU,GAAY,KAAK;;AAG1B,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,YAAY,EAAQ;;AAG9C,QAAA,IAAA,CAAA,qBAAqB,GAAG,IAAI,YAAY,EAAQ;;AAGhD,QAAA,IAAA,CAAA,yBAAyB,GAAG,IAAI,YAAY,EAAQ;;AAGpD,QAAA,IAAA,CAAA,uBAAuB,GAAG,IAAI,YAAY,EAAQ;;AAGlD,QAAA,IAAA,CAAA,qBAAqB,GAAG,IAAI,YAAY,EAAQ;AAiD3D,IAAA;AA/CC;;;AAGG;AACH,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,QAAQ,GAAG,KAAK,GAAG,KAAK,CAAC;IACvC;AAEA;;;AAGG;IACH,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE;IACjC;AAEA;;;AAGG;IACH,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE;IACnC;AAEA;;;AAGG;IACH,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,EAAE;IACvC;AAEA;;;AAGG;IACH,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE;IACrC;AAEA;;;AAGG;IACH,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE;IACnC;+GAzFW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,OAAA,EAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtEtC,4qCA+CO,EAAA,MAAA,EAAA,CAAA,45BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDmBK,YAAY,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,CAAA,EAAA,CAAA,CAAA;;4FAIX,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAPrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,UAAA,EAClB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,4qCAAA,EAAA,MAAA,EAAA,CAAA,45BAAA,CAAA,EAAA;8BAMd,QAAQ,EAAA,CAAA;sBAAhB;gBAGQ,MAAM,EAAA,CAAA;sBAAd;gBAGQ,YAAY,EAAA,CAAA;sBAApB;gBAGQ,gBAAgB,EAAA,CAAA;sBAAxB;gBAGQ,cAAc,EAAA,CAAA;sBAAtB;gBAGQ,UAAU,EAAA,CAAA;sBAAlB;gBAGQ,OAAO,EAAA,CAAA;sBAAf;gBAGQ,QAAQ,EAAA,CAAA;sBAAhB;gBAGQ,UAAU,EAAA,CAAA;sBAAlB;gBAGS,mBAAmB,EAAA,CAAA;sBAA5B;gBAGS,qBAAqB,EAAA,CAAA;sBAA9B;gBAGS,yBAAyB,EAAA,CAAA;sBAAlC;gBAGS,uBAAuB,EAAA,CAAA;sBAAhC;gBAGS,qBAAqB,EAAA,CAAA;sBAA9B;;;AErGH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCG;MAQU,oBAAoB,CAAA;AAPjC,IAAA,WAAA,GAAA;;QASW,IAAA,CAAA,OAAO,GAAW,YAAY;;QAG9B,IAAA,CAAA,IAAI,GAAgB,QAAQ;;QAG5B,IAAA,CAAA,KAAK,GAAW,SAAS;;QAGzB,IAAA,CAAA,OAAO,GAAY,IAAI;;QAGvB,IAAA,CAAA,WAAW,GAAY,KAAK;AAoBtC,IAAA;AAlBC;;;AAGG;AACH,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,CAAA,QAAA,EAAW,IAAI,CAAC,IAAI,EAAE;IAC/B;AAEA;;;AAGG;AACH,IAAA,IAAI,cAAc,GAAA;QAChB,IAAI,OAAO,GAAG,cAAc;QAC5B,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,UAAU;QACvC,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,cAAc;AAC/C,QAAA,OAAO,OAAO;IAChB;+GAjCW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvDjC,oTAOO,EAAA,MAAA,EAAA,CAAA,s1BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED4CK,YAAY,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,CAAA,EAAA,CAAA,CAAA;;4FAIX,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,UAAA,EACZ,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,oTAAA,EAAA,MAAA,EAAA,CAAA,s1BAAA,CAAA,EAAA;8BAMd,OAAO,EAAA,CAAA;sBAAf;gBAGQ,IAAI,EAAA,CAAA;sBAAZ;gBAGQ,KAAK,EAAA,CAAA;sBAAb;gBAGQ,OAAO,EAAA,CAAA;sBAAf;gBAGQ,WAAW,EAAA,CAAA;sBAAnB;;;AEjEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCG;MAQU,0BAA0B,CAAA;AAPvC,IAAA,WAAA,GAAA;;QAYW,IAAA,CAAA,YAAY,GAA0B,EAAE;;QAGxC,IAAA,CAAA,OAAO,GAAW,YAAY;;QAG9B,IAAA,CAAA,IAAI,GAAiC,OAAO;;QAG5C,IAAA,CAAA,KAAK,GAAW,SAAS;;QAGzB,IAAA,CAAA,QAAQ,GAAY,IAAI;;QAGxB,IAAA,CAAA,eAAe,GAAW,GAAG;;QAG7B,IAAA,CAAA,WAAW,GAAY,IAAI;AA+CrC,IAAA;AA7CC;;;AAGG;AACH,IAAA,IAAI,gBAAgB,GAAA;QAClB,MAAM,WAAW,GAA0B,EAAE;AAE7C,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QACjC;AAEA,QAAA,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;YACrD,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;QACxC;AAEA,QAAA,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;AAC5B,YAAA,OAAO,IAAI,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7D;AAEA,QAAA,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;AAC5B,YAAA,OAAO,WAAW,CAAC,CAAC,CAAC;QACvB;QAEA,OAAO,aAAa,CAAC,WAAW,CAAC,CAAC,IAAI,CACpC,GAAG,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC,CAC7D;IACH;AAEA;;;AAGG;AACH,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,CAAA,QAAA,EAAW,IAAI,CAAC,IAAI,EAAE;IAC/B;AAEA;;;AAGG;AACH,IAAA,IAAI,aAAa,GAAA;QACf,OAAO;AACL,YAAA,kBAAkB,EAAE,CAAA,oBAAA,EAAuB,IAAI,CAAC,eAAe,CAAA,CAAA;SAChE;IACH;+GArEW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/CvC,gpBAqBO,EAAA,MAAA,EAAA,CAAA,iyCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDsBK,YAAY,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,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIX,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAPtC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAAA,UAAA,EACnB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,gpBAAA,EAAA,MAAA,EAAA,CAAA,iyCAAA,CAAA,EAAA;8BAMd,QAAQ,EAAA,CAAA;sBAAhB;gBAGQ,YAAY,EAAA,CAAA;sBAApB;gBAGQ,OAAO,EAAA,CAAA;sBAAf;gBAGQ,IAAI,EAAA,CAAA;sBAAZ;gBAGQ,KAAK,EAAA,CAAA;sBAAb;gBAGQ,QAAQ,EAAA,CAAA;sBAAhB;gBAGQ,eAAe,EAAA,CAAA;sBAAvB;gBAGQ,WAAW,EAAA,CAAA;sBAAnB;;;AEzCH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDG;MAeU,kBAAkB,CAAA;AAd/B,IAAA,WAAA,GAAA;;QAmBW,IAAA,CAAA,WAAW,GAAW,EAAE;;QAGxB,IAAA,CAAA,IAAI,GAAc,MAAM;;QAGxB,IAAA,CAAA,IAAI,GAAc,QAAQ;;QAG1B,IAAA,CAAA,QAAQ,GAAY,KAAK;;QAGzB,IAAA,CAAA,QAAQ,GAAY,KAAK;;QAGzB,IAAA,CAAA,QAAQ,GAAY,KAAK;;QAqBzB,IAAA,CAAA,IAAI,GAAW,CAAC;;QAGhB,IAAA,CAAA,OAAO,GAAmB,EAAE;;QAS5B,IAAA,CAAA,WAAW,GAAY,KAAK;;AAG3B,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAAO;;AAGrC,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,YAAY,EAAQ;;AAGlC,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAQ;QAEnC,IAAA,CAAA,MAAM,GAAQ,EAAE;AAChB,QAAA,IAAA,CAAA,SAAS,GAAG,CAAC,KAAU,KAAI,EAAE,CAAC;AAC9B,QAAA,IAAA,CAAA,UAAU,GAAG,MAAK,EAAE,CAAC;AAoF9B,IAAA;AAlFC,IAAA,IAAI,KAAK,GAAA;QACP,OAAO,IAAI,CAAC,MAAM;IACpB;IAEA,IAAI,KAAK,CAAC,GAAQ,EAAA;AAChB,QAAA,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE;AACvB,YAAA,IAAI,CAAC,MAAM,GAAG,GAAG;AACjB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;AACnB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;QAC5B;IACF;AAEA;;;AAGG;AACH,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,IAAI,OAAO,GAAG,CAAA,sBAAA,EAAyB,IAAI,CAAC,IAAI,EAAE;QAClD,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,WAAW;QACzC,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,QAAQ;QACnC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,WAAW;AACzC,QAAA,OAAO,OAAO;IAChB;AAEA;;;AAGG;AACH,IAAA,IAAI,YAAY,GAAA;QACd,IAAI,OAAO,GAAG,eAAe;QAC7B,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,aAAa;QACzC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,aAAa;AACzC,QAAA,OAAO,OAAO;IAChB;AAEA;;AAEG;AACH,IAAA,OAAO,CAAC,KAAY,EAAA;AAClB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAoE;AACzF,QAAA,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;IAC3B;AAEA;;AAEG;IACH,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACrB;AAEA;;AAEG;IACH,UAAU,GAAA;QACR,IAAI,CAAC,UAAU,EAAE;AACjB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;AAEA;;;AAGG;AACH,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC;IACtD;;AAGA,IAAA,UAAU,CAAC,KAAU,EAAA;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,EAAE;IAC3B;AAEA,IAAA,gBAAgB,CAAC,EAAwB,EAAA;AACvC,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU;IAC5B;+GArJW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,WAAA,EAAA,aAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,KAAA,EAAA,OAAA,EAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,GAAA,EAAA,KAAA,EAAA,GAAA,EAAA,KAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,OAAA,EAAA,SAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,SAAA,EARlB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,kBAAkB,CAAC;AACjD,gBAAA,KAAK,EAAE;AACR;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1FH,68EAuFO,EAAA,MAAA,EAAA,CAAA,kuEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDNK,YAAY,EAAA,EAAA,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,UAAA,EAAA,IAAA,EAAE,mBAAmB,2OAAE,WAAW,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAW7C,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAd9B,SAAS;+BACE,YAAY,EAAA,UAAA,EACV,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,mBAAmB,EAAE,WAAW,CAAC,EAAA,SAAA,EAG9C;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,wBAAwB,CAAC;AACjD,4BAAA,KAAK,EAAE;AACR;AACF,qBAAA,EAAA,QAAA,EAAA,68EAAA,EAAA,MAAA,EAAA,CAAA,kuEAAA,CAAA,EAAA;8BAIQ,KAAK,EAAA,CAAA;sBAAb;gBAGQ,WAAW,EAAA,CAAA;sBAAnB;gBAGQ,IAAI,EAAA,CAAA;sBAAZ;gBAGQ,IAAI,EAAA,CAAA;sBAAZ;gBAGQ,QAAQ,EAAA,CAAA;sBAAhB;gBAGQ,QAAQ,EAAA,CAAA;sBAAhB;gBAGQ,QAAQ,EAAA,CAAA;sBAAhB;gBAGQ,KAAK,EAAA,CAAA;sBAAb;gBAGQ,IAAI,EAAA,CAAA;sBAAZ;gBAGQ,SAAS,EAAA,CAAA;sBAAjB;gBAGQ,GAAG,EAAA,CAAA;sBAAX;gBAGQ,GAAG,EAAA,CAAA;sBAAX;gBAGQ,IAAI,EAAA,CAAA;sBAAZ;gBAGQ,IAAI,EAAA,CAAA;sBAAZ;gBAGQ,OAAO,EAAA,CAAA;sBAAf;gBAGQ,MAAM,EAAA,CAAA;sBAAd;gBAGQ,MAAM,EAAA,CAAA;sBAAd;gBAGQ,WAAW,EAAA,CAAA;sBAAnB;gBAGS,WAAW,EAAA,CAAA;sBAApB;gBAGS,OAAO,EAAA,CAAA;sBAAhB;gBAGS,MAAM,EAAA,CAAA;sBAAf;;;AEzIH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCG;MAQU,iBAAiB,CAAA;AAP9B,IAAA,WAAA,GAAA;;AASW,QAAA,IAAA,CAAA,KAAK,GAAsB,EAAE,CAAC,EAAE,CAAC;;QAGjC,IAAA,CAAA,OAAO,GAAiB,EAAE;;AAG1B,QAAA,IAAA,CAAA,QAAQ,GAAwB,EAAE,CAAC,KAAK,CAAC;;QAGzC,IAAA,CAAA,UAAU,GAAY,KAAK;;QAG3B,IAAA,CAAA,UAAU,GAAY,IAAI;;QAG1B,IAAA,CAAA,YAAY,GAAW,mBAAmB;;QAG1C,IAAA,CAAA,cAAc,GAAW,YAAY;;QAGrC,IAAA,CAAA,IAAI,GAAiC,QAAQ;;QAG7C,IAAA,CAAA,QAAQ,GAAY,IAAI;;QAGxB,IAAA,CAAA,OAAO,GAAY,IAAI;;AAGtB,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAO;;AAGtC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAAO;;AAGrC,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,YAAY,EAAqD;QAE5F,IAAA,CAAA,aAAa,GAAU,EAAE;QAEzB,IAAA,CAAA,aAAa,GAAmB,KAAK;AA6FtC,IAAA;AA3FC;;;AAGG;AACH,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,IAAI,OAAO,GAAG,CAAA,oBAAA,EAAuB,IAAI,CAAC,IAAI,EAAE;QAChD,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,WAAW;QACzC,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,UAAU;AACvC,QAAA,OAAO,OAAO;IAChB;AAEA;;AAEG;AACH,IAAA,YAAY,CAAC,IAAS,EAAA;QACpB,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;AAEtB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,IAAI,QAAQ,KAAK,IAAI,CAAC;AACzE,QAAA,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;YACd,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACrC;aAAO;AACL,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/B;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,IAAS,EAAA;AACnB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAC7B;AAEA;;AAEG;AACH,IAAA,mBAAmB,CAAC,MAAkB,EAAA;QACpC,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE;QAEtB,IAAI,IAAI,CAAC,UAAU,KAAK,MAAM,CAAC,GAAG,EAAE;AAClC,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,KAAK,KAAK,GAAG,MAAM,GAAG,KAAK;QACpE;aAAO;AACL,YAAA,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,GAAG;AAC5B,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;QAC5B;AAEA,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;IACjE;AAEA;;AAEG;AACH,IAAA,UAAU,CAAC,IAAS,EAAA;QAClB,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC1C;AAEA;;AAEG;IACH,YAAY,CAAC,IAAS,EAAE,MAAkB,EAAA;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AAE9B,QAAA,QAAQ,MAAM,CAAC,IAAI;AACjB,YAAA,KAAK,SAAS;gBACZ,OAAO,KAAK,GAAG,GAAG,GAAG,GAAG;AAC1B,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,kBAAkB,EAAE,GAAG,EAAE;AAC1D,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,CAAC,cAAc,EAAE,GAAG,EAAE;AAChE,YAAA;AACE,gBAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;;IAEpC;AAEA;;AAEG;AACH,IAAA,gBAAgB,CAAC,MAAkB,EAAA;QACjC,IAAI,OAAO,GAAG,kBAAkB;QAChC,IAAI,MAAM,CAAC,QAAQ;YAAE,OAAO,IAAI,WAAW;AAC3C,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,MAAM,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI,CAAA,QAAA,EAAW,IAAI,CAAC,aAAa,EAAE;AAC9E,QAAA,OAAO,OAAO;IAChB;AAEA;;AAEG;IACH,SAAS,CAAC,KAAa,EAAE,IAAS,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,EAAE,IAAI,KAAK;IACzB;+GAtIW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3D9B,krEAkEO,EAAA,MAAA,EAAA,CAAA,42EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDXK,YAAY,EAAA,EAAA,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,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIX,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAP7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAAA,UAAA,EACT,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,krEAAA,EAAA,MAAA,EAAA,CAAA,42EAAA,CAAA,EAAA;8BAMd,KAAK,EAAA,CAAA;sBAAb;gBAGQ,OAAO,EAAA,CAAA;sBAAf;gBAGQ,QAAQ,EAAA,CAAA;sBAAhB;gBAGQ,UAAU,EAAA,CAAA;sBAAlB;gBAGQ,UAAU,EAAA,CAAA;sBAAlB;gBAGQ,YAAY,EAAA,CAAA;sBAApB;gBAGQ,cAAc,EAAA,CAAA;sBAAtB;gBAGQ,IAAI,EAAA,CAAA;sBAAZ;gBAGQ,QAAQ,EAAA,CAAA;sBAAhB;gBAGQ,OAAO,EAAA,CAAA;sBAAf;gBAGS,YAAY,EAAA,CAAA;sBAArB;gBAGS,WAAW,EAAA,CAAA;sBAApB;gBAGS,UAAU,EAAA,CAAA;sBAAnB;;;AE/EH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCG;MAQU,kBAAkB,CAAA;AAP/B,IAAA,WAAA,GAAA;;AASW,QAAA,IAAA,CAAA,KAAK,GAAsB,EAAE,CAAC,EAAE,CAAC;;QAGjC,IAAA,CAAA,OAAO,GAAkB,EAAE;;AAG3B,QAAA,IAAA,CAAA,QAAQ,GAAwB,EAAE,CAAC,KAAK,CAAC;;QAGzC,IAAA,CAAA,aAAa,GAAmC,MAAM;;QAGtD,IAAA,CAAA,SAAS,GAAY,KAAK;;QAG1B,IAAA,CAAA,IAAI,GAAW,EAAE;;QAGjB,IAAA,CAAA,QAAQ,GAAmC,QAAQ;;QAGnD,IAAA,CAAA,aAAa,GAAY,IAAI;;QAG7B,IAAA,CAAA,OAAO,GAAY,IAAI;;QAGvB,IAAA,CAAA,SAAS,GAAY,IAAI;;QAGzB,IAAA,CAAA,IAAI,GAAiC,QAAQ;;QAG7C,IAAA,CAAA,YAAY,GAAW,kBAAkB;;QAGzC,IAAA,CAAA,cAAc,GAAW,iBAAiB;;AAGzC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAAO;;AAGrC,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAAS;;AAG3C,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,YAAY,EAAO;;AAGpC,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,YAAY,EAA4C;;AAGzE,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,YAAY,EAAmC;;AAGhE,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAAiC;QAE7E,IAAA,CAAA,YAAY,GAAU,EAAE;QACxB,IAAA,CAAA,WAAW,GAAG,CAAC;QAEf,IAAA,CAAA,SAAS,GAAmB,KAAK;QACjC,IAAA,CAAA,aAAa,GAAU,EAAE;QACzB,IAAA,CAAA,YAAY,GAAG,CAAC;;QAGhB,IAAA,CAAA,IAAI,GAAG,IAAI;AAuJZ,IAAA;AArJC;;;AAGG;AACH,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,IAAI,OAAO,GAAG,CAAA,sBAAA,EAAyB,IAAI,CAAC,IAAI,EAAE;QAClD,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO,IAAI,YAAY;QAC/C,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,UAAU;QACvC,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,YAAY;AAC3C,QAAA,OAAO,OAAO;IAChB;AAEA;;AAEG;IACH,WAAW,CAAC,GAAQ,EAAE,KAAa,EAAA;AACjC,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,MAAM;YAAE;QAEnC,IAAI,KAAK,EAAE;YACT,KAAK,CAAC,eAAe,EAAE;QACzB;AAEA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,IAAI,QAAQ,KAAK,GAAG,CAAC;AAEvE,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,QAAQ,EAAE;AACnC,YAAA,IAAI,CAAC,YAAY,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;QAC7C;AAAO,aAAA,IAAI,IAAI,CAAC,aAAa,KAAK,UAAU,EAAE;AAC5C,YAAA,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;gBACd,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACpC;iBAAO;AACL,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;YAC7B;QACF;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;QAC1B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;IAC9C;AAEA;;AAEG;AACH,IAAA,UAAU,CAAC,GAAQ,EAAA;AACjB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;IAC3B;AAEA;;AAEG;AACH,IAAA,MAAM,CAAC,MAAmB,EAAA;QACxB,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM;YAAE;QAElD,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC,GAAG,EAAE;AACjC,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,KAAK,KAAK,GAAG,MAAM,GAAG,KAAK;QAC5D;aAAO;AACL,YAAA,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG;AAC3B,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;QACxB;AAEA,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IACpE;AAEA;;AAEG;AACH,IAAA,SAAS,CAAC,KAAY,EAAA;AACpB,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,MAA0B;;;QAGjD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;IAC9C;AAEA;;AAEG;IACH,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE;YACxB,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAChF;IACF;AAEA;;AAEG;IACH,QAAQ,GAAA;QACN,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAChF;AAEA;;AAEG;AACH,IAAA,UAAU,CAAC,GAAQ,EAAA;QACjB,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC;IACxC;AAEA;;AAEG;IACH,YAAY,CAAC,IAAS,EAAE,MAAmB,EAAA;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AAE9B,QAAA,QAAQ,MAAM,CAAC,IAAI;AACjB,YAAA,KAAK,SAAS;gBACZ,OAAO,KAAK,GAAG,GAAG,GAAG,GAAG;AAC1B,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,kBAAkB,EAAE,GAAG,EAAE;AAC1D,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,CAAC,cAAc,EAAE,GAAG,EAAE;AAChE,YAAA,KAAK,SAAS;gBACZ,OAAO,EAAE,CAAC;AACZ,YAAA;AACE,gBAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;;IAEpC;AAEA;;AAEG;AACH,IAAA,gBAAgB,CAAC,MAAmB,EAAA;QAClC,IAAI,OAAO,GAAG,mBAAmB;QACjC,IAAI,MAAM,CAAC,QAAQ;YAAE,OAAO,IAAI,WAAW;AAC3C,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI,CAAA,QAAA,EAAW,IAAI,CAAC,SAAS,EAAE;QACzE,IAAI,MAAM,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI,CAAA,MAAA,EAAS,MAAM,CAAC,KAAK,EAAE;AACpD,QAAA,OAAO,OAAO;IAChB;AAEA;;AAEG;AACH,IAAA,cAAc,CAAC,MAAmB,EAAA;QAChC,IAAI,OAAO,GAAG,YAAY;QAC1B,IAAI,MAAM,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI,CAAA,MAAA,EAAS,MAAM,CAAC,KAAK,EAAE;AACpD,QAAA,OAAO,OAAO;IAChB;AAEA;;AAEG;IACH,QAAQ,CAAC,MAAc,EAAE,IAAS,EAAA;QAChC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC7C;AAEA;;AAEG;IACH,SAAS,CAAC,KAAa,EAAE,IAAS,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,EAAE,IAAI,KAAK;IACzB;+GAxNW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,UAAA,EAAA,aAAA,EAAA,eAAA,EAAA,SAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,aAAA,EAAA,eAAA,EAAA,OAAA,EAAA,SAAA,EAAA,SAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,YAAA,EAAA,cAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClE/B,ylIAwHO,EAAA,MAAA,EAAA,CAAA,+tGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1DK,YAAY,EAAA,EAAA,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,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIX,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAP9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,EAAA,UAAA,EACV,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,ylIAAA,EAAA,MAAA,EAAA,CAAA,+tGAAA,CAAA,EAAA;8BAMd,KAAK,EAAA,CAAA;sBAAb;gBAGQ,OAAO,EAAA,CAAA;sBAAf;gBAGQ,QAAQ,EAAA,CAAA;sBAAhB;gBAGQ,aAAa,EAAA,CAAA;sBAArB;gBAGQ,SAAS,EAAA,CAAA;sBAAjB;gBAGQ,IAAI,EAAA,CAAA;sBAAZ;gBAGQ,QAAQ,EAAA,CAAA;sBAAhB;gBAGQ,aAAa,EAAA,CAAA;sBAArB;gBAGQ,OAAO,EAAA,CAAA;sBAAf;gBAGQ,SAAS,EAAA,CAAA;sBAAjB;gBAGQ,IAAI,EAAA,CAAA;sBAAZ;gBAGQ,YAAY,EAAA,CAAA;sBAApB;gBAGQ,cAAc,EAAA,CAAA;sBAAtB;gBAGS,WAAW,EAAA,CAAA;sBAApB;gBAGS,eAAe,EAAA,CAAA;sBAAxB;gBAGS,UAAU,EAAA,CAAA;sBAAnB;gBAGS,UAAU,EAAA,CAAA;sBAAnB;gBAGS,UAAU,EAAA,CAAA;sBAAnB;gBAGS,eAAe,EAAA,CAAA;sBAAxB;;;AEzGH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCG;MAQU,oBAAoB,CAAA;AAPjC,IAAA,WAAA,GAAA;;QASW,IAAA,CAAA,KAAK,GAAkB,EAAE;;QAMzB,IAAA,CAAA,OAAO,GAA+B,MAAM;;QAG5C,IAAA,CAAA,IAAI,GAAiC,QAAQ;;QAG7C,IAAA,CAAA,UAAU,GAAY,KAAK;;AAG1B,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,YAAY,EAAe;;AAG3C,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,YAAY,EAAe;AA4C7D,IAAA;AA1CC;;;AAGG;AACH,IAAA,IAAI,gBAAgB,GAAA;QAClB,IAAI,OAAO,GAAG,CAAA,kBAAA,EAAqB,IAAI,CAAC,OAAO,CAAA,UAAA,EAAa,IAAI,CAAC,IAAI,CAAA,CAAE;QACvE,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,aAAa;AAC7C,QAAA,OAAO,OAAO;IAChB;AAEA;;;;AAIG;AACH,IAAA,aAAa,CAAC,IAAiB,EAAA;QAC7B,IAAI,OAAO,GAAG,UAAU;AACxB,QAAA,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,SAAS;QACvD,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,WAAW;AACzC,QAAA,OAAO,OAAO;IAChB;AAEA;;;AAGG;AACH,IAAA,UAAU,CAAC,IAAiB,EAAA;QAC1B,IAAI,IAAI,CAAC,QAAQ;YAAE;AAEnB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE;AAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;IAClC;AAEA;;;;AAIG;AACH,IAAA,QAAQ,CAAC,IAAiB,EAAA;AACxB,QAAA,OAAO,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY;IACtC;+GA/DW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,YAAA,EAAA,cAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,MAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzDjC,kwBA4BO,EAAA,MAAA,EAAA,CAAA,suEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDyBK,YAAY,EAAA,EAAA,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,CAAA,EAAA,CAAA,CAAA;;4FAIX,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAAA,UAAA,EACb,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,kwBAAA,EAAA,MAAA,EAAA,CAAA,suEAAA,CAAA,EAAA;8BAMd,KAAK,EAAA,CAAA;sBAAb;gBAGQ,YAAY,EAAA,CAAA;sBAApB;gBAGQ,OAAO,EAAA,CAAA;sBAAf;gBAGQ,IAAI,EAAA,CAAA;sBAAZ;gBAGQ,UAAU,EAAA,CAAA;sBAAlB;gBAGS,SAAS,EAAA,CAAA;sBAAlB;gBAGS,gBAAgB,EAAA,CAAA;sBAAzB;;;AE9CH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCG;MAQU,yBAAyB,CAAA;AAPtC,IAAA,WAAA,GAAA;;QASW,IAAA,CAAA,IAAI,GAAqB,MAAM;;QAG/B,IAAA,CAAA,KAAK,GAAW,EAAE;;QAMlB,IAAA,CAAA,QAAQ,GAAW,IAAI;;QAGvB,IAAA,CAAA,UAAU,GAAY,KAAK;;QAG3B,IAAA,CAAA,QAAQ,GAAyB,WAAW;;QAG5C,IAAA,CAAA,QAAQ,GAAY,IAAI;;QAGxB,IAAA,CAAA,OAAO,GAAY,IAAI;;AAGtB,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,YAAY,EAAQ;;AAGlC,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,YAAY,EAAQ;AA4D7C,IAAA;IAxDC,QAAQ,GAAA;QACN,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE;YACzC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,MAAK;gBACtC,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC;QACnB;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;QAC9B;IACF;AAEA;;;AAGG;AACH,IAAA,IAAI,IAAI,GAAA;AACN,QAAA,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,SAAS,EAAE,OAAO,GAAG;AAC1B,YAAA,KAAK,OAAO,EAAE,OAAO,GAAG;AACxB,YAAA,KAAK,SAAS,EAAE,OAAO,IAAI;AAC3B,YAAA,KAAK,MAAM,EAAE,OAAO,IAAI;AACxB,YAAA,SAAS,OAAO,IAAI;;IAExB;AAEA;;;AAGG;AACH,IAAA,IAAI,mBAAmB,GAAA;QACrB,OAAO,CAAA,0BAAA,EAA6B,IAAI,CAAC,IAAI,iBAAiB,IAAI,CAAC,QAAQ,CAAA,CAAE;IAC/E;AAEA;;;AAGG;IACH,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AAEnB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;QAC9B;IACF;AAEA;;;AAGG;IACH,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACrB;+GAxFW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzEtC,y5BAgCO,EAAA,MAAA,EAAA,CAAA,ilEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDqCK,YAAY,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,CAAA,EAAA,CAAA,CAAA;;4FAIX,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAPrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAAA,UAAA,EACjB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,y5BAAA,EAAA,MAAA,EAAA,CAAA,ilEAAA,CAAA,EAAA;8BAMd,IAAI,EAAA,CAAA;sBAAZ;gBAGQ,KAAK,EAAA,CAAA;sBAAb;gBAGQ,OAAO,EAAA,CAAA;sBAAf;gBAGQ,QAAQ,EAAA,CAAA;sBAAhB;gBAGQ,UAAU,EAAA,CAAA;sBAAlB;gBAGQ,QAAQ,EAAA,CAAA;sBAAhB;gBAGQ,QAAQ,EAAA,CAAA;sBAAhB;gBAGQ,OAAO,EAAA,CAAA;sBAAf;gBAGS,OAAO,EAAA,CAAA;sBAAhB;gBAGS,OAAO,EAAA,CAAA;sBAAhB;;;AEnGH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCG;MAQU,+BAA+B,CAAA;AAP5C,IAAA,WAAA,GAAA;;QASW,IAAA,CAAA,MAAM,GAAW,cAAc;;QAG/B,IAAA,CAAA,IAAI,GAAW,IAAI;;QAGnB,IAAA,CAAA,OAAO,GAAW,mCAAmC;;QAGrD,IAAA,CAAA,UAAU,GAAW,KAAK;;QAG1B,IAAA,CAAA,UAAU,GAAW,IAAI;;QAGzB,IAAA,CAAA,OAAO,GAAY,IAAI;;QAGvB,IAAA,CAAA,KAAK,GAAW,OAAO;;AAGtB,QAAA,IAAA,CAAA,qBAAqB,GAAG,IAAI,YAAY,EAAQ;;AAGhD,QAAA,IAAA,CAAA,qBAAqB,GAAG,IAAI,YAAY,EAAQ;;AAGhD,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,YAAY,EAAQ;AA0C7C,IAAA;AAxCC;;;AAGG;IACH,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE;QACjC,IAAI,CAAC,KAAK,EAAE;IACd;AAEA;;;AAGG;IACH,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE;QACjC,IAAI,CAAC,KAAK,EAAE;IACd;AAEA;;;AAGG;IACH,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACrB;AAEA;;AAEG;IACH,eAAe,GAAA;QACb,IAAI,CAAC,QAAQ,EAAE;IACjB;AAEA;;AAEG;AACH,IAAA,cAAc,CAAC,KAAY,EAAA;QACzB,KAAK,CAAC,eAAe,EAAE;IACzB;+GAtEW,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA/B,+BAA+B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/C5C,ygCAmCO,EAAA,MAAA,EAAA,CAAA,muDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDQK,YAAY,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,CAAA,EAAA,CAAA,CAAA;;4FAIX,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAP3C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,EAAA,UAAA,EACxB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,ygCAAA,EAAA,MAAA,EAAA,CAAA,muDAAA,CAAA,EAAA;8BAMd,MAAM,EAAA,CAAA;sBAAd;gBAGQ,IAAI,EAAA,CAAA;sBAAZ;gBAGQ,OAAO,EAAA,CAAA;sBAAf;gBAGQ,UAAU,EAAA,CAAA;sBAAlB;gBAGQ,UAAU,EAAA,CAAA;sBAAlB;gBAGQ,OAAO,EAAA,CAAA;sBAAf;gBAGQ,KAAK,EAAA,CAAA;sBAAb;gBAGS,qBAAqB,EAAA,CAAA;sBAA9B;gBAGS,qBAAqB,EAAA,CAAA;sBAA9B;gBAGS,OAAO,EAAA,CAAA;sBAAhB;;;AE3DH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BG;MAeU,wBAAwB,CAAA;AAdrC,IAAA,WAAA,GAAA;;QAgBW,IAAA,CAAA,QAAQ,GAAY,KAAK;;AAGzB,QAAA,IAAA,CAAA,OAAO,GAAW,CAAC,GAAG,IAAI,GAAG,IAAI;;QAGjC,IAAA,CAAA,QAAQ,GAAW,EAAE;;QAGrB,IAAA,CAAA,aAAa,GAAW,SAAS;;QAGjC,IAAA,CAAA,WAAW,GAAY,IAAI;;QAG3B,IAAA,CAAA,QAAQ,GAAY,KAAK;;QAGzB,IAAA,CAAA,WAAW,GAAW,qCAAqC;;QAG3D,IAAA,CAAA,UAAU,GAAW,cAAc;;QAGnC,IAAA,CAAA,eAAe,GAAY,IAAI;;AAG9B,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAkB;;AAGlD,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAAgB;;AAG9C,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAAU;QAEtD,IAAA,CAAA,KAAK,GAAmB,EAAE;QAC1B,IAAA,CAAA,UAAU,GAAG,KAAK;AAEV,QAAA,IAAA,CAAA,SAAS,GAAG,CAAC,KAAqB,KAAI,EAAE,CAAC;AACzC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAK,EAAE,CAAC;AA6L9B,IAAA;AA3LC;;;AAGG;AACH,IAAA,IAAI,eAAe,GAAA;QACjB,IAAI,OAAO,GAAG,WAAW;QACzB,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,YAAY;QAC5C,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,WAAW;AACzC,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,YAAY;AAClD,QAAA,OAAO,OAAO;IAChB;AAEA;;AAEG;AACH,IAAA,UAAU,CAAC,KAAgB,EAAA;QACzB,IAAI,IAAI,CAAC,QAAQ;YAAE;QAEnB,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;IACxB;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,KAAgB,EAAA;QAC1B,IAAI,IAAI,CAAC,QAAQ;YAAE;QAEnB,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;IACzB;AAEA;;AAEG;AACH,IAAA,MAAM,CAAC,KAAgB,EAAA;QACrB,IAAI,IAAI,CAAC,QAAQ;YAAE;QAEnB,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;AAEvB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC;AACzD,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;IACzB;AAEA;;AAEG;AACH,IAAA,iBAAiB,CAAC,KAAY,EAAA;AAC5B,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;AAC3C,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;;AAGvB,QAAA,KAAK,CAAC,KAAK,GAAG,EAAE;IAClB;AAEA;;AAEG;AACK,IAAA,WAAW,CAAC,aAAqB,EAAA;QACvC,MAAM,UAAU,GAAmB,EAAE;AAErC,QAAA,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE;;YAEhC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE;gBAC/B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA,mBAAA,EAAsB,IAAI,CAAC,IAAI,CAAA,CAAE,CAAC;gBAC5D;YACF;;YAGA,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE;gBAC5B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA,gBAAA,EAAmB,IAAI,CAAC,IAAI,CAAA,CAAE,CAAC;gBACzD;YACF;AAEA,YAAA,MAAM,YAAY,GAAiB;gBACjC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,gBAAA,IAAI,EAAE,IAAI;AACV,gBAAA,GAAG,EAAE,GAAG,CAAC,eAAe,CAAC,IAAI;aAC9B;AAED,YAAA,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;QAC/B;AAEA,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;;YAEjB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM;AACxD,YAAA,IAAI,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE;gBAC9B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA,QAAA,EAAW,IAAI,CAAC,QAAQ,CAAA,cAAA,CAAgB,CAAC;gBACnE;YACF;AAEA,YAAA,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,UAAU,CAAC;QAC7C;aAAO;;YAEL,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACzB,gBAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,IAAG;oBACxB,IAAI,IAAI,CAAC,GAAG;AAAE,wBAAA,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;AAC7C,gBAAA,CAAC,CAAC;YACJ;YACA,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACrC;QAEA,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IACrC;AAEA;;AAEG;AACK,IAAA,eAAe,CAAC,IAAU,EAAA;AAChC,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,GAAG;AAAE,YAAA,OAAO,IAAI;QAE3C,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9D,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,IAAG;AACvB,YAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACvB,gBAAA,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAChD;AACA,YAAA,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI;AAC3B,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;AACH,IAAA,UAAU,CAAC,IAAkB,EAAA;QAC3B,IAAI,IAAI,CAAC,QAAQ;YAAE;AAEnB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;AACnD,QAAA,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;YACd,IAAI,IAAI,CAAC,GAAG;AAAE,gBAAA,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;YAC3C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC3B,IAAI,CAAC,WAAW,EAAE;AAClB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QAC7B;IACF;AAEA;;AAEG;AACH,IAAA,cAAc,CAAC,IAAY,EAAA;QACzB,IAAI,IAAI,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;QAE5B,MAAM,CAAC,GAAG,IAAI;QACd,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAElD,OAAO,UAAU,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;IACxE;AAEA;;AAEG;IACK,WAAW,GAAA;AACjB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,UAAU,EAAE;IACnB;;AAGA,IAAA,UAAU,CAAC,KAAqB,EAAA;AAC9B,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE;IAC1B;AAEA,IAAA,gBAAgB,CAAC,EAAmC,EAAA;AAClD,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU;IAC5B;IAEA,WAAW,GAAA;;AAET,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,IAAG;YACxB,IAAI,IAAI,CAAC,GAAG;AAAE,gBAAA,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;AAC7C,QAAA,CAAC,CAAC;IACJ;+GArOW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,UAAA,EAAA,aAAA,EAAA,eAAA,EAAA,WAAA,EAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,WAAA,EAAA,aAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,SAAA,EARxB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,wBAAwB,CAAC;AACvD,gBAAA,KAAK,EAAE;AACR;SACF,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7DH,guDAwDO,6qEDJK,YAAY,EAAA,EAAA,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,CAAA,EAAA,CAAA,CAAA;;4FAWX,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAdpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,cACjB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,SAAA,EAGZ;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,8BAA8B,CAAC;AACvD,4BAAA,KAAK,EAAE;AACR;AACF,qBAAA,EAAA,QAAA,EAAA,guDAAA,EAAA,MAAA,EAAA,CAAA,snEAAA,CAAA,EAAA;8BAIQ,QAAQ,EAAA,CAAA;sBAAhB;gBAGQ,OAAO,EAAA,CAAA;sBAAf;gBAGQ,QAAQ,EAAA,CAAA;sBAAhB;gBAGQ,aAAa,EAAA,CAAA;sBAArB;gBAGQ,WAAW,EAAA,CAAA;sBAAnB;gBAGQ,QAAQ,EAAA,CAAA;sBAAhB;gBAGQ,WAAW,EAAA,CAAA;sBAAnB;gBAGQ,UAAU,EAAA,CAAA;sBAAlB;gBAGQ,eAAe,EAAA,CAAA;sBAAvB;gBAGS,aAAa,EAAA,CAAA;sBAAtB;gBAGS,WAAW,EAAA,CAAA;sBAApB;gBAGS,eAAe,EAAA,CAAA;sBAAxB;;;AEhGH;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;SACa,kBAAkB,GAAA;IAChC,OAAO,CAAC,OAAwB,KAAuC;;QAErE,IAAI,CAAC,OAAO,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI;;QAG/B,MAAM,WAAW,GAAG,6FAA6F;QACjH,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QAE/C,OAAO,OAAO,GAAG,IAAI,GAAG,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,6BAA6B,EAAE,EAAE;AAChH,IAAA,CAAC;AACH;;ACrCA;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;SACa,mBAAmB,GAAA;IACjC,OAAO,CAAC,OAAwB,KAAuC;;QAErE,IAAI,CAAC,OAAO,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI;;QAG/B,MAAM,UAAU,GAAG,2CAA2C;QAE9D,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;AAC9C,QAAA,OAAO,OAAO,GAAG,IAAI,GAAG;AACtB,YAAA,iBAAiB,EAAE;gBACjB,KAAK,EAAE,OAAO,CAAC,KAAK;AACpB,gBAAA,OAAO,EAAE;AACV;SACF;AACH,IAAA,CAAC;AACH;;AC1CA;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;SACa,aAAa,GAAA;IAC3B,OAAO,CAAC,OAAwB,KAAuC;;QAErE,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;QAEtD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;;AAGlC,QAAA,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE;YAC3C,OAAO;AACL,gBAAA,WAAW,EAAE;oBACX,KAAK,EAAE,OAAO,CAAC,KAAK;AACpB,oBAAA,OAAO,EAAE;AACV;aACF;QACH;AAEA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;AACH;;AC7CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BG;SACa,mBAAmB,GAAA;IACjC,OAAO,CAAC,OAAwB,KAAuC;;QAErE,IAAI,CAAC,OAAO,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI;;;;;QAM/B,MAAM,iBAAiB,GAAG,oDAAoD;QAC9E,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;AAErD,QAAA,OAAO,OAAO,GAAG,IAAI,GAAG;AACtB,YAAA,iBAAiB,EAAE;gBACjB,KAAK,EAAE,OAAO,CAAC,KAAK;AACpB,gBAAA,OAAO,EAAE;AACV;SACF;AACH,IAAA,CAAC;AACH;;ACnDA;;;;;;;;;;AAUG;AAEH;;ACZA;;;;;;;;;;;;;AAaG;AAEH;;ACfA;;AAEG;;;;"}