{"version":3,"file":"medha-analytics-medha-one-access.mjs","sources":["../../../projects/medha-one-access/src/lib/config/medha-config.token.ts","../../../projects/medha-one-access/src/lib/components/sidebar/sidebar.component.ts","../../../projects/medha-one-access/src/lib/components/sidebar/sidebar.component.html","../../../projects/medha-one-access/src/lib/services/auth.service.ts","../../../projects/medha-one-access/src/lib/services/medha-http.service.ts","../../../projects/medha-one-access/src/lib/services/user.service.ts","../../../projects/medha-one-access/src/lib/services/group.service.ts","../../../projects/medha-one-access/src/lib/services/artifact.service.ts","../../../projects/medha-one-access/src/lib/services/expression-parser.service.ts","../../../projects/medha-one-access/src/lib/services/sync-expression-resolver.service.ts","../../../projects/medha-one-access/src/lib/services/hierarchy.service.ts","../../../projects/medha-one-access/src/lib/components/combined-hierarchy/combined-hierarchy.component.ts","../../../projects/medha-one-access/src/lib/components/organization-tree/organization-tree.component.ts","../../../projects/medha-one-access/src/lib/components/organization-tree/organization-tree.component.html","../../../projects/medha-one-access/src/lib/components/add-user-dialog/add-user-dialog.component.ts","../../../projects/medha-one-access/src/lib/components/add-user-dialog/add-user-dialog.component.html","../../../projects/medha-one-access/src/lib/services/access-rule.service.ts","../../../projects/medha-one-access/src/lib/components/edit-user-dialog/edit-user-dialog.component.ts","../../../projects/medha-one-access/src/lib/components/edit-user-dialog/edit-user-dialog.component.html","../../../projects/medha-one-access/src/lib/components/confirm-dialog/confirm-dialog.component.ts","../../../projects/medha-one-access/src/lib/components/user-management/user-management.component.ts","../../../projects/medha-one-access/src/lib/components/user-management/user-management.component.html","../../../projects/medha-one-access/src/lib/components/user-groups/user-groups.component.ts","../../../projects/medha-one-access/src/lib/components/user-groups/user-groups.component.html","../../../projects/medha-one-access/src/lib/components/hierarchy/hierarchy.component.ts","../../../projects/medha-one-access/src/lib/components/hierarchy/hierarchy.component.html","../../../projects/medha-one-access/src/lib/services/artifact-hierarchy.service.ts","../../../projects/medha-one-access/src/lib/components/artifact-hierarchy/artifact-hierarchy.component.ts","../../../projects/medha-one-access/src/lib/services/app-context.service.ts","../../../projects/medha-one-access/src/lib/components/artifacts/artifacts.component.ts","../../../projects/medha-one-access/src/lib/components/artifacts/artifacts.component.html","../../../projects/medha-one-access/src/lib/components/access-rules/access-rules.component.ts","../../../projects/medha-one-access/src/lib/components/access-rules/access-rules.component.html","../../../projects/medha-one-access/src/lib/medha-one-access.component.ts","../../../projects/medha-one-access/src/lib/medha-one-access.module.ts","../../../projects/medha-one-access/src/lib/medha-one-access.routes.ts","../../../projects/medha-one-access/src/lib/components/expression-input/expression-input.component.ts","../../../projects/medha-one-access/src/lib/components/expression-input/expression-input.component.html","../../../projects/medha-one-access/src/lib/components/access-rule-dialog/access-rule-dialog.component.ts","../../../projects/medha-one-access/src/lib/components/access-rule-dialog/access-rule-dialog.component.html","../../../projects/medha-one-access/src/lib/components/artifact-dialog/artifact-dialog.component.ts","../../../projects/medha-one-access/src/lib/components/artifact-dialog/artifact-dialog.component.html","../../../projects/medha-one-access/src/lib/components/group-hierarchy/group-hierarchy.component.ts","../../../projects/medha-one-access/src/lib/components/group-hierarchy/group-hierarchy.component.html","../../../projects/medha-one-access/src/lib/components/organization-hierarchy/organization-hierarchy.component.ts","../../../projects/medha-one-access/src/lib/components/organization-hierarchy/organization-hierarchy.component.html","../../../projects/medha-one-access/src/lib/components/user-group-dialog/user-group-dialog.component.ts","../../../projects/medha-one-access/src/lib/components/user-group-dialog/user-group-dialog.component.html","../../../projects/medha-one-access/src/lib/interceptors/auth.interceptor.ts","../../../projects/medha-one-access/src/public-api.ts","../../../projects/medha-one-access/src/medha-analytics-medha-one-access.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { MedhaOneAccessConfig } from './medha-config.interface';\n\nexport const MEDHA_ONE_ACCESS_CONFIG = new InjectionToken<MedhaOneAccessConfig>('MEDHA_ONE_ACCESS_CONFIG');","import { Component, EventEmitter, Output, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\ninterface NavItem {\r\n  name: string;\r\n  icon: string;\r\n  viewName: string;\r\n}\r\n\r\n@Component({\r\n  selector: 'app-sidebar',\r\n  standalone: true,\r\n  imports: [CommonModule, MatIconModule],\r\n  templateUrl: './sidebar.component.html',\r\n  styleUrls: ['./sidebar.component.scss']\r\n})\r\nexport class SidebarComponent implements OnInit {\r\n  @Output() navigationChange = new EventEmitter<string>();\r\n\r\n  activeView: string = 'users';\r\n\r\n  navItems: NavItem[] = [\r\n    {\r\n      name: 'Users',\r\n      icon: 'people',\r\n      viewName: 'users'\r\n    },\r\n    {\r\n      name: 'Artifacts',\r\n      icon: 'dashboard',\r\n      viewName: 'artifacts'\r\n    },\r\n    {\r\n      name: 'Access Rules',\r\n      icon: 'security',\r\n      viewName: 'access-rules'\r\n    }\r\n  ];\r\n  \r\n  ngOnInit(): void {\r\n    // Set initial active view to first item\r\n    if (this.navItems.length > 0) {\r\n      this.activeView = this.navItems[0].viewName;\r\n    }\r\n  }\r\n\r\n  navigateTo(viewName: string): void {\r\n    this.activeView = viewName;\r\n    this.navigationChange.emit(viewName);\r\n  }\r\n\r\n  isActive(viewName: string): boolean {\r\n    return this.activeView === viewName;\r\n  }\r\n}","<div class=\"sidebar\">\r\n  <div class=\"sidebar-header\">\r\n    <h2>Admin Panel</h2>\r\n  </div>\r\n\r\n  <div class=\"sidebar-content\">\r\n    <div class=\"sidebar-item\"\r\n         *ngFor=\"let item of navItems\"\r\n         (click)=\"navigateTo(item.viewName)\"\r\n         [class.active]=\"isActive(item.viewName)\">\r\n      <mat-icon>{{item.icon}}</mat-icon>\r\n      <span>{{item.name}}</span>\r\n    </div>\r\n  </div>\r\n</div>","import { Injectable, Inject } from '@angular/core';\nimport { MEDHA_ONE_ACCESS_CONFIG } from '../config/medha-config.token';\nimport { MedhaOneAccessConfig } from '../config/medha-config.interface';\nimport * as CryptoJS from 'crypto-js';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class AuthService {\n  private secretKey: string;\n\n  constructor(\n    @Inject(MEDHA_ONE_ACCESS_CONFIG) private config: MedhaOneAccessConfig\n  ) {\n    this.secretKey = config.secretKey;\n  }\n\n  /**\n   * Generate an authentication token for API requests\n   * Format: \"MedhaOneAccess_[endpoint]_[method]_[timestamp]_[nonce]\"\n   */\n  generateToken(endpoint: string, method: string): string {\n    const timestamp = Date.now();\n    const nonce = this.generateNonce();\n    const authString = `MedhaOneAccess_${endpoint}_${method}_${timestamp}_${nonce}`;\n    \n    // Encrypt the token using Fernet-compatible encryption\n    const encrypted = this.encryptString(authString);\n    return btoa(encrypted);\n  }\n  \n  /**\n   * Encrypt a string using the Fernet algorithm compatible with the backend\n   */\n  private encryptString(text: string): string {\n    // Convert the secret key from base64 to a usable format\n    const keyBytes = CryptoJS.enc.Base64.parse(this.secretKey);\n    \n    // For Fernet compatibility:\n    // - First 16 bytes are the IV (initialization vector)\n    // - Remaining bytes are the encryption key\n    const iv = keyBytes.clone();\n    iv.sigBytes = 16;\n    iv.words = iv.words.slice(0, 4);\n    \n    const key = keyBytes.clone();\n    key.words = key.words.slice(4);\n    key.sigBytes = keyBytes.sigBytes - 16;\n    \n    // Encrypt the text using AES-128-CBC with the key\n    const encrypted = CryptoJS.AES.encrypt(text, key, {\n      iv: iv,\n      mode: CryptoJS.mode.CBC,\n      padding: CryptoJS.pad.Pkcs7\n    });\n    \n    // Convert the encrypted data to a format compatible with Python's Fernet\n    // This is a simplified version - actual Fernet has additional format requirements\n    return encrypted.ciphertext.toString(CryptoJS.enc.Base64);\n  }\n  \n  /**\n   * Generate a random nonce for the token\n   */\n  private generateNonce(): string {\n    return Math.random().toString(36).substring(2, 10);\n  }\n}","import { Injectable, Inject, Optional } from '@angular/core';\nimport { HttpClient, HttpHeaders, HttpParams, HttpErrorResponse } from '@angular/common/http';\nimport { Observable, throwError } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { AuthService } from './auth.service';\nimport { MEDHA_ONE_ACCESS_CONFIG } from '../config/medha-config.token';\nimport { MedhaOneAccessConfig } from '../config/medha-config.interface';\n\nexport interface HttpOptions {\n  headers?: HttpHeaders | { [header: string]: string | string[] };\n  params?: HttpParams | { [param: string]: string | string[] };\n  reportProgress?: boolean;\n  withCredentials?: boolean;\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class MedhaHttpService {\n  constructor(\n    private http: HttpClient,\n    @Optional() private authService: AuthService,\n    @Optional() @Inject(MEDHA_ONE_ACCESS_CONFIG) private config: MedhaOneAccessConfig\n  ) {}\n\n  /**\n   * Generate authentication headers for the request\n   */\n  private getAuthHeaders(endpoint: string, method: string): HttpHeaders {\n    if (!this.authService || !this.config) {\n      return new HttpHeaders();\n    }\n\n    try {\n      const token = this.authService.generateToken(endpoint, method);\n      return new HttpHeaders({\n        'Authorization': `Bearer ${token}`\n      });\n    } catch (error) {\n      return new HttpHeaders();\n    }\n  }\n\n  /**\n   * Extract endpoint from full URL for token generation\n   */\n  private extractEndpoint(url: string): string {\n    if (!this.config?.apiUrl) {\n      return url;\n    }\n    \n    // Remove the base API URL to get the endpoint\n    let endpoint = url.replace(this.config.apiUrl, '');\n    \n    // Ensure endpoint starts with /\n    if (!endpoint.startsWith('/')) {\n      endpoint = '/' + endpoint;\n    }\n    \n    return endpoint;\n  }\n\n  /**\n   * Merge auth headers with existing headers\n   */\n  private mergeHeaders(existingHeaders: HttpHeaders | { [header: string]: string | string[] } | undefined, authHeaders: HttpHeaders): HttpHeaders {\n    let headers = authHeaders;\n    \n    if (existingHeaders) {\n      if (existingHeaders instanceof HttpHeaders) {\n        // Merge with existing HttpHeaders\n        existingHeaders.keys().forEach(key => {\n          const values = existingHeaders.getAll(key);\n          if (values) {\n            values.forEach(value => {\n              headers = headers.set(key, value);\n            });\n          }\n        });\n      } else {\n        // Merge with plain object headers\n        Object.keys(existingHeaders).forEach(key => {\n          const value = existingHeaders[key];\n          if (Array.isArray(value)) {\n            value.forEach(v => {\n              headers = headers.append(key, v);\n            });\n          } else {\n            headers = headers.set(key, value);\n          }\n        });\n      }\n    }\n    \n    return headers;\n  }\n\n  /**\n   * Standardized error handling for HTTP requests\n   */\n  private handleError(error: HttpErrorResponse): Observable<never> {\n    let errorMessage = 'An unknown error occurred';\n    let userFriendlyMessage = 'Something went wrong. Please try again.';\n\n    if (error.error instanceof ErrorEvent) {\n      // Client-side or network error\n      errorMessage = `Client Error: ${error.error.message}`;\n      userFriendlyMessage = 'Network error. Please check your connection and try again.';\n    } else {\n      // Backend returned an error response\n      switch (error.status) {\n        case 400:\n          errorMessage = error.error?.message || 'Bad Request';\n          userFriendlyMessage = error.error?.message || 'Invalid data provided. Please check your input.';\n          break;\n        case 401:\n          errorMessage = 'Unauthorized';\n          userFriendlyMessage = 'You are not authorized to perform this action. Please log in again.';\n          break;\n        case 403:\n          errorMessage = 'Forbidden';\n          userFriendlyMessage = 'You do not have permission to perform this action.';\n          break;\n        case 404:\n          errorMessage = 'Not Found';\n          userFriendlyMessage = 'The requested resource was not found.';\n          break;\n        case 409:\n          errorMessage = error.error?.message || 'Conflict';\n          userFriendlyMessage = error.error?.message || 'The resource already exists or there was a conflict.';\n          break;\n        case 422:\n          errorMessage = error.error?.message || 'Validation Error';\n          userFriendlyMessage = error.error?.message || 'The data provided is invalid.';\n          break;\n        case 500:\n          errorMessage = 'Internal Server Error';\n          userFriendlyMessage = 'A server error occurred. Please try again later.';\n          break;\n        default:\n          errorMessage = `Error ${error.status}: ${error.error?.message || error.message}`;\n          userFriendlyMessage = 'An unexpected error occurred. Please try again.';\n      }\n    }\n\n    console.error('HTTP Error:', {\n      status: error.status,\n      message: errorMessage,\n      error: error.error,\n      url: error.url\n    });\n\n    // Return enhanced error object with both technical and user-friendly messages\n    return throwError({\n      ...error,\n      message: errorMessage,\n      userMessage: userFriendlyMessage,\n      originalError: error\n    });\n  }\n\n  /**\n   * HTTP GET with automatic authentication\n   */\n  get<T>(url: string, options?: HttpOptions): Observable<T> {\n    const endpoint = this.extractEndpoint(url);\n    const authHeaders = this.getAuthHeaders(endpoint, 'GET');\n    const headers = this.mergeHeaders(options?.headers, authHeaders);\n    \n    const requestOptions = {\n      ...options,\n      headers\n    };\n\n\n    return this.http.get<T>(url, requestOptions).pipe(\n      catchError(this.handleError.bind(this))\n    );\n  }\n\n  /**\n   * HTTP POST with automatic authentication\n   */\n  post<T>(url: string, body: any, options?: HttpOptions): Observable<T> {\n    const endpoint = this.extractEndpoint(url);\n    const authHeaders = this.getAuthHeaders(endpoint, 'POST');\n    const headers = this.mergeHeaders(options?.headers, authHeaders);\n    \n    const requestOptions = {\n      ...options,\n      headers\n    };\n\n\n    return this.http.post<T>(url, body, requestOptions).pipe(\n      catchError(this.handleError.bind(this))\n    );\n  }\n\n  /**\n   * HTTP PUT with automatic authentication\n   */\n  put<T>(url: string, body: any, options?: HttpOptions): Observable<T> {\n    const endpoint = this.extractEndpoint(url);\n    const authHeaders = this.getAuthHeaders(endpoint, 'PUT');\n    const headers = this.mergeHeaders(options?.headers, authHeaders);\n    \n    const requestOptions = {\n      ...options,\n      headers\n    };\n\n\n    return this.http.put<T>(url, body, requestOptions).pipe(\n      catchError(this.handleError.bind(this))\n    );\n  }\n\n  /**\n   * HTTP DELETE with automatic authentication\n   */\n  delete<T>(url: string, options?: HttpOptions): Observable<T> {\n    const endpoint = this.extractEndpoint(url);\n    const authHeaders = this.getAuthHeaders(endpoint, 'DELETE');\n    const headers = this.mergeHeaders(options?.headers, authHeaders);\n    \n    const requestOptions = {\n      ...options,\n      headers\n    };\n\n\n    return this.http.delete<T>(url, requestOptions).pipe(\n      catchError(this.handleError.bind(this))\n    );\n  }\n\n  /**\n   * HTTP PATCH with automatic authentication\n   */\n  patch<T>(url: string, body: any, options?: HttpOptions): Observable<T> {\n    const endpoint = this.extractEndpoint(url);\n    const authHeaders = this.getAuthHeaders(endpoint, 'PATCH');\n    const headers = this.mergeHeaders(options?.headers, authHeaders);\n    \n    const requestOptions = {\n      ...options,\n      headers\n    };\n\n\n    return this.http.patch<T>(url, body, requestOptions);\n  }\n\n  /**\n   * HTTP HEAD with automatic authentication\n   */\n  head<T>(url: string, options?: HttpOptions): Observable<T> {\n    const endpoint = this.extractEndpoint(url);\n    const authHeaders = this.getAuthHeaders(endpoint, 'HEAD');\n    const headers = this.mergeHeaders(options?.headers, authHeaders);\n    \n    const requestOptions = {\n      ...options,\n      headers\n    };\n\n\n    return this.http.head<T>(url, requestOptions);\n  }\n\n  /**\n   * HTTP OPTIONS with automatic authentication\n   */\n  options<T>(url: string, options?: HttpOptions): Observable<T> {\n    const endpoint = this.extractEndpoint(url);\n    const authHeaders = this.getAuthHeaders(endpoint, 'OPTIONS');\n    const headers = this.mergeHeaders(options?.headers, authHeaders);\n    \n    const requestOptions = {\n      ...options,\n      headers\n    };\n\n\n    return this.http.options<T>(url, requestOptions);\n  }\n}","import { Injectable, Inject } from '@angular/core';\nimport { HttpParams } from '@angular/common/http';\nimport { Observable, of } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\nimport { User, UserGroup, UserResponse } from '../models/user.model';\nimport { MEDHA_ONE_ACCESS_CONFIG } from '../config/medha-config.token';\nimport { MedhaOneAccessConfig } from '../config/medha-config.interface';\nimport { MedhaHttpService } from './medha-http.service';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class UserService {\n  private apiUrl: string;\n\n  constructor(\n    private medhaHttp: MedhaHttpService,\n    @Inject(MEDHA_ONE_ACCESS_CONFIG) private config: MedhaOneAccessConfig\n  ) {\n    this.apiUrl = `${config.apiUrl}/users`;\n  }\n\n  /**\n   * Get all users\n   */\n  getUsers(skip: number = 0, limit?: number, activeOnly:any = null): Observable<User[]> {\n    let params = new HttpParams()\n      .set('skip', skip.toString())\n      .set('user_type', 'USER');\n    \n    if (limit !== undefined) {\n      params = params.set('limit', limit.toString());\n    }\n    \n    if (activeOnly !== null) {\n      params = params.set('active', activeOnly.toString());\n    }\n\n    return this.medhaHttp.get<UserResponse[]>(this.apiUrl, { params }).pipe(\n      map(users => users.map(user => this.mapUserResponseToUser(user)))\n    );\n  }\n\n  /**\n   * Get a specific user by ID\n   */\n  getUserById(id: any): Observable<User> {\n    return this.medhaHttp.get<UserResponse>(`${this.apiUrl}/${id}`).pipe(\n      map(user => this.mapUserResponseToUser(user))\n    );\n  }\n\n  /**\n   * Create a new user\n   */\n  addUser(user: User, upsert: boolean = false): Observable<User> {\n    // Convert frontend model to backend model\n    const userRequest = this.mapUserToUserRequest(user);\n    \n    // Add upsert parameter if needed\n    const url = upsert ? `${this.apiUrl}?upsert=true` : this.apiUrl;\n    \n    return this.medhaHttp.post<UserResponse>(url, userRequest).pipe(\n      map(response => this.mapUserResponseToUser(response)),\n      catchError(error => {\n        console.error('Error creating user:', error);\n        \n        // Handle specific error cases without automatic retry\n        if (error.status === 409) {\n          // User already exists - return clear error message\n          const errorMessage = upsert ? 'User update failed due to conflict' : 'User already exists. Please use update instead.';\n          throw { ...error, message: errorMessage };\n        } else if (error.status === 400) {\n          // Bad request - likely validation error\n          const errorMessage = error.error?.message || 'Invalid user data provided';\n          throw { ...error, message: errorMessage };\n        }\n        \n        throw error;\n      })\n    );\n  }\n\n  /**\n   * Update an existing user\n   */\n  updateUser(user: User): Observable<User> {\n    // Convert frontend model to backend model\n    const userRequest = this.mapUserToUserRequest(user);\n    \n    \n    return this.medhaHttp.put<UserResponse>(`${this.apiUrl}/${user.id}`, userRequest).pipe(\n      map(response => {\n        return this.mapUserResponseToUser(response);\n      }),\n      catchError(error => {\n        console.error(`Error updating user ${user.id}:`, error);\n        \n        // Handle specific error cases\n        if (error.status === 409) {\n          // Conflict - user/group already exists, but update was successful\n          console.warn(`Conflict when updating user ${user.id}, but operation may have succeeded`);\n          throw { ...error, message: 'User updated successfully despite conflict' };\n        } else if (error.status === 400) {\n          // Bad request - likely validation error\n          const errorMessage = error.error?.message || 'Invalid user data provided';\n          throw { ...error, message: errorMessage };\n        }\n        \n        throw error;\n      })\n    );\n  }\n\n  /**\n   * Delete a user\n   */\n  deleteUser(id: string): Observable<any> {\n    return this.medhaHttp.delete(`${this.apiUrl}/${id}`).pipe(\n      map(response => {\n        // Return true to indicate success\n        return true;\n      }),\n      catchError(error => {\n        console.error(`Error deleting user/group ${id}:`, error);\n        throw error;\n      })\n    );\n  }\n\n  /**\n   * Get all user groups\n   */\n  getGroups(skip: number = 0, limit?: number, activeOnly?: boolean): Observable<UserGroup[]> {\n    let params = new HttpParams()\n      .set('skip', skip.toString())\n      .set('user_type', 'USERGROUP');\n    \n    if (limit !== undefined) {\n      params = params.set('limit', limit.toString());\n    }\n    \n    if (activeOnly !== undefined && activeOnly !== null) {\n      params = params.set('active', activeOnly.toString());\n    }\n\n    return this.medhaHttp.get<UserResponse[]>(this.apiUrl, { params }).pipe(\n      map(users => users.map(user => this.mapUserResponseToUserGroup(user)))\n    );\n  }\n\n  /**\n   * Get members of a specific user group\n   */\n  getGroupMembers(groupId: string): Observable<User[]> {\n    return this.medhaHttp.get<{group_id: string, members: UserResponse[]}>(`${this.config.apiUrl}/usergroups/${groupId}/members`).pipe(\n      map(response => response.members.map(user => this.mapUserResponseToUser(user)))\n    );\n  }\n\n  /**\n   * Get groups a user belongs to\n   */\n  getUserGroups(userId: string): Observable<UserGroup[]> {\n    return this.medhaHttp.get<{user_id: string, groups: UserResponse[]}>(`${this.apiUrl}/${userId}/groups`).pipe(\n      map(response => response.groups.map(group => this.mapUserResponseToUserGroup(group)))\n    );\n  }\n\n  /**\n   * Helper to map backend response to frontend User model\n   */\n  private mapUserResponseToUser(response: UserResponse): User {\n    // Get user fields from direct properties or from metadata\n    const first_name = response.first_name || response.user_metadata?.first_name || '';\n    const last_name = response.last_name || response.user_metadata?.last_name || '';\n    const email = response.email || response.user_metadata?.email || '';\n    const department = response.department || response.user_metadata?.department || '';\n    const role = response.role || response.user_metadata?.role || '';\n    const manager_id = response.manager_id || response.user_metadata?.manager_id || '';\n    \n    return {\n      id: response.id,\n      type: response.type,\n      expression: response.expression,\n      active: response.active,\n      first_name: first_name,\n      last_name: last_name,\n      email: email,\n      department: department,\n      role: role,\n      manager_id: manager_id,\n      parent_group_id: response.parent_group_id,\n      owner_id: response.owner_id,\n      description: response.description,\n      user_metadata: response.user_metadata,\n      created_at: response.created_at,\n      updated_at: response.updated_at,\n      \n      // Computed properties for UI\n      name: `${first_name} ${last_name}`.trim() || response.user_metadata?.name || response.id,\n      status: response.active ? 'Active' : 'Inactive',\n      // The following would be populated separately via API calls or computed data\n      artifacts: 0,\n      groups: 0,\n      reportingTo: manager_id\n    };\n  }\n\n  /**\n   * Helper to map backend response to frontend UserGroup model\n   */\n  private mapUserResponseToUserGroup(response: UserResponse): UserGroup {\n    // Better name resolution for groups\n    let groupName = response.id; // Default to ID\n    \n    // Try to get name from various sources\n    if (response.user_metadata?.name) {\n      groupName = response.user_metadata.name as string;\n    } else if (response.first_name || response.last_name) {\n      groupName = `${response.first_name || ''} ${response.last_name || ''}`.trim();\n    } else if (response.description) {\n      groupName = response.description;\n    }\n    \n    return {\n      id: response.id,\n      type: 'USERGROUP',\n      expression: response.expression || '',\n      active: response.active,\n      name: groupName,\n      description: response.description,\n      parent_group_id: response.parent_group_id,\n      owner_id: response.owner_id,\n      user_metadata: response.user_metadata,\n      created_at: response.created_at,\n      updated_at: response.updated_at,\n      \n      // This would be populated separately via API calls\n      memberCount: 0\n    };\n  }\n\n  /**\n   * Get unique departments from all users\n   */\n  getDepartments(): Observable<string[]> {\n    return this.getUsers().pipe(\n      map(users => {\n        const departments = users\n          .map(user => user.department)\n          .filter((dept): dept is string => dept !== undefined && dept !== null && dept.trim() !== '')\n          .filter((dept, index, arr) => arr.indexOf(dept) === index)\n          .sort();\n        return departments;\n      }),\n      catchError(error => {\n        console.error('Error loading departments:', error);\n        return of([]);\n      })\n    );\n  }\n\n  /**\n   * Get unique roles from all users\n   */\n  getRoles(): Observable<string[]> {\n    return this.getUsers().pipe(\n      map(users => {\n        const roles = users\n          .map(user => user.role)\n          .filter((role): role is string => role !== undefined && role !== null && role.trim() !== '')\n          .filter((role, index, arr) => arr.indexOf(role) === index)\n          .sort();\n        return roles;\n      }),\n      catchError(error => {\n        console.error('Error loading roles:', error);\n        return of([]);\n      })\n    );\n  }\n\n  /**\n   * Helper to map frontend User model to backend request format\n   */\n  private mapUserToUserRequest(user: User): any {\n    // Determine if this is a user or group based on type field\n    const isGroup = user.type === 'USERGROUP';\n    \n    // Convert status string to boolean active field if it exists\n    let active = user.active;\n    if (user.status !== undefined) {\n      active = user.status === 'Active';\n    }\n    \n    // Now that we've updated the backend, send all fields directly\n    // Convert empty strings to null for foreign keys\n    const manager_id = !user.manager_id || user.manager_id === '' ? null : user.manager_id;\n    const parent_group_id = !user.parent_group_id || user.parent_group_id === '' ? null : user.parent_group_id;\n    const owner_id = !user.owner_id || user.owner_id === '' ? null : user.owner_id;\n    \n    return {\n      id: user.id,\n      type: user.type,\n      active: active === undefined ? true : active,\n      expression: user.expression,\n      first_name: user.first_name,\n      last_name: user.last_name,\n      email: user.email,\n      department: user.department,\n      role: user.role,\n      manager_id: manager_id,\n      parent_group_id: parent_group_id,\n      owner_id: owner_id,\n      description: user.description,\n      // Still include user_metadata with duplicated fields for backward compatibility\n      user_metadata: {\n        ...(user.user_metadata || {}),\n        // For user groups, use the name field directly, for users use first_name + last_name\n        name: isGroup ? (user.name || '') : `${user.first_name || ''} ${user.last_name || ''}`.trim(),\n        first_name: user.first_name,\n        last_name: user.last_name,\n        email: user.email,\n        department: user.department,\n        role: user.role,\n        manager_id: user.manager_id\n      }\n    };\n  }\n}","import { Injectable, Inject } from '@angular/core';\r\nimport { HttpParams } from '@angular/common/http';\r\nimport { Observable, of } from 'rxjs';\r\nimport { map, catchError } from 'rxjs/operators';\r\nimport { UserGroup, GroupMember } from '../models/group.model';\r\nimport { MEDHA_ONE_ACCESS_CONFIG } from '../config/medha-config.token';\r\nimport { MedhaOneAccessConfig } from '../config/medha-config.interface';\r\nimport { MedhaHttpService } from './medha-http.service';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class GroupService {\r\n  private apiUrl: string;\r\n  private userGroupsUrl: string;\r\n\r\n  constructor(\r\n    private medhaHttp: MedhaHttpService,\r\n    @Inject(MEDHA_ONE_ACCESS_CONFIG) private config: MedhaOneAccessConfig\r\n  ) {\r\n    this.apiUrl = `${config.apiUrl}/users`;\r\n    this.userGroupsUrl = `${config.apiUrl}/usergroups`;\r\n  }\r\n\r\n  getGroups(skip: number = 0, limit?: number, activeOnly?: any): Observable<UserGroup[]> {\r\n    let params = new HttpParams()\r\n      .set('skip', skip.toString())\r\n      .set('user_type', 'USERGROUP');\r\n    \r\n    if (limit !== undefined) {\r\n      params = params.set('limit', limit.toString());\r\n    }\r\n    \r\n    if (activeOnly !== undefined && activeOnly !== null) {\r\n      params = params.set('active', activeOnly.toString());\r\n    }\r\n\r\n    return this.medhaHttp.get<any[]>(this.apiUrl, { params }).pipe(\r\n      map(response => response.map(group => this.mapResponseToUserGroup(group))),\r\n      catchError(error => {\r\n        console.error('Error fetching groups:', error);\r\n        return of([]);\r\n      })\r\n    );\r\n  }\r\n\r\n  getGroupById(id: string): Observable<UserGroup | undefined> {\r\n    return this.medhaHttp.get<any>(`${this.apiUrl}/${id}`).pipe(\r\n      map(group => this.mapResponseToUserGroup(group)),\r\n      catchError(error => {\r\n        console.error(`Error fetching group with id ${id}:`, error);\r\n        return of(undefined);\r\n      })\r\n    );\r\n  }\r\n\r\n  getGroupMembers(groupId: string): Observable<GroupMember[]> {\r\n    return this.medhaHttp.get<{group_id: string, members: any[]}>(`${this.userGroupsUrl}/${groupId}/members`).pipe(\r\n      map(response => response.members.map(member => this.mapResponseToGroupMember(member, groupId))),\r\n      catchError(error => {\r\n        console.error(`Error fetching members for group ${groupId}:`, error);\r\n        return of([]);\r\n      })\r\n    );\r\n  }\r\n\r\n  addGroup(group: UserGroup, upsert: boolean = false): Observable<UserGroup> {\r\n    const groupRequest = {\r\n      id: group.id,\r\n      type: 'USERGROUP',\r\n      name: group.name || '',\r\n      expression: group.expression || '',\r\n      active: group.status === 'Active',\r\n      description: group.description || '',\r\n      user_metadata: {\r\n        name: group.name || '',\r\n        description: group.description || ''\r\n      }\r\n    };\r\n\r\n    // Add upsert parameter if needed\r\n    const url = upsert ? `${this.apiUrl}?upsert=true` : this.apiUrl;\r\n    \r\n    return this.medhaHttp.post<any>(url, groupRequest).pipe(\r\n      map(response => this.mapResponseToUserGroup(response)),\r\n      catchError(error => {\r\n        console.error('Error creating group:', error);\r\n        \r\n        // If we get a 409 conflict and haven't tried upsert yet, retry with upsert\r\n        if (error.status === 409 && !upsert && error.error?.message?.includes('already exists')) {\r\n          console.warn('Group already exists, retrying with upsert...');\r\n          return this.addGroup(group, true);\r\n        } else if (error.status === 409) {\r\n          // Conflict but upsert was already tried, or it's a different conflict\r\n          throw { ...error, message: 'Group created/updated successfully despite conflict' };\r\n        } else if (error.status === 400) {\r\n          // Bad request - likely validation error\r\n          const errorMessage = error.error?.message || 'Invalid group data provided';\r\n          throw { ...error, message: errorMessage };\r\n        }\r\n        \r\n        throw error;\r\n      })\r\n    );\r\n  }\r\n\r\n  updateGroup(group: UserGroup): Observable<UserGroup> {\r\n    const groupRequest = {\r\n      type: 'USERGROUP',\r\n      expression: group.expression || '',\r\n      active: group.status === 'Active',\r\n      description: group.description,\r\n      user_metadata: {\r\n        name: group.name\r\n      }\r\n    };\r\n\r\n    return this.medhaHttp.put<any>(`${this.apiUrl}/${group.id}`, groupRequest).pipe(\r\n      map(response => this.mapResponseToUserGroup(response)),\r\n      catchError(error => {\r\n        console.error(`Error updating group ${group.id}:`, error);\r\n        \r\n        // Handle specific error cases\r\n        if (error.status === 409) {\r\n          // Conflict - user/group already exists, but update was successful\r\n          console.warn(`Conflict when updating group ${group.id}, but operation may have succeeded`);\r\n          // Still throw the error but with better message\r\n          throw { ...error, message: 'Group updated successfully despite conflict' };\r\n        } else if (error.status === 400) {\r\n          // Bad request - likely validation error\r\n          const errorMessage = error.error?.message || 'Invalid group data provided';\r\n          throw { ...error, message: errorMessage };\r\n        }\r\n        \r\n        throw error;\r\n      })\r\n    );\r\n  }\r\n\r\n  deleteGroup(id: string): Observable<boolean> {\r\n    return this.medhaHttp.delete<any>(`${this.apiUrl}/${id}`).pipe(\r\n      map(response => true),\r\n      catchError(error => {\r\n        console.error(`Error deleting group ${id}:`, error);\r\n        return of(false);\r\n      })\r\n    );\r\n  }\r\n\r\n  addMemberToGroup(groupId: string, userId: string): Observable<boolean> {\r\n    // This would need to update the expression of the group to include the user\r\n    return this.getGroupById(groupId).pipe(\r\n      map(group => {\r\n        if (!group) return false;\r\n        \r\n        // Create the updated expression\r\n        const currentExpression = group.expression || '';\r\n        const updatedExpression = currentExpression ? `${currentExpression}+${userId}` : userId;\r\n        \r\n        const updatedGroup = {\r\n          ...group,\r\n          expression: updatedExpression\r\n        };\r\n        \r\n        // Update the group with the new expression\r\n        this.updateGroup(updatedGroup).subscribe();\r\n        return true;\r\n      }),\r\n      catchError(error => {\r\n        console.error(`Error adding member ${userId} to group ${groupId}:`, error);\r\n        return of(false);\r\n      })\r\n    );\r\n  }\r\n\r\n  removeMemberFromGroup(groupId: string, userId: string): Observable<boolean> {\r\n    // This would need to update the expression of the group to exclude the user\r\n    return this.getGroupById(groupId).pipe(\r\n      map(group => {\r\n        if (!group) return false;\r\n        \r\n        // Create the updated expression\r\n        const currentExpression = group.expression || '';\r\n        if (!currentExpression.includes(userId)) return false;\r\n        \r\n        // Update the expression to exclude the user (this is simplified and would need a proper parser)\r\n        // For a simple approach, we'll add a negative for this user\r\n        const updatedExpression = `${currentExpression}-${userId}`;\r\n        \r\n        const updatedGroup = {\r\n          ...group,\r\n          expression: updatedExpression\r\n        };\r\n        \r\n        // Update the group with the new expression\r\n        this.updateGroup(updatedGroup).subscribe();\r\n        return true;\r\n      }),\r\n      catchError(error => {\r\n        console.error(`Error removing member ${userId} from group ${groupId}:`, error);\r\n        return of(false);\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Helper to map API response to UserGroup model\r\n   */\r\n  private mapResponseToUserGroup(response: any): UserGroup {\r\n    if (!response) return {} as UserGroup;\r\n    \r\n    return {\r\n      id: response.id,\r\n      name: response.user_metadata?.name || response.id,\r\n      description: response.description || '',\r\n      expression: response.expression || '',\r\n      memberCount: 0, // This will be populated separately if needed\r\n      status: response.active ? 'Active' : 'Inactive',\r\n      createdAt: response.created_at ? new Date(response.created_at) : undefined,\r\n      updatedAt: response.updated_at ? new Date(response.updated_at) : undefined\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Helper to map API response to GroupMember model\r\n   */\r\n  private mapResponseToGroupMember(response: any, groupId: string): GroupMember {\r\n    return {\r\n      userId: response.id,\r\n      userName: `${response.first_name || ''} ${response.last_name || ''}`.trim() || response.id,\r\n      email: response.email || '',\r\n      addedAt: response.created_at ? new Date(response.created_at) : new Date(),\r\n      directMember: true // This information might need to come from the API\r\n    };\r\n  }\r\n}","import { Injectable, Inject } from '@angular/core';\nimport { HttpParams } from '@angular/common/http';\nimport { Observable, of } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\nimport { Artifact, ArtifactGroup } from '../models/artifact.model';\nimport { MEDHA_ONE_ACCESS_CONFIG } from '../config/medha-config.token';\nimport { MedhaOneAccessConfig } from '../config/medha-config.interface';\nimport { MedhaHttpService } from './medha-http.service';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class ArtifactService {\n  private apiUrl: string;\n  private resourceGroupsUrl: string;\n\n  constructor(\n    private medhaHttp: MedhaHttpService,\n    @Inject(MEDHA_ONE_ACCESS_CONFIG) private config: MedhaOneAccessConfig\n  ) {\n    this.apiUrl = `${config.apiUrl}/artifacts`;\n    this.resourceGroupsUrl = `${config.apiUrl}/resourcegroups`;\n  }\n\n  getArtifacts(skip: number = 0, limit?: number, activeOnly: any = null, applicationName?: string): Observable<Artifact[]> {\n    let params = new HttpParams()\n      .set('skip', skip.toString());\n    \n    if (limit !== undefined) {\n      params = params.set('limit', limit.toString());\n    }\n    \n    if (activeOnly !== null) {\n      params = params.set('active', activeOnly.toString());\n    }\n    \n    if (applicationName) {\n      params = params.set('application_name', applicationName);\n    }\n\n    return this.medhaHttp.get<any[]>(this.apiUrl, { params }).pipe(\n      map(response => response.map(artifact => this.mapResponseToArtifact(artifact))),\n      catchError(error => {\n        console.error('Error fetching artifacts:', error);\n        return of([]);\n      })\n    );\n  }\n\n  getArtifactById(id: string): Observable<Artifact | undefined> {\n    return this.medhaHttp.get<any>(`${this.apiUrl}/${id}`).pipe(\n      map(artifact => this.mapResponseToArtifact(artifact)),\n      catchError(error => {\n        console.error(`Error fetching artifact with id ${id}:`, error);\n        return of(undefined);\n      })\n    );\n  }\n\n  getArtifactGroups(skip: number = 0, limit?: number, activeOnly: boolean = true, applicationName?: string): Observable<ArtifactGroup[]> {\n    let params = new HttpParams()\n      .set('skip', skip.toString())\n      .set('artifact_type', 'RESOURCEGROUP');\n    \n    if (limit !== undefined) {\n      params = params.set('limit', limit.toString());\n    }\n    \n    if (activeOnly !== null) {\n      params = params.set('active', activeOnly.toString());\n    }\n    \n    if (applicationName) {\n      params = params.set('application_name', applicationName);\n    }\n\n    return this.medhaHttp.get<any[]>(this.apiUrl, { params }).pipe(\n      map(response => response.map(group => this.mapResponseToArtifactGroup(group))),\n      catchError(error => {\n        console.error('Error fetching artifact groups:', error);\n        return of([]);\n      })\n    );\n  }\n\n  getArtifactGroupById(id: string): Observable<ArtifactGroup | undefined> {\n    return this.medhaHttp.get<any>(`${this.apiUrl}/${id}`).pipe(\n      map(group => this.mapResponseToArtifactGroup(group)),\n      catchError(error => {\n        console.error(`Error fetching artifact group with id ${id}:`, error);\n        return of(undefined);\n      })\n    );\n  }\n\n  getArtifactGroupContents(groupId: string): Observable<Artifact[]> {\n    return this.medhaHttp.get<{group_id: string, contents: any[]}>(`${this.resourceGroupsUrl}/${groupId}/contents`).pipe(\n      map(response => response.contents.map(artifact => this.mapResponseToArtifact(artifact))),\n      catchError(error => {\n        console.error(`Error fetching contents for group ${groupId}:`, error);\n        return of([]);\n      })\n    );\n  }\n\n  getGroupsForArtifact(artifactId: string): Observable<ArtifactGroup[]> {\n    return this.medhaHttp.get<{artifact_id: string, groups: any[]}>(`${this.apiUrl}/${artifactId}/groups`).pipe(\n      map(response => response.groups.map(group => this.mapResponseToArtifactGroup(group))),\n      catchError(error => {\n        console.error(`Error fetching groups for artifact ${artifactId}:`, error);\n        return of([]);\n      })\n    );\n  }\n\n  getUniqueApplications(): Observable<string[]> {\n    return this.getArtifacts().pipe(\n      map(artifacts => {\n        const applications = artifacts\n          .filter(artifact => artifact.application && artifact.application.trim() !== '')\n          .map(artifact => artifact.application)\n          .filter(application => application !== undefined) as string[];\n        \n        // Remove duplicates and sort\n        return Array.from(new Set(applications)).sort();\n      }),\n      catchError(error => {\n        console.error('Error fetching unique applications:', error);\n        return of([]);\n      })\n    );\n  }\n\n  addArtifact(artifact: Artifact): Observable<Artifact> {\n    const artifactRequest = this.mapArtifactToRequest(artifact);\n\n    return this.medhaHttp.post<any>(this.apiUrl, artifactRequest).pipe(\n      map(response => this.mapResponseToArtifact(response)),\n      catchError(error => {\n        console.error('Error creating artifact:', error);\n        throw error;\n      })\n    );\n  }\n\n  updateArtifact(artifact: Artifact): Observable<Artifact> {\n    const artifactRequest = this.mapArtifactToRequest(artifact);\n\n    return this.medhaHttp.put<any>(`${this.apiUrl}/${artifact.id}`, artifactRequest).pipe(\n      map(response => this.mapResponseToArtifact(response)),\n      catchError(error => {\n        console.error(`Error updating artifact ${artifact.id}:`, error);\n        throw error;\n      })\n    );\n  }\n\n  deleteArtifact(id: string): Observable<boolean> {\n    return this.medhaHttp.delete<any>(`${this.apiUrl}/${id}`).pipe(\n      map(response => true),\n      catchError(error => {\n        console.error(`Error deleting artifact ${id}:`, error);\n        return of(false);\n      })\n    );\n  }\n\n  /**\n   * Helper to map API response to Artifact model\n   */\n  private mapResponseToArtifact(response: any): Artifact {\n    if (!response) return {} as Artifact;\n    \n    const isResource = response.type === 'RESOURCE';\n    const isGroup = response.type === 'RESOURCEGROUP';\n    \n    return {\n      id: response.id,\n      name: response.name || response.artifact_metadata?.name || response.id,\n      description: response.description || '',\n      type: response.type,\n      application: response.application || '',\n      status: response.active ? 'Active' : 'Inactive',\n      artifactCount: isGroup ? 0 : undefined, // Will be populated separately\n      expression: isGroup ? response.expression : undefined,\n      permissions: [], // Will be populated separately\n      owner_id: response.owner_id,\n      parent_group_id: response.parent_group_id,\n      artifactMetadata: response.artifact_metadata || {}, // Include full metadata\n      createdAt: response.created_at ? new Date(response.created_at) : undefined,\n      updatedAt: response.updated_at ? new Date(response.updated_at) : undefined\n    };\n  }\n\n  /**\n   * Helper to map API response to ArtifactGroup model\n   */\n  private mapResponseToArtifactGroup(response: any): ArtifactGroup {\n    if (!response) return {} as ArtifactGroup;\n    \n    return {\n      id: response.id,\n      name: response.name || response.artifact_metadata?.name || response.id,\n      description: response.description || '',\n      status: response.active ? 'Active' : 'Inactive',\n      artifactCount: 0, // Will be populated separately if needed\n      application: response.application || '',\n      expression: response.expression || '',\n      type: 'RESOURCEGROUP',\n      createdAt: response.created_at ? new Date(response.created_at) : undefined,\n      updatedAt: response.updated_at ? new Date(response.updated_at) : undefined\n    };\n  }\n\n  /**\n   * Helper to generate ID from name as fallback\n   */\n  private generateIdFromName(name: string): string {\n    if (!name || name.trim() === '') {\n      return `artifact_${Date.now()}`;\n    }\n    \n    // Create ID from name: lowercase, replace spaces/special chars with underscores\n    let baseId = name.trim().toLowerCase()\n      .replace(/[^a-zA-Z0-9_]/g, '_')  // Replace non-alphanumeric with underscore\n      .replace(/_+/g, '_')            // Replace multiple underscores with single\n      .replace(/^_|_$/g, '');         // Remove leading/trailing underscores\n    \n    // Add timestamp to ensure uniqueness\n    const timestamp = Date.now().toString().slice(-6);\n    return `${baseId}_${timestamp}`;\n  }\n\n  /**\n   * Helper to map frontend model to backend request format\n   */\n  private mapArtifactToRequest(artifact: Artifact): any {\n    // Convert status string to boolean active field\n    const active = artifact.status === 'Active';\n\n    // Handle null/empty values for foreign keys\n    const owner_id = !artifact.owner_id || artifact.owner_id === '' ? null : artifact.owner_id;\n    const parent_group_id = !artifact.parent_group_id || artifact.parent_group_id === '' ? null : artifact.parent_group_id;\n    \n    const isGroup = artifact.type === 'RESOURCEGROUP';\n    \n    // Ensure ID is present - generate if empty\n    let artifactId = artifact.id;\n    if (!artifactId || artifactId.trim() === '') {\n      artifactId = this.generateIdFromName(artifact.name);\n    }\n    \n    // Start with base metadata (no longer including application in metadata)\n    const artifactMetadata: any = {};\n    \n    // Add any additional metadata if available\n    if (artifact.artifactMetadata) {\n      Object.assign(artifactMetadata, artifact.artifactMetadata);\n    }\n    \n    const request: any = {\n      id: artifactId,\n      type: artifact.type,\n      name: artifact.name || '',\n      description: artifact.description || '',\n      application: artifact.application || '',\n      active: active,\n      artifact_metadata: artifactMetadata\n    };\n    \n    // Only include expression for resource groups\n    if (isGroup && artifact.expression) {\n      request.expression = artifact.expression;\n    }\n    \n    // Include optional fields if present\n    if (owner_id) request.owner_id = owner_id;\n    if (parent_group_id) request.parent_group_id = parent_group_id;\n    \n    return request;\n  }\n}","import { Injectable } from '@angular/core';\nimport { Observable, of, forkJoin } from 'rxjs';\nimport { map, catchError, switchMap } from 'rxjs/operators';\nimport { UserService } from './user.service';\nimport { GroupService } from './group.service';\nimport { ArtifactService } from './artifact.service';\n\nexport interface ExpressionOperation {\n  type: 'include' | 'exclude';\n  entity: string;\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class ExpressionParserService {\n  constructor(\n    private userService: UserService,\n    private groupService: GroupService,\n    private artifactService: ArtifactService\n  ) { }\n\n  /**\n   * Parse an expression into a list of operations\n   */\n  parseExpression(expression: string): ExpressionOperation[] {\n    if (!expression) {\n      return [];\n    }\n\n    const operations: ExpressionOperation[] = [];\n    const regex = /([+-]?)(\".*?\"|[^+-]+)/g;\n    let match;\n    let isFirstToken = true;\n\n    while ((match = regex.exec(expression)) !== null) {\n      const [, operator, entity] = match;\n      let trimmedEntity = entity.trim();\n\n      // Remove quotes if present\n      if (trimmedEntity.startsWith('\"') && trimmedEntity.endsWith('\"')) {\n        trimmedEntity = trimmedEntity.slice(1, -1);\n      }\n\n      // First token is always include even if no operator specified\n      if (isFirstToken && !operator) {\n        operations.push({ type: 'include', entity: trimmedEntity });\n      } else if (operator === '+' || !operator) {\n        operations.push({ type: 'include', entity: trimmedEntity });\n      } else if (operator === '-') {\n        operations.push({ type: 'exclude', entity: trimmedEntity });\n      }\n\n      isFirstToken = false;\n    }\n\n    return operations;\n  }\n\n  /**\n   * Validate expression syntax\n   */\n  validateExpression(expression: string): { isValid: boolean, errorMessage?: string } {\n    if (!expression) {\n      return { isValid: true };\n    }\n\n    // Check for invalid characters (only allow: alphanumeric, _, +, -, |, ., @, &, quotes, parentheses, colons, commas, apostrophes, spaces)\n    if (/[^a-zA-Z0-9_+\\-|.@&\"():,'\\s]/.test(expression)) {\n      return { isValid: false, errorMessage: 'Expression contains invalid characters. Only alphanumeric, _, +, -, |, ., @, &, quotes, parentheses, colons, commas, apostrophes, and spaces are allowed' };\n    }\n\n    // Check for unmatched quotes\n    const quoteCount = (expression.match(/\"/g) || []).length;\n    if (quoteCount % 2 !== 0) {\n      return { isValid: false, errorMessage: 'Expression contains unmatched quotes' };\n    }\n\n    // Check for consecutive operators\n    if (/[+-][+-]/.test(expression)) {\n      return { isValid: false, errorMessage: 'Expression contains consecutive operators' };\n    }\n\n    // Check for leading/trailing operators\n    if (expression.startsWith('+') || expression.startsWith('-')) {\n      return { isValid: false, errorMessage: 'Expression cannot start with an operator' };\n    }\n\n    if (expression.endsWith('+') || expression.endsWith('-')) {\n      return { isValid: false, errorMessage: 'Expression cannot end with an operator' };\n    }\n\n    return { isValid: true };\n  }\n\n  /**\n   * Resolve user expression to a set of user IDs\n   */\n  resolveUserExpression(expression: string): Observable<string[]> {\n    const operations = this.parseExpression(expression);\n    if (operations.length === 0) {\n      return of([]);\n    }\n\n    // Process operations sequentially using recursive function\n    return this.processUserOperations(operations, 0, new Set<string>());\n  }\n\n  /**\n   * Resolve resource expression to a set of resource IDs\n   */\n  resolveResourceExpression(expression: string): Observable<string[]> {\n    const operations = this.parseExpression(expression);\n    if (operations.length === 0) {\n      return of([]);\n    }\n\n    // Process operations sequentially using recursive function\n    return this.processResourceOperations(operations, 0, new Set<string>());\n  }\n\n  /**\n   * Process user operations recursively\n   */\n  private processUserOperations(\n    operations: ExpressionOperation[],\n    index: number,\n    resultUsers: Set<string>\n  ): Observable<string[]> {\n    if (index >= operations.length) {\n      return of(Array.from(resultUsers));\n    }\n\n    const operation = operations[index];\n    \n    return this.resolveUserEntity(operation.entity).pipe(\n      switchMap(userIds => {\n        // Apply the operation\n        if (operation.type === 'include') {\n          userIds.forEach(id => resultUsers.add(id));\n        } else if (operation.type === 'exclude') {\n          userIds.forEach(id => resultUsers.delete(id));\n        }\n        \n        // Process the next operation\n        return this.processUserOperations(operations, index + 1, resultUsers);\n      })\n    );\n  }\n\n  /**\n   * Process resource operations recursively\n   */\n  private processResourceOperations(\n    operations: ExpressionOperation[],\n    index: number,\n    resultResources: Set<string>\n  ): Observable<string[]> {\n    if (index >= operations.length) {\n      return of(Array.from(resultResources));\n    }\n\n    const operation = operations[index];\n    \n    return this.resolveResourceEntity(operation.entity).pipe(\n      switchMap(resourceIds => {\n        // Apply the operation\n        if (operation.type === 'include') {\n          resourceIds.forEach(id => resultResources.add(id));\n        } else if (operation.type === 'exclude') {\n          resourceIds.forEach(id => resultResources.delete(id));\n        }\n        \n        // Process the next operation\n        return this.processResourceOperations(operations, index + 1, resultResources);\n      })\n    );\n  }\n\n  /**\n   * Resolve a user entity (user or group) to a set of user IDs\n   */\n  private resolveUserEntity(entityId: string): Observable<string[]> {\n    // First check if it's a direct user\n    return this.userService.getUserById(entityId).pipe(\n      switchMap(user => {\n        if (user && user.type === 'USER') {\n          return of([user.id]);\n        }\n        \n        // If not a direct user, check if it's a group\n        return this.groupService.getGroupById(entityId).pipe(\n          switchMap(group => {\n            if (group && group.expression) {\n              // Recursively resolve the group's expression\n              return this.resolveUserExpression(group.expression);\n            }\n            \n            // If it's a group without an expression, return the group ID itself\n            return of(group ? [group.id] : []);\n          }),\n          catchError(() => of([]))\n        );\n      }),\n      catchError(() => of([]))\n    );\n  }\n\n  /**\n   * Resolve a resource entity (artifact or artifact group) to a set of artifact IDs\n   */\n  private resolveResourceEntity(entityId: string): Observable<string[]> {\n    // First check if it's a direct artifact\n    return this.artifactService.getArtifactById(entityId).pipe(\n      switchMap(artifact => {\n        if (artifact && artifact.type === 'RESOURCE') {\n          return of([artifact.id]);\n        }\n        \n        // If it's a resource group with an expression\n        if (artifact && artifact.type === 'RESOURCEGROUP' && artifact.expression) {\n          // Recursively resolve the resource group's expression\n          return this.resolveResourceExpression(artifact.expression);\n        }\n        \n        // If it's a resource group without an expression, return the group ID itself\n        return of(artifact ? [artifact.id] : []);\n      }),\n      catchError(() => of([]))\n    );\n  }\n\n  /**\n   * Check if a user is a member of a group by resolving the group's expression\n   */\n  isUserInGroup(userId: string, groupId: string): Observable<boolean> {\n    return this.groupService.getGroupById(groupId).pipe(\n      switchMap(group => {\n        if (!group || !group.expression) {\n          return of(false);\n        }\n        \n        return this.resolveUserExpression(group.expression).pipe(\n          map(userIds => userIds.includes(userId))\n        );\n      }),\n      catchError(() => of(false))\n    );\n  }\n\n  /**\n   * Get all groups a user is a member of\n   */\n  getUserGroups(userId: string): Observable<string[]> {\n    return this.groupService.getGroups().pipe(\n      switchMap(groups => {\n        if (!groups || groups.length === 0) {\n          return of([]);\n        }\n        \n        // Check each group to see if user is a member\n        const groupChecks = groups.map(group => \n          this.isUserInGroup(userId, group.id).pipe(\n            map(isMember => isMember ? group.id : null)\n          )\n        );\n        \n        return forkJoin(groupChecks).pipe(\n          map(results => results.filter(id => id !== null) as string[])\n        );\n      }),\n      catchError(() => of([]))\n    );\n  }\n}","import { Injectable } from '@angular/core';\r\nimport { User } from '../models/user.model';\r\n\r\nexport interface ExpressionOperation {\r\n  type: 'include' | 'exclude';\r\n  entity: string;\r\n}\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class SyncExpressionResolverService {\r\n  // Cache for group expressions\r\n  private groupExpressionCache = new Map<string, Set<string>>();\r\n  \r\n  constructor() { }\r\n\r\n  /**\r\n   * Parse an expression into a list of operations\r\n   * Supports quoted entities: \"entity-with-hyphens\"\r\n   */\r\n  parseExpression(expression: string): ExpressionOperation[] {\r\n    if (!expression) {\r\n      return [];\r\n    }\r\n\r\n    const operations: ExpressionOperation[] = [];\r\n    \r\n    // Use regex that handles quoted entities properly: ([+-]?)(\".*?\"|[^+-]+)\r\n    const regex = /([+-]?)(\".*?\"|[^+-]+)/g;\r\n    let match;\r\n    let isFirstToken = true;\r\n\r\n    while ((match = regex.exec(expression)) !== null) {\r\n      const [, operator, rawEntity] = match;\r\n      let entity = rawEntity.trim();\r\n      \r\n      // Remove quotes if present\r\n      if (entity.startsWith('\"') && entity.endsWith('\"')) {\r\n        entity = entity.slice(1, -1);\r\n      }\r\n\r\n      // First token is always include even if no operator specified\r\n      if (isFirstToken && !operator) {\r\n        operations.push({ type: 'include', entity });\r\n      } else if (operator === '+' || !operator) {\r\n        operations.push({ type: 'include', entity });\r\n      } else if (operator === '-') {\r\n        operations.push({ type: 'exclude', entity });\r\n      }\r\n\r\n      isFirstToken = false;\r\n    }\r\n\r\n    return operations;\r\n  }\r\n\r\n  /**\r\n   * Check if a user is referenced in an expression (directly or indirectly)\r\n   */\r\n  isUserInExpression(userId: string, expression: string, allGroups: { id: string, expression?: string }[]): boolean {\r\n    // console.log(`Checking if user ${userId} is in expression: ${expression}`);\r\n    \r\n    // If expression is empty, user is not in group\r\n    if (!expression) return false;\r\n\r\n    // Cache to avoid circular references\r\n    const visitedGroups = new Set<string>();\r\n    \r\n    // Inner function to recursively check expressions\r\n    const checkExpression = (expr: string, depth = 0): boolean => {\r\n      // Prevent infinite recursion\r\n      if (depth > 10) {\r\n        console.warn('Maximum recursion depth reached when resolving expressions');\r\n        return false;\r\n      }\r\n      \r\n      // Get operations from expression\r\n      const operations = this.parseExpression(expr);\r\n      // console.log(`  Parsed ${operations.length} operations at depth ${depth}`);\r\n      \r\n      // Result variables\r\n      let userIncluded = false;\r\n      \r\n      // Process operations in order\r\n      for (const op of operations) {\r\n        const entityId = op.entity.trim();\r\n        // console.log(`  Processing ${op.type} ${entityId}`);\r\n        \r\n        // Direct user reference\r\n        if (entityId === userId) {\r\n          if (op.type === 'include') {\r\n            userIncluded = true;\r\n          } else if (op.type === 'exclude') {\r\n            userIncluded = false;\r\n          }\r\n          continue;\r\n        }\r\n        \r\n        // Group reference\r\n        const isGroupReference = allGroups.some(g => g.id === entityId);\r\n        if (isGroupReference && !visitedGroups.has(entityId)) {\r\n          // Find the referenced group\r\n          const referencedGroup = allGroups.find(g => g.id === entityId);\r\n          \r\n          if (referencedGroup && referencedGroup.expression) {\r\n            // Mark this group as visited to avoid circular references\r\n            visitedGroups.add(entityId);\r\n            \r\n            // Check if user is in the referenced group\r\n            const userInReferencedGroup = checkExpression(referencedGroup.expression, depth + 1);\r\n            \r\n            if (op.type === 'include' && userInReferencedGroup) {\r\n              userIncluded = true;\r\n            } else if (op.type === 'exclude' && userInReferencedGroup) {\r\n              userIncluded = false;\r\n            }\r\n            \r\n            // Remove from visited set after checking (allows for reuse in other branches)\r\n            visitedGroups.delete(entityId);\r\n          }\r\n        }\r\n      }\r\n      \r\n      return userIncluded;\r\n    };\r\n    \r\n    // Start the recursive check\r\n    return checkExpression(expression);\r\n  }\r\n}","import { Injectable, Inject } from '@angular/core';\nimport { Observable, map, of, combineLatest, forkJoin, switchMap } from 'rxjs';\nimport { MEDHA_ONE_ACCESS_CONFIG } from '../config/medha-config.token';\nimport { MedhaOneAccessConfig } from '../config/medha-config.interface';\nimport { User, UserGroup } from '../models/user.model';\nimport { UserService } from './user.service';\nimport { ExpressionParserService } from './expression-parser.service';\nimport { SyncExpressionResolverService } from './sync-expression-resolver.service';\nimport { MedhaHttpService } from './medha-http.service';\n\nexport interface HierarchyNode {\n  id: string;\n  name: string;\n  type: string;\n  parent_id?: string;\n  children?: HierarchyNode[];\n  metadata?: any;\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class HierarchyService {\n  private apiUrl: string;\n\n  constructor(\n    private medhaHttp: MedhaHttpService,\n    private userService: UserService,\n    private expressionParser: ExpressionParserService,\n    private syncExpressionResolver: SyncExpressionResolverService,\n    @Inject(MEDHA_ONE_ACCESS_CONFIG) private config: MedhaOneAccessConfig\n  ) {\n    this.apiUrl = config.apiUrl;\n  }\n\n  /**\n   * Get the reporting structure for a user\n   * @param userId User ID to get structure for\n   * @param levelsUp Number of levels to go up in hierarchy\n   * @param levelsDown Number of levels to go down in hierarchy\n   */\n  getReportingStructure(userId: string, levelsUp: number = 1, levelsDown: number = 2): Observable<any> {\n    return this.medhaHttp.get(`${this.apiUrl}/reporting/structure/${userId}`, {\n      params: { levels_up: levelsUp.toString(), levels_down: levelsDown.toString() }\n    });\n  }\n\n  /**\n   * Get the organization chart from top level down\n   */\n  getOrganizationChart(): Observable<any> {\n    return this.medhaHttp.get(`${this.apiUrl}/reporting/organization-chart`);\n  }\n\n  /**\n   * Build a hierarchical structure of users and their reports\n   */\n  buildUserHierarchy(): Observable<HierarchyNode[]> {\n    return this.userService.getUsers().pipe(\n      map(users => this.constructUserHierarchyTree(users))\n    );\n  }\n\n  /**\n   * Build a hierarchical structure of groups and their relationships\n   */\n  buildGroupHierarchy(): Observable<HierarchyNode[]> {\n    return this.userService.getGroups().pipe(\n      map(groups => this.constructGroupHierarchyTree(groups))\n    );\n  }\n\n  /**\n   * Build a combined user and group hierarchy\n   */\n  buildCombinedHierarchy(): Observable<HierarchyNode[]> {\n    // console.log('Building combined hierarchy...');\n    \n    // First get all groups and users\n    return forkJoin([\n      this.userService.getGroups(),\n      this.userService.getUsers()\n    ]).pipe(\n      // Then build a unified hierarchy\n      map(([groups, users]) => {\n        // console.log(`Got ${groups.length} groups and ${users.length} users`);\n        // Create map of group ID to node\n        const groupNodeMap = new Map<string, HierarchyNode>();\n        const groupChildrenMap = new Map<string, string[]>(); \n        const referencedGroups = new Set<string>();\n        \n        // console.log('Creating group nodes and determining relationships');\n        // First, create all group nodes\n        groups.forEach(group => {\n          const node: HierarchyNode = {\n            id: group.id,\n            name: this.getGroupDisplayName(group),\n            type: 'group',\n            metadata: {\n              description: group.description,\n              expression: group.expression,\n              active: group.active\n            },\n            children: []\n          };\n          \n          groupNodeMap.set(group.id, node);\n          \n          // Use expression parser to find referenced groups\n          if (group.expression) {\n            const operations = this.expressionParser.parseExpression(group.expression);\n            \n            // Process operations to find group references\n            operations.forEach(operation => {\n              const entityId = operation.entity.trim();\n              \n              // If this is a reference to another group\n              if (groups.some(g => g.id === entityId) && operation.type === 'include') {\n                referencedGroups.add(entityId);\n                \n                // Add this as a child of the referenced group\n                if (!groupChildrenMap.has(entityId)) {\n                  groupChildrenMap.set(entityId, []);\n                }\n                groupChildrenMap.get(entityId)?.push(group.id);\n              }\n            });\n          }\n        });\n        \n        // Now build the hierarchy for groups\n        groupNodeMap.forEach((node, groupId) => {\n          // Add children groups\n          if (groupChildrenMap.has(groupId)) {\n            const childGroupIds = groupChildrenMap.get(groupId) || [];\n            childGroupIds.forEach(childId => {\n              const childNode = groupNodeMap.get(childId);\n              if (childNode && !node.children?.includes(childNode)) {\n                if (!node.children) node.children = [];\n                node.children.push(childNode);\n              }\n            });\n          }\n          \n          // Find users that belong to this group via expression\n          // Find the group object that corresponds to this node\n          const currentGroup = groups.find(g => g.id === groupId);\n          if (!currentGroup || !currentGroup.expression) {\n            return; // Skip if we can't find the group or if it has no expression\n          }\n          \n          const userNodes = users\n            .filter(user => this.isUserInGroup(user, currentGroup.expression, groups))\n            .map(user => ({\n              id: user.id,\n              name: this.getUserDisplayName(user),\n              type: 'user',\n              metadata: {\n                email: user.email,\n                role: user.role,\n                department: user.department,\n                active: user.active\n              }\n            }));\n            \n          // Add users to this group's children\n          if (userNodes.length > 0) {\n            if (!node.children) node.children = [];\n            node.children.push(...userNodes);\n          }\n        });\n        \n        // Find top-level groups (not referenced by any other group)\n        const rootGroups = Array.from(groupNodeMap.values())\n          .filter(node => !referencedGroups.has(node.id));\n          \n        // Find users that don't belong to any group\n        const ungroupedUsers = users\n          .filter(user => !this.isUserInAnyGroup(user, groups))\n          .map(user => ({\n            id: user.id,\n            name: this.getUserDisplayName(user),\n            type: 'user',\n            metadata: {\n              email: user.email,\n              role: user.role,\n              department: user.department,\n              active: user.active\n            }\n          }));\n          \n        // Create a proper organization structure\n        \n        // First add all groups as roots\n        const allGroups = Array.from(groupNodeMap.values());\n        // console.log(`Total of ${allGroups.length} groups`);\n        // console.log(`Found ${rootGroups.length} top-level groups`);\n        // console.log(`Found ${ungroupedUsers.length} ungrouped users`);\n        \n        // Build a more detailed hierarchy\n        // Always use ALL groups as direct children of the root node to ensure all groups are visible\n        const rootNodes: HierarchyNode[] = [\n          {\n            id: 'groups_root',\n            name: 'Groups',\n            type: 'root',\n            children: allGroups // Always show all groups directly under the root\n          }\n        ];\n        \n        // Only add ungrouped users if there are any\n        if (ungroupedUsers.length > 0) {\n          rootNodes.push({\n            id: 'users_root',\n            name: 'Ungrouped Users',\n            type: 'root',\n            children: ungroupedUsers\n          });\n        }\n        \n        // console.log('Hierarchy structure built with:', rootNodes);\n        return rootNodes;\n      })\n    );\n  }\n\n  /**\n   * Get user's group memberships and map them into the hierarchy\n   */\n  getUserGroupMemberships(userId: string): Observable<HierarchyNode[]> {\n    return this.userService.getUserGroups(userId).pipe(\n      map(groups => {\n        return groups.map(group => ({\n          id: group.id,\n          name: this.getGroupDisplayName(group),\n          type: 'group',\n          metadata: {\n            description: group.description,\n            expression: group.expression,\n            active: group.active\n          }\n        }));\n      })\n    );\n  }\n\n  /**\n   * Helper method to construct a hierarchy tree from flat user data\n   */\n  private constructUserHierarchyTree(users: User[]): HierarchyNode[] {\n    // Create lookup maps\n    const userMap = new Map<string, User>();\n    const nodeMap = new Map<string, HierarchyNode>();\n    const childrenMap = new Map<string, string[]>();\n    \n    // First pass - create nodes and identify parent-child relationships\n    users.forEach(user => {\n      const userName = this.getUserDisplayName(user);\n      userMap.set(user.id, user);\n      \n      // Create node\n      const node: HierarchyNode = {\n        id: user.id,\n        name: userName,\n        type: 'user',\n        metadata: {\n          email: user.email,\n          role: user.role,\n          department: user.department,\n          active: user.active\n        }\n      };\n      \n      // Set parent relationship if exists\n      if (user.manager_id) {\n        node.parent_id = user.manager_id;\n        \n        // Add to children map\n        if (!childrenMap.has(user.manager_id)) {\n          childrenMap.set(user.manager_id, []);\n        }\n        childrenMap.get(user.manager_id)?.push(user.id);\n      } else if (user.reportingTo) {\n        // Try to find manager by name\n        const manager = Array.from(userMap.values()).find(u => \n          this.getUserDisplayName(u) === user.reportingTo\n        );\n        if (manager) {\n          node.parent_id = manager.id;\n          \n          // Add to children map\n          if (!childrenMap.has(manager.id)) {\n            childrenMap.set(manager.id, []);\n          }\n          childrenMap.get(manager.id)?.push(user.id);\n        }\n      }\n      \n      // Store node\n      nodeMap.set(user.id, node);\n    });\n    \n    // Second pass - build tree structure\n    const rootNodes: HierarchyNode[] = [];\n    nodeMap.forEach((node, id) => {\n      if (!node.parent_id) {\n        // This is a root node\n        rootNodes.push(node);\n      }\n      \n      // Add children if any\n      if (childrenMap.has(id)) {\n        node.children = childrenMap.get(id)?.map(childId => nodeMap.get(childId)!) || [];\n      }\n    });\n    \n    return rootNodes;\n  }\n\n  /**\n   * Helper method to construct a hierarchy tree from flat group data\n   */\n  private constructGroupHierarchyTree(groups: UserGroup[]): HierarchyNode[] {\n    // Create lookup maps\n    const groupMap = new Map<string, UserGroup>();\n    const nodeMap = new Map<string, HierarchyNode>();\n    const childrenMap = new Map<string, string[]>();\n    const referencedGroups = new Set<string>();\n    \n    // First pass - create nodes and parse expressions using the expression parser\n    groups.forEach(group => {\n      const groupName = this.getGroupDisplayName(group);\n      groupMap.set(group.id, group);\n      \n      // Create node\n      const node: HierarchyNode = {\n        id: group.id,\n        name: groupName,\n        type: 'group',\n        metadata: {\n          description: group.description,\n          expression: group.expression,\n          active: group.active\n        }\n      };\n      \n      nodeMap.set(group.id, node);\n      \n      // Use the expression parser to find referenced groups\n      if (group.expression) {\n        const operations = this.expressionParser.parseExpression(group.expression);\n        \n        // Find operations that reference groups\n        operations.forEach(operation => {\n          const entityId = operation.entity.trim();\n          // Check if this is a reference to another group\n          if (groupMap.has(entityId) || entityId.startsWith('group')) {\n            referencedGroups.add(entityId);\n            \n            // Track parent-child relationship\n            if (!childrenMap.has(entityId)) {\n              childrenMap.set(entityId, []);\n            }\n            childrenMap.get(entityId)?.push(group.id);\n          }\n        });\n      }\n    });\n    \n    // Second pass - build tree structure\n    const rootNodes: HierarchyNode[] = [];\n    nodeMap.forEach((node, id) => {\n      // If this group is not referenced by any other group, it's a top-level node\n      if (!referencedGroups.has(id)) {\n        rootNodes.push(node);\n      }\n      \n      // Add children if any\n      if (childrenMap.has(id)) {\n        node.children = childrenMap.get(id)?.map(childId => nodeMap.get(childId)!) || [];\n      }\n    });\n    \n    return rootNodes;\n  }\n  \n  // Helper method to get user display name\n  private getUserDisplayName(user: User): string {\n    if (user.name) {\n      return user.name;\n    }\n    \n    if (user.first_name || user.last_name) {\n      return `${user.first_name || ''} ${user.last_name || ''}`.trim();\n    }\n    \n    if (user.user_metadata?.name) {\n      return user.user_metadata.name as string;\n    }\n    \n    return user.id;\n  }\n  \n  // Helper to check if a user is in a group via expression\n  private isUserInGroup(user: User, expression?: string, groups: UserGroup[] = []): boolean {\n    if (!expression) return false;\n    \n    // Use the synchronous expression resolver to check if the user is in this expression\n    return this.syncExpressionResolver.isUserInExpression(\n      user.id, \n      expression,\n      groups // Pass the groups array to resolve references\n    );\n  }\n  \n  // Helper to check if a user is in any group\n  private isUserInAnyGroup(user: User, groups: UserGroup[]): boolean {\n    return groups.some(group => this.isUserInGroup(user, group.expression, groups));\n  }\n  \n  // Helper method to get group display name\n  private getGroupDisplayName(group: UserGroup): string {\n    if (group.name) {\n      return group.name;\n    }\n    \n    if (group.user_metadata?.name) {\n      return group.user_metadata.name as string;\n    }\n    \n    return group.id;\n  }\n}","import { Component, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatTreeModule, MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree';\nimport { FlatTreeControl } from '@angular/cdk/tree';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { FormsModule } from '@angular/forms';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { HierarchyService, HierarchyNode } from '../../services/hierarchy.service';\n\ninterface FlatNode {\n  expandable: boolean;\n  name: string;\n  level: number;\n  id: string;\n  type: string;\n  metadata?: any;\n}\n\n@Component({\n  selector: 'app-combined-hierarchy',\n  standalone: true,\n  imports: [\n    CommonModule,\n    MatTreeModule,\n    MatIconModule,\n    MatButtonModule,\n    MatProgressSpinnerModule,\n    MatFormFieldModule,\n    MatInputModule,\n    FormsModule\n  ],\n  template: `\n    <div class=\"combined-hierarchy-container\">\n      <div class=\"header-container\">\n        <h3>Organization Structure</h3>\n        <mat-form-field class=\"search-field\">\n          <mat-label>Search</mat-label>\n          <input matInput [(ngModel)]=\"searchText\" (input)=\"filterTree()\" placeholder=\"Search users or groups\">\n          <mat-icon matSuffix>search</mat-icon>\n        </mat-form-field>\n      </div>\n      \n      <div class=\"tree-container\">\n        <div *ngIf=\"loading\" class=\"loading-container\">\n          <mat-spinner diameter=\"40\"></mat-spinner>\n          <p>Loading organization structure...</p>\n        </div>\n        \n        <div *ngIf=\"!loading && (!dataSource.data || dataSource.data.length === 0)\" class=\"empty-state\">\n          <mat-icon>account_tree</mat-icon>\n          <p>No hierarchy data available</p>\n        </div>\n        \n        <mat-tree *ngIf=\"!loading && dataSource.data && dataSource.data.length > 0\"\n                 [dataSource]=\"dataSource\" \n                 [treeControl]=\"treeControl\">\n          <!-- Tree node template for leaf nodes -->\n          <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding>\n            <div class=\"node-container\">\n              <div class=\"icon-container\" [ngClass]=\"getNodeIconClass(node)\">\n                <mat-icon>{{ getNodeIcon(node) }}</mat-icon>\n              </div>\n              <span class=\"node-name\">{{ node.name }}</span>\n              <span *ngIf=\"node.metadata?.active === false\" class=\"inactive-badge\">Inactive</span>\n            </div>\n          </mat-tree-node>\n          \n          <!-- Tree node template for expandable nodes -->\n          <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding>\n            <div class=\"node-container\">\n              <button mat-icon-button matTreeNodeToggle\n                      [attr.aria-label]=\"'Toggle ' + node.name\">\n                <mat-icon>{{ treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}</mat-icon>\n              </button>\n              <div class=\"icon-container\" [ngClass]=\"getNodeIconClass(node)\">\n                <mat-icon>{{ getNodeIcon(node) }}</mat-icon>\n              </div>\n              <span class=\"node-name\">{{ node.name }}</span>\n              <span *ngIf=\"node.metadata?.active === false\" class=\"inactive-badge\">Inactive</span>\n            </div>\n          </mat-tree-node>\n        </mat-tree>\n      </div>\n    </div>\n  `,\n  styles: [`\n    .combined-hierarchy-container {\n      height: 100%;\n      display: flex;\n      flex-direction: column;\n      padding: 16px;\n    }\n    \n    .header-container {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 16px;\n      \n      h3 {\n        margin: 0;\n      }\n      \n      .search-field {\n        width: 250px;\n      }\n    }\n    \n    .tree-container {\n      flex: 1;\n      overflow: auto;\n      border: 1px solid #e0e0e0;\n      border-radius: 4px;\n      background-color: white;\n    }\n    \n    .loading-container, .empty-state {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      height: 200px;\n      \n      p {\n        margin-top: 16px;\n        color: #666;\n      }\n    }\n    \n    .empty-state mat-icon {\n      font-size: 48px;\n      height: 48px;\n      width: 48px;\n      color: #ccc;\n    }\n    \n    .node-container {\n      display: flex;\n      align-items: center;\n    }\n    \n    .icon-container {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      width: 28px;\n      height: 28px;\n      border-radius: 4px;\n      margin-right: 8px;\n      \n      mat-icon {\n        font-size: 16px;\n        height: 16px;\n        width: 16px;\n        color: white;\n      }\n    }\n    \n    .node-name {\n      margin-right: 8px;\n    }\n    \n    .inactive-badge {\n      background-color: #f5f5f5;\n      color: #757575;\n      padding: 2px 6px;\n      border-radius: 4px;\n      font-size: 11px;\n      font-weight: 500;\n      text-transform: uppercase;\n    }\n    \n    .user-node {\n      background-color: #42a5f5;\n    }\n    \n    .group-node {\n      background-color: #7e57c2;\n    }\n    \n    .root-node {\n      background-color: #4caf50;\n    }\n  `]\n})\nexport class CombinedHierarchyComponent implements OnInit {\n  private _transformer = (node: HierarchyNode, level: number): FlatNode => {\n    return {\n      expandable: !!node.children && node.children.length > 0,\n      name: node.name,\n      level: level,\n      id: node.id,\n      type: node.type,\n      metadata: node.metadata\n    };\n  };\n\n  treeControl = new FlatTreeControl<FlatNode>(\n    node => node.level,\n    node => node.expandable\n  );\n\n  treeFlattener = new MatTreeFlattener(\n    this._transformer,\n    node => node.level,\n    node => node.expandable,\n    node => node.children\n  );\n\n  dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);\n  \n  loading = true;\n  searchText = '';\n  originalData: HierarchyNode[] = [];\n\n  constructor(private hierarchyService: HierarchyService) {}\n\n  ngOnInit(): void {\n    this.loadHierarchy();\n  }\n  \n  loadHierarchy(): void {\n    this.loading = true;\n    \n    this.hierarchyService.buildCombinedHierarchy().subscribe({\n      next: (hierarchy) => {\n        this.originalData = hierarchy;\n        this.dataSource.data = hierarchy;\n        this.loading = false;\n        \n        // Expand the first level\n        if (this.treeControl.dataNodes && this.treeControl.dataNodes.length > 0) {\n          this.treeControl.dataNodes\n            .filter(node => node.level === 0)\n            .forEach(node => this.treeControl.expand(node));\n        }\n      },\n      error: (error) => {\n        console.error('Error loading hierarchy:', error);\n        this.loading = false;\n      }\n    });\n  }\n  \n  hasChild = (_: number, node: FlatNode) => node.expandable;\n  \n  getNodeIcon(node: FlatNode): string {\n    switch (node.type) {\n      case 'user':\n        return 'person';\n      case 'group':\n        return 'group';\n      case 'root':\n        return 'folder';\n      default:\n        return 'circle';\n    }\n  }\n  \n  getNodeIconClass(node: FlatNode): string {\n    switch (node.type) {\n      case 'user':\n        return 'user-node';\n      case 'group':\n        return 'group-node';\n      case 'root':\n        return 'root-node';\n      default:\n        return 'user-node';\n    }\n  }\n  \n  filterTree(): void {\n    if (!this.searchText) {\n      this.dataSource.data = this.originalData;\n      return;\n    }\n    \n    const searchTerm = this.searchText.toLowerCase();\n    \n    // Helper function to filter nodes\n    const filterNode = (node: HierarchyNode): HierarchyNode | null => {\n      // Check if this node matches\n      const nameMatch = node.name.toLowerCase().includes(searchTerm);\n      \n      if (nameMatch) {\n        return {...node}; // Return a copy of the node if it matches\n      }\n      \n      // Check children\n      if (node.children && node.children.length > 0) {\n        const filteredChildren = node.children\n          .map(child => filterNode(child))\n          .filter(child => child !== null) as HierarchyNode[];\n        \n        if (filteredChildren.length > 0) {\n          return {...node, children: filteredChildren};\n        }\n      }\n      \n      return null; // No match in this branch\n    };\n    \n    const filteredData = this.originalData\n      .map(node => filterNode(node))\n      .filter(node => node !== null) as HierarchyNode[];\n    \n    this.dataSource.data = filteredData;\n    \n    // Expand all nodes if searching\n    if (this.searchText && this.treeControl.dataNodes && this.treeControl.dataNodes.length > 0) {\n      this.treeControl.expandAll();\n    }\n  }\n}","import { Component, Input, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { FormsModule } from '@angular/forms';\nimport { UserService } from '../../services/user.service';\nimport { User, UserGroup } from '../../models/user.model';\n\ninterface TreeNode {\n  name: string;\n  type: 'organization' | 'department' | 'team';\n  members?: number;\n  expanded?: boolean;\n  isRoot?: boolean;\n  children?: TreeNode[];\n}\n\n@Component({\n  selector: 'app-organization-tree',\n  standalone: true,\n  imports: [\n    CommonModule,\n    MatIconModule,\n    MatButtonModule,\n    FormsModule\n  ],\n  templateUrl: './organization-tree.component.html',\n  styleUrls: ['./organization-tree.component.scss']\n})\nexport class OrganizationTreeComponent implements OnInit {\n  @Input() showSearch: boolean = true;\n  @Input() userId: string = '';\n  searchQuery: string = '';\n\n  // Sample organization structure data\n  organizationTree: TreeNode[] = [\n    {\n      name: 'Organization',\n      type: 'organization',\n      expanded: true,\n      isRoot: true,\n      children: [\n        {\n          name: 'Engineering',\n          type: 'department',\n          members: 25,\n          expanded: true,\n          children: [\n            {\n              name: 'Frontend Team',\n              type: 'team',\n              members: 8\n            },\n            {\n              name: 'Backend Team',\n              type: 'team',\n              members: 12\n            },\n            {\n              name: 'DevOps Team',\n              type: 'team',\n              members: 5\n            }\n          ]\n        },\n        {\n          name: 'Marketing',\n          type: 'department',\n          members: 12,\n          expanded: true,\n          children: [\n            {\n              name: 'Content Team',\n              type: 'team',\n              members: 5\n            },\n            {\n              name: 'Design Team',\n              type: 'team',\n              members: 7\n            }\n          ]\n        },\n        {\n          name: 'Sales',\n          type: 'department',\n          members: 15,\n          expanded: false,\n          children: []\n        }\n      ]\n    }\n  ];\n\n  constructor(\n    private userService: UserService\n  ) { }\n  \n  ngOnInit(): void {\n    if (this.userId) {\n      this.loadUserSpecificHierarchy();\n    }\n  }\n  \n  loadUserSpecificHierarchy(): void {\n    // Fetch the user's details and groups they belong to\n    this.userService.getUserById(this.userId).subscribe(user => {\n      if (user) {\n        // Get a safe user name\n        const userName = this.getSafeName(user);\n        \n        // Reset the organization tree to show only user-specific hierarchy\n        this.organizationTree = [{\n          name: userName,\n          type: 'organization',\n          expanded: true,\n          isRoot: true,\n          children: []\n        }];\n        \n        // Load user's manager if available\n        if (user.manager_id || user.reportingTo) {\n          const managerId = user.manager_id || user.reportingTo;\n          this.userService.getUserById(managerId).subscribe({\n            next: (manager) => {\n              if (manager) {\n                const managerName = this.getSafeName(manager);\n                const managerNode: TreeNode = {\n                  name: managerName,\n                  type: 'department',\n                  expanded: true,\n                  children: [{\n                    name: userName + ' (This User)',\n                    type: 'team',\n                    members: 1\n                  }]\n                };\n                this.organizationTree[0].children?.push(managerNode);\n              }\n            },\n            error: () => {\n              // If manager lookup fails, create a generic entry\n              if (managerId) {\n                const managerNode: TreeNode = {\n                  name: managerId,\n                  type: 'department',\n                  expanded: true,\n                  children: [{\n                    name: userName + ' (This User)',\n                    type: 'team',\n                    members: 1\n                  }]\n                };\n                this.organizationTree[0].children?.push(managerNode);\n              }\n            }\n          });\n        }\n        \n        // Load groups that the user belongs to\n        this.userService.getUserGroups(this.userId).subscribe({\n          next: (groups) => {\n            if (groups && groups.length > 0) {\n              const groupsNode: TreeNode = {\n                name: 'Member of Groups',\n                type: 'department',\n                expanded: true,\n                members: groups.length,\n                children: groups.map(group => ({\n                  name: group.name || group.id,\n                  type: 'team',\n                  members: group.memberCount || 0\n                }))\n              };\n              this.organizationTree[0].children?.push(groupsNode);\n            }\n          },\n          error: () => {\n            // Handle error getting groups\n            console.error('Failed to load user groups');\n          }\n        });\n      }\n    });\n  }\n  \n  // Helper method to safely get user name from various fields\n  private getSafeName(user: User): string {\n    if (user.name) {\n      return user.name;\n    }\n    \n    if (user.first_name || user.last_name) {\n      return `${user.first_name || ''} ${user.last_name || ''}`.trim();\n    }\n    \n    if (user.user_metadata?.name) {\n      return user.user_metadata.name as string;\n    }\n    \n    return user.id;\n  }\n\n  toggleNode(node: TreeNode): void {\n    node.expanded = !node.expanded;\n  }\n\n  filterTree(): TreeNode[] {\n    if (!this.searchQuery) {\n      return this.organizationTree;\n    }\n    \n    // Simple filtering logic (could be improved for production)\n    return this.deepCopy(this.organizationTree).filter((node: TreeNode) => \n      this.filterNode(node, this.searchQuery.toLowerCase())\n    );\n  }\n\n  private filterNode(node: TreeNode, query: string): boolean {\n    // Check if the node matches the query\n    const nodeMatches = node.name.toLowerCase().includes(query);\n    \n    // If there are children, filter them too\n    if (node.children && node.children.length > 0) {\n      node.children = node.children.filter(child => this.filterNode(child, query));\n      \n      // Return true if node matches or has any matching children\n      return nodeMatches || node.children.length > 0;\n    }\n    \n    // Return true if leaf node matches\n    return nodeMatches;\n  }\n\n  private deepCopy(obj: any): any {\n    return JSON.parse(JSON.stringify(obj));\n  }\n}","<div class=\"tree-container\">\r\n  <div class=\"search-bar\" *ngIf=\"showSearch\">\r\n    <div class=\"search-input\">\r\n      <mat-icon>search</mat-icon>\r\n      <input type=\"text\" [(ngModel)]=\"searchQuery\" placeholder=\"Search\">\r\n    </div>\r\n    <div class=\"view-options\">\r\n      <button class=\"view-btn active\">Tree</button>\r\n      <button class=\"view-btn\">List</button>\r\n    </div>\r\n  </div>\r\n\r\n  <div class=\"tree-view\">\r\n    <ng-container *ngTemplateOutlet=\"nodeTemplate; context: { nodes: filterTree(), level: 0 }\"></ng-container>\r\n  </div>\r\n</div>\r\n\r\n<ng-template #nodeTemplate let-nodes=\"nodes\" let-level=\"level\">\r\n  <div class=\"tree-nodes\" [style.padding-left]=\"level > 0 ? '16px' : '0'\">\r\n    <div class=\"tree-node\" *ngFor=\"let node of nodes\">\r\n      <div class=\"node-content\" [class.root-node]=\"node.isRoot\" [class.department-node]=\"node.type === 'department'\">\r\n        <div class=\"expander\" *ngIf=\"node.children && node.children.length > 0\" (click)=\"toggleNode(node)\">\r\n          <mat-icon>{{ node.expanded ? 'expand_more' : 'chevron_right' }}</mat-icon>\r\n        </div>\r\n        <div class=\"expander-placeholder\" *ngIf=\"!node.children || node.children.length === 0\"></div>\r\n        \r\n        <div class=\"node-icon\" [ngClass]=\"node.type\">\r\n          <mat-icon>{{ node.type === 'organization' ? 'business' : (node.type === 'department' ? 'category' : 'group') }}</mat-icon>\r\n        </div>\r\n        \r\n        <div class=\"node-label\">\r\n          {{ node.name }}\r\n        </div>\r\n        \r\n        <div class=\"node-members\" *ngIf=\"node.members\">\r\n          <span class=\"member-count\">{{ node.members }} members</span>\r\n        </div>\r\n      </div>\r\n      \r\n      <div class=\"node-children\" *ngIf=\"node.expanded && node.children && node.children.length > 0\">\r\n        <ng-container *ngTemplateOutlet=\"nodeTemplate; context: { nodes: node.children, level: level + 1 }\"></ng-container>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</ng-template>","import { Component, Inject, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormBuilder, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\nimport { User } from '../../models/user.model';\r\nimport { UserService } from '../../services/user.service';\r\nimport { OrganizationTreeComponent } from '../organization-tree/organization-tree.component';\r\nimport { Observable, of } from 'rxjs';\r\nimport { startWith, map } from 'rxjs/operators';\r\n\r\n@Component({\r\n  selector: 'app-add-user-dialog',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    ReactiveFormsModule,\r\n    MatDialogModule,\r\n    MatFormFieldModule,\r\n    MatInputModule,\r\n    MatButtonModule,\r\n    MatSelectModule,\r\n    MatTabsModule,\r\n    MatSlideToggleModule,\r\n    MatIconModule,\r\n    MatAutocompleteModule,\r\n    OrganizationTreeComponent\r\n  ],\r\n  templateUrl: './add-user-dialog.component.html',\r\n  styleUrls: ['./add-user-dialog.component.scss']\r\n})\r\nexport class AddUserDialogComponent implements OnInit {\r\n  userForm: FormGroup;\r\n  activeTab = 'details';\r\n  availableManagers: User[] = [];\r\n  \r\n  departments: string[] = [];\r\n  roles: string[] = [];\r\n  filteredDepartments: Observable<string[]> = of([]);\r\n  filteredRoles: Observable<string[]> = of([]);\r\n\r\n  constructor(\r\n    private fb: FormBuilder,\r\n    private userService: UserService,\r\n    public dialogRef: MatDialogRef<AddUserDialogComponent>,\r\n    @Inject(MAT_DIALOG_DATA) public data: any\r\n  ) {\r\n    this.userForm = this.fb.group({\r\n      firstName: ['', Validators.required],\r\n      lastName: ['', Validators.required],\r\n      email: ['', [Validators.required, Validators.email]],\r\n      status: [true],\r\n      department: [''],\r\n      role: [''],\r\n      manager: ['']\r\n    });\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    this.loadAvailableManagers();\r\n    this.loadDepartmentsAndRoles();\r\n    this.setupAutoComplete();\r\n  }\r\n\r\n  loadAvailableManagers(): void {\r\n    this.userService.getUsers().subscribe(users => {\r\n      // Filter to only include active users of type 'USER' (exclude groups)\r\n      this.availableManagers = users.filter(user => \r\n        user.type === 'USER' && \r\n        user.active === true\r\n      );\r\n    });\r\n  }\r\n\r\n  loadDepartmentsAndRoles(): void {\r\n    this.userService.getDepartments().subscribe(departments => {\r\n      this.departments = departments;\r\n    });\r\n\r\n    this.userService.getRoles().subscribe(roles => {\r\n      this.roles = roles;\r\n    });\r\n  }\r\n\r\n  setupAutoComplete(): void {\r\n    this.filteredDepartments = this.userForm.get('department')!.valueChanges.pipe(\r\n      startWith(''),\r\n      map(value => this._filterOptions(this.departments, value || ''))\r\n    );\r\n\r\n    this.filteredRoles = this.userForm.get('role')!.valueChanges.pipe(\r\n      startWith(''),\r\n      map(value => this._filterOptions(this.roles, value || ''))\r\n    );\r\n  }\r\n\r\n  private _filterOptions(options: string[], value: string): string[] {\r\n    const filterValue = value.toLowerCase();\r\n    const filtered = options.filter(option => option.toLowerCase().includes(filterValue));\r\n    \r\n    // If the exact value is not in the filtered list and user has typed something, add it as an option\r\n    if (value && !filtered.some(option => option.toLowerCase() === filterValue)) {\r\n      filtered.unshift(value);\r\n    }\r\n    \r\n    return filtered;\r\n  }\r\n\r\n  onTabChange(tab: string): void {\r\n    this.activeTab = tab;\r\n  }\r\n\r\n  onCancel(): void {\r\n    this.dialogRef.close();\r\n  }\r\n\r\n  onSave(): void {\r\n    if (this.userForm.valid) {\r\n      const formValue = this.userForm.value;\r\n      \r\n      // Create new user object from form values using email as ID\r\n      const newUser: User = {\r\n        id: formValue.email, // Use email as user ID\r\n        type: 'USER',\r\n        active: formValue.status,\r\n        first_name: formValue.firstName,\r\n        last_name: formValue.lastName,\r\n        email: formValue.email,\r\n        role: formValue.role || '',\r\n        department: formValue.department || '',\r\n        manager_id: formValue.manager || null,\r\n        user_metadata: {\r\n          name: `${formValue.firstName} ${formValue.lastName}`\r\n        },\r\n        // Frontend display properties\r\n        name: `${formValue.firstName} ${formValue.lastName}`,\r\n        status: formValue.status ? 'Active' : 'Inactive',\r\n        artifacts: 0,\r\n        groups: 0\r\n      };\r\n      \r\n      // Add user and close dialog\r\n      this.userService.addUser(newUser).subscribe({\r\n        next: (user) => {\r\n          this.dialogRef.close(user);\r\n        },\r\n        error: (error) => {\r\n          console.error('Error adding user:', error);\r\n          // If user already exists, try with upsert instead of automatic retry\r\n          if (error.status === 409) {\r\n            // Ask user if they want to update the existing user\r\n            if (confirm('User already exists. Do you want to update the existing user instead?')) {\r\n              this.userService.addUser(newUser, true).subscribe({\r\n                next: (user) => {\r\n                  this.dialogRef.close(user);\r\n                },\r\n                error: (updateError) => {\r\n                  console.error('Error updating user:', updateError);\r\n                  alert('Failed to update user: ' + (updateError.message || updateError));\r\n                }\r\n              });\r\n            }\r\n          } else {\r\n            alert('Failed to add user: ' + (error.message || error));\r\n          }\r\n        }\r\n      });\r\n    }\r\n  }\r\n}","<div class=\"dialog-container\">\r\n  <div class=\"dialog-header\">\r\n    <h2>Create New User</h2>\r\n    <button mat-icon-button (click)=\"onCancel()\">\r\n      <mat-icon>close</mat-icon>\r\n    </button>\r\n  </div>\r\n\r\n  <div class=\"dialog-tabs\">\r\n    <div class=\"tab\" [class.active]=\"activeTab === 'details'\" (click)=\"onTabChange('details')\">\r\n      <mat-icon>person</mat-icon> Details\r\n    </div>\r\n    <div class=\"tab\" [class.active]=\"activeTab === 'membership'\" (click)=\"onTabChange('membership')\">\r\n      <mat-icon>group</mat-icon> Membership\r\n    </div>\r\n    <div class=\"tab\" [class.active]=\"activeTab === 'permissions'\" (click)=\"onTabChange('permissions')\">\r\n      <mat-icon>security</mat-icon> Permissions (Artifacts)\r\n    </div>\r\n  </div>\r\n\r\n  <div class=\"dialog-content\">\r\n    <!-- Details Tab -->\r\n    <form [formGroup]=\"userForm\" *ngIf=\"activeTab === 'details'\">\r\n      <div class=\"section-title\">Personal Information</div>\r\n      \r\n      <div class=\"form-row\">\r\n        <div class=\"form-field\">\r\n          <label for=\"firstName\">First Name</label>\r\n          <input id=\"firstName\" type=\"text\" formControlName=\"firstName\" placeholder=\"John\">\r\n        </div>\r\n        \r\n        <div class=\"form-field\">\r\n          <label for=\"lastName\">Last Name</label>\r\n          <input id=\"lastName\" type=\"text\" formControlName=\"lastName\" placeholder=\"Sharma\">\r\n        </div>\r\n      </div>\r\n      \r\n      <div class=\"form-row\">\r\n        <div class=\"form-field\">\r\n          <label for=\"email\">Email Address</label>\r\n          <input id=\"email\" type=\"email\" formControlName=\"email\" placeholder=\"example@email.com\">\r\n        </div>\r\n        \r\n        <div class=\"form-field\">\r\n          <label for=\"status\">Status</label>\r\n          <div class=\"status-toggle\">\r\n            <mat-slide-toggle color=\"primary\" formControlName=\"status\"></mat-slide-toggle>\r\n            <span class=\"status-label\">{{ userForm.get('status')?.value ? 'Active' : 'Inactive' }}</span>\r\n          </div>\r\n        </div>\r\n      </div>\r\n      \r\n      <div class=\"section-title\">Organisation Details</div>\r\n      \r\n      <div class=\"form-row\">\r\n        <div class=\"form-field\">\r\n          <label for=\"department\">Department</label>\r\n          <input type=\"text\" \r\n                 id=\"department\" \r\n                 formControlName=\"department\" \r\n                 placeholder=\"Type or select department\"\r\n                 [matAutocomplete]=\"departmentAuto\">\r\n          <mat-autocomplete #departmentAuto=\"matAutocomplete\">\r\n            <mat-option *ngFor=\"let dept of filteredDepartments | async\" [value]=\"dept\">\r\n              {{ dept }}\r\n            </mat-option>\r\n          </mat-autocomplete>\r\n        </div>\r\n        \r\n        <div class=\"form-field\">\r\n          <label for=\"role\">Role</label>\r\n          <input type=\"text\" \r\n                 id=\"role\" \r\n                 formControlName=\"role\" \r\n                 placeholder=\"Type or select role\"\r\n                 [matAutocomplete]=\"roleAuto\">\r\n          <mat-autocomplete #roleAuto=\"matAutocomplete\">\r\n            <mat-option *ngFor=\"let role of filteredRoles | async\" [value]=\"role\">\r\n              {{ role }}\r\n            </mat-option>\r\n          </mat-autocomplete>\r\n        </div>\r\n      </div>\r\n      \r\n      <div class=\"form-row\">\r\n        <div class=\"form-field\">\r\n          <label for=\"manager\">Manager</label>\r\n          <mat-select id=\"manager\" formControlName=\"manager\" placeholder=\"Select Manager\">\r\n            <mat-option [value]=\"null\">No Manager</mat-option>\r\n            <mat-option *ngFor=\"let manager of availableManagers\" [value]=\"manager.id\">\r\n              {{ manager.name || (manager.first_name + ' ' + manager.last_name) }}\r\n            </mat-option>\r\n          </mat-select>\r\n        </div>\r\n      </div>\r\n    </form>\r\n    \r\n    <!-- Membership Tab -->\r\n    <div *ngIf=\"activeTab === 'membership'\" class=\"membership-tab\">\r\n      <app-organization-tree></app-organization-tree>\r\n    </div>\r\n    \r\n    <!-- Permissions Tab -->\r\n    <div *ngIf=\"activeTab === 'permissions'\" class=\"placeholder-content\">\r\n      <p>Permission settings for artifacts will be available in future updates.</p>\r\n    </div>\r\n  </div>\r\n\r\n  <div class=\"dialog-actions\">\r\n    <button mat-button (click)=\"onCancel()\">Cancel</button>\r\n    <button mat-flat-button color=\"primary\" [disabled]=\"userForm.invalid\" (click)=\"onSave()\">Save</button>\r\n  </div>\r\n</div>","import { Injectable, Inject } from '@angular/core';\nimport { HttpParams } from '@angular/common/http';\nimport { Observable, of, throwError } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\nimport { AccessRule, TimeConstraint, AccessExpression } from '../models/access-rule.model';\nimport { MEDHA_ONE_ACCESS_CONFIG } from '../config/medha-config.token';\nimport { MedhaOneAccessConfig } from '../config/medha-config.interface';\nimport { MedhaHttpService } from './medha-http.service';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class AccessRuleService {\n  private apiUrl: string;\n  \n  constructor(\n    private medhaHttp: MedhaHttpService,\n    @Inject(MEDHA_ONE_ACCESS_CONFIG) private config: MedhaOneAccessConfig\n  ) {\n    this.apiUrl = `${config.apiUrl}/access-rules`;\n  }\n\n  getAccessRules(skip: number = 0, limit?: number, activeOnly: any = null, applicationName?: string): Observable<AccessRule[]> {\n    let params = new HttpParams()\n      .set('skip', skip.toString());\n    \n    if (limit !== undefined) {\n      params = params.set('limit', limit.toString());\n    }\n    \n    if (activeOnly !== null) {\n      params = params.set('active', activeOnly.toString());\n    }\n    \n    if (applicationName) {\n      params = params.set('application_name', applicationName);\n    }\n\n    return this.medhaHttp.get<any[]>(this.apiUrl, { params }).pipe(\n      map(response => response.map(rule => this.mapResponseToAccessRule(rule))),\n      catchError(error => {\n        console.error('Error fetching access rules:', error);\n        return of([]);\n      })\n    );\n  }\n\n  getAccessRuleById(id: string): Observable<AccessRule | undefined> {\n    return this.medhaHttp.get<any>(`${this.apiUrl}/${id}`).pipe(\n      map(rule => this.mapResponseToAccessRule(rule)),\n      catchError(error => {\n        console.error(`Error fetching access rule with id ${id}:`, error);\n        return of(undefined);\n      })\n    );\n  }\n\n  addAccessRule(rule: AccessRule): Observable<AccessRule> {\n    const ruleRequest = this.mapAccessRuleToRequest(rule);\n\n    return this.medhaHttp.post<any>(this.apiUrl, ruleRequest).pipe(\n      map(response => this.mapResponseToAccessRule(response)),\n      catchError(error => {\n        console.error('Error creating access rule:', error);\n        return throwError(() => new Error(`Error creating access rule: ${error.message}`));\n      })\n    );\n  }\n\n  updateAccessRule(rule: AccessRule): Observable<AccessRule> {\n    const ruleRequest = this.mapAccessRuleToRequest(rule);\n\n    return this.medhaHttp.put<any>(`${this.apiUrl}/${rule.id}`, ruleRequest).pipe(\n      map(response => this.mapResponseToAccessRule(response)),\n      catchError(error => {\n        console.error(`Error updating access rule ${rule.id}:`, error);\n        return throwError(() => new Error(`Error updating access rule: ${error.message}`));\n      })\n    );\n  }\n\n  deleteAccessRule(id: string): Observable<boolean> {\n    return this.medhaHttp.delete<any>(`${this.apiUrl}/${id}`).pipe(\n      map(response => true),\n      catchError(error => {\n        console.error(`Error deleting access rule ${id}:`, error);\n        return of(false);\n      })\n    );\n  }\n\n  checkAccess(userId: string, artifactId: string, permission: string): Observable<boolean> {\n    const url = `${this.config.apiUrl}/access/check`;\n    const params = {\n      user_id: userId,\n      resource_id: artifactId,\n      permission: permission\n    };\n\n    return this.medhaHttp.post<any>(url, params).pipe(\n      map(response => response.granted || false),\n      catchError(error => {\n        console.error('Error checking access:', error);\n        return of(false);\n      })\n    );\n  }\n\n  getUserAccess(userId: string): Observable<any> {\n    const url = `${this.config.apiUrl}/access/user/${userId}`;\n    // // console.log('Calling API endpoint:', url);\n    \n    return this.medhaHttp.get<any>(url).pipe(\n      map(response => {\n        // // console.log('API response for getUserAccess:', response);\n        // Return the full response to allow access to both resolved_access and resolved_access_detailed\n        return response || {};\n      }),\n      catchError(error => {\n        console.error(`Error fetching access for user ${userId}:`, error);\n        return of({});\n      })\n    );\n  }\n\n\n  // Get access for a user group\n  getUserGroupAccess(groupId: string): Observable<Record<string, string[]>> {\n    const url = `${this.config.apiUrl}/access/usergroup/${groupId}`;\n    // // console.log('Calling API endpoint:', url);\n    return this.medhaHttp.get<any>(url).pipe(\n      map(response => {\n        // // console.log('API response for getUserGroupAccess:', response);\n        const resourcePermissions: Record<string, string[]> = {};\n        if (response && response.resolvedAccess) {\n          Object.entries(response.resolvedAccess).forEach(([resourceId, permissions]) => {\n            resourcePermissions[resourceId] = permissions as string[];\n          });\n        } else {\n          // console.warn('No resolvedAccess found in response');\n        }\n        return resourcePermissions;\n      }),\n      catchError(error => {\n        console.error(`Error fetching access for user group ${groupId}:`, error);\n        return of({});\n      })\n    );\n  }\n\n  // Get user groups for a user\n  getUserGroups(userId: string): Observable<any[]> {\n    const url = `${this.config.apiUrl}/users/${userId}/groups`;\n    // // console.log('Calling API endpoint for user groups:', url);\n    \n    return this.medhaHttp.get<any>(url).pipe(\n      map(response => {\n        // // console.log('API response for getUserGroups:', response);\n        return response && response.groups ? response.groups : [];\n      }),\n      catchError(error => {\n        console.error(`Error fetching groups for user ${userId}:`, error);\n        return of([]);\n      })\n    );\n  }\n  \n  // Get members of a user group\n  getGroupMembers(groupId: string): Observable<any[]> {\n    const url = `${this.config.apiUrl}/usergroups/${groupId}/members`;\n    // // console.log('Calling API endpoint for group members:', url);\n    \n    return this.medhaHttp.get<any>(url).pipe(\n      map(response => {\n        // // console.log('API response for getGroupMembers:', response);\n        return response && response.members ? response.members : [];\n      }),\n      catchError(error => {\n        console.error(`Error fetching members for group ${groupId}:`, error);\n        return of([]);\n      })\n    );\n  }\n\n  getArtifactAccess(artifactId: string): Observable<Record<string, string[]>> {\n    const url = `${this.config.apiUrl}/access/resource/${artifactId}`;\n    // // console.log('Calling API endpoint for artifact access:', url);\n    \n    return this.medhaHttp.get<any>(url).pipe(\n      map(response => {\n        // // console.log('API response for getArtifactAccess:', response);\n        const userPermissions: Record<string, string[]> = {};\n        // The API returns users_with_access as an object where keys are user IDs and values are permission arrays\n        if (response && response.users_with_access) {\n          // // console.log('Found users_with_access in response:', response.users_with_access);\n          Object.entries(response.users_with_access).forEach(([userId, permissions]) => {\n            userPermissions[userId] = permissions as string[];\n          });\n        } else {\n          // console.warn('No users_with_access found in response');\n        }\n        return userPermissions;\n      }),\n      catchError(error => {\n        console.error(`Error fetching access for artifact ${artifactId}:`, error);\n        return of({});\n      })\n    );\n  }\n  \n  getArtifactGroupAccess(artifactId: string): Observable<Record<string, string[]>> {\n    const url = `${this.config.apiUrl}/access/resourcegroup/${artifactId}`;\n    // // console.log('Calling API endpoint for artifact group access:', url);\n\n    return this.medhaHttp.get<any>(url).pipe(\n      map(response => {\n        // // console.log('API response for getArtifactGroupAccess:', response);\n        const userPermissions: Record<string, string[]> = {};\n        // The API returns users_with_access as an object where keys are user IDs and values are permission arrays\n        if (response && response.users_with_access) {\n          // // console.log('Found users_with_access in response:', response.users_with_access);\n          Object.entries(response.users_with_access).forEach(([userId, permissions]) => {\n            userPermissions[userId] = permissions as string[];\n          });\n        } else {\n          // console.warn('No users_with_access found in response');\n        }\n        return userPermissions;\n      }),\n      catchError(error => {\n        console.error(`Error fetching access for artifact ${artifactId}:`, error);\n        return of({});\n      })\n    );\n  }\n  // Get artifact groups for an artifact\n  getArtifactGroups(artifactId: string): Observable<any[]> {\n    const url = `${this.config.apiUrl}/artifacts/${artifactId}/groups`;\n    // // console.log('Calling API endpoint for artifact groups:', url);\n    \n    return this.medhaHttp.get<any>(url).pipe(\n      map(response => {\n        // // console.log('API response for getArtifactGroups:', response);\n        return response && response.groups ? response.groups : [];\n      }),\n      catchError(error => {\n        console.error(`Error fetching groups for artifact ${artifactId}:`, error);\n        return of([]);\n      })\n    );\n  }\n  \n  // Get contents of a resource group\n  getGroupContents(groupId: string): Observable<any[]> {\n    const url = `${this.config.apiUrl}/resourcegroups/${groupId}/contents`;\n    // // console.log('Calling API endpoint for group contents:', url);\n    \n    return this.medhaHttp.get<any>(url).pipe(\n      map(response => {\n        // // console.log('API response for getGroupContents:', response);\n        return response && response.contents ? response.contents : [];\n      }),\n      catchError(error => {\n        console.error(`Error fetching contents for group ${groupId}:`, error);\n        return of([]);\n      })\n    );\n  }\n\n  validateExpression(expression: string, type: 'user' | 'resource'): Observable<{valid: boolean, errors: string[], expandedEntities: string[]}> {\n    const url = `${this.config.apiUrl}/expressions/validate`;\n    const params = {\n      expression: expression,\n      expression_type: type.toUpperCase()\n    };\n\n    return this.medhaHttp.post<any>(url, params).pipe(\n      catchError(error => {\n        console.error('Error validating expression:', error);\n        return of({\n          valid: false,\n          errors: [error.message || 'Unknown error validating expression'],\n          expandedEntities: []\n        });\n      })\n    );\n  }\n\n  /**\n   * Helper method to map API response to the AccessRule model\n   */\n  private mapResponseToAccessRule(response: any): AccessRule {\n    if (!response) return {} as AccessRule;\n\n    // Map time constraints\n    const timeConstraints: TimeConstraint = {};\n    if (response.time_constraints) {\n      if (response.time_constraints.start_date) {\n        timeConstraints.startDate = response.time_constraints.start_date;\n      }\n      if (response.time_constraints.end_date) {\n        timeConstraints.endDate = response.time_constraints.end_date;\n      }\n      if (response.time_constraints.days_of_week) {\n        timeConstraints.daysOfWeek = response.time_constraints.days_of_week;\n      }\n      if (response.time_constraints.start_time) {\n        timeConstraints.startTime = response.time_constraints.start_time;\n      }\n      if (response.time_constraints.end_time) {\n        timeConstraints.endTime = response.time_constraints.end_time;\n      }\n    }\n\n    // Get name from either direct name field or from metadata\n    let name = response.name;\n    if (!name && response.rule_metadata && response.rule_metadata.name) {\n      name = response.rule_metadata.name;\n    }\n    if (!name) {\n      name = response.id; // Fallback to ID if no name is found\n    }\n    \n    return {\n      id: response.id,\n      name: name,\n      description: response.description,\n      userExpression: response.user_expression,\n      resourceExpression: response.resource_expression,\n      permissions: response.permissions || [],\n      application: response.application || '',\n      status: response.active ? 'Active' : 'Inactive',\n      timeConstraints: Object.keys(timeConstraints).length > 0 ? timeConstraints : undefined,\n      createdAt: response.created_at ? new Date(response.created_at) : undefined,\n      updatedAt: response.updated_at ? new Date(response.updated_at) : undefined\n    };\n  }\n\n  /**\n   * Helper method to map frontend model to backend request format\n   */\n  private mapAccessRuleToRequest(rule: AccessRule): any {\n    // Convert status string to boolean active field\n    const active = rule.status === 'Active';\n    \n    // Map time constraints to backend format\n    let timeConstraints: any = null;\n    if (rule.timeConstraints) {\n      timeConstraints = {\n        start_date: rule.timeConstraints.startDate,\n        end_date: rule.timeConstraints.endDate,\n        days_of_week: rule.timeConstraints.daysOfWeek,\n        start_time: rule.timeConstraints.startTime,\n        end_time: rule.timeConstraints.endTime\n      };\n      \n      // Remove undefined values\n      Object.keys(timeConstraints).forEach(key => {\n        if (timeConstraints[key] === undefined) {\n          delete timeConstraints[key];\n        }\n      });\n      \n      // Set to null if empty\n      if (Object.keys(timeConstraints).length === 0) {\n        timeConstraints = null;\n      }\n    }\n    \n    const request = {\n      id: rule.id,\n      name: rule.name,\n      description: rule.description || '',\n      application: rule.application,\n      user_expression: rule.userExpression,\n      resource_expression: rule.resourceExpression,\n      permissions: rule.permissions,\n      active: active,\n      time_constraints: timeConstraints,\n      rule_metadata: {\n        name: rule.name,\n        description: rule.description || ''\n      }\n    };\n    \n    return request;\n  }\n}","import { Component, Inject, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormBuilder, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\nimport { User } from '../../models/user.model';\r\nimport { UserService } from '../../services/user.service';\r\nimport { OrganizationTreeComponent } from '../organization-tree/organization-tree.component';\r\nimport { AccessRuleService } from '../../services/access-rule.service';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { Observable, of } from 'rxjs';\r\nimport { startWith, map } from 'rxjs/operators';\r\n\r\n@Component({\r\n  selector: 'app-edit-user-dialog',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    ReactiveFormsModule,\r\n    MatDialogModule,\r\n    MatFormFieldModule,\r\n    MatInputModule,\r\n    MatButtonModule,\r\n    MatSelectModule,\r\n    MatTabsModule,\r\n    MatSlideToggleModule,\r\n    MatIconModule,\r\n    MatAutocompleteModule,\r\n    MatProgressSpinnerModule,\r\n    OrganizationTreeComponent\r\n  ],\r\n  templateUrl: './edit-user-dialog.component.html',\r\n  styleUrls: ['./edit-user-dialog.component.scss']\r\n})\r\nexport class EditUserDialogComponent implements OnInit {\r\n  userForm: FormGroup;\r\n  activeTab = 'details';\r\n  userPermissions: {artifactId: string, artifactName: string, permissions: string[]}[] = [];\r\n  loadingPermissions = false;\r\n  availableManagers: User[] = [];\r\n  \r\n  departments: string[] = [];\r\n  roles: string[] = [];\r\n  filteredDepartments: Observable<string[]> = of([]);\r\n  filteredRoles: Observable<string[]> = of([]);\r\n\r\n  constructor(\r\n    private fb: FormBuilder,\r\n    private userService: UserService,\r\n    private accessRuleService: AccessRuleService,\r\n    public dialogRef: MatDialogRef<EditUserDialogComponent>,\r\n    @Inject(MAT_DIALOG_DATA) public data: { user: User },\r\n    private snackBar: MatSnackBar\r\n  ) {\r\n    this.userForm = this.fb.group({\r\n      firstName: ['', Validators.required],\r\n      lastName: ['', Validators.required],\r\n      email: ['', [Validators.required, Validators.email]],\r\n      status: [true],\r\n      department: [''],\r\n      role: [''],\r\n      manager: ['']\r\n    });\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    this.loadAvailableManagers();\r\n    this.loadDepartmentsAndRoles();\r\n    this.setupAutoComplete();\r\n    if (this.data && this.data.user) {\r\n      const user = this.data.user;\r\n      let firstName = '';\r\n      let lastName = '';\r\n      \r\n      // Handle name parsing safely\r\n      if (user.name) {\r\n        const nameParts = user.name.split(' ');\r\n        firstName = nameParts[0] || '';\r\n        lastName = nameParts.slice(1).join(' ') || '';\r\n      } else if (user.first_name || user.last_name) {\r\n        firstName = user.first_name || '';\r\n        lastName = user.last_name || '';\r\n      }\r\n      \r\n      // console.log('Populating form with user data:', user);\r\n      this.userForm.patchValue({\r\n        firstName: user.first_name || firstName,\r\n        lastName: user.last_name || lastName,\r\n        email: user.email || '',\r\n        status: user.active !== undefined ? user.active : (user.status === 'Active'),\r\n        department: user.department || '',\r\n        role: user.role || '',\r\n        manager: user.manager_id || null\r\n      });\r\n    }\r\n  }\r\n\r\n  loadAvailableManagers(): void {\r\n    this.userService.getUsers().subscribe(users => {\r\n      // Filter to only include active users of type 'USER' (exclude groups and the current user if editing)\r\n      this.availableManagers = users.filter(user => \r\n        user.type === 'USER' && \r\n        user.active === true &&\r\n        (!this.data?.user || user.id !== this.data.user.id) // Exclude current user from manager list\r\n      );\r\n    });\r\n  }\r\n\r\n  loadDepartmentsAndRoles(): void {\r\n    this.userService.getDepartments().subscribe(departments => {\r\n      this.departments = departments;\r\n    });\r\n\r\n    this.userService.getRoles().subscribe(roles => {\r\n      this.roles = roles;\r\n    });\r\n  }\r\n\r\n  setupAutoComplete(): void {\r\n    this.filteredDepartments = this.userForm.get('department')!.valueChanges.pipe(\r\n      startWith(''),\r\n      map(value => this._filterOptions(this.departments, value || ''))\r\n    );\r\n\r\n    this.filteredRoles = this.userForm.get('role')!.valueChanges.pipe(\r\n      startWith(''),\r\n      map(value => this._filterOptions(this.roles, value || ''))\r\n    );\r\n  }\r\n\r\n  private _filterOptions(options: string[], value: string): string[] {\r\n    const filterValue = value.toLowerCase();\r\n    const filtered = options.filter(option => option.toLowerCase().includes(filterValue));\r\n    \r\n    // If the exact value is not in the filtered list and user has typed something, add it as an option\r\n    if (value && !filtered.some(option => option.toLowerCase() === filterValue)) {\r\n      filtered.unshift(value);\r\n    }\r\n    \r\n    return filtered;\r\n  }\r\n\r\n  onTabChange(tab: string): void {\r\n    this.activeTab = tab;\r\n    \r\n    if (tab === 'permissions' && this.userPermissions.length === 0) {\r\n      this.loadUserPermissions();\r\n    }\r\n  }\r\n\r\n  loadUserPermissions(): void {\r\n    if (!this.data.user || !this.data.user.id) {\r\n      console.error('User or user ID is missing');\r\n      return;\r\n    }\r\n\r\n    this.loadingPermissions = true;\r\n    this.userPermissions = [];\r\n    \r\n    // Use email instead of ID if available, as the backend might expect email\r\n    const userIdentifier = this.data.user.email || this.data.user.id;\r\n    \r\n    this.accessRuleService.getUserAccess(userIdentifier).subscribe({\r\n      next: (response) => {\r\n        // First try to use the enhanced detailed format with artifact names\r\n        const detailedAccessMap = response?.['resolved_access_detailed'] || {};\r\n        const accessMap = response?.['resolved_access'] || response || {};\r\n        \r\n        // Check if we got any data\r\n        if ((!detailedAccessMap || Object.keys(detailedAccessMap).length === 0) && \r\n            (!accessMap || Object.keys(accessMap).length === 0)) {\r\n          this.loadingPermissions = false;\r\n          return;\r\n        }\r\n        \r\n        // Convert the map to an array of objects for display\r\n        // Use detailed format if available, otherwise fall back to basic format\r\n        if (detailedAccessMap && Object.keys(detailedAccessMap).length > 0) {\r\n          this.userPermissions = Object.entries(detailedAccessMap).map(([artifactId, details]: [string, any]) => {\r\n            const artifactName = details.artifact_name || details.name || artifactId;\r\n            return {\r\n              artifactId,\r\n              artifactName,\r\n              permissions: Array.isArray(details.permissions) ? details.permissions : (details.permissions ? [details.permissions] : [])\r\n            };\r\n          });\r\n        } else {\r\n          this.userPermissions = Object.entries(accessMap).map(([artifactId, permissions]) => {\r\n            return {\r\n              artifactId,\r\n              artifactName: artifactId, // Fallback to ID if detailed format not available\r\n              permissions: Array.isArray(permissions) ? permissions : (permissions ? [permissions] : [])\r\n            };\r\n          });\r\n        }\r\n        this.loadingPermissions = false;\r\n      },\r\n      error: (error) => {\r\n        console.error('Error loading user permissions:', error);\r\n        console.error('Error details:', error.error);\r\n        this.loadingPermissions = false;\r\n      }\r\n    });\r\n  }\r\n\r\n  onCancel(): void {\r\n    this.dialogRef.close();\r\n  }\r\n\r\n  onSave(): void {\r\n    if (this.userForm.valid && this.data.user) {\r\n      const formValue = this.userForm.value;\r\n      const fullName = `${formValue.firstName} ${formValue.lastName}`;\r\n      \r\n      // console.log('Saving user with values:', formValue);\r\n      \r\n      // Update user object from form values using email as ID\r\n      const updatedUser: User = {\r\n        ...this.data.user,\r\n        id: formValue.email, // Use email as user ID\r\n        type: 'USER',\r\n        active: formValue.status,\r\n        first_name: formValue.firstName,\r\n        last_name: formValue.lastName,\r\n        email: formValue.email,\r\n        department: formValue.department || '',\r\n        role: formValue.role || '',\r\n        manager_id: formValue.manager || null, // Use null instead of empty string\r\n        user_metadata: {\r\n          ...(this.data.user.user_metadata || {}),\r\n          name: fullName\r\n        },\r\n        // Frontend display properties\r\n        name: fullName,\r\n        status: formValue.status ? 'Active' : 'Inactive'\r\n      };\r\n      \r\n      // console.log('Updating user with data:', updatedUser);\r\n      \r\n      // Update user and close dialog\r\n      this.userService.updateUser(updatedUser).subscribe({\r\n        next: (user) => {\r\n          // console.log('User updated successfully:', user);\r\n          this.dialogRef.close(user);\r\n        },\r\n        error: (error) => {\r\n          console.error('Error updating user:', error);\r\n          // Close dialog anyway to not block the UI\r\n          this.dialogRef.close(null);\r\n        }\r\n      });\r\n    }\r\n  }\r\n}","<div class=\"dialog-container\">\r\n  <div class=\"dialog-header\">\r\n    <h2>Edit User</h2>\r\n    <button mat-icon-button (click)=\"onCancel()\">\r\n      <mat-icon>close</mat-icon>\r\n    </button>\r\n  </div>\r\n\r\n  <div class=\"dialog-tabs\">\r\n    <div class=\"tab\" [class.active]=\"activeTab === 'details'\" (click)=\"onTabChange('details')\">\r\n      <mat-icon>person</mat-icon> Details\r\n    </div>\r\n    <div class=\"tab\" [class.active]=\"activeTab === 'groups'\" (click)=\"onTabChange('groups')\">\r\n      <mat-icon>group</mat-icon> Groups\r\n    </div>\r\n    <div class=\"tab\" [class.active]=\"activeTab === 'permissions'\" (click)=\"onTabChange('permissions')\">\r\n      <mat-icon>security</mat-icon> Permissions\r\n    </div>\r\n  </div>\r\n\r\n  <div class=\"dialog-content\">\r\n    <!-- Details Tab -->\r\n    <form [formGroup]=\"userForm\" *ngIf=\"activeTab === 'details'\">\r\n      <div class=\"section-title\">Personal Information</div>\r\n      \r\n      <div class=\"form-row\">\r\n        <div class=\"form-field\">\r\n          <label for=\"firstName\">Name</label>\r\n          <input id=\"firstName\" type=\"text\" formControlName=\"firstName\" placeholder=\"Rachana\">\r\n        </div>\r\n        \r\n        <div class=\"form-field\">\r\n          <label for=\"lastName\">Name</label>\r\n          <input id=\"lastName\" type=\"text\" formControlName=\"lastName\" placeholder=\"Singh\">\r\n        </div>\r\n      </div>\r\n      \r\n      <div class=\"form-row\">\r\n        <div class=\"form-field\">\r\n          <label for=\"email\">Email Address</label>\r\n          <input id=\"email\" type=\"email\" formControlName=\"email\" placeholder=\"rachanasingh@gmail.com\">\r\n        </div>\r\n        \r\n        <div class=\"form-field\">\r\n          <label for=\"status\">Status</label>\r\n          <div class=\"status-toggle\">\r\n            <mat-slide-toggle color=\"primary\" formControlName=\"status\"></mat-slide-toggle>\r\n            <span class=\"status-label\">{{ userForm.get('status')?.value ? 'Active' : 'Inactive' }}</span>\r\n          </div>\r\n        </div>\r\n      </div>\r\n      \r\n      <div class=\"section-title\">Organisation Details</div>\r\n      \r\n      <div class=\"form-row\">\r\n        <div class=\"form-field\">\r\n          <label for=\"department\">Department</label>\r\n          <input type=\"text\" \r\n                 id=\"department\" \r\n                 formControlName=\"department\" \r\n                 placeholder=\"Type or select department\"\r\n                 [matAutocomplete]=\"departmentAuto\">\r\n          <mat-autocomplete #departmentAuto=\"matAutocomplete\">\r\n            <mat-option *ngFor=\"let dept of filteredDepartments | async\" [value]=\"dept\">\r\n              {{ dept }}\r\n            </mat-option>\r\n          </mat-autocomplete>\r\n        </div>\r\n        \r\n        <div class=\"form-field\">\r\n          <label for=\"role\">Role</label>\r\n          <input type=\"text\" \r\n                 id=\"role\" \r\n                 formControlName=\"role\" \r\n                 placeholder=\"Type or select role\"\r\n                 [matAutocomplete]=\"roleAuto\">\r\n          <mat-autocomplete #roleAuto=\"matAutocomplete\">\r\n            <mat-option *ngFor=\"let role of filteredRoles | async\" [value]=\"role\">\r\n              {{ role }}\r\n            </mat-option>\r\n          </mat-autocomplete>\r\n        </div>\r\n      </div>\r\n      \r\n      <div class=\"form-row\">\r\n        <div class=\"form-field\">\r\n          <label for=\"manager\">Manager</label>\r\n          <mat-select id=\"manager\" formControlName=\"manager\" placeholder=\"Select Manager\">\r\n            <mat-option [value]=\"null\">No Manager</mat-option>\r\n            <mat-option *ngFor=\"let manager of availableManagers\" [value]=\"manager.id\">\r\n              {{ manager.name || (manager.first_name + ' ' + manager.last_name) }}\r\n            </mat-option>\r\n          </mat-select>\r\n        </div>\r\n      </div>\r\n    </form>\r\n    \r\n    <!-- Groups Tab -->\r\n    <div *ngIf=\"activeTab === 'groups'\" class=\"membership-tab\">\r\n      <app-organization-tree [userId]=\"data.user.id\"></app-organization-tree>\r\n    </div>\r\n    \r\n    <!-- Permissions Tab -->\r\n    <div *ngIf=\"activeTab === 'permissions'\" class=\"permissions-content\">\r\n      <!-- Loading state -->\r\n      <div *ngIf=\"loadingPermissions\" class=\"loading-container\">\r\n        <mat-spinner diameter=\"40\"></mat-spinner>\r\n        <p>Loading user permissions...</p>\r\n      </div>\r\n      \r\n      <!-- Empty state -->\r\n      <div *ngIf=\"!loadingPermissions && userPermissions.length === 0\" class=\"empty-state\">\r\n        <mat-icon>security</mat-icon>\r\n        <p>No permissions found for this user</p>\r\n        <p class=\"hint-text\">This user doesn't have access to any artifacts</p>\r\n      </div>\r\n      \r\n      <!-- Permissions list -->\r\n      <div *ngIf=\"!loadingPermissions && userPermissions.length > 0\" class=\"permissions-list\">\r\n        <h3>Artifacts this user has access to:</h3>\r\n        \r\n        <table class=\"permissions-table\">\r\n          <thead>\r\n            <tr>\r\n              <th>Artifact Name</th>\r\n              <th>Permissions</th>\r\n            </tr>\r\n          </thead>\r\n          <tbody>\r\n            <tr *ngFor=\"let item of userPermissions\">\r\n              <td>{{ item.artifactName }}</td>\r\n              <td>\r\n                <div class=\"permission-badges\">\r\n                  <span class=\"permission-badge\" *ngFor=\"let perm of item.permissions\">{{ perm }}</span>\r\n                </div>\r\n              </td>\r\n            </tr>\r\n          </tbody>\r\n        </table>\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n  <div class=\"dialog-actions\">\r\n    <button mat-button (click)=\"onCancel()\">Cancel</button>\r\n    <button mat-flat-button color=\"primary\" [disabled]=\"userForm.invalid\" (click)=\"onSave()\">Save</button>\r\n  </div>\r\n</div>","import { Component, Inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\n\n@Component({\n  selector: 'app-confirm-dialog',\n  standalone: true,\n  imports: [\n    CommonModule,\n    MatDialogModule,\n    MatButtonModule,\n    MatIconModule\n  ],\n  template: `\n    <div class=\"confirm-dialog\">\n      <div class=\"dialog-header\">\n        <h2>{{ data.title || 'Confirm Action' }}</h2>\n        <button mat-icon-button (click)=\"onCancel()\">\n          <mat-icon>close</mat-icon>\n        </button>\n      </div>\n      \n      <div class=\"dialog-content\">\n        <p>{{ data.message || 'Are you sure you want to proceed?' }}</p>\n      </div>\n      \n      <div class=\"dialog-actions\">\n        <button mat-button (click)=\"onCancel()\">\n          {{ data.cancelText || 'Cancel' }}\n        </button>\n        <button mat-flat-button \n                [color]=\"data.color || 'warn'\" \n                (click)=\"onConfirm()\">\n          {{ data.confirmText || 'Confirm' }}\n        </button>\n      </div>\n    </div>\n  `,\n  styles: [`\n    .confirm-dialog {\n      width: 400px;\n      max-width: 100%;\n    }\n    \n    .dialog-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      padding: 16px 24px;\n      border-bottom: 1px solid #e0e0e0;\n    }\n    \n    .dialog-header h2 {\n      margin: 0;\n      font-size: 18px;\n      font-weight: 500;\n    }\n    \n    .dialog-content {\n      padding: 24px;\n      color: #555;\n      font-size: 16px;\n    }\n    \n    .dialog-actions {\n      display: flex;\n      justify-content: flex-end;\n      padding: 16px 24px;\n      border-top: 1px solid #e0e0e0;\n      gap: 12px;\n    }\n  `]\n})\nexport class ConfirmDialogComponent {\n  constructor(\n    public dialogRef: MatDialogRef<ConfirmDialogComponent>,\n    @Inject(MAT_DIALOG_DATA) public data: {\n      title?: string;\n      message?: string;\n      confirmText?: string;\n      cancelText?: string;\n      color?: 'primary' | 'accent' | 'warn';\n    }\n  ) {}\n\n  onConfirm(): void {\n    this.dialogRef.close(true);\n  }\n\n  onCancel(): void {\n    this.dialogRef.close(false);\n  }\n}","import { Component, OnInit, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatSortModule } from '@angular/material/sort';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatDialogModule, MatDialog } from '@angular/material/dialog';\r\nimport { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\n// import { ActivatedRoute } from '@angular/router'; // Removed for routing-less library\r\nimport { CombinedHierarchyComponent } from '../combined-hierarchy/combined-hierarchy.component';\r\nimport { catchError, finalize } from 'rxjs/operators';\r\nimport { of } from 'rxjs';\r\n\r\nimport { UserService } from '../../services/user.service';\r\nimport { HierarchyService } from '../../services/hierarchy.service';\r\nimport { AccessRuleService } from '../../services/access-rule.service';\r\nimport { ExpressionParserService } from '../../services/expression-parser.service';\r\nimport { SyncExpressionResolverService } from '../../services/sync-expression-resolver.service';\r\nimport { User, UserGroup as UserModelGroup } from '../../models/user.model';\r\nimport { UserGroup } from '../../models/group.model';\r\nimport { AddUserDialogComponent } from '../add-user-dialog/add-user-dialog.component';\r\nimport { EditUserDialogComponent } from '../edit-user-dialog/edit-user-dialog.component';\r\nimport { ConfirmDialogComponent } from '../confirm-dialog/confirm-dialog.component';\r\n\r\n@Component({\r\n  selector: 'app-user-management',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    MatTableModule,\r\n    MatPaginatorModule,\r\n    MatSortModule,\r\n    MatButtonModule,\r\n    MatIconModule,\r\n    MatInputModule,\r\n    MatFormFieldModule,\r\n    MatSelectModule,\r\n    MatMenuModule,\r\n    MatChipsModule,\r\n    MatTabsModule,\r\n    MatCheckboxModule,\r\n    MatDialogModule,\r\n    MatSnackBarModule,\r\n    MatProgressSpinnerModule,\r\n    FormsModule,\r\n    ReactiveFormsModule,\r\n    CombinedHierarchyComponent\r\n  ],\r\n  templateUrl: './user-management.component.html',\r\n  styleUrls: ['./user-management.component.scss']\r\n})\r\nexport class UserManagementComponent implements OnInit, OnChanges {\r\n  displayedColumns: string[] = ['name', 'status', 'actions'];\r\n  dataSource: User[] = [];\r\n  filteredDataSource: User[] = [];\r\n  searchQuery: string = '';\r\n  \r\n  // Filter properties\r\n  statusFilter: string = 'all';\r\n  \r\n  @Input() selectedTab: 'users' | 'groups' | 'hierarchy' = 'users';\r\n  @Output() tabChanged = new EventEmitter<'users' | 'groups' | 'hierarchy'>();\r\n  \r\n  activeTab: 'users' | 'groups' | 'hierarchy' = 'users';\r\n  groupsData: UserGroup[] = [];\r\n  filteredGroupsData: UserGroup[] = [];\r\n  hierarchyData: any[] = [];\r\n  \r\n  // Loading state properties\r\n  loading = false;\r\n  groupsLoading = false;\r\n  hierarchyLoading = false;\r\n  error = '';\r\n  \r\n\r\n  constructor(\r\n    private userService: UserService,\r\n    private hierarchyService: HierarchyService,\r\n    private expressionParser: ExpressionParserService,\r\n    private syncExpressionResolver: SyncExpressionResolverService,\r\n    private accessRuleService: AccessRuleService,\r\n    private dialog: MatDialog,\r\n    private snackBar: MatSnackBar,\r\n    private cdr: ChangeDetectorRef\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    // Set initial tab from input\r\n    if (this.selectedTab) {\r\n      this.activeTab = this.selectedTab;\r\n    }\r\n    \r\n    this.loadUsers();\r\n    this.loadGroups();\r\n    this.loadHierarchy();\r\n  }\r\n  \r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    // Update active tab when input changes\r\n    if (changes['selectedTab'] && changes['selectedTab'].currentValue) {\r\n      this.activeTab = changes['selectedTab'].currentValue;\r\n    }\r\n  }\r\n\r\n  loadUsers(): void {\r\n    this.loading = true;\r\n    this.error = '';\r\n    \r\n    this.userService.getUsers()\r\n      .pipe(\r\n        catchError(error => {\r\n          console.error('Error loading users:', error);\r\n          this.error = 'Failed to load users. Please try again later.';\r\n          this.showNotification(`Error: ${this.error}`);\r\n          return of([]);\r\n        }),\r\n        finalize(() => this.loading = false)\r\n      )\r\n      .subscribe(users => {\r\n        this.dataSource = users;\r\n        this.filteredDataSource = users;\r\n        \r\n        // Users loaded successfully\r\n      });\r\n  }\r\n\r\n\r\n  loadGroups(): void {\r\n    this.groupsLoading = true;\r\n    \r\n    this.userService.getGroups()\r\n      .pipe(\r\n        catchError(error => {\r\n          console.error('Error loading groups:', error);\r\n          this.showNotification('Failed to load user groups');\r\n          return of([]);\r\n        }),\r\n        finalize(() => this.groupsLoading = false)\r\n      )\r\n      .subscribe((apiGroups: UserModelGroup[]) => {\r\n        // Convert from UserModelGroup to UserGroup\r\n        this.groupsData = apiGroups.map(group => ({\r\n          id: group.id,\r\n          name: group.name || '',\r\n          description: group.description || '',\r\n          expression: group.expression || '',\r\n          memberCount: group.memberCount || 0,\r\n          status: group.active ? 'Active' : 'Inactive',\r\n          createdAt: group.created_at ? new Date(group.created_at) : undefined,\r\n          updatedAt: group.updated_at ? new Date(group.updated_at) : undefined\r\n        }));\r\n        \r\n      });\r\n  }\r\n\r\n  loadHierarchy(): void {\r\n    this.hierarchyLoading = true;\r\n    this.hierarchyService.buildCombinedHierarchy().pipe(\r\n      catchError(error => {\r\n        console.error('Error loading hierarchy:', error);\r\n        this.showNotification('Failed to load organization hierarchy');\r\n        return of([]);\r\n      }),\r\n      finalize(() => this.hierarchyLoading = false)\r\n    ).subscribe(hierarchyData => {\r\n      this.hierarchyData = hierarchyData;\r\n    });\r\n  }\r\n\r\n  switchTab(tab: 'users' | 'groups' | 'hierarchy'): void {\r\n    this.activeTab = tab;\r\n    this.tabChanged.emit(tab);\r\n  }\r\n\r\n  onAddUserClick(): void {\r\n    const dialogRef = this.dialog.open(AddUserDialogComponent, {\r\n      width: '600px',\r\n      panelClass: 'custom-dialog-container'\r\n    });\r\n\r\n    dialogRef.afterClosed().subscribe(result => {\r\n      if (result) {\r\n        // Dialog already created the user - just reload the list and show notification\r\n        this.loadUsers(); // Reload users list when new user is added\r\n        this.showNotification('User added successfully');\r\n      }\r\n    });\r\n  }\r\n\r\n  onEditUser(user: User): void {\r\n    const dialogRef = this.dialog.open(EditUserDialogComponent, {\r\n      width: '600px',\r\n      panelClass: 'custom-dialog-container',\r\n      data: { \r\n        user: user  // Pass the complete User object\r\n      }\r\n    });\r\n\r\n    dialogRef.afterClosed().subscribe(result => {\r\n      if (result) {\r\n        // The dialog already updated the user in the database\r\n        // We just need to refresh our list\r\n        this.loadUsers();\r\n        this.showNotification('User updated successfully');\r\n      }\r\n    });\r\n  }\r\n\r\n  onDeleteUser(user: User): void {\r\n    const dialogRef = this.dialog.open(ConfirmDialogComponent, {\r\n      width: '400px',\r\n      data: {\r\n        title: 'Delete User',\r\n        message: `Are you sure you want to delete ${user.name}?`,\r\n        confirmText: 'Delete',\r\n        cancelText: 'Cancel',\r\n        color: 'warn'\r\n      }\r\n    });\r\n\r\n    dialogRef.afterClosed().subscribe(confirmed => {\r\n      if (confirmed) {\r\n        this.userService.deleteUser(user.id)\r\n          .pipe(\r\n            catchError(error => {\r\n              console.error('Error deleting user:', error);\r\n              this.showNotification('Failed to delete user. Please try again.');\r\n              return of(null);\r\n            })\r\n          )\r\n          .subscribe(response => {\r\n            if (response) {\r\n              this.loadUsers(); // Reload users list when user is deleted\r\n              this.showNotification('User deleted successfully');\r\n            }\r\n          });\r\n      }\r\n    });\r\n  }\r\n  \r\n  // Helper method to generate a unique user ID\r\n  private generateUserId(): string {\r\n    return 'user_' + new Date().getTime();\r\n  }\r\n\r\n  onAddGroupClick(): void {\r\n    import('./../../components/user-group-dialog/user-group-dialog.component').then(({ UserGroupDialogComponent }) => {\r\n      const dialogRef = this.dialog.open(UserGroupDialogComponent, {\r\n        width: '700px',\r\n        data: { isEdit: false }\r\n      });\r\n\r\n      dialogRef.afterClosed().subscribe(result => {\r\n        if (result) {\r\n          // Create user group with API format - use UserModelGroup for API calls\r\n          const newGroup: UserModelGroup = {\r\n            id: result.id || result.name.trim(),\r\n            type: 'USERGROUP',\r\n            name: result.name,\r\n            description: result.description,\r\n            expression: result.expression || '',\r\n            active: true,\r\n            user_metadata: {\r\n              name: result.name,\r\n              description: result.description\r\n            }\r\n          };\r\n          \r\n          this.userService.addUser(newGroup)\r\n            .pipe(\r\n              catchError(error => {\r\n                console.error('Error creating group:', error);\r\n                this.showNotification('Failed to create group. Please try again.');\r\n                return of(null);\r\n              })\r\n            )\r\n            .subscribe(group => {\r\n              if (group) {\r\n                this.showNotification('User group created successfully');\r\n                this.loadGroups(); // Reload groups to reflect changes\r\n              }\r\n            });\r\n        }\r\n      });\r\n    });\r\n  }\r\n  \r\n  onEditGroup(group: UserGroup): void {\r\n    import('./../../components/user-group-dialog/user-group-dialog.component').then(({ UserGroupDialogComponent }) => {\r\n      const dialogRef = this.dialog.open(UserGroupDialogComponent, {\r\n        width: '700px',\r\n        data: { \r\n          isEdit: true,\r\n          group: {\r\n            id: group.id,\r\n            name: group.name,\r\n            description: group.description,\r\n            expression: group.expression,\r\n            status: group.status,\r\n            memberCount: group.memberCount\r\n          } \r\n        }\r\n      });\r\n\r\n      dialogRef.afterClosed().subscribe(result => {\r\n        if (result) {\r\n          // Update user group with API format\r\n          // Convert the group model from our form to the API format\r\n          const updatedGroup: UserModelGroup = {\r\n            id: group.id,\r\n            name: result.name,\r\n            description: result.description,\r\n            expression: result.expression,\r\n            // Add these fields required by the API\r\n            type: 'USERGROUP' as const,\r\n            active: result.status === 'Active',\r\n            user_metadata: {\r\n              name: result.name,\r\n              description: result.description\r\n            }\r\n          };\r\n          \r\n          this.userService.updateUser(updatedGroup)\r\n            .pipe(\r\n              catchError(error => {\r\n                console.error('Error updating group:', error);\r\n                this.showNotification('Failed to update group. Please try again.');\r\n                return of(null);\r\n              })\r\n            )\r\n            .subscribe(response => {\r\n              if (response) {\r\n                this.showNotification('User group updated successfully');\r\n                this.loadGroups(); // Reload groups to reflect changes\r\n              }\r\n            });\r\n        }\r\n      });\r\n    });\r\n  }\r\n  \r\n  onDeleteGroup(group: UserGroup): void {\r\n    const dialogRef = this.dialog.open(ConfirmDialogComponent, {\r\n      width: '400px',\r\n      data: {\r\n        title: 'Delete Group',\r\n        message: `Are you sure you want to delete the group \"${group.name || group.id}\"?`,\r\n        confirmText: 'Delete',\r\n        cancelText: 'Cancel',\r\n        color: 'warn'\r\n      }\r\n    });\r\n\r\n    dialogRef.afterClosed().subscribe(confirmed => {\r\n      if (confirmed) {\r\n        this.userService.deleteUser(group.id)\r\n          .pipe(\r\n            catchError(error => {\r\n              console.error('Error deleting group:', error);\r\n              this.showNotification('Failed to delete group. Please try again.');\r\n              return of(false);\r\n            })\r\n          )\r\n          .subscribe(response => {\r\n            if (response) {\r\n              this.showNotification('User group deleted successfully');\r\n              this.loadGroups(); // Reload groups to reflect changes\r\n            }\r\n          });\r\n      }\r\n    });\r\n  }\r\n\r\n  onImportUsersClick(): void {\r\n    // console.log('Import users clicked');\r\n    this.showNotification('Import Users functionality coming soon');\r\n  }\r\n\r\n  onAddArtifactsClick(): void {\r\n    import('./../../components/artifact-dialog/artifact-dialog.component').then(({ ArtifactDialogComponent }) => {\r\n      const dialogRef = this.dialog.open(ArtifactDialogComponent, {\r\n        width: '700px',\r\n        data: { isEdit: false, isGroup: false }\r\n      });\r\n\r\n      dialogRef.afterClosed().subscribe(result => {\r\n        if (result) {\r\n          this.showNotification('Artifact created successfully');\r\n          this.loadUsers(); // Reload users to reflect any changes\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n\r\n  applyFilter(event?: Event): void {\r\n    let filteredData = this.dataSource;\r\n\r\n    // Apply text search filter\r\n    if (event) {\r\n      const filterValue = (event.target as HTMLInputElement).value.toLowerCase();\r\n      this.searchQuery = filterValue;\r\n    }\r\n    \r\n    if (this.searchQuery && this.searchQuery.trim()) {\r\n      const searchTerm = this.searchQuery.toLowerCase();\r\n      filteredData = filteredData.filter(user => \r\n        (user.name?.toLowerCase().includes(searchTerm)) || \r\n        (user.email?.toLowerCase()?.includes(searchTerm)) ||\r\n        (user.role?.toLowerCase()?.includes(searchTerm)) ||\r\n        (user.department?.toLowerCase()?.includes(searchTerm))\r\n      );\r\n    }\r\n\r\n    // Apply status filter\r\n    if (this.statusFilter !== 'all') {\r\n      filteredData = filteredData.filter(user => user.status === this.statusFilter);\r\n    }\r\n\r\n\r\n    this.filteredDataSource = filteredData;\r\n  }\r\n\r\n  onStatusFilterChange(): void {\r\n    this.applyFilter();\r\n  }\r\n\r\n\r\n  clearFilters(): void {\r\n    this.searchQuery = '';\r\n    this.statusFilter = 'all';\r\n    this.filteredDataSource = this.dataSource;\r\n  }\r\n\r\n  hasActiveFilters(): boolean {\r\n    return this.searchQuery !== '' || \r\n           this.statusFilter !== 'all';\r\n  }\r\n\r\n  getStatusClass(status: string): string {\r\n    return status === 'Active' ? 'status-active' : 'status-inactive';\r\n  }\r\n  \r\n  onRefresh(): void {\r\n    this.loadUsers();\r\n  }\r\n\r\n  getUserInitials(name: string): string {\r\n    if (!name) return '';\r\n    return name.split(' ').map(n => n?.[0] || '').join('');\r\n  }\r\n\r\n  // Handle API errors\r\n  private handleError(message: string, error: any): void {\r\n    console.error(error);\r\n    this.showNotification(`${message}: ${error.message || 'An unknown error occurred'}`);\r\n  }\r\n\r\n  private showNotification(message: string): void {\r\n    this.snackBar.open(message, 'Close', {\r\n      duration: 3000,\r\n      horizontalPosition: 'end',\r\n      verticalPosition: 'bottom'\r\n    });\r\n  }\r\n}","<div class=\"user-management-container\">\r\n  <div class=\"header\">\r\n    <h1>Users & User Groups</h1>\r\n    <div class=\"actions\">\r\n      <button mat-flat-button color=\"primary\" [matMenuTriggerFor]=\"addMenu\" class=\"add-button\">\r\n        <mat-icon>add</mat-icon> Add\r\n      </button>\r\n      <mat-menu #addMenu=\"matMenu\" class=\"add-menu\">\r\n        <button mat-menu-item (click)=\"onAddUserClick()\">\r\n          <mat-icon>person_add</mat-icon>\r\n          <span>Add User</span>\r\n        </button>\r\n        <button mat-menu-item (click)=\"onAddGroupClick()\">\r\n          <mat-icon>group_add</mat-icon>\r\n          <span>Add Group</span>\r\n        </button>\r\n        <button mat-menu-item (click)=\"onImportUsersClick()\">\r\n          <mat-icon>cloud_upload</mat-icon>\r\n          <span>Import Users from AD</span>\r\n        </button>\r\n        <button mat-menu-item (click)=\"onAddArtifactsClick()\">\r\n          <mat-icon>add_circle</mat-icon>\r\n          <span>Add Artifact's</span>\r\n        </button>\r\n      </mat-menu>\r\n    </div>\r\n  </div>\r\n\r\n  <div class=\"tabs-container\">\r\n    <div class=\"tabs-header\">\r\n      <div class=\"tab\" [ngClass]=\"{'active': activeTab === 'users'}\" (click)=\"switchTab('users')\">\r\n        <mat-icon>person</mat-icon>\r\n        Users\r\n      </div>\r\n      <div class=\"tab\" [ngClass]=\"{'active': activeTab === 'groups'}\" (click)=\"switchTab('groups')\">\r\n        <mat-icon>group</mat-icon>\r\n        Groups\r\n      </div>\r\n      <div class=\"tab\" [ngClass]=\"{'active': activeTab === 'hierarchy'}\" (click)=\"switchTab('hierarchy')\">\r\n        <mat-icon>account_tree</mat-icon>\r\n        Hierarchy\r\n      </div>\r\n    </div>\r\n    \r\n    <!-- Users Tab Content -->\r\n    <div class=\"tab-content\" *ngIf=\"activeTab === 'users'\">\r\n      <div class=\"search-container\">\r\n        <div class=\"search-field\">\r\n          <mat-icon>search</mat-icon>\r\n          <input placeholder=\"Search by name or employee ID\" [(ngModel)]=\"searchQuery\" (keyup)=\"applyFilter($event)\">\r\n        </div>\r\n        \r\n        <!-- Compact Filters on the right -->\r\n        <div class=\"filters-container\">\r\n          <div class=\"compact-filters\">\r\n            <mat-form-field appearance=\"outline\" class=\"compact-filter\">\r\n              <mat-label>Status</mat-label>\r\n              <mat-select [(value)]=\"statusFilter\" (selectionChange)=\"onStatusFilterChange()\">\r\n                <mat-option value=\"all\">All Statuses</mat-option>\r\n                <mat-option value=\"Active\">Active</mat-option>\r\n                <mat-option value=\"Inactive\">Inactive</mat-option>\r\n              </mat-select>\r\n            </mat-form-field>\r\n\r\n            <button mat-stroked-button color=\"primary\" (click)=\"clearFilters()\" \r\n                    class=\"clear-filters\" *ngIf=\"hasActiveFilters()\">\r\n              Clear Filters\r\n            </button>\r\n          </div>\r\n          \r\n          <div class=\"view-controls\">\r\n            <button mat-icon-button matTooltip=\"Refresh\" (click)=\"onRefresh()\">\r\n              <mat-icon>refresh</mat-icon>\r\n            </button>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <div class=\"table-container\">\r\n        <!-- Loading spinner -->\r\n        <div class=\"loading-container\" *ngIf=\"loading\">\r\n          <mat-spinner diameter=\"50\"></mat-spinner>\r\n          <p>Loading users...</p>\r\n        </div>\r\n        \r\n        <!-- Error message -->\r\n        <div class=\"error-container\" *ngIf=\"error && !loading\">\r\n          <mat-icon color=\"warn\">error</mat-icon>\r\n          <p>{{ error }}</p>\r\n          <button mat-button color=\"primary\" (click)=\"loadUsers()\">Retry</button>\r\n        </div>\r\n        \r\n        <!-- Empty state -->\r\n        <div class=\"empty-state\" *ngIf=\"!loading && !error && filteredDataSource.length === 0\">\r\n          <mat-icon>person_off</mat-icon>\r\n          <p>No users found</p>\r\n          <button mat-button color=\"primary\" (click)=\"onAddUserClick()\">Add User</button>\r\n        </div>\r\n        \r\n        <!-- Table with data -->\r\n        <table class=\"user-table\" *ngIf=\"!loading && !error && filteredDataSource.length > 0\">\r\n          <thead>\r\n            <tr>\r\n              <th class=\"checkbox-column\">\r\n                <mat-checkbox color=\"primary\"></mat-checkbox>\r\n              </th>\r\n              <th>Name</th>\r\n              <th>Status</th>\r\n              <th></th>\r\n            </tr>\r\n          </thead>\r\n          <tbody>\r\n            <tr *ngFor=\"let user of filteredDataSource\">\r\n              <td class=\"checkbox-column\">\r\n                <mat-checkbox color=\"primary\"></mat-checkbox>\r\n              </td>\r\n              <td>\r\n                <div class=\"user-info\">\r\n                  <div class=\"user-initials\">\r\n                    {{ getUserInitials(user.name || '') }}\r\n                  </div>\r\n                  <div class=\"user-details\">\r\n                    <div class=\"user-name\">{{ user.name }}</div>\r\n                    <div class=\"user-email\">{{ user.email }}</div>\r\n                  </div>\r\n                </div>\r\n              </td>\r\n              <td>\r\n                <div class=\"status-badge\" [ngClass]=\"getStatusClass(user.status || 'Inactive')\">\r\n                  {{ user.status || (user.active ? 'Active' : 'Inactive') }}\r\n                </div>\r\n              </td>\r\n              <td class=\"actions-column\">\r\n                <button mat-icon-button [matMenuTriggerFor]=\"actionMenu\" (click)=\"$event.stopPropagation()\">\r\n                  <mat-icon>more_vert</mat-icon>\r\n                </button>\r\n                <mat-menu #actionMenu=\"matMenu\">\r\n                  <button mat-menu-item (click)=\"onEditUser(user)\">\r\n                    <mat-icon>edit</mat-icon>\r\n                    <span>Edit</span>\r\n                  </button>\r\n                  <button mat-menu-item (click)=\"onDeleteUser(user)\">\r\n                    <mat-icon>delete</mat-icon>\r\n                    <span>Delete</span>\r\n                  </button>\r\n                </mat-menu>\r\n              </td>\r\n            </tr>\r\n          </tbody>\r\n        </table>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Groups Tab Content -->\r\n    <div class=\"tab-content\" *ngIf=\"activeTab === 'groups'\">\r\n      <div class=\"search-container\">\r\n        <div class=\"search-field\">\r\n          <mat-icon>search</mat-icon>\r\n          <input placeholder=\"Search by group name\" [(ngModel)]=\"searchQuery\">\r\n        </div>\r\n        <div class=\"view-controls\">\r\n          <button mat-icon-button (click)=\"loadGroups()\">\r\n            <mat-icon>refresh</mat-icon>\r\n          </button>\r\n        </div>\r\n      </div>\r\n\r\n      <div class=\"table-container\">\r\n        <!-- Loading spinner -->\r\n        <div class=\"loading-container\" *ngIf=\"groupsLoading\">\r\n          <mat-spinner diameter=\"50\"></mat-spinner>\r\n          <p>Loading groups...</p>\r\n        </div>\r\n        \r\n        <!-- Empty state -->\r\n        <div class=\"empty-state\" *ngIf=\"!groupsLoading && groupsData.length === 0\">\r\n          <mat-icon>group_off</mat-icon>\r\n          <p>No groups found</p>\r\n          <button mat-button color=\"primary\" (click)=\"onAddGroupClick()\">Add Group</button>\r\n        </div>\r\n        \r\n        <!-- Table with data -->\r\n        <table class=\"user-table\" *ngIf=\"!groupsLoading && groupsData.length > 0\">\r\n          <thead>\r\n            <tr>\r\n              <th class=\"checkbox-column\">\r\n                <mat-checkbox color=\"primary\"></mat-checkbox>\r\n              </th>\r\n              <th>Name</th>\r\n              <th>Description</th>\r\n              <th>Status</th>\r\n              <th></th>\r\n            </tr>\r\n          </thead>\r\n          <tbody>\r\n            <tr *ngFor=\"let group of groupsData\">\r\n              <td class=\"checkbox-column\">\r\n                <mat-checkbox color=\"primary\"></mat-checkbox>\r\n              </td>\r\n              <td>\r\n                <div class=\"group-info\">\r\n                  <div class=\"group-icon\">\r\n                    <mat-icon>group</mat-icon>\r\n                  </div>\r\n                  <div class=\"group-name\">{{ group.name || group.id }}</div>\r\n                </div>\r\n              </td>\r\n              <td>\r\n                <div class=\"group-description\">{{ group.description || 'No description' }}</div>\r\n              </td>\r\n              <td>\r\n                <div class=\"status-badge\" [ngClass]=\"getStatusClass(group.status)\">\r\n                  {{ group.status }}\r\n                </div>\r\n              </td>\r\n              <td class=\"actions-column\">\r\n                <button mat-icon-button [matMenuTriggerFor]=\"groupActionMenu\" (click)=\"$event.stopPropagation()\">\r\n                  <mat-icon>more_vert</mat-icon>\r\n                </button>\r\n                <mat-menu #groupActionMenu=\"matMenu\">\r\n                  <button mat-menu-item (click)=\"onEditGroup(group)\">\r\n                    <mat-icon>edit</mat-icon>\r\n                    <span>Edit</span>\r\n                  </button>\r\n                  <button mat-menu-item (click)=\"onDeleteGroup(group)\">\r\n                    <mat-icon>delete</mat-icon>\r\n                    <span>Delete</span>\r\n                  </button>\r\n                </mat-menu>\r\n              </td>\r\n            </tr>\r\n          </tbody>\r\n        </table>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Hierarchy Tab Content -->\r\n    <div class=\"tab-content\" *ngIf=\"activeTab === 'hierarchy'\">\r\n      <div class=\"hierarchy-content\">\r\n        <!-- Loading spinner -->\r\n        <div class=\"loading-container\" *ngIf=\"hierarchyLoading\">\r\n          <mat-spinner diameter=\"50\"></mat-spinner>\r\n          <p>Loading organization hierarchy...</p>\r\n        </div>\r\n        \r\n        <div class=\"organization-tree-container\" *ngIf=\"!hierarchyLoading\">\r\n          <app-combined-hierarchy></app-combined-hierarchy>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>","import { Component, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatSortModule } from '@angular/material/sort';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatDialogModule, MatDialog } from '@angular/material/dialog';\r\nimport { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { GroupService } from '../../services/group.service';\r\nimport { UserGroup } from '../../models/group.model';\r\nimport { ConfirmDialogComponent } from '../confirm-dialog/confirm-dialog.component';\r\n\r\n@Component({\r\n  selector: 'app-user-groups',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    MatTableModule,\r\n    MatPaginatorModule,\r\n    MatSortModule,\r\n    MatButtonModule,\r\n    MatIconModule,\r\n    MatInputModule,\r\n    MatFormFieldModule,\r\n    MatMenuModule,\r\n    MatChipsModule,\r\n    MatTabsModule,\r\n    MatCheckboxModule,\r\n    MatDialogModule,\r\n    MatSnackBarModule,\r\n    FormsModule,\r\n    ReactiveFormsModule\r\n  ],\r\n  templateUrl: './user-groups.component.html',\r\n  styleUrls: ['./user-groups.component.scss']\r\n})\r\nexport class UserGroupsComponent implements OnInit {\r\n  displayedColumns: string[] = ['name', 'description', 'memberCount', 'status', 'actions'];\r\n  dataSource: UserGroup[] = [];\r\n  filteredDataSource: UserGroup[] = [];\r\n  searchQuery: string = '';\r\n\r\n  constructor(\r\n    private groupService: GroupService,\r\n    private dialog: MatDialog,\r\n    private snackBar: MatSnackBar\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.loadGroups();\r\n  }\r\n\r\n  loadGroups(): void {\r\n    this.groupService.getGroups().subscribe(groups => {\r\n      // Initialize with groups data\r\n      this.dataSource = groups;\r\n      this.filteredDataSource = groups;\r\n    });\r\n  }\r\n\r\n\r\n  onAddGroupClick(): void {\r\n    import('./../../components/user-group-dialog/user-group-dialog.component').then(({ UserGroupDialogComponent }) => {\r\n      const dialogRef = this.dialog.open(UserGroupDialogComponent, {\r\n        width: '700px',\r\n        data: { isEdit: false }\r\n      });\r\n\r\n      dialogRef.afterClosed().subscribe(result => {\r\n        if (result) {\r\n          this.groupService.addGroup(result).subscribe({\r\n            next: (newGroup) => {\r\n              this.loadGroups();\r\n              this.showNotification('User group created successfully');\r\n            },\r\n            error: (error) => {\r\n              console.error('Error creating group:', error);\r\n              // Check if it's a conflict error but operation succeeded (upsert)\r\n              if (error.status === 409 || error.message?.includes('successfully despite conflict')) {\r\n                this.loadGroups(); // Refresh data as it might have been created/updated\r\n                this.showNotification('User group created successfully');\r\n              } else {\r\n                // Show user-friendly error message\r\n                const errorMessage = error.userMessage || error.message || 'Failed to create user group';\r\n                this.showNotification(errorMessage, 'error');\r\n              }\r\n            }\r\n          });\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n  onEditGroup(group: UserGroup): void {\r\n    import('./../../components/user-group-dialog/user-group-dialog.component').then(({ UserGroupDialogComponent }) => {\r\n      const dialogRef = this.dialog.open(UserGroupDialogComponent, {\r\n        width: '700px',\r\n        data: { group, isEdit: true }\r\n      });\r\n\r\n      dialogRef.afterClosed().subscribe(result => {\r\n        if (result) {\r\n          this.groupService.updateGroup(result).subscribe({\r\n            next: (updatedGroup) => {\r\n              this.loadGroups();\r\n              this.showNotification('User group updated successfully');\r\n            },\r\n            error: (error) => {\r\n              console.error('Error updating group:', error);\r\n              // Check if it's a conflict error but operation succeeded\r\n              if (error.status === 409 || error.message?.includes('successfully despite conflict')) {\r\n                this.loadGroups(); // Refresh data as it might have been updated\r\n                this.showNotification('User group updated successfully');\r\n              } else {\r\n                // Show user-friendly error message\r\n                const errorMessage = error.userMessage || error.message || 'Failed to update user group';\r\n                this.showNotification(errorMessage, 'error');\r\n              }\r\n            }\r\n          });\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n  onDeleteGroup(group: UserGroup): void {\r\n    const dialogRef = this.dialog.open(ConfirmDialogComponent, {\r\n      width: '400px',\r\n      data: {\r\n        title: 'Delete User Group',\r\n        message: `Are you sure you want to delete ${group.name}?`,\r\n        confirmText: 'Delete',\r\n        cancelText: 'Cancel',\r\n        color: 'warn'\r\n      }\r\n    });\r\n\r\n    dialogRef.afterClosed().subscribe(confirmed => {\r\n      if (confirmed) {\r\n        this.groupService.deleteGroup(group.id).subscribe(success => {\r\n          if (success) {\r\n            this.loadGroups();\r\n            this.showNotification('User group deleted successfully');\r\n          }\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n  applyFilter(event: Event): void {\r\n    const filterValue = (event.target as HTMLInputElement).value.toLowerCase();\r\n    this.searchQuery = filterValue;\r\n    \r\n    if (filterValue) {\r\n      this.filteredDataSource = this.dataSource.filter(group => \r\n        group.name.toLowerCase().includes(filterValue) || \r\n        group.description?.toLowerCase().includes(filterValue)\r\n      );\r\n    } else {\r\n      this.filteredDataSource = [...this.dataSource];\r\n    }\r\n  }\r\n\r\n  onRefresh(): void {\r\n    this.loadGroups();\r\n  }\r\n\r\n  getStatusClass(status: string): string {\r\n    return status === 'Active' ? 'status-active' : 'status-inactive';\r\n  }\r\n\r\n  private showNotification(message: string, type: 'success' | 'error' = 'success'): void {\r\n    this.snackBar.open(message, 'Close', {\r\n      duration: type === 'error' ? 5000 : 3000, // Show errors longer\r\n      horizontalPosition: 'end',\r\n      verticalPosition: 'bottom',\r\n      panelClass: type === 'error' ? ['error-snackbar'] : ['success-snackbar']\r\n    });\r\n  }\r\n}","<div class=\"user-groups-container\">\r\n  <div class=\"header\">\r\n    <h1>User Groups</h1>\r\n    <div class=\"actions\">\r\n      <button mat-flat-button color=\"primary\" class=\"add-button\" (click)=\"onAddGroupClick()\">\r\n        <mat-icon>add</mat-icon> Add Group\r\n      </button>\r\n    </div>\r\n  </div>\r\n\r\n  <div class=\"content-container\">\r\n    <div class=\"search-container\">\r\n      <div class=\"search-field\">\r\n        <mat-icon>search</mat-icon>\r\n        <input placeholder=\"Search user groups...\" [(ngModel)]=\"searchQuery\" (keyup)=\"applyFilter($event)\">\r\n      </div>\r\n      <div class=\"view-controls\">\r\n        <button mat-icon-button (click)=\"onRefresh()\" title=\"Refresh\">\r\n          <mat-icon>refresh</mat-icon>\r\n        </button>\r\n      </div>\r\n    </div>\r\n\r\n    <div class=\"table-container\">\r\n      <table class=\"groups-table\">\r\n        <thead>\r\n          <tr>\r\n            <th class=\"checkbox-column\">\r\n              <mat-checkbox color=\"primary\"></mat-checkbox>\r\n            </th>\r\n            <th>Name</th>\r\n            <th>Description</th>\r\n            <th>Expression</th>\r\n            <th>Status</th>\r\n            <th>Actions</th>\r\n          </tr>\r\n        </thead>\r\n        <tbody>\r\n          <tr *ngFor=\"let group of filteredDataSource\">\r\n            <td class=\"checkbox-column\">\r\n              <mat-checkbox color=\"primary\"></mat-checkbox>\r\n            </td>\r\n            <td>\r\n              <div class=\"group-name\">{{ group.name }}</div>\r\n            </td>\r\n            <td>\r\n              <div class=\"group-description\">{{ group.description }}</div>\r\n            </td>\r\n            <td>\r\n              <div class=\"group-expression\" *ngIf=\"group.expression\">{{ group.expression }}</div>\r\n              <div class=\"no-expression\" *ngIf=\"!group.expression\">No expression</div>\r\n            </td>\r\n            <td>\r\n              <div class=\"status-badge\" [ngClass]=\"getStatusClass(group.status)\">\r\n                {{ group.status }}\r\n              </div>\r\n            </td>\r\n            <td class=\"actions-column\">\r\n              <button mat-icon-button [matMenuTriggerFor]=\"actionMenu\" (click)=\"$event.stopPropagation()\">\r\n                <mat-icon>more_vert</mat-icon>\r\n              </button>\r\n              <mat-menu #actionMenu=\"matMenu\">\r\n                <button mat-menu-item (click)=\"onEditGroup(group)\">\r\n                  <mat-icon>edit</mat-icon>\r\n                  <span>Edit</span>\r\n                </button>\r\n                <button mat-menu-item (click)=\"onDeleteGroup(group)\">\r\n                  <mat-icon>delete</mat-icon>\r\n                  <span>Delete</span>\r\n                </button>\r\n              </mat-menu>\r\n            </td>\r\n          </tr>\r\n        </tbody>\r\n      </table>\r\n    </div>\r\n  </div>\r\n</div>","import { Component, OnInit, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatTreeModule, MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree';\nimport { FlatTreeControl } from '@angular/cdk/tree';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { FormsModule } from '@angular/forms';\nimport { UserService } from '../../services/user.service';\nimport { ArtifactService } from '../../services/artifact.service';\nimport { User, UserGroup } from '../../models/user.model';\nimport { Artifact, ArtifactGroup } from '../../models/artifact.model';\n\ninterface HierarchyNode {\n  name: string;\n  description?: string;\n  id: string;\n  level: number;\n  expandable: boolean;\n  children?: HierarchyNode[];\n  count?: number;\n  status: 'Active' | 'Inactive';\n  type: 'user' | 'group' | 'artifact' | 'artifactGroup';\n  position?: string;\n  expression?: string;\n}\n\ninterface FlatNode {\n  expandable: boolean;\n  name: string;\n  description?: string;\n  level: number;\n  id: string;\n  count?: number;\n  status: 'Active' | 'Inactive';\n  type: 'user' | 'group' | 'artifact' | 'artifactGroup';\n  position?: string;\n  expression?: string;\n}\n\n@Component({\n  selector: 'app-hierarchy',\n  standalone: true,\n  imports: [\n    CommonModule,\n    MatTreeModule,\n    MatIconModule,\n    MatButtonModule,\n    MatInputModule,\n    MatFormFieldModule,\n    MatTabsModule,\n    MatChipsModule,\n    FormsModule\n  ],\n  templateUrl: './hierarchy.component.html',\n  styleUrls: ['./hierarchy.component.scss']\n})\nexport class HierarchyComponent implements OnInit {\n  @Input() showArtifactHierarchy: boolean = false;\n  @Input() artifactId: string = '';\n  @Input() showUserHierarchy: boolean = false;\n  @Input() userId: string = '';\n  \n  // Type guard to check if an object is an Artifact\n  private isArtifact(entity: any): entity is Artifact {\n    return 'type' in entity;\n  }\n  private transformer = (node: HierarchyNode, level: number): FlatNode => {\n    return {\n      expandable: !!node.children && node.children.length > 0,\n      name: node.name,\n      description: node.description,\n      level: level,\n      id: node.id,\n      count: node.count,\n      status: node.status,\n      type: node.type,\n      position: node.position\n    };\n  };\n\n  treeControl = new FlatTreeControl<FlatNode>(\n    node => node.level,\n    node => node.expandable\n  );\n\n  treeFlattener = new MatTreeFlattener(\n    this.transformer,\n    node => node.level,\n    node => node.expandable,\n    node => node.children\n  );\n\n  dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);\n  searchQuery: string = '';\n  originalData: HierarchyNode[] = [];\n  activeTab: 'organization' | 'groups' | 'artifacts' = 'organization';\n\n  constructor(\n    private userService: UserService,\n    private artifactService: ArtifactService\n  ) {}\n\n  ngOnInit(): void {\n    if (this.showArtifactHierarchy && this.artifactId) {\n      this.loadArtifactSpecificHierarchy();\n    } else if (this.showUserHierarchy && this.userId) {\n      this.loadUserSpecificHierarchy();\n    } else {\n      this.switchTab('organization');\n    }\n  }\n  \n  loadArtifactSpecificHierarchy(): void {\n    // Get the specific artifact\n    this.artifactService.getArtifactById(this.artifactId).subscribe(artifact => {\n      if (artifact) {\n        // If it's a group, find what's in it\n        if (artifact.type === 'RESOURCEGROUP') {\n          // Create a hierarchy showing only this artifact group and what it contains\n          const hierarchyData: HierarchyNode[] = [{\n            name: artifact.name,\n            description: artifact.description,\n            id: artifact.id,\n            level: 0,\n            expandable: true,\n            children: [],\n            status: artifact.status,\n            type: 'artifactGroup',\n            expression: artifact.expression\n          }];\n          \n          if (artifact.expression) {\n            // Find the artifacts referenced in the expression\n            const referencedIds = artifact.expression.split(/[+\\-]/g);\n            \n            // Fetch artifacts mentioned in the expression\n            this.artifactService.getArtifacts().subscribe(allArtifacts => {\n              const childArtifacts = allArtifacts.filter(a => \n                referencedIds.includes(a.id)\n              );\n              \n              // Add them as children\n              const childNodes: HierarchyNode[] = childArtifacts.map(a => ({\n                name: a.name,\n                description: a.description,\n                id: a.id,\n                level: 1,\n                expandable: false,\n                status: a.status,\n                type: a.type === 'RESOURCEGROUP' ? 'artifactGroup' as const : 'artifact' as const,\n                expression: a.expression\n              }));\n              hierarchyData[0].children = childNodes;\n              \n              this.originalData = hierarchyData;\n              this.dataSource.data = hierarchyData;\n              \n              // Expand the root node\n              if (this.treeControl.dataNodes && this.treeControl.dataNodes.length > 0) {\n                this.treeControl.expand(this.treeControl.dataNodes[0]);\n              }\n            });\n          }\n        } else {\n          // For a single artifact, show where it's used in groups\n          const hierarchyData: HierarchyNode[] = [{\n            name: artifact.name,\n            description: artifact.description,\n            id: artifact.id,\n            level: 0,\n            expandable: true,\n            children: [],\n            status: artifact.status,\n            type: 'artifact' as const\n          }];\n          \n          // Find groups that reference this artifact\n          this.artifactService.getArtifactGroups().subscribe(groups => {\n            const parentGroups = groups.filter(g => \n              g.expression && g.expression.includes(artifact.id)\n            );\n            \n            if (parentGroups.length > 0) {\n              const groupNodes: HierarchyNode[] = parentGroups.map(g => ({\n                name: g.name,\n                description: g.description,\n                id: g.id,\n                level: 2,\n                expandable: false,\n                status: g.status,\n                type: 'artifactGroup' as const,\n                expression: g.expression\n              }));\n              \n              const usedInNode: HierarchyNode = {\n                name: 'Used in groups',\n                description: 'Groups that reference this artifact',\n                id: 'used_in_groups',\n                level: 1,\n                expandable: true,\n                children: groupNodes,\n                status: 'Active',\n                type: 'artifactGroup' as const\n              };\n              \n              hierarchyData[0]!.children!.push(usedInNode);\n            }\n            \n            this.originalData = hierarchyData;\n            this.dataSource.data = hierarchyData;\n            \n            // Expand nodes\n            if (this.treeControl.dataNodes && this.treeControl.dataNodes.length > 0) {\n              this.treeControl.expandAll();\n            }\n          });\n        }\n      }\n    });\n  }\n  \n  loadUserSpecificHierarchy(): void {\n    // Get the specific user\n    this.userService.getUserById(this.userId).subscribe(user => {\n      if (user) {\n        // Get user display name\n        const userName = this.getUserDisplayName(user);\n        const userDept = user.department || '';\n        const userRole = user.role || '';\n        const userDescription = userDept + (userDept && userRole ? ' / ' : '') + userRole;\n        \n        // Create a hierarchy showing only this user and their relationships\n        const hierarchyData: HierarchyNode[] = [{\n          name: userName,\n          description: userDescription,\n          id: user.id,\n          level: 0,\n          expandable: true,\n          children: [],\n          status: user.active ? 'Active' : 'Inactive',\n          type: 'user' as const,\n          position: userRole\n        }];\n        \n        // Add manager if available\n        if (user.manager_id || user.reportingTo) {\n          const managerId = user.manager_id || user.reportingTo || '';\n          \n          // Try to get manager details\n          this.userService.getUserById(managerId).subscribe({\n            next: manager => {\n              if (manager) {\n                const managerName = this.getUserDisplayName(manager);\n                \n                const managerChildNode: HierarchyNode = {\n                  name: managerName,\n                  description: 'Manager',\n                  id: 'manager_' + user.id,\n                  level: 2,\n                  expandable: false,\n                  status: 'Active',\n                  type: 'user' as const,\n                  position: 'Manager'\n                };\n                \n                const managerNode: HierarchyNode = {\n                  name: 'Reports to',\n                  description: 'Manager',\n                  id: 'manager_section',\n                  level: 1,\n                  expandable: true,\n                  children: [managerChildNode],\n                  status: 'Active',\n                  type: 'user' as const\n                };\n                \n                hierarchyData[0]!.children!.push(managerNode);\n                this.updateHierarchyData(hierarchyData);\n              }\n            },\n            error: () => {\n              // If can't find manager details, just use ID\n              const managerChildNode: HierarchyNode = {\n                name: managerId,\n                description: 'Manager',\n                id: 'manager_' + user.id,\n                level: 2,\n                expandable: false,\n                status: 'Active',\n                type: 'user' as const,\n                position: 'Manager'\n              };\n              \n              const managerNode: HierarchyNode = {\n                name: 'Reports to',\n                description: 'Manager',\n                id: 'manager_section',\n                level: 1,\n                expandable: true,\n                children: [managerChildNode],\n                status: 'Active',\n                type: 'user' as const\n              };\n              \n              hierarchyData[0]!.children!.push(managerNode);\n              this.updateHierarchyData(hierarchyData);\n            }\n          });\n        }\n        \n        // Find groups this user is part of\n        this.userService.getUserGroups(user.id).subscribe({\n          next: groups => {\n            if (groups && groups.length > 0) {\n              const groupChildNodes: HierarchyNode[] = groups.map(g => ({\n                name: this.getGroupDisplayName(g),\n                description: g.description || '',\n                id: g.id,\n                level: 2,\n                expandable: false,\n                status: g.active ? 'Active' : 'Inactive',\n                type: 'group' as const,\n                count: g.memberCount || 0\n              }));\n              \n              const groupsNode: HierarchyNode = {\n                name: 'Member of groups',\n                description: 'Groups that include this user',\n                id: 'member_of_groups',\n                level: 1,\n                expandable: true,\n                children: groupChildNodes,\n                status: 'Active',\n                type: 'group' as const\n              };\n              \n              hierarchyData[0]!.children!.push(groupsNode);\n              this.updateHierarchyData(hierarchyData);\n            }\n          },\n          error: () => {\n            // Handle error getting groups\n            console.error('Failed to load user groups');\n            this.updateHierarchyData(hierarchyData);\n          }\n        });\n        \n        // Initialize the tree even if we're still waiting for API responses\n        this.updateHierarchyData(hierarchyData);\n      }\n    });\n  }\n  \n  // Helper method to update hierarchy data and expand nodes\n  private updateHierarchyData(hierarchyData: HierarchyNode[]): void {\n    this.originalData = hierarchyData;\n    this.dataSource.data = hierarchyData;\n    \n    // Expand nodes\n    if (this.treeControl.dataNodes && this.treeControl.dataNodes.length > 0) {\n      this.treeControl.expandAll();\n    }\n  }\n  \n  // Helper method to get user display name\n  private getUserDisplayName(user: User): string {\n    if (user.name) {\n      return user.name;\n    }\n    \n    if (user.first_name || user.last_name) {\n      return `${user.first_name || ''} ${user.last_name || ''}`.trim();\n    }\n    \n    if (user.user_metadata?.name) {\n      return user.user_metadata.name as string;\n    }\n    \n    return user.id;\n  }\n  \n  // Helper method to get group display name\n  private getGroupDisplayName(group: UserGroup): string {\n    if (group.name) {\n      return group.name;\n    }\n    \n    if (group.user_metadata?.name) {\n      return group.user_metadata.name as string;\n    }\n    \n    return group.id;\n  }\n\n  onRefresh(): void {\n    // Reload the current active tab\n    if (this.activeTab === 'organization') {\n      this.generateOrgHierarchy();\n    } else if (this.activeTab === 'groups') {\n      this.generateGroupHierarchy();\n    } else if (this.activeTab === 'artifacts') {\n      this.generateArtifactHierarchy();\n    }\n  }\n\n  switchTab(tab: 'organization' | 'groups' | 'artifacts'): void {\n    this.activeTab = tab;\n    \n    if (tab === 'organization') {\n      this.generateOrgHierarchy();\n    } else if (tab === 'groups') {\n      this.generateGroupHierarchy();\n    } else if (tab === 'artifacts') {\n      this.generateArtifactHierarchy();\n    }\n  }\n\n  generateOrgHierarchy(): void {\n    this.userService.getUsers().subscribe(users => {\n      const orgHierarchy = this.buildOrgHierarchy(users);\n      this.originalData = orgHierarchy;\n      this.dataSource.data = orgHierarchy;\n      \n      // Expand the first level by default\n      if (this.treeControl.dataNodes && this.treeControl.dataNodes.length > 0) {\n        this.treeControl.expand(this.treeControl.dataNodes[0]);\n      }\n    });\n  }\n\n  buildOrgHierarchy(users: User[]): HierarchyNode[] {\n    // First, find users without managers (top level)\n    const topLevelUsers = users.filter(user => \n      (!user.manager_id || user.manager_id === '') && \n      (!user.reportingTo || user.reportingTo === '')\n    );\n    \n    // Create the hierarchy\n    const buildNode = (user: User, level: number): HierarchyNode => {\n      // Get user name safely\n      const userName = this.getUserDisplayName(user);\n      \n      // Find direct reports - users who report to this user\n      const directReports = users.filter(u => \n        (u.manager_id === user.id) || (u.reportingTo === userName)\n      );\n      \n      const children = directReports.map(report => buildNode(report, level + 1));\n      \n      return {\n        name: userName,\n        position: user.role || '',\n        id: user.id,\n        level: level,\n        expandable: children.length > 0,\n        children: children.length > 0 ? children : undefined,\n        count: children.length,\n        status: user.active ? 'Active' : 'Inactive',\n        type: 'user'\n      };\n    };\n    \n    // Create hierarchy for each top-level user\n    return topLevelUsers.map(user => buildNode(user, 0));\n  }\n\n  generateGroupHierarchy(): void {\n    this.userService.getGroups().subscribe(groups => {\n      const groupHierarchy = this.buildGroupHierarchy(groups);\n      this.originalData = groupHierarchy;\n      this.dataSource.data = groupHierarchy;\n      \n      // Expand the first level by default\n      if (this.treeControl.dataNodes && this.treeControl.dataNodes.length > 0) {\n        this.treeControl.expand(this.treeControl.dataNodes[0]);\n      }\n    });\n  }\n\n  buildGroupHierarchy(groups: UserGroup[]): HierarchyNode[] {\n    // Parse expressions to determine relationships\n    const groupMap = new Map<string, UserGroup>();\n    const references = new Map<string, string[]>();\n    \n    // First pass: build lookup maps\n    groups.forEach(group => {\n      groupMap.set(group.id, group);\n      \n      // Parse expression to find references\n      if (group.expression) {\n        // Extract IDs from expressions like \"user1+user2+user6\" or \"user1+user3+user5\"\n        const parts = group.expression.split(/[+\\-]/g);\n        const groupRefs = parts.filter(part => part.startsWith('group'));\n        references.set(group.id, groupRefs);\n      } else {\n        references.set(group.id, []);\n      }\n    });\n    \n    // Identify groups that are not referenced by any other group (top level)\n    const referencedGroups = new Set<string>();\n    references.forEach(refs => {\n      refs.forEach(ref => referencedGroups.add(ref));\n    });\n    \n    const topLevelGroups = groups.filter(group => !referencedGroups.has(group.id));\n    \n    // Create the hierarchy\n    const buildNode = (group: UserGroup, level: number, visited = new Set<string>()): HierarchyNode => {\n      // Prevent circular references\n      if (visited.has(group.id)) {\n        return {\n          name: this.getGroupDisplayName(group) + ' (circular reference)',\n          description: group.description || '',\n          id: group.id,\n          level: level,\n          expandable: false,\n          children: undefined,\n          count: group.memberCount || 0,\n          status: group.active ? 'Active' : 'Inactive',\n          type: 'group',\n          expression: group.expression\n        };\n      }\n      \n      visited.add(group.id);\n      \n      // Find child groups based on references\n      const childGroups: UserGroup[] = [];\n      groups.forEach(g => {\n        if (g.expression && g.expression.includes(group.id)) {\n          childGroups.push(g);\n        }\n      });\n      \n      const children = childGroups.map(childGroup => \n        buildNode(childGroup, level + 1, new Set(visited))\n      );\n      \n      return {\n        name: this.getGroupDisplayName(group),\n        description: group.description || '',\n        id: group.id,\n        level: level,\n        expandable: children.length > 0,\n        children: children.length > 0 ? children : undefined,\n        count: group.memberCount || 0,\n        status: group.active ? 'Active' : 'Inactive',\n        type: 'group',\n        expression: group.expression\n      };\n    };\n    \n    // Create hierarchy for each top-level group\n    return topLevelGroups.map(group => buildNode(group, 0, new Set<string>()));\n  }\n\n  hasChild = (_: number, node: FlatNode) => node.expandable;\n\n  getStatusClass(status: string): string {\n    return status === 'Active' ? 'status-active' : 'status-inactive';\n  }\n\n  applyFilter(event: Event): void {\n    const filterValue = (event.target as HTMLInputElement).value.toLowerCase();\n    \n    if (!filterValue) {\n      this.dataSource.data = this.originalData;\n      return;\n    }\n    \n    // Helper function to filter nodes\n    const filterNode = (node: HierarchyNode): HierarchyNode | null => {\n      const nameMatch = node.name.toLowerCase().includes(filterValue);\n      const descMatch = node.description?.toLowerCase().includes(filterValue) || false;\n      const posMatch = node.position?.toLowerCase().includes(filterValue) || false;\n      \n      if (nameMatch || descMatch || posMatch) {\n        return {...node, children: node.children}; // Return the node if it matches\n      }\n      \n      // If node doesn't match, check its children\n      if (node.children) {\n        const filteredChildren = node.children\n          .map(child => filterNode(child))\n          .filter(child => child !== null) as HierarchyNode[];\n        \n        if (filteredChildren.length > 0) {\n          return {...node, children: filteredChildren};\n        }\n      }\n      \n      return null; // No match found in this branch\n    };\n    \n    const filteredData = this.originalData\n      .map(node => filterNode(node))\n      .filter(node => node !== null) as HierarchyNode[];\n    \n    this.dataSource.data = filteredData;\n    \n    // Expand all nodes if filtering\n    if (filterValue && this.treeControl.dataNodes) {\n      this.treeControl.expandAll();\n    }\n  }\n\n  getNodeIcon(node: FlatNode): string {\n    switch(node.type) {\n      case 'user':\n        return node.expandable ? 'supervisor_account' : 'person';\n      case 'group':\n        return 'folder';\n      case 'artifact':\n        return 'description';\n      case 'artifactGroup':\n        return 'dashboard';\n      default:\n        return 'folder';\n    }\n  }\n\n  getNodeIconBgColor(node: FlatNode): string {\n    switch(node.type) {\n      case 'user':\n        return node.expandable ? 'bg-green' : 'bg-blue';\n      case 'group':\n        return 'bg-purple';\n      case 'artifact':\n        return 'bg-orange';\n      case 'artifactGroup':\n        return 'bg-teal';\n      default:\n        return 'bg-purple';\n    }\n  }\n  \n  generateArtifactHierarchy(): void {\n    this.artifactService.getArtifacts().subscribe(artifacts => {\n      this.artifactService.getArtifactGroups().subscribe(artifactGroups => {\n        const hierarchyData = this.buildArtifactHierarchy(artifacts, artifactGroups);\n        this.originalData = hierarchyData;\n        this.dataSource.data = hierarchyData;\n        \n        // Expand the first level by default\n        if (this.treeControl.dataNodes && this.treeControl.dataNodes.length > 0) {\n          this.treeControl.expand(this.treeControl.dataNodes[0]);\n        }\n      });\n    });\n  }\n  \n  \n  buildArtifactHierarchy(artifacts: Artifact[], artifactGroups: ArtifactGroup[]): HierarchyNode[] {\n    // Parse expressions to determine relationships\n    const allEntities = new Map<string, Artifact | ArtifactGroup>();\n    const references = new Map<string, string[]>();\n    \n    // First pass: build lookup maps for artifacts and groups\n    artifacts.forEach(artifact => {\n      allEntities.set(artifact.id, artifact);\n    });\n    \n    artifactGroups.forEach(group => {\n      allEntities.set(group.id, group);\n      \n      // Parse expression to find references\n      if (group.expression) {\n        const parts = group.expression.split(/[+\\\\-]/g);\n        references.set(group.id, parts);\n      } else {\n        references.set(group.id, []);\n      }\n    });\n    \n    // Identify entities that are not referenced by any other entity (top level)\n    const referencedEntities = new Set<string>();\n    references.forEach(refs => {\n      refs.forEach(ref => referencedEntities.add(ref));\n    });\n    \n    // Start with artifact groups that are not referenced\n    const topLevelGroups = artifactGroups.filter(group => !referencedEntities.has(group.id));\n    \n    // Create the hierarchy\n    const buildNode = (entity: Artifact | ArtifactGroup, level: number, visited = new Set<string>()): HierarchyNode => {\n      // Prevent circular references\n      if (visited.has(entity.id)) {\n        return {\n          name: entity.name + ' (circular reference)',\n          description: entity.description,\n          id: entity.id,\n          level: level,\n          expandable: false,\n          children: undefined,\n          status: entity.status as 'Active' | 'Inactive',\n          type: 'type' in entity ? (entity.type === 'RESOURCEGROUP' ? 'artifactGroup' : 'artifact') : 'artifact',\n          expression: 'expression' in entity ? entity.expression : undefined\n        };\n      }\n      \n      visited.add(entity.id);\n      \n      // Find child entities that reference this entity\n      const children: HierarchyNode[] = [];\n      \n      // Add any artifact groups that reference this entity\n      artifactGroups.forEach(group => {\n        if (group.expression && group.expression.includes(entity.id) && !visited.has(group.id)) {\n          children.push(buildNode(group, level + 1, new Set(visited)));\n        }\n      });\n      \n      return {\n        name: entity.name,\n        description: entity.description,\n        id: entity.id,\n        level: level,\n        expandable: children.length > 0,\n        children: children.length > 0 ? children : undefined,\n        count: 'artifactCount' in entity ? entity.artifactCount : undefined,\n        status: entity.status as 'Active' | 'Inactive',\n        type: 'type' in entity ? (entity.type === 'RESOURCEGROUP' ? 'artifactGroup' : 'artifact') : 'artifact',\n        expression: 'expression' in entity ? entity.expression : undefined\n      };\n    };\n    \n    // Create hierarchy for each top-level group\n    const hierarchyNodes = topLevelGroups.map(group => buildNode(group, 0, new Set<string>()));\n    \n    // Add any individual artifacts that aren't referenced by any group as top-level nodes\n    artifacts\n      .filter(artifact => !referencedEntities.has(artifact.id))\n      .forEach(artifact => {\n        hierarchyNodes.push({\n          name: artifact.name,\n          description: artifact.description,\n          id: artifact.id,\n          level: 0,\n          expandable: false,\n          status: artifact.status as 'Active' | 'Inactive',\n          type: 'artifact'\n        });\n      });\n    \n    return hierarchyNodes;\n  }\n}","<div class=\"hierarchy-container\">\r\n  <div class=\"header\">\r\n    <h1>Hierarchy Visualization</h1>\r\n  </div>\r\n\r\n  <div class=\"content-container\">\r\n    <div class=\"tabs-header\">\r\n      <div class=\"tab\" [ngClass]=\"{'active': activeTab === 'organization'}\" (click)=\"switchTab('organization')\">\r\n        <mat-icon>account_tree</mat-icon>\r\n        Organization Hierarchy\r\n      </div>\r\n      <div class=\"tab\" [ngClass]=\"{'active': activeTab === 'groups'}\" (click)=\"switchTab('groups')\">\r\n        <mat-icon>device_hub</mat-icon>\r\n        Group Hierarchy\r\n      </div>\r\n      <div class=\"tab\" [ngClass]=\"{'active': activeTab === 'artifacts'}\" (click)=\"switchTab('artifacts')\">\r\n        <mat-icon>dashboard</mat-icon>\r\n        Artifact Hierarchy\r\n      </div>\r\n    </div>\r\n\r\n    <div class=\"search-container\">\r\n      <div class=\"search-field\">\r\n        <mat-icon>search</mat-icon>\r\n        <input placeholder=\"Search hierarchy...\" [(ngModel)]=\"searchQuery\" (keyup)=\"applyFilter($event)\">\r\n      </div>\r\n      <div class=\"view-controls\">\r\n        <button mat-icon-button (click)=\"onRefresh()\" title=\"Refresh\">\r\n          <mat-icon>refresh</mat-icon>\r\n        </button>\r\n      </div>\r\n    </div>\r\n\r\n    <div class=\"tree-container\">\r\n      <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\r\n        <!-- Leaf node -->\r\n        <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding [style.padding-left]=\"node.level * 20 + 'px'\">\r\n          <div class=\"tree-node leaf-node\">\r\n            <div class=\"node-icon\" [ngClass]=\"getNodeIconBgColor(node)\">\r\n              <mat-icon>{{ getNodeIcon(node) }}</mat-icon>\r\n            </div>\r\n            <div class=\"node-content\">\r\n              <div class=\"node-name\">{{node.name}}</div>\r\n              <div class=\"node-description\" *ngIf=\"node.description\">{{node.description}}</div>\r\n              <div class=\"node-position\" *ngIf=\"node.type === 'user' && node.position\">{{node.position}}</div>\r\n              <div class=\"node-expression\" *ngIf=\"node.expression\" title=\"Expression: {{node.expression}}\">\r\n                <small class=\"expression-badge\">{{node.expression.length > 20 ? node.expression.substring(0, 20) + '...' : node.expression}}</small>\r\n              </div>\r\n            </div>\r\n            <div class=\"node-status\">\r\n              <span class=\"status-badge\" [ngClass]=\"getStatusClass(node.status)\">{{node.status}}</span>\r\n            </div>\r\n            <div class=\"node-actions\">\r\n              <button mat-icon-button>\r\n                <mat-icon>more_vert</mat-icon>\r\n              </button>\r\n            </div>\r\n          </div>\r\n        </mat-tree-node>\r\n        \r\n        <!-- Expandable node -->\r\n        <mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChild\">\r\n          <div class=\"tree-node expandable-node\" [class.expanded]=\"treeControl.isExpanded(node)\">\r\n            <div class=\"node-toggle\">\r\n              <button mat-icon-button matTreeNodeToggle>\r\n                <mat-icon>\r\n                  {{treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}\r\n                </mat-icon>\r\n              </button>\r\n            </div>\r\n            <div class=\"node-icon\" [ngClass]=\"getNodeIconBgColor(node)\">\r\n              <mat-icon>{{ getNodeIcon(node) }}</mat-icon>\r\n            </div>\r\n            <div class=\"node-content\">\r\n              <div class=\"node-name\">{{node.name}}</div>\r\n              <div class=\"node-description\" *ngIf=\"node.description\">{{node.description}}</div>\r\n              <div class=\"node-position\" *ngIf=\"node.type === 'user' && node.position\">{{node.position}}</div>\r\n              <div class=\"node-expression\" *ngIf=\"node.expression\" title=\"Expression: {{node.expression}}\">\r\n                <small class=\"expression-badge\">{{node.expression.length > 20 ? node.expression.substring(0, 20) + '...' : node.expression}}</small>\r\n              </div>\r\n            </div>\r\n            <div class=\"node-count\" *ngIf=\"node.count\">\r\n              {{node.count}} {{ node.type === 'user' ? 'members' : 'members' }}\r\n            </div>\r\n            <div class=\"node-status\">\r\n              <span class=\"status-badge\" [ngClass]=\"getStatusClass(node.status)\">{{node.status}}</span>\r\n            </div>\r\n            <div class=\"node-actions\">\r\n              <button mat-icon-button>\r\n                <mat-icon>more_vert</mat-icon>\r\n              </button>\r\n            </div>\r\n          </div>\r\n          \r\n          <div class=\"nested-tree-node\" [class.hidden]=\"!treeControl.isExpanded(node)\">\r\n            <ng-container matTreeNodeOutlet></ng-container>\r\n          </div>\r\n        </mat-nested-tree-node>\r\n      </mat-tree>\r\n    </div>\r\n  </div>\r\n</div>","import { Injectable } from '@angular/core';\nimport { Observable, forkJoin, map } from 'rxjs';\nimport { Artifact, ArtifactGroup } from '../models/artifact.model';\nimport { ArtifactService } from './artifact.service';\nimport { ExpressionParserService } from './expression-parser.service';\nimport { SyncExpressionResolverService } from './sync-expression-resolver.service';\n\nexport interface ArtifactHierarchyNode {\n  id: string;\n  name: string;\n  type: string;\n  parent_id?: string;\n  children?: ArtifactHierarchyNode[];\n  metadata?: any;\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class ArtifactHierarchyService {\n  constructor(\n    private artifactService: ArtifactService,\n    private expressionParser: ExpressionParserService,\n    private syncExpressionResolver: SyncExpressionResolverService\n  ) { }\n\n  /**\n   * Build a combined hierarchy of artifacts and groups\n   */\n  buildCombinedHierarchy(): Observable<ArtifactHierarchyNode[]> {\n    // console.log('Building combined artifact hierarchy...');\n    \n    // First get all artifacts and artifact groups\n    return forkJoin([\n      this.artifactService.getArtifacts(),\n      this.artifactService.getArtifactGroups() as Observable<Artifact[]>\n    ]).pipe(\n      // Then build a unified hierarchy\n      map(([artifacts, artifactGroups]) => {\n        // console.log(`Got ${artifacts.length} artifacts and ${artifactGroups.length} artifact groups`);\n        \n        // Filter only resources (not groups)\n        const resources = artifacts.filter(a => a.type === 'RESOURCE');\n        \n        // Create map of group ID to node\n        const groupNodeMap = new Map<string, ArtifactHierarchyNode>();\n        const groupChildrenMap = new Map<string, string[]>(); \n        const referencedGroups = new Set<string>();\n        \n        // console.log('Creating group nodes and determining relationships');\n        // First, create all group nodes\n        artifactGroups.forEach(group => {\n          const node: ArtifactHierarchyNode = {\n            id: group.id,\n            name: group.name,\n            type: 'artifactGroup',\n            metadata: {\n              description: group.description,\n              expression: group.expression,\n              active: group.status === 'Active'\n            },\n            children: []\n          };\n          \n          groupNodeMap.set(group.id, node);\n          \n          // Use expression parser to find referenced groups\n          if (group.expression) {\n            const operations = this.expressionParser.parseExpression(group.expression);\n            \n            // Process operations to find group references\n            operations.forEach(operation => {\n              const entityId = operation.entity.trim();\n              \n              // If this is a reference to another group - handle both include and exclude operations\n              if (artifactGroups.some(g => g.id === entityId)) {\n                referencedGroups.add(entityId);\n                \n                // Add this as a child of the referenced group\n                if (!groupChildrenMap.has(entityId)) {\n                  groupChildrenMap.set(entityId, []);\n                }\n                groupChildrenMap.get(entityId)?.push(group.id);\n              }\n            });\n          }\n        });\n        \n        // Now build the hierarchy for groups\n        groupNodeMap.forEach((node, groupId) => {\n          // Add children groups\n          if (groupChildrenMap.has(groupId)) {\n            const childGroupIds = groupChildrenMap.get(groupId) || [];\n            childGroupIds.forEach(childId => {\n              const childNode = groupNodeMap.get(childId);\n              if (childNode && !node.children?.includes(childNode)) {\n                if (!node.children) node.children = [];\n                node.children.push(childNode);\n              }\n            });\n          }\n          \n          // Find artifacts that are referenced in this group's expression\n          const currentGroup = artifactGroups.find(g => g.id === groupId);\n          if (!currentGroup || !currentGroup.expression) {\n            return; // Skip if we can't find the group or if it has no expression\n          }\n          \n          // Get operations from expression to find all referenced artifacts\n          const operations = this.expressionParser.parseExpression(currentGroup.expression);\n          const referencedArtifacts = new Map<string, 'include' | 'exclude'>();\n          \n          // Process each operation to build a list of referenced artifacts\n          operations.forEach(operation => {\n            const entityId = operation.entity.trim();\n            \n            // Check if this refers to an individual artifact\n            const artifact = resources.find(a => a.id === entityId);\n            if (artifact) {\n              referencedArtifacts.set(entityId, operation.type);\n            } \n            // Check if this refers to a group\n            else if (artifactGroups.some(g => g.id === entityId)) {\n              // If it's a group, add all its artifacts\n              const referencedGroup = artifactGroups.find(g => g.id === entityId);\n              if (referencedGroup && referencedGroup.expression) {\n                const groupArtifacts = resources.filter(a => \n                  this.isArtifactInGroup(a, referencedGroup.expression, artifactGroups)\n                );\n                \n                // Add these artifacts with the same operation type (include/exclude)\n                groupArtifacts.forEach(a => {\n                  // Only set if not already in map, to avoid overriding explicit mentions\n                  if (!referencedArtifacts.has(a.id)) {\n                    referencedArtifacts.set(a.id, operation.type);\n                  }\n                });\n              }\n            }\n          });\n          \n          // Convert the map to nodes\n          const artifactNodes = Array.from(referencedArtifacts.entries())\n            .map(([artifactId, operationType]) => {\n              const artifact = resources.find(a => a.id === artifactId);\n              if (!artifact) return null;\n              \n              return {\n                id: artifact.id,\n                name: artifact.name + (operationType === 'exclude' ? ' (Excluded)' : ''),\n                type: 'artifact',\n                metadata: {\n                  description: artifact.description,\n                  category: artifact.application,\n                  active: artifact.status === 'Active',\n                  excluded: operationType === 'exclude'\n                }\n              };\n            })\n            .filter(node => node !== null) as ArtifactHierarchyNode[];\n            \n          // Add artifacts to this group's children\n          if (artifactNodes.length > 0) {\n            if (!node.children) node.children = [];\n            node.children.push(...artifactNodes);\n          }\n        });\n        \n        // Find top-level groups (not referenced by any other group)\n        const rootGroups = Array.from(groupNodeMap.values())\n          .filter(node => !referencedGroups.has(node.id));\n          \n        // Find artifacts that don't belong to any group\n        const ungroupedArtifacts = resources\n          .filter(artifact => !this.isArtifactInAnyGroup(artifact, artifactGroups))\n          .map(artifact => ({\n            id: artifact.id,\n            name: artifact.name,\n            type: 'artifact',\n            metadata: {\n              description: artifact.description,\n              category: artifact.application,\n              active: artifact.status === 'Active'\n            }\n          }));\n        \n        // Create a proper organization structure\n        // Always use ALL groups as direct children of the root node to ensure all groups are visible\n        const allGroups = Array.from(groupNodeMap.values());\n        // console.log(`Total of ${allGroups.length} artifact groups`);\n        // console.log(`Found ${rootGroups.length} top-level artifact groups`);\n        // console.log(`Found ${ungroupedArtifacts.length} ungrouped artifacts`);\n        \n        // Build a more detailed hierarchy\n        // Always use ALL groups as direct children of the root node to ensure all groups are visible\n        const rootNodes: ArtifactHierarchyNode[] = [\n          {\n            id: 'groups_root',\n            name: 'Resource Groups',\n            type: 'root',\n            children: allGroups // Always show all groups directly under the root\n          }\n        ];\n        \n        // Only add ungrouped artifacts if there are any\n        if (ungroupedArtifacts.length > 0) {\n          rootNodes.push({\n            id: 'artifacts_root',\n            name: 'Ungrouped Resources',\n            type: 'root',\n            children: ungroupedArtifacts\n          });\n        }\n        \n        // console.log('Artifact hierarchy structure built with:', rootNodes);\n        return rootNodes;\n      })\n    );\n  }\n  \n  // Helper to check if an artifact is in a group via expression\n  private isArtifactInGroup(artifact: Artifact, expression?: string, groups: (Artifact | ArtifactGroup)[] = []): boolean {\n    if (!expression) return false;\n    \n    // Use the synchronous expression resolver to check if the artifact is in this expression\n    return this.syncExpressionResolver.isUserInExpression(\n      artifact.id, \n      expression,\n      groups // Pass the groups array to resolve references\n    );\n  }\n  \n  // Helper to check if an artifact is in any group\n  private isArtifactInAnyGroup(artifact: Artifact, groups: (Artifact | ArtifactGroup)[]): boolean {\n    return groups.some(group => this.isArtifactInGroup(artifact, group.expression, groups));\n  }\n}","import { Component, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatTreeModule, MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree';\nimport { FlatTreeControl } from '@angular/cdk/tree';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { FormsModule } from '@angular/forms';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { ArtifactHierarchyService, ArtifactHierarchyNode } from '../../services/artifact-hierarchy.service';\n\ninterface FlatNode {\n  expandable: boolean;\n  name: string;\n  level: number;\n  id: string;\n  type: string;\n  metadata?: any;\n}\n\n@Component({\n  selector: 'app-artifact-hierarchy',\n  standalone: true,\n  imports: [\n    CommonModule,\n    MatTreeModule,\n    MatIconModule,\n    MatButtonModule,\n    MatProgressSpinnerModule,\n    MatFormFieldModule,\n    MatInputModule,\n    FormsModule\n  ],\n  template: `\n    <div class=\"artifact-hierarchy-container\">\n      <div class=\"header-container\">\n        <h3>Resource Structure</h3>\n        <mat-form-field class=\"search-field\">\n          <mat-label>Search</mat-label>\n          <input matInput [(ngModel)]=\"searchText\" (input)=\"filterTree()\" placeholder=\"Search resources or groups\">\n          <mat-icon matSuffix>search</mat-icon>\n        </mat-form-field>\n      </div>\n      \n      <div class=\"tree-container\">\n        <div *ngIf=\"loading\" class=\"loading-container\">\n          <mat-spinner diameter=\"40\"></mat-spinner>\n          <p>Loading resource structure...</p>\n        </div>\n        \n        <div *ngIf=\"!loading && (!dataSource.data || dataSource.data.length === 0)\" class=\"empty-state\">\n          <mat-icon>account_tree</mat-icon>\n          <p>No hierarchy data available</p>\n        </div>\n        \n        <mat-tree *ngIf=\"!loading && dataSource.data && dataSource.data.length > 0\"\n                 [dataSource]=\"dataSource\" \n                 [treeControl]=\"treeControl\">\n          <!-- Tree node template for leaf nodes -->\n          <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding>\n            <div class=\"node-container\">\n              <div class=\"icon-container\" [ngClass]=\"getNodeIconClass(node)\">\n                <mat-icon>{{ getNodeIcon(node) }}</mat-icon>\n              </div>\n              <span class=\"node-name\" [ngClass]=\"{'excluded-node': node.metadata?.excluded}\">{{ node.name }}</span>\n              <span *ngIf=\"node.metadata?.active === false\" class=\"inactive-badge\">Inactive</span>\n              <span *ngIf=\"node.metadata?.excluded\" class=\"excluded-badge\">Excluded</span>\n            </div>\n          </mat-tree-node>\n          \n          <!-- Tree node template for expandable nodes -->\n          <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding>\n            <div class=\"node-container\">\n              <button mat-icon-button matTreeNodeToggle\n                      [attr.aria-label]=\"'Toggle ' + node.name\">\n                <mat-icon>{{ treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}</mat-icon>\n              </button>\n              <div class=\"icon-container\" [ngClass]=\"getNodeIconClass(node)\">\n                <mat-icon>{{ getNodeIcon(node) }}</mat-icon>\n              </div>\n              <span class=\"node-name\">{{ node.name }}</span>\n              <span *ngIf=\"node.metadata?.active === false\" class=\"inactive-badge\">Inactive</span>\n            </div>\n          </mat-tree-node>\n        </mat-tree>\n      </div>\n    </div>\n  `,\n  styles: [`\n    .artifact-hierarchy-container {\n      height: 100%;\n      display: flex;\n      flex-direction: column;\n    }\n    \n    .header-container {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 16px;\n      \n      h3 {\n        margin: 0;\n      }\n      \n      .search-field {\n        width: 250px;\n      }\n    }\n    \n    .tree-container {\n      flex: 1;\n      overflow: auto;\n      border: 1px solid #e0e0e0;\n      border-radius: 4px;\n      background-color: white;\n    }\n    \n    .loading-container, .empty-state {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      height: 200px;\n      \n      p {\n        margin-top: 16px;\n        color: #666;\n      }\n    }\n    \n    .empty-state mat-icon {\n      font-size: 48px;\n      height: 48px;\n      width: 48px;\n      color: #ccc;\n    }\n    \n    .node-container {\n      display: flex;\n      align-items: center;\n    }\n    \n    .icon-container {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      width: 28px;\n      height: 28px;\n      border-radius: 4px;\n      margin-right: 8px;\n      \n      mat-icon {\n        font-size: 16px;\n        height: 16px;\n        width: 16px;\n        color: white;\n      }\n    }\n    \n    .node-name {\n      margin-right: 8px;\n    }\n    \n    .inactive-badge {\n      background-color: #f5f5f5;\n      color: #757575;\n      padding: 2px 6px;\n      border-radius: 4px;\n      font-size: 11px;\n      font-weight: 500;\n      text-transform: uppercase;\n    }\n    \n    .artifact-node {\n      background-color: #ff9800;\n    }\n    \n    .artifactGroup-node {\n      background-color: #9c27b0;\n    }\n    \n    .root-node {\n      background-color: #4caf50;\n    }\n  `]\n})\nexport class ArtifactHierarchyComponent implements OnInit {\n  private _transformer = (node: ArtifactHierarchyNode, level: number): FlatNode => {\n    return {\n      expandable: !!node.children && node.children.length > 0,\n      name: node.name,\n      level: level,\n      id: node.id,\n      type: node.type,\n      metadata: node.metadata\n    };\n  };\n\n  treeControl = new FlatTreeControl<FlatNode>(\n    node => node.level,\n    node => node.expandable\n  );\n\n  treeFlattener = new MatTreeFlattener(\n    this._transformer,\n    node => node.level,\n    node => node.expandable,\n    node => node.children\n  );\n\n  dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);\n  \n  loading = true;\n  searchText = '';\n  originalData: ArtifactHierarchyNode[] = [];\n\n  constructor(private artifactHierarchyService: ArtifactHierarchyService) {}\n\n  ngOnInit(): void {\n    this.loadHierarchy();\n  }\n  \n  loadHierarchy(): void {\n    this.loading = true;\n    \n    this.artifactHierarchyService.buildCombinedHierarchy().subscribe({\n      next: (hierarchy) => {\n        this.originalData = hierarchy;\n        this.dataSource.data = hierarchy;\n        this.loading = false;\n        \n        // Expand the first level\n        if (this.treeControl.dataNodes && this.treeControl.dataNodes.length > 0) {\n          this.treeControl.dataNodes\n            .filter(node => node.level === 0)\n            .forEach(node => this.treeControl.expand(node));\n        }\n      },\n      error: (error) => {\n        console.error('Error loading artifact hierarchy:', error);\n        this.loading = false;\n      }\n    });\n  }\n  \n  hasChild = (_: number, node: FlatNode) => node.expandable;\n  \n  getNodeIcon(node: FlatNode): string {\n    switch (node.type) {\n      case 'artifact':\n        return 'insert_chart';\n      case 'artifactGroup':\n        return 'folder';\n      case 'root':\n        return 'account_tree';\n      default:\n        return 'circle';\n    }\n  }\n  \n  getNodeIconClass(node: FlatNode): string {\n    switch (node.type) {\n      case 'artifact':\n        return 'artifact-node';\n      case 'artifactGroup':\n        return 'artifactGroup-node';\n      case 'root':\n        return 'root-node';\n      default:\n        return 'artifact-node';\n    }\n  }\n  \n  filterTree(): void {\n    if (!this.searchText) {\n      this.dataSource.data = this.originalData;\n      return;\n    }\n    \n    const searchTerm = this.searchText.toLowerCase();\n    \n    // Helper function to filter nodes\n    const filterNode = (node: ArtifactHierarchyNode): ArtifactHierarchyNode | null => {\n      // Check if this node matches\n      const nameMatch = node.name.toLowerCase().includes(searchTerm);\n      \n      if (nameMatch) {\n        return {...node}; // Return a copy of the node if it matches\n      }\n      \n      // Check children\n      if (node.children && node.children.length > 0) {\n        const filteredChildren = node.children\n          .map(child => filterNode(child))\n          .filter(child => child !== null) as ArtifactHierarchyNode[];\n        \n        if (filteredChildren.length > 0) {\n          return {...node, children: filteredChildren};\n        }\n      }\n      \n      return null; // No match in this branch\n    };\n    \n    const filteredData = this.originalData\n      .map(node => filterNode(node))\n      .filter(node => node !== null) as ArtifactHierarchyNode[];\n    \n    this.dataSource.data = filteredData;\n    \n    // Expand all nodes if searching\n    if (this.searchText && this.treeControl.dataNodes && this.treeControl.dataNodes.length > 0) {\n      this.treeControl.expandAll();\n    }\n  }\n}","import { Injectable, Inject } from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { MEDHA_ONE_ACCESS_CONFIG } from '../config/medha-config.token';\nimport { MedhaOneAccessConfig } from '../config/medha-config.interface';\nimport { MedhaHttpService } from './medha-http.service';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class AppContextService {\n\n  constructor(\n    private medhaHttp: MedhaHttpService,\n    @Inject(MEDHA_ONE_ACCESS_CONFIG) private config: MedhaOneAccessConfig\n  ) {}\n\n  getCurrentApplication(): string {\n    return this.config.currentApplication || 'admin';\n  }\n\n  isAdmin(): boolean {\n    return this.getCurrentApplication().toLowerCase() === 'admin';\n  }\n\n  getAvailableApplications(): Observable<string[]> {\n    // For now, return hardcoded list. Later can fetch from API\n    const applications = ['admin', 'CRM', 'ERP', 'Analytics', 'Dashboard'];\n    return of(applications);\n    \n    // Future API call:\n    // return this.medhaHttp.get<string[]>(`${this.config.apiUrl}/applications`);\n  }\n\n  shouldShowApplicationField(): boolean {\n    return this.isAdmin();\n  }\n\n  getDefaultApplicationForCreate(): string {\n    return this.isAdmin() ? '' : this.getCurrentApplication();\n  }\n}","import { Component, OnInit, Input, Output, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatSortModule } from '@angular/material/sort';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatDialogModule, MatDialog } from '@angular/material/dialog';\r\nimport { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\n// import { ActivatedRoute } from '@angular/router'; // Removed for routing-less library\r\nimport { ArtifactService } from '../../services/artifact.service';\r\nimport { AppContextService } from '../../services/app-context.service';\r\nimport { Artifact } from '../../models/artifact.model';\r\nimport { ConfirmDialogComponent } from '../confirm-dialog/confirm-dialog.component';\r\nimport { ArtifactHierarchyComponent } from '../artifact-hierarchy/artifact-hierarchy.component';\r\n\r\n@Component({\r\n  selector: 'app-artifacts',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    MatTableModule,\r\n    MatPaginatorModule,\r\n    MatSortModule,\r\n    MatButtonModule,\r\n    MatIconModule,\r\n    MatInputModule,\r\n    MatFormFieldModule,\r\n    MatSelectModule,\r\n    MatMenuModule,\r\n    MatChipsModule,\r\n    MatTabsModule,\r\n    MatCheckboxModule,\r\n    MatDialogModule,\r\n    MatSnackBarModule,\r\n    FormsModule,\r\n    ReactiveFormsModule,\r\n    ArtifactHierarchyComponent\r\n  ],\r\n  templateUrl: './artifacts.component.html',\r\n  styleUrls: ['./artifacts.component.scss']\r\n})\r\nexport class ArtifactsComponent implements OnInit, OnChanges {\r\n  displayedColumns: string[] = ['name', 'type', 'status', 'actions'];\r\n  dataSource: Artifact[] = [];\r\n  filteredDataSource: Artifact[] = [];\r\n  groupsDataSource: Artifact[] = [];\r\n  filteredGroupsDataSource: Artifact[] = [];\r\n  searchQuery: string = '';\r\n  \r\n  \r\n  // Advanced filtering properties\r\n  statusFilter: string = 'all';\r\n  applicationFilter: string = 'all';\r\n  availableApplications: string[] = [];\r\n  \r\n  // New filter properties for enhanced UI\r\n  selectedStatus: string = '';\r\n  selectedApplication: string = 'admin';\r\n  statusOptions: string[] = ['Active', 'Inactive'];\r\n  applicationOptions: string[] = [];\r\n  \r\n  @Input() selectedTab: 'resources' | 'groups' | 'hierarchy' = 'resources';\r\n  @Output() tabChanged = new EventEmitter<'resources' | 'groups' | 'hierarchy'>();\r\n  \r\n  activeTab: 'resources' | 'groups' | 'hierarchy' = 'resources';\r\n  \r\n\r\n  constructor(\r\n    private artifactService: ArtifactService,\r\n    private appContext: AppContextService,\r\n    private dialog: MatDialog,\r\n    private snackBar: MatSnackBar\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    // Set initial tab from input\r\n    if (this.selectedTab) {\r\n      this.activeTab = this.selectedTab;\r\n    }\r\n    \r\n    this.loadArtifacts();\r\n    this.loadArtifactGroups();\r\n  }\r\n  \r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    // Update active tab when input changes\r\n    if (changes['selectedTab'] && changes['selectedTab'].currentValue) {\r\n      this.activeTab = changes['selectedTab'].currentValue;\r\n    }\r\n  }\r\n\r\n  loadArtifacts(): void {\r\n    \r\n    // For admin users, load all artifacts (no application filter)\r\n    // For non-admin users, filter by their current application\r\n    const currentApp = this.appContext.getCurrentApplication();\r\n    const applicationName = this.appContext.isAdmin() ? 'admin' : currentApp;\r\n    \r\n    this.artifactService.getArtifacts(0, undefined, null, applicationName).subscribe(artifacts => {\r\n      // Filter to only include RESOURCE type artifacts\r\n      this.dataSource = artifacts.filter(a => a.type === 'RESOURCE');\r\n      this.filteredDataSource = this.dataSource;\r\n      \r\n      // For admin users, always load all possible applications (not just from current data)\r\n      if (this.appContext.isAdmin()) {\r\n        this.loadAllApplicationOptions();\r\n      } else {\r\n        this.extractApplicationOptions();\r\n      }\r\n      \r\n    });\r\n  }\r\n\r\n  loadArtifactsWithFilter(): void {\r\n    // Use the selected application filter for admin users\r\n    // If 'admin' is selected, it means \"All Applications\"\r\n    const applicationName = this.selectedApplication === 'admin' ? 'admin' : this.selectedApplication;\r\n    \r\n    this.artifactService.getArtifacts(0, undefined, null, applicationName).subscribe(artifacts => {\r\n      // Filter to only include RESOURCE type artifacts\r\n      this.dataSource = artifacts.filter(a => a.type === 'RESOURCE');\r\n      this.filteredDataSource = this.dataSource;\r\n      \r\n      // Don't re-extract applications for admin users to keep dropdown static\r\n      \r\n    });\r\n  }\r\n\r\n  loadGroupsWithFilter(): void {\r\n    // Use the selected application filter for admin users\r\n    // If 'admin' is selected, it means \"All Applications\"\r\n    const applicationName = this.selectedApplication === 'admin' ? 'admin' : this.selectedApplication;\r\n    \r\n    this.artifactService.getArtifactGroups(0, undefined, true, applicationName).subscribe(groups => {\r\n      // Convert ArtifactGroup[] to Artifact[] for type compatibility\r\n      this.groupsDataSource = groups.map(group => ({\r\n        ...group,\r\n        type: 'RESOURCEGROUP' as const\r\n      }));\r\n      this.filteredGroupsDataSource = this.groupsDataSource;\r\n      \r\n      // Don't re-extract applications for admin users to keep dropdown static\r\n      \r\n    });\r\n  }\r\n\r\n  loadArtifactGroups(): void {\r\n    \r\n    // For admin users, load all artifact groups (no application filter)  \r\n    // For non-admin users, filter by their current application\r\n    const currentApp = this.appContext.getCurrentApplication();\r\n    const applicationName = this.appContext.isAdmin() ? 'admin' : currentApp;\r\n    \r\n    this.artifactService.getArtifactGroups(0, undefined, true, applicationName).subscribe(groups => {\r\n      // Convert ArtifactGroup[] to Artifact[] for type compatibility\r\n      this.groupsDataSource = groups.map(group => ({\r\n        ...group,\r\n        type: 'RESOURCEGROUP' as const\r\n      }));\r\n      this.filteredGroupsDataSource = this.groupsDataSource;\r\n      \r\n      // For admin users, applications are already loaded from loadArtifacts()\r\n      // For non-admin users, extract from current data\r\n      if (!this.appContext.isAdmin()) {\r\n        this.extractApplicationOptions();\r\n      }\r\n      \r\n    });\r\n  }\r\n\r\n  switchTab(tab: 'resources' | 'groups' | 'hierarchy'): void {\r\n    this.activeTab = tab;\r\n    this.tabChanged.emit(tab);\r\n    \r\n    \r\n    // Reload data when switching tabs\r\n    if (tab === 'resources') {\r\n      this.loadArtifacts();\r\n    } else if (tab === 'groups') {\r\n      this.loadArtifactGroups();\r\n    }\r\n  }\r\n\r\n\r\n  onAddArtifactClick(): void {\r\n    import('./../../components/artifact-dialog/artifact-dialog.component').then(({ ArtifactDialogComponent }) => {\r\n      const dialogRef = this.dialog.open(ArtifactDialogComponent, {\r\n        width: '700px',\r\n        data: { \r\n          isEdit: false, \r\n          isGroup: false,\r\n          currentApplication: this.appContext.getCurrentApplication(),\r\n          isAdmin: this.appContext.isAdmin()\r\n        }\r\n      });\r\n\r\n      dialogRef.afterClosed().subscribe(result => {\r\n        if (result) {\r\n          this.artifactService.addArtifact(result).subscribe(newArtifact => {\r\n            this.loadArtifacts();\r\n            this.showNotification('Artifact created successfully');\r\n          });\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n  onAddGroupClick(): void {\r\n    import('./../../components/artifact-dialog/artifact-dialog.component').then(({ ArtifactDialogComponent }) => {\r\n      const dialogRef = this.dialog.open(ArtifactDialogComponent, {\r\n        width: '700px',\r\n        data: { \r\n          isEdit: false, \r\n          isGroup: true,\r\n          currentApplication: this.appContext.getCurrentApplication(),\r\n          isAdmin: this.appContext.isAdmin()\r\n        }\r\n      });\r\n\r\n      dialogRef.afterClosed().subscribe(result => {\r\n        if (result) {\r\n          // For simplicity, we're using the same addArtifact method\r\n          this.artifactService.addArtifact(result).subscribe(newArtifact => {\r\n            this.loadArtifacts();\r\n            this.showNotification('Artifact Group created successfully');\r\n          });\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n  onEditArtifact(artifact: Artifact): void {\r\n    import('./../../components/artifact-dialog/artifact-dialog.component').then(({ ArtifactDialogComponent }) => {\r\n      const dialogRef = this.dialog.open(ArtifactDialogComponent, {\r\n        width: '700px',\r\n        data: { \r\n          artifact, \r\n          isEdit: true, \r\n          isGroup: artifact.type === 'RESOURCEGROUP',\r\n          currentApplication: this.appContext.getCurrentApplication(),\r\n          isAdmin: this.appContext.isAdmin()\r\n        }\r\n      });\r\n\r\n      dialogRef.afterClosed().subscribe(result => {\r\n        if (result) {\r\n          this.artifactService.updateArtifact(result).subscribe(updatedArtifact => {\r\n            this.loadArtifacts();\r\n            this.showNotification('Artifact updated successfully');\r\n          });\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n  onDeleteArtifact(artifact: Artifact): void {\r\n    const dialogRef = this.dialog.open(ConfirmDialogComponent, {\r\n      width: '400px',\r\n      data: {\r\n        title: 'Delete Artifact',\r\n        message: `Are you sure you want to delete ${artifact.name}?`,\r\n        confirmText: 'Delete',\r\n        cancelText: 'Cancel',\r\n        color: 'warn'\r\n      }\r\n    });\r\n\r\n    dialogRef.afterClosed().subscribe(confirmed => {\r\n      if (confirmed) {\r\n        this.artifactService.deleteArtifact(artifact.id).subscribe(success => {\r\n          if (success) {\r\n            this.loadArtifacts(); // Reload artifacts list when artifact is deleted\r\n            this.showNotification('Artifact deleted successfully');\r\n          }\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n  applyFilter(event: Event): void {\r\n    const filterValue = (event.target as HTMLInputElement).value.toLowerCase();\r\n    this.searchQuery = filterValue;\r\n    \r\n    if (this.activeTab === 'resources') {\r\n      this.applyAdvancedFilters();\r\n    } else if (this.activeTab === 'groups') {\r\n      this.applyGroupFilters();\r\n    }\r\n  }\r\n\r\n  applyGroupFilters(): void {\r\n    let filtered = [...this.groupsDataSource];\r\n\r\n    // Apply status filter\r\n    if (this.selectedStatus) {\r\n      filtered = filtered.filter(group => \r\n        group.status?.toLowerCase() === this.selectedStatus.toLowerCase()\r\n      );\r\n    }\r\n\r\n    // Apply application filter using direct application field\r\n    if (this.selectedApplication && this.selectedApplication !== 'admin') {\r\n      filtered = filtered.filter(group => {\r\n        return group.application === this.selectedApplication;\r\n      });\r\n    }\r\n\r\n    // Apply search query filter\r\n    if (this.searchQuery) {\r\n      const query = this.searchQuery.toLowerCase();\r\n      filtered = filtered.filter(group => \r\n        group.name?.toLowerCase().includes(query) || \r\n        group.description?.toLowerCase().includes(query) ||\r\n        // Also search in group application\r\n        group.application?.toLowerCase().includes(query)\r\n      );\r\n    }\r\n\r\n    this.filteredGroupsDataSource = filtered;\r\n  }\r\n\r\n  getStatusClass(status: string): string {\r\n    return status === 'Active' ? 'status-active' : 'status-inactive';\r\n  }\r\n\r\n  getTypeIcon(type: string): string {\r\n    return type === 'RESOURCE' ? 'insert_chart' : 'folder';\r\n  }\r\n\r\n\r\n  loadAllApplicationOptions(): void {\r\n    // For admin users, load ALL possible applications from the system\r\n    this.artifactService.getArtifacts(0, undefined, null, 'admin').subscribe(allArtifacts => {\r\n      const applications = new Set<string>();\r\n      \r\n      // Extract from all artifacts in the system\r\n      allArtifacts.forEach((artifact: any) => {\r\n        if (artifact.application && typeof artifact.application === 'string') {\r\n          applications.add(artifact.application);\r\n        }\r\n      });\r\n      \r\n      // Also load all groups to get their applications\r\n      this.artifactService.getArtifactGroups(0, undefined, true, 'admin').subscribe(allGroups => {\r\n        allGroups.forEach((group: any) => {\r\n          if (group.application && typeof group.application === 'string') {\r\n            applications.add(group.application);\r\n          }\r\n        });\r\n        \r\n        this.applicationOptions = Array.from(applications).sort();\r\n      });\r\n    });\r\n  }\r\n\r\n  extractApplicationOptions(): void {\r\n    const applications = new Set<string>();\r\n    \r\n    // Extract from individual artifacts in dataSource (using application field)\r\n    this.dataSource.forEach((artifact: any) => {\r\n      if (artifact.application && typeof artifact.application === 'string') {\r\n        applications.add(artifact.application);\r\n      }\r\n    });\r\n    \r\n    // Extract from groups\r\n    this.groupsDataSource.forEach((group: any) => {\r\n      if (group.application && typeof group.application === 'string') {\r\n        applications.add(group.application);\r\n      }\r\n    });\r\n    \r\n    this.applicationOptions = Array.from(applications).sort();\r\n  }\r\n\r\n  onStatusChange(): void {\r\n    if (this.activeTab === 'resources') {\r\n      this.applyAdvancedFilters();\r\n    } else if (this.activeTab === 'groups') {\r\n      this.applyGroupFilters();\r\n    }\r\n  }\r\n\r\n  onApplicationChange(): void {\r\n    // For admin users, reload data with the selected application filter\r\n    if (this.appContext.isAdmin()) {\r\n      if (this.activeTab === 'resources') {\r\n        this.loadArtifactsWithFilter();\r\n      } else if (this.activeTab === 'groups') {\r\n        this.loadGroupsWithFilter();\r\n      }\r\n    } else {\r\n      // For non-admin users, just apply local filters\r\n      if (this.activeTab === 'resources') {\r\n        this.applyAdvancedFilters();\r\n      } else if (this.activeTab === 'groups') {\r\n        this.applyGroupFilters();\r\n      }\r\n    }\r\n  }\r\n\r\n  applyAdvancedFilters(): void {\r\n    let filtered = [...this.dataSource];\r\n\r\n    // Apply status filter\r\n    if (this.selectedStatus) {\r\n      filtered = filtered.filter(artifact => \r\n        artifact.status?.toLowerCase() === this.selectedStatus.toLowerCase()\r\n      );\r\n    }\r\n\r\n    // Apply application filter (using category field)\r\n    if (this.selectedApplication) {\r\n      filtered = filtered.filter((artifact: any) => \r\n        artifact.category === this.selectedApplication\r\n      );\r\n    }\r\n\r\n    // Apply search query filter\r\n    if (this.searchQuery) {\r\n      const query = this.searchQuery.toLowerCase();\r\n      filtered = filtered.filter(artifact => \r\n        artifact.name?.toLowerCase().includes(query) || \r\n        artifact.description?.toLowerCase().includes(query) ||\r\n        artifact.application?.toLowerCase().includes(query)\r\n      );\r\n    }\r\n\r\n    this.filteredDataSource = filtered;\r\n  }\r\n\r\n  resetFilters(): void {\r\n    this.selectedStatus = '';\r\n    this.selectedApplication = '';\r\n    this.searchQuery = '';\r\n    \r\n    if (this.activeTab === 'resources') {\r\n      this.filteredDataSource = [...this.dataSource];\r\n    } else if (this.activeTab === 'groups') {\r\n      this.filteredGroupsDataSource = [...this.groupsDataSource];\r\n    }\r\n  }\r\n\r\n  hasActiveFilters(): boolean {\r\n    return !!(this.selectedStatus || this.selectedApplication || this.searchQuery);\r\n  }\r\n\r\n  onRefresh(): void {\r\n    if (this.activeTab === 'resources') {\r\n      this.loadArtifacts();\r\n    } else if (this.activeTab === 'groups') {\r\n      this.loadArtifactGroups();\r\n    }\r\n  }\r\n\r\n  isAdmin(): boolean {\r\n    return this.appContext.isAdmin();\r\n  }\r\n\r\n  private showNotification(message: string): void {\r\n    this.snackBar.open(message, 'Close', {\r\n      duration: 3000,\r\n      horizontalPosition: 'end',\r\n      verticalPosition: 'bottom'\r\n    });\r\n  }\r\n}","<div class=\"artifacts-container\">\r\n  <div class=\"header\">\r\n    <h1>Artifacts</h1>\r\n    <div class=\"actions\">\r\n      <button mat-flat-button color=\"primary\" [matMenuTriggerFor]=\"addMenu\" class=\"add-button\">\r\n        <mat-icon>add</mat-icon> Add\r\n      </button>\r\n      <mat-menu #addMenu=\"matMenu\" class=\"add-menu\">\r\n        <button mat-menu-item (click)=\"onAddArtifactClick()\">\r\n          <mat-icon>insert_chart</mat-icon>\r\n          <span>Add Artifact</span>\r\n        </button>\r\n        <button mat-menu-item (click)=\"onAddGroupClick()\">\r\n          <mat-icon>folder</mat-icon>\r\n          <span>Add Artifact Group</span>\r\n        </button>\r\n      </mat-menu>\r\n    </div>\r\n  </div>\r\n\r\n  <div class=\"tabs-container\">\r\n    <div class=\"tabs-header\">\r\n      <div class=\"tab\" [ngClass]=\"{'active': activeTab === 'resources'}\" (click)=\"switchTab('resources')\">\r\n        <mat-icon>insert_chart</mat-icon>\r\n        Resources\r\n      </div>\r\n      <div class=\"tab\" [ngClass]=\"{'active': activeTab === 'groups'}\" (click)=\"switchTab('groups')\">\r\n        <mat-icon>folder</mat-icon>\r\n        Resource Groups\r\n      </div>\r\n      <div class=\"tab\" [ngClass]=\"{'active': activeTab === 'hierarchy'}\" (click)=\"switchTab('hierarchy')\">\r\n        <mat-icon>account_tree</mat-icon>\r\n        Hierarchy\r\n      </div>\r\n    </div>\r\n    \r\n    <!-- Resources Tab Content -->\r\n    <div class=\"tab-content\" *ngIf=\"activeTab === 'resources'\">\r\n      <div class=\"search-container\">\r\n        <div class=\"search-field\">\r\n          <mat-icon>search</mat-icon>\r\n          <input placeholder=\"Search resources...\" [(ngModel)]=\"searchQuery\" (keyup)=\"applyFilter($event)\">\r\n        </div>\r\n        \r\n        <!-- Compact Filters on the right -->\r\n        <div class=\"filters-container\">\r\n          <div class=\"compact-filters\">\r\n            <mat-form-field appearance=\"outline\" class=\"compact-filter\">\r\n              <mat-label>Status</mat-label>\r\n              <mat-select [(value)]=\"selectedStatus\" (selectionChange)=\"onStatusChange()\">\r\n                <mat-option value=\"\">All Status</mat-option>\r\n                <mat-option *ngFor=\"let status of statusOptions\" [value]=\"status\">\r\n                  {{ status }}\r\n                </mat-option>\r\n              </mat-select>\r\n            </mat-form-field>\r\n\r\n            <mat-form-field appearance=\"outline\" class=\"compact-filter\" *ngIf=\"isAdmin()\">\r\n              <mat-label>Application</mat-label>\r\n              <mat-select [(value)]=\"selectedApplication\" (selectionChange)=\"onApplicationChange()\">\r\n                <mat-option value=\"admin\">All Applications</mat-option>\r\n                <mat-option *ngFor=\"let app of applicationOptions\" [value]=\"app\">\r\n                  {{ app }}\r\n                </mat-option>\r\n              </mat-select>\r\n            </mat-form-field>\r\n\r\n            <button mat-stroked-button color=\"primary\" (click)=\"resetFilters()\" \r\n                    class=\"clear-filters\" *ngIf=\"hasActiveFilters()\">\r\n              Clear Filters\r\n            </button>\r\n          </div>\r\n          \r\n          <div class=\"view-controls\">\r\n            <button mat-icon-button (click)=\"onRefresh()\" title=\"Refresh\">\r\n              <mat-icon>refresh</mat-icon>\r\n            </button>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <div class=\"table-container\">\r\n        <table class=\"artifact-table\">\r\n          <thead>\r\n            <tr>\r\n              <th class=\"checkbox-column\">\r\n                <mat-checkbox color=\"primary\"></mat-checkbox>\r\n              </th>\r\n              <th>Name</th>\r\n              <th>Application</th>\r\n              <th>Status</th>\r\n              <th>Actions</th>\r\n            </tr>\r\n          </thead>\r\n          <tbody>\r\n            <tr *ngFor=\"let artifact of filteredDataSource\">\r\n              <td class=\"checkbox-column\">\r\n                <mat-checkbox color=\"primary\"></mat-checkbox>\r\n              </td>\r\n              <td>\r\n                <div class=\"artifact-info\">\r\n                  <div class=\"artifact-icon\">\r\n                    <mat-icon>insert_chart</mat-icon>\r\n                  </div>\r\n                  <div class=\"artifact-details\">\r\n                    <div class=\"artifact-name\">{{ artifact.name }}</div>\r\n                    <div class=\"artifact-desc\" *ngIf=\"artifact.description\">{{ artifact.description }}</div>\r\n                  </div>\r\n                </div>\r\n              </td>\r\n              <td>\r\n                <span class=\"category-badge\">{{ artifact.application }}</span>\r\n              </td>\r\n              <td>\r\n                <div class=\"status-badge\" [ngClass]=\"getStatusClass(artifact.status)\">\r\n                  {{ artifact.status }}\r\n                </div>\r\n              </td>\r\n              <td class=\"actions-column\">\r\n                <button mat-icon-button [matMenuTriggerFor]=\"actionMenu\" (click)=\"$event.stopPropagation()\">\r\n                  <mat-icon>more_vert</mat-icon>\r\n                </button>\r\n                <mat-menu #actionMenu=\"matMenu\">\r\n                  <button mat-menu-item (click)=\"onEditArtifact(artifact)\">\r\n                    <mat-icon>edit</mat-icon>\r\n                    <span>Edit</span>\r\n                  </button>\r\n                  <button mat-menu-item (click)=\"onDeleteArtifact(artifact)\">\r\n                    <mat-icon>delete</mat-icon>\r\n                    <span>Delete</span>\r\n                  </button>\r\n                </mat-menu>\r\n              </td>\r\n            </tr>\r\n          </tbody>\r\n        </table>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Resource Groups Tab Content -->\r\n    <div class=\"tab-content\" *ngIf=\"activeTab === 'groups'\">\r\n      <div class=\"search-container\">\r\n        <div class=\"search-field\">\r\n          <mat-icon>search</mat-icon>\r\n          <input placeholder=\"Search resource groups...\" [(ngModel)]=\"searchQuery\" (keyup)=\"applyFilter($event)\">\r\n        </div>\r\n        \r\n        <!-- Compact Filters on the right -->\r\n        <div class=\"filters-container\">\r\n          <div class=\"compact-filters\">\r\n            <mat-form-field appearance=\"outline\" class=\"compact-filter\">\r\n              <mat-label>Status</mat-label>\r\n              <mat-select [(value)]=\"selectedStatus\" (selectionChange)=\"onStatusChange()\">\r\n                <mat-option value=\"\">All Status</mat-option>\r\n                <mat-option *ngFor=\"let status of statusOptions\" [value]=\"status\">\r\n                  {{ status }}\r\n                </mat-option>\r\n              </mat-select>\r\n            </mat-form-field>\r\n\r\n            <mat-form-field appearance=\"outline\" class=\"compact-filter\" *ngIf=\"isAdmin()\">\r\n              <mat-label>Application</mat-label>\r\n              <mat-select [(value)]=\"selectedApplication\" (selectionChange)=\"onApplicationChange()\">\r\n                <mat-option value=\"admin\">All Applications</mat-option>\r\n                <mat-option *ngFor=\"let app of applicationOptions\" [value]=\"app\">\r\n                  {{ app }}\r\n                </mat-option>\r\n              </mat-select>\r\n            </mat-form-field>\r\n\r\n            <button mat-stroked-button color=\"primary\" (click)=\"resetFilters()\" \r\n                    class=\"clear-filters\" *ngIf=\"hasActiveFilters()\">\r\n              Clear Filters\r\n            </button>\r\n          </div>\r\n          \r\n          <div class=\"view-controls\">\r\n            <button mat-icon-button (click)=\"onRefresh()\" title=\"Refresh\">\r\n              <mat-icon>refresh</mat-icon>\r\n            </button>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <div class=\"table-container\">\r\n        <table class=\"artifact-table\">\r\n          <thead>\r\n            <tr>\r\n              <th class=\"checkbox-column\">\r\n                <mat-checkbox color=\"primary\"></mat-checkbox>\r\n              </th>\r\n              <th>Name</th>\r\n              <th>Application</th>\r\n              <th>Description</th>\r\n              <th>Status</th>\r\n              <th>Actions</th>\r\n            </tr>\r\n          </thead>\r\n          <tbody>\r\n            <tr *ngFor=\"let group of filteredGroupsDataSource\">\r\n              <td class=\"checkbox-column\">\r\n                <mat-checkbox color=\"primary\"></mat-checkbox>\r\n              </td>\r\n              <td>\r\n                <div class=\"artifact-info\">\r\n                  <div class=\"artifact-icon\">\r\n                    <mat-icon>folder</mat-icon>\r\n                  </div>\r\n                  <div class=\"artifact-details\">\r\n                    <div class=\"artifact-name\">{{ group.name }}</div>\r\n                  </div>\r\n                </div>\r\n              </td>\r\n              <td>\r\n                <span class=\"category-badge\" *ngIf=\"group.application\">\r\n                  {{ group.application }}\r\n                </span>\r\n                <span class=\"no-category\" *ngIf=\"!group.application\">\r\n                  No application\r\n                </span>\r\n              </td>\r\n              <td>\r\n                <div class=\"artifact-desc\">{{ group.description || 'No description' }}</div>\r\n              </td>\r\n              <td>\r\n                <div class=\"status-badge\" [ngClass]=\"getStatusClass(group.status)\">\r\n                  {{ group.status }}\r\n                </div>\r\n              </td>\r\n              <td class=\"actions-column\">\r\n                <button mat-icon-button [matMenuTriggerFor]=\"groupActionMenu\" (click)=\"$event.stopPropagation()\">\r\n                  <mat-icon>more_vert</mat-icon>\r\n                </button>\r\n                <mat-menu #groupActionMenu=\"matMenu\">\r\n                  <button mat-menu-item (click)=\"onEditArtifact(group)\">\r\n                    <mat-icon>edit</mat-icon>\r\n                    <span>Edit</span>\r\n                  </button>\r\n                  <button mat-menu-item (click)=\"onDeleteArtifact(group)\">\r\n                    <mat-icon>delete</mat-icon>\r\n                    <span>Delete</span>\r\n                  </button>\r\n                </mat-menu>\r\n              </td>\r\n            </tr>\r\n          </tbody>\r\n        </table>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Hierarchy Tab Content -->\r\n    <div class=\"tab-content\" *ngIf=\"activeTab === 'hierarchy'\">\r\n      <app-artifact-hierarchy></app-artifact-hierarchy>\r\n    </div>\r\n  </div>\r\n</div>","import { Component, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatSortModule } from '@angular/material/sort';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatDialogModule, MatDialog } from '@angular/material/dialog';\nimport { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { AccessRuleService } from '../../services/access-rule.service';\nimport { AppContextService } from '../../services/app-context.service';\nimport { UserService } from '../../services/user.service';\nimport { ArtifactService } from '../../services/artifact.service';\nimport { AccessRule } from '../../models/access-rule.model';\nimport { ConfirmDialogComponent } from '../confirm-dialog/confirm-dialog.component';\nimport { forkJoin } from 'rxjs';\n\n@Component({\n  selector: 'app-access-rules',\n  standalone: true,\n  imports: [\n    CommonModule,\n    MatTableModule,\n    MatPaginatorModule,\n    MatSortModule,\n    MatButtonModule,\n    MatIconModule,\n    MatInputModule,\n    MatFormFieldModule,\n    MatSelectModule,\n    MatMenuModule,\n    MatChipsModule,\n    MatTabsModule,\n    MatCheckboxModule,\n    MatDialogModule,\n    MatSnackBarModule,\n    MatTooltipModule,\n    FormsModule,\n    ReactiveFormsModule\n  ],\n  templateUrl: './access-rules.component.html',\n  styleUrls: ['./access-rules.component.scss']\n})\nexport class AccessRulesComponent implements OnInit {\n  displayedColumns: string[] = ['name', 'description', 'userExpression', 'resourceExpression', 'permissions', 'status', 'actions'];\n  dataSource: AccessRule[] = [];\n  filteredDataSource: AccessRule[] = [];\n  searchQuery: string = '';\n  \n  // Admin filtering properties\n  selectedApplication: string = '';\n  applicationOptions: string[] = [];\n  selectedStatus: string = '';\n  statusOptions: string[] = ['Active', 'Inactive'];\n\n  // Entity arrays for expression conversion (same approach as ExpressionInputComponent)\n  private allUserEntities: Array<{id: string, name: string, type: string}> = [];\n  private allArtifactEntities: Array<{id: string, name: string, type: string}> = [];\n\n  constructor(\n    private accessRuleService: AccessRuleService,\n    private appContext: AppContextService,\n    private userService: UserService,\n    private artifactService: ArtifactService,\n    private dialog: MatDialog,\n    private snackBar: MatSnackBar\n  ) {}\n\n  ngOnInit(): void {\n    this.loadLookupData();\n  }\n\n  loadLookupData(): void {\n    // Load users and artifacts for expression conversion (same approach as ExpressionInputComponent)\n    // Get application context for filtering\n    const currentApp = this.appContext.getCurrentApplication();\n    const applicationName = this.appContext.isAdmin() ? undefined : currentApp;\n\n    forkJoin({\n      users: this.userService.getUsers(),\n      userGroups: this.userService.getGroups(),\n      artifacts: this.artifactService.getArtifacts(0, 1000, null, applicationName),\n      artifactGroups: this.artifactService.getArtifactGroups(0, 1000, true, applicationName)\n    }).subscribe({\n      next: (data) => {\n        // Build user entities array\n        this.allUserEntities = [\n          // Individual users\n          ...data.users.map(user => ({\n            id: user.email || user.id, // Use email as ID for users\n            name: user.name || `${user.first_name || ''} ${user.last_name || ''}`.trim() || user.email || user.id,\n            type: 'user'\n          })),\n          // User groups\n          ...data.userGroups.map(group => ({\n            id: group.id,\n            name: group.name || (group.user_metadata?.name as string) || group.id,\n            type: 'group'\n          }))\n        ].map(entity => ({\n          ...entity,\n          name: entity.name || entity.id // Ensure all entities have non-undefined names\n        }));\n\n        // Build artifact entities array\n        this.allArtifactEntities = [\n          // Individual artifacts\n          ...data.artifacts.filter(artifact => artifact.type === 'RESOURCE').map(artifact => ({\n            id: artifact.id,\n            name: artifact.name || artifact.description || artifact.id,\n            type: 'artifact'\n          })),\n          // Artifact groups\n          ...data.artifactGroups.map(group => ({\n            id: group.id,\n            name: group.name || group.description || group.id,\n            type: 'artifactGroup'\n          }))\n        ].map(entity => ({\n          ...entity,\n          name: entity.name || entity.id // Ensure all entities have non-undefined names\n        }));\n\n        // Now load access rules\n        this.loadAccessRules();\n      },\n      error: (error) => {\n        console.error('Error loading lookup data:', error);\n        this.loadAccessRules(); // Load rules anyway\n      }\n    });\n  }\n\n  loadAccessRules(): void {\n    // For admin users, load all access rules (no application filter)\n    // For non-admin users, filter by their current application\n    const currentApp = this.appContext.getCurrentApplication();\n    const applicationName = this.appContext.isAdmin() ? 'admin' : currentApp;\n    \n    this.accessRuleService.getAccessRules(0, 100, null, applicationName).subscribe(rules => {\n      this.dataSource = rules;\n      this.filteredDataSource = rules;\n      \n      // Extract available applications for admin filtering\n      if (this.appContext.isAdmin()) {\n        this.extractApplicationOptions();\n      }\n    });\n  }\n\n  private getUserDisplayName(user: any): string {\n    if (user.name) {\n      return user.name;\n    }\n    \n    if (user.first_name || user.last_name) {\n      return `${user.first_name || ''} ${user.last_name || ''}`.trim();\n    }\n    \n    if (user.user_metadata?.name) {\n      return user.user_metadata.name as string;\n    }\n    \n    return user.email || user.id;\n  }\n\n  // Convert internal expression (with IDs/emails) to display expression (with names)\n  // Using same approach as ExpressionInputComponent\n  convertExpressionToDisplayFormat(expression: string, isUserExpression: boolean = true): string {\n    if (!expression) return '';\n    \n    const entities = isUserExpression ? this.allUserEntities : this.allArtifactEntities;\n    \n    // Parse the expression to get individual tokens\n    const tokens = this.parseExpressionTokens(expression);\n    \n    // Convert each ID/email to its corresponding display name\n    const convertedTokens = tokens.map(token => {\n      if (this.isOperator(token)) {\n        return token; // Keep operators as is\n      }\n      \n      // Find the entity by ID/email\n      const entity = entities.find(e => e.id === token.trim());\n      if (entity) {\n        return entity.name;\n      }\n      \n      // If not found, return original token\n      return token;\n    });\n    \n    return convertedTokens.join('');\n  }\n\n  // Parse expression into tokens (entities and operators)\n  private parseExpressionTokens(expression: string): string[] {\n    if (!expression) return [];\n    \n    const tokens: string[] = [];\n    let currentToken = '';\n    \n    for (let i = 0; i < expression.length; i++) {\n      const char = expression[i];\n      \n      if (char === '+' || char === '-') {\n        // Save current token if it exists\n        if (currentToken.trim()) {\n          tokens.push(currentToken.trim());\n          currentToken = '';\n        }\n        // Save operator\n        tokens.push(char);\n      } else {\n        currentToken += char;\n      }\n    }\n    \n    // Save last token if it exists\n    if (currentToken.trim()) {\n      tokens.push(currentToken.trim());\n    }\n    \n    return tokens;\n  }\n\n  // Check if a token is an operator\n  private isOperator(token: string): boolean {\n    return token === '+' || token === '-';\n  }\n  \n  generateRuleId(name: string): string {\n    // Create a slug from the name\n    const slug = name.toLowerCase()\n      .replace(/\\s+/g, '_')        // Replace spaces with underscores\n      .replace(/[^\\w-]+/g, '')     // Remove non-word characters\n      .replace(/--+/g, '_')       // Replace multiple dashes with a single underscore\n      .replace(/^-+/, '')          // Trim from start\n      .replace(/-+$/, '');         // Trim from end\n    \n    // Add a timestamp to ensure uniqueness\n    const timestamp = Date.now();\n    return `rule_${slug}_${timestamp}`;\n  }\n\n  onAddRuleClick(): void {\n    import('./../../components/access-rule-dialog/access-rule-dialog.component').then(({ AccessRuleDialogComponent }) => {\n      const dialogRef = this.dialog.open(AccessRuleDialogComponent, {\n        width: '700px',\n        data: { \n          isEdit: false,\n          currentApplication: this.appContext.getCurrentApplication(),\n          isAdmin: this.appContext.isAdmin()\n        }\n      });\n\n      dialogRef.afterClosed().subscribe(result => {\n        if (result) {\n          // Generate ID for new rule\n          if (!result.id) {\n            result.id = this.generateRuleId(result.name);\n          }\n          \n          this.accessRuleService.addAccessRule(result).subscribe({\n            next: (newRule) => {\n              this.loadAccessRules();\n              this.showNotification('Access rule created successfully');\n            },\n            error: (error) => {\n              this.showNotification(`Error creating access rule: ${error.message}`);\n            }\n          });\n        }\n      });\n    });\n  }\n\n  onEditRule(rule: AccessRule): void {\n    import('./../../components/access-rule-dialog/access-rule-dialog.component').then(({ AccessRuleDialogComponent }) => {\n      const dialogRef = this.dialog.open(AccessRuleDialogComponent, {\n        width: '700px',\n        data: { \n          rule, \n          isEdit: true,\n          currentApplication: this.appContext.getCurrentApplication(),\n          isAdmin: this.appContext.isAdmin()\n        }\n      });\n\n      dialogRef.afterClosed().subscribe(result => {\n        if (result) {\n          this.accessRuleService.updateAccessRule(result).subscribe({\n            next: (updatedRule) => {\n              this.loadAccessRules();\n              this.showNotification('Access rule updated successfully');\n            },\n            error: (error) => {\n              this.showNotification(`Error updating access rule: ${error.message}`);\n            }\n          });\n        }\n      });\n    });\n  }\n\n  onDeleteRule(rule: AccessRule): void {\n    const dialogRef = this.dialog.open(ConfirmDialogComponent, {\n      width: '400px',\n      data: {\n        title: 'Delete Access Rule',\n        message: `Are you sure you want to delete ${rule.name}?`,\n        confirmText: 'Delete',\n        cancelText: 'Cancel',\n        color: 'warn'\n      }\n    });\n\n    dialogRef.afterClosed().subscribe(confirmed => {\n      if (confirmed) {\n        this.accessRuleService.deleteAccessRule(rule.id).subscribe({\n          next: (success) => {\n            if (success) {\n              this.loadAccessRules();\n              this.showNotification('Access rule deleted successfully');\n            } else {\n              this.showNotification('Failed to delete access rule');\n            }\n          },\n          error: (error) => {\n            this.showNotification(`Error deleting access rule: ${error.message}`);\n          }\n        });\n      }\n    });\n  }\n\n  applyFilter(event: Event): void {\n    this.searchQuery = (event.target as HTMLInputElement).value;\n    this.applyFilters();\n  }\n\n  getStatusClass(status: string): string {\n    return status === 'Active' ? 'status-active' : 'status-inactive';\n  }\n\n  formatPermissions(permissions: string[]): string {\n    return permissions.join(', ');\n  }\n\n  hasTimeConstraints(rule: AccessRule): boolean {\n    return !!rule.timeConstraints;\n  }\n\n  formatTimeConstraints(rule: AccessRule): string {\n    if (!rule.timeConstraints) return '';\n    \n    let constraints: string[] = [];\n    \n    if (rule.timeConstraints.daysOfWeek) {\n      const days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n      const daysText = rule.timeConstraints.daysOfWeek.map(d => days[d]).join(', ');\n      constraints.push(daysText);\n    }\n    \n    if (rule.timeConstraints.startTime && rule.timeConstraints.endTime) {\n      constraints.push(`${rule.timeConstraints.startTime}-${rule.timeConstraints.endTime}`);\n    }\n    \n    if (rule.timeConstraints.startDate && rule.timeConstraints.endDate) {\n      constraints.push(`${rule.timeConstraints.startDate} to ${rule.timeConstraints.endDate}`);\n    }\n    \n    return constraints.join(' • ');\n  }\n\n  extractApplicationOptions(): void {\n    const applications = this.dataSource\n      .filter(rule => rule.application && rule.application.trim() !== '')\n      .map(rule => rule.application)\n      .filter(application => application !== undefined) as string[];\n    \n    // Remove duplicates and sort\n    this.applicationOptions = Array.from(new Set(applications)).sort();\n  }\n\n  onApplicationChange(): void {\n    this.applyFilters();\n  }\n\n  onStatusChange(): void {\n    this.applyFilters();\n  }\n\n  applyFilters(): void {\n    let filtered = [...this.dataSource];\n\n    // Apply search query filter\n    if (this.searchQuery) {\n      const query = this.searchQuery.toLowerCase();\n      filtered = filtered.filter(rule => \n        rule.name.toLowerCase().includes(query) ||\n        (rule.description || '').toLowerCase().includes(query) || \n        rule.userExpression.toLowerCase().includes(query) ||\n        rule.resourceExpression.toLowerCase().includes(query) ||\n        rule.application?.toLowerCase().includes(query)\n      );\n    }\n\n    // Apply status filter\n    if (this.selectedStatus) {\n      filtered = filtered.filter(rule => rule.status === this.selectedStatus);\n    }\n\n    // Apply application filter (admin only)\n    if (this.selectedApplication && this.appContext.isAdmin()) {\n      filtered = filtered.filter(rule => rule.application === this.selectedApplication);\n    }\n\n    this.filteredDataSource = filtered;\n  }\n\n  resetFilters(): void {\n    this.selectedStatus = '';\n    this.selectedApplication = '';\n    this.searchQuery = '';\n    this.filteredDataSource = [...this.dataSource];\n  }\n\n  hasActiveFilters(): boolean {\n    return !!(this.selectedStatus || this.selectedApplication || this.searchQuery);\n  }\n\n  onRefresh(): void {\n    this.loadLookupData();\n  }\n\n  isAdmin(): boolean {\n    return this.appContext.isAdmin();\n  }\n\n  truncateText(text: string, maxLength: number): string {\n    if (!text || text.length <= maxLength) {\n      return text;\n    }\n    return text.substring(0, maxLength) + '...';\n  }\n\n  showExpressionModal(expression: string, title: string, isUserExpression: boolean): void {\n    if (!expression || expression.length <= 30) {\n      return;\n    }\n\n    const displayExpression = this.convertExpressionToDisplayFormat(expression, isUserExpression);\n\n    const dialogRef = this.dialog.open(ConfirmDialogComponent, {\n      width: '600px',\n      data: {\n        title: title,\n        message: displayExpression,\n        showCancel: false,\n        confirmText: 'Close'\n      }\n    });\n  }\n\n  private showNotification(message: string): void {\n    this.snackBar.open(message, 'Close', {\n      duration: 3000,\n      horizontalPosition: 'end',\n      verticalPosition: 'bottom'\n    });\n  }\n}","<div class=\"access-rules-container\">\r\n  <div class=\"header\">\r\n    <h1>Access Rules</h1>\r\n    <div class=\"actions\">\r\n      <button mat-flat-button color=\"primary\" class=\"add-button\" (click)=\"onAddRuleClick()\">\r\n        <mat-icon>add</mat-icon> Add Rule\r\n      </button>\r\n    </div>\r\n  </div>\r\n\r\n  <div class=\"content-container\">\r\n    <div class=\"search-container\">\r\n      <div class=\"search-field\">\r\n        <mat-icon>search</mat-icon>\r\n        <input placeholder=\"Search access rules...\" [(ngModel)]=\"searchQuery\" (keyup)=\"applyFilter($event)\">\r\n      </div>\r\n      <div class=\"view-controls\">\r\n        <button mat-icon-button (click)=\"onRefresh()\" title=\"Refresh\">\r\n          <mat-icon>refresh</mat-icon>\r\n        </button>\r\n      </div>\r\n    </div>\r\n\r\n    <div class=\"table-container\">\r\n      <table class=\"rules-table\">\r\n        <thead>\r\n          <tr>\r\n            <th>Rule Name</th>\r\n            <th>Description</th>\r\n            <th>User Expression</th>\r\n            <th>Resource Expression</th>\r\n            <th>Permissions</th>\r\n            <th>Time Constraint</th>\r\n            <th>Status</th>\r\n            <th>Actions</th>\r\n          </tr>\r\n        </thead>\r\n        <tbody>\r\n          <tr *ngFor=\"let rule of filteredDataSource\">\r\n            <td>\r\n              <div class=\"rule-name\">{{ rule.name }}</div>\r\n            </td>\r\n            <td>\r\n              <div class=\"rule-description\"\r\n                   [matTooltip]=\"rule.description && rule.description.length > 40 ? rule.description : ''\"\r\n                   matTooltipPosition=\"above\">\r\n                {{ truncateText(rule.description || 'No description', 40) }}\r\n              </div>\r\n            </td>\r\n            <td>\r\n              <div class=\"expression-badge user-expression\"\r\n                   [matTooltip]=\"rule.userExpression && rule.userExpression.length > 30 ? convertExpressionToDisplayFormat(rule.userExpression, true) : ''\"\r\n                   matTooltipPosition=\"above\"\r\n                   (click)=\"showExpressionModal(rule.userExpression, 'User Expression', true)\">\r\n                {{ truncateText(convertExpressionToDisplayFormat(rule.userExpression, true), 30) }}\r\n              </div>\r\n            </td>\r\n            <td>\r\n              <div class=\"expression-badge resource-expression\"\r\n                   [matTooltip]=\"rule.resourceExpression && rule.resourceExpression.length > 30 ? convertExpressionToDisplayFormat(rule.resourceExpression, false) : ''\"\r\n                   matTooltipPosition=\"above\"\r\n                   (click)=\"showExpressionModal(rule.resourceExpression, 'Resource Expression', false)\">\r\n                {{ truncateText(convertExpressionToDisplayFormat(rule.resourceExpression, false), 30) }}\r\n              </div>\r\n            </td>\r\n            <td>\r\n              <div class=\"permissions-container\">\r\n                <span class=\"permission-badge\" *ngFor=\"let permission of rule.permissions\">{{ permission }}</span>\r\n              </div>\r\n            </td>\r\n            <td>\r\n              <div class=\"time-constraints\" *ngIf=\"hasTimeConstraints(rule)\">\r\n                {{ formatTimeConstraints(rule) }}\r\n              </div>\r\n              <div class=\"no-constraints\" *ngIf=\"!hasTimeConstraints(rule)\">\r\n                No time constraints\r\n              </div>\r\n            </td>\r\n            <td>\r\n              <div class=\"status-badge\" [ngClass]=\"getStatusClass(rule.status)\">\r\n                {{ rule.status }}\r\n              </div>\r\n            </td>\r\n            <td class=\"actions-column\">\r\n              <button mat-icon-button [matMenuTriggerFor]=\"actionMenu\" (click)=\"$event.stopPropagation()\">\r\n                <mat-icon>more_vert</mat-icon>\r\n              </button>\r\n              <mat-menu #actionMenu=\"matMenu\">\r\n                <button mat-menu-item (click)=\"onEditRule(rule)\">\r\n                  <mat-icon>edit</mat-icon>\r\n                  <span>Edit</span>\r\n                </button>\r\n                <button mat-menu-item (click)=\"onDeleteRule(rule)\">\r\n                  <mat-icon>delete</mat-icon>\r\n                  <span>Delete</span>\r\n                </button>\r\n              </mat-menu>\r\n            </td>\r\n          </tr>\r\n        </tbody>\r\n      </table>\r\n    </div>\r\n  </div>\r\n</div>","import { Component, Input, OnInit, Inject, ViewEncapsulation } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SidebarComponent } from './components/sidebar/sidebar.component';\r\nimport { UserManagementComponent } from './components/user-management/user-management.component';\r\nimport { UserGroupsComponent } from './components/user-groups/user-groups.component';\r\nimport { HierarchyComponent } from './components/hierarchy/hierarchy.component';\r\nimport { ArtifactsComponent } from './components/artifacts/artifacts.component';\r\nimport { AccessRulesComponent } from './components/access-rules/access-rules.component';\r\nimport { MEDHA_ONE_ACCESS_CONFIG } from './config/medha-config.token';\r\nimport { MedhaOneAccessConfig } from './config/medha-config.interface';\r\n\r\n@Component({\r\n  selector: 'medha-one-access',\r\n  standalone: true,\r\n  encapsulation: ViewEncapsulation.None,\r\n  imports: [\r\n    CommonModule,\r\n    SidebarComponent,\r\n    UserManagementComponent,\r\n    UserGroupsComponent,\r\n    HierarchyComponent,\r\n    ArtifactsComponent,\r\n    AccessRulesComponent\r\n  ],\r\n  template: `\r\n    <div class=\"app-container\">\r\n      <div class=\"app-content\">\r\n        <app-sidebar (navigationChange)=\"onNavigationChange($event)\"></app-sidebar>\r\n        <main class=\"main-content\">\r\n          <!-- Component switching based on current view -->\r\n          <app-user-management *ngIf=\"currentView === 'users'\"></app-user-management>\r\n          <app-user-groups *ngIf=\"currentView === 'user-groups'\"></app-user-groups>\r\n          <app-hierarchy *ngIf=\"currentView === 'hierarchy'\"></app-hierarchy>\r\n          <app-artifacts *ngIf=\"currentView === 'artifacts'\"></app-artifacts>\r\n          <app-access-rules *ngIf=\"currentView === 'access-rules'\"></app-access-rules>\r\n        </main>\r\n      </div>\r\n    </div>\r\n  `,\r\n  styleUrls: ['./medha-one-access.component.scss', './medha-one-access.scss']\r\n})\r\nexport class MedhaOneAccessComponent implements OnInit {\r\n  @Input() currentApplication: string = '';\r\n  @Input() secretKey: string = '';\r\n  @Input() apiUrl: string = '';\r\n  \r\n  currentView: string = 'users'; // Default view\r\n  title = 'Medha One Access';\r\n\r\n  constructor(\r\n    @Inject(MEDHA_ONE_ACCESS_CONFIG) private config: MedhaOneAccessConfig\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    // Override config with input values if provided\r\n    if (this.currentApplication) this.config.currentApplication = this.currentApplication;\r\n    if (this.secretKey) this.config.secretKey = this.secretKey;\r\n    if (this.apiUrl) this.config.apiUrl = this.apiUrl;\r\n  }\r\n\r\n  onNavigationChange(view: string): void {\r\n    this.currentView = view;\r\n  }\r\n}","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule } from '@angular/router';\n\n// Configuration\nimport { MedhaOneAccessConfig } from './config/medha-config.interface';\nimport { MEDHA_ONE_ACCESS_CONFIG } from './config/medha-config.token';\n\n// Main component\nimport { MedhaOneAccessComponent } from './medha-one-access.component';\n\n// Routes\nimport { routes } from './medha-one-access.routes';\n\n@NgModule({\n  imports: [\n    CommonModule,\n    RouterModule,\n    MedhaOneAccessComponent\n  ],\n  exports: [\n    MedhaOneAccessComponent\n  ]\n})\nexport class MedhaOneAccessModule {\n  static forRoot(config: MedhaOneAccessConfig): ModuleWithProviders<MedhaOneAccessModule> {\n    return {\n      ngModule: MedhaOneAccessModule,\n      providers: [\n        {\n          provide: MEDHA_ONE_ACCESS_CONFIG,\n          useValue: config\n        }\n        // No more HTTP interceptor registration - using manual authentication\n      ]\n    };\n  }\n}","import { Routes } from '@angular/router';\nimport { UserManagementComponent } from './components/user-management/user-management.component';\nimport { UserGroupsComponent } from './components/user-groups/user-groups.component';\nimport { HierarchyComponent } from './components/hierarchy/hierarchy.component';\nimport { ArtifactsComponent } from './components/artifacts/artifacts.component';\nimport { AccessRulesComponent } from './components/access-rules/access-rules.component';\n\nexport const routes: Routes = [\n  { path: '', redirectTo: 'users', pathMatch: 'full' },\n  { path: 'users', component: UserManagementComponent },\n  { path: 'user-groups', component: UserGroupsComponent },\n  { path: 'hierarchy', component: HierarchyComponent },\n  { path: 'artifacts', component: ArtifactsComponent },\n  { path: 'access-rules', component: AccessRulesComponent },\n  { path: '**', redirectTo: 'users' }\n];","import { Component, Input, OnInit, forwardRef, ViewChild, ElementRef, OnDestroy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatAutocompleteModule, MatAutocomplete, MatAutocompleteTrigger } from '@angular/material/autocomplete';\nimport { MatChipInputEvent, MatChipsModule } from '@angular/material/chips';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { Observable, Subject, of, BehaviorSubject, Subscription, combineLatest } from 'rxjs';\nimport { map, startWith, debounceTime, switchMap, distinctUntilChanged, finalize, catchError } from 'rxjs/operators';\nimport { UserService } from '../../services/user.service';\nimport { ArtifactService } from '../../services/artifact.service';\nimport { ExpressionParserService } from '../../services/expression-parser.service';\nimport { User, UserGroup } from '../../models/user.model';\nimport { Artifact, ArtifactGroup } from '../../models/artifact.model';\nimport { COMMA, ENTER } from '@angular/cdk/keycodes';\n\nexport type ExpressionEntity = {\n  id: string;\n  name: string;\n  type: 'user' | 'group' | 'artifact' | 'artifactGroup';\n};\n\n@Component({\n  selector: 'app-expression-input',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatAutocompleteModule,\n    MatChipsModule,\n    MatIconModule,\n    MatProgressSpinnerModule\n  ],\n  templateUrl: './expression-input.component.html',\n  styleUrls: ['./expression-input.component.scss'],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => ExpressionInputComponent),\n      multi: true\n    }\n  ]\n})\nexport class ExpressionInputComponent implements OnInit, ControlValueAccessor, OnDestroy {\n  @Input() placeholder = 'Enter expression...';\n  @Input() hint = '';\n  @Input() label = 'Expression';\n  @Input() type: 'user' | 'resource' = 'user';\n  @Input() required = false;\n  @Input() currentApplication?: string;\n  @Input() isAdmin: boolean = false;\n\n  @ViewChild('expressionInput') expressionInput!: ElementRef<HTMLInputElement>;\n  @ViewChild(MatAutocompleteTrigger) autocomplete!: MatAutocompleteTrigger;\n\n  expressionControl = new FormControl('');\n  filteredEntities: Observable<ExpressionEntity[]> = of([]);\n  currentPosition = 0;\n  currentWord = '';\n  displayExpression = ''; // User-friendly expression with names\n  internalExpression = ''; // Backend expression with IDs\n  fullExpression = ''; // Store the full expression for reference\n  lastSelectedEntity: ExpressionEntity | null = null;\n  separatorKeysCodes: number[] = [ENTER, COMMA];\n  entities: ExpressionEntity[] = [];\n  allEntities: ExpressionEntity[] = [];\n  isLoading = false;\n  hasError = false;\n  errorMessage = '';\n  private subscriptions: Subscription[] = [];\n  private entities$ = new BehaviorSubject<ExpressionEntity[]>([]);\n\n  private onChange: any = () => {};\n  private onTouched: any = () => {};\n\n  constructor(\n    private userService: UserService,\n    private artifactService: ArtifactService,\n    private expressionParser: ExpressionParserService\n  ) {}\n\n  ngOnInit(): void {\n    // Load appropriate entities based on type\n    if (this.type === 'user') {\n      this.loadUserEntities();\n    } else {\n      this.loadResourceEntities();\n    }\n\n    // Set up filtering\n    this.filteredEntities = combineLatest([\n      this.entities$,\n      this.expressionControl.valueChanges.pipe(\n        startWith(''),\n        debounceTime(500),\n        map(value => {\n          // Handle both string and object value types\n          if (typeof value === 'object' && value !== null) {\n            // If it's an object (selected from autocomplete), just use empty string to reset suggestions\n            return '';\n          }\n          return this.getCurrentWord(value || '');\n        })\n      )\n    ]).pipe(\n      map(([entities, currentWord]) => {\n        // If no current word, show all entities (limited to 10)\n        if (!currentWord || currentWord.trim() === '') {\n          return entities.slice(0, 10);\n        }\n        \n        const lowercaseWord = currentWord.toLowerCase();\n        return entities.filter(entity => \n          entity.name.toLowerCase().includes(lowercaseWord)\n        ).slice(0, 5);\n      })\n    );\n\n    // Subscribe to value changes to notify the parent form\n    const sub = this.expressionControl.valueChanges.subscribe(value => {\n      // Make sure we always have a string value to emit\n      let displayValue: string;\n      \n      if (typeof value === 'object' && value !== null) {\n        // If we have an object, try to get its name or use stored expression\n        displayValue = (value as ExpressionEntity)?.name || this.fullExpression || '';\n      } else {\n        // Otherwise use the value as is and update our stored full expression\n        displayValue = value || '';\n        this.fullExpression = displayValue;\n      }\n      \n      // Update both expressions\n      this.displayExpression = displayValue;\n      this.internalExpression = this.convertDisplayToInternal(displayValue);\n      \n      // Emit the internal (ID-based) expression to parent\n      this.onChange(this.internalExpression);\n    });\n    \n    this.subscriptions.push(sub);\n  }\n\n  ngOnDestroy(): void {\n    this.subscriptions.forEach(sub => sub.unsubscribe());\n  }\n\n  private loadUserEntities(): void {\n    this.isLoading = true;\n    this.hasError = false;\n    \n    const users$ = this.userService.getUsers().pipe(\n      map(users => users.map(user => ({\n        id: user.email || user.id, // Use email as ID for users\n        name: user.name || `${user.first_name || ''} ${user.last_name || ''}`.trim() || user.email || user.id,\n        type: 'user' as const\n      }))),\n      catchError(error => {\n        console.error('Error loading users:', error);\n        return of([]);\n      })\n    );\n\n    const groups$ = this.userService.getGroups().pipe(\n      map(groups => groups.map(group => ({\n        id: group.id,\n        name: group.name || (group.user_metadata?.name as string) || group.id,\n        type: 'group' as const\n      }))),\n      catchError(error => {\n        console.error('Error loading groups:', error);\n        return of([]);\n      })\n    );\n\n    const sub = combineLatest([users$, groups$]).pipe(\n      map(([users, groups]) => {\n        // Ensure all entities have non-undefined names\n        const validUsers = users.map(user => ({\n          ...user,\n          name: user.name || user.id\n        }));\n        \n        const validGroups = groups.map(group => ({\n          ...group,\n          name: group.name || group.id\n        }));\n        \n        return [...validUsers, ...validGroups];\n      }),\n      finalize(() => {\n        this.isLoading = false;\n      })\n    ).subscribe({\n      next: entities => {\n        this.allEntities = entities;\n        this.entities$.next(entities);\n      },\n      error: error => {\n        console.error('Error loading entities:', error);\n        this.hasError = true;\n        this.errorMessage = 'Failed to load entities. Please try again.';\n        this.isLoading = false;\n      }\n    });\n\n    this.subscriptions.push(sub);\n  }\n\n  private loadResourceEntities(): void {\n    this.isLoading = true;\n    this.hasError = false;\n    \n    // Determine application filter - for admin users, use 'admin' to get all unless specific app is set\n    const applicationFilter = this.isAdmin ? (this.currentApplication === 'admin' ? 'admin' : this.currentApplication) : this.currentApplication;\n    \n    const artifacts$ = this.artifactService.getArtifacts(0, 1000, null, applicationFilter).pipe(\n      map(artifacts => artifacts\n        .filter(artifact => artifact.type === 'RESOURCE')\n        .map(artifact => ({\n          id: artifact.id,\n          name: artifact.name || artifact.description || artifact.id,\n          type: 'artifact' as const\n        }))\n      ),\n      catchError(error => {\n        console.error('Error loading resources:', error);\n        return of([]);\n      })\n    );\n\n    const groups$ = this.artifactService.getArtifactGroups(0, 1000, true, applicationFilter).pipe(\n      map(groups => groups.map(group => ({\n        id: group.id,\n        name: group.name || group.description || group.id,\n        type: 'artifactGroup' as const\n      }))),\n      catchError(error => {\n        console.error('Error loading resource groups:', error);\n        return of([]);\n      })\n    );\n\n    const sub = combineLatest([artifacts$, groups$]).pipe(\n      map(([artifacts, groups]) => {\n        // Ensure all entities have non-undefined names\n        const validArtifacts = artifacts.map(artifact => ({\n          ...artifact,\n          name: artifact.name || artifact.id\n        }));\n        \n        const validGroups = groups.map(group => ({\n          ...group,\n          name: group.name || group.id\n        }));\n        \n        return [...validArtifacts, ...validGroups];\n      }),\n      finalize(() => {\n        this.isLoading = false;\n      })\n    ).subscribe({\n      next: entities => {\n        this.allEntities = entities;\n        this.entities$.next(entities);\n      },\n      error: error => {\n        console.error('Error loading entities:', error);\n        this.hasError = true;\n        this.errorMessage = 'Failed to load entities. Please try again.';\n        this.isLoading = false;\n      }\n    });\n\n    this.subscriptions.push(sub);\n  }\n\n  getCurrentWord(value: string): string {\n    if (!value) return '';\n    \n    // Get cursor position or use end of string\n    const cursorPos = this.expressionInput?.nativeElement.selectionStart ?? value.length;\n    \n    // Find the start of the current word (any character except +, -, or whitespace)\n    let startPos = cursorPos;\n    while (startPos > 0 && !['+', '-', ' '].includes(value[startPos - 1])) {\n      startPos--;\n    }\n    \n    // Find the end of the current word (to handle mid-word cursor positions)\n    let endPos = cursorPos;\n    while (endPos < value.length && !['+', '-', ' '].includes(value[endPos])) {\n      endPos++;\n    }\n    \n    // Extract the current word\n    const currentWord = value.substring(startPos, endPos);\n    this.currentPosition = startPos;\n    this.currentWord = currentWord;\n    \n    // Store the full value for future reference\n    this.fullExpression = value;\n    \n    return currentWord;\n  }\n\n  displayFn = (entity: ExpressionEntity | string | null): string => {\n    // The displayFn should just show the current input value\n    // Let onOptionSelected handle the actual replacement logic\n    if (entity === null || entity === undefined) {\n      return this.expressionInput?.nativeElement?.value || this.fullExpression || '';\n    }\n    \n    if (typeof entity === 'string') {\n      return entity;\n    }\n    \n    // For entity objects, just return the current input value\n    // The actual replacement happens in onOptionSelected\n    return this.expressionInput?.nativeElement?.value || this.fullExpression || '';\n  }\n\n  onKeyDown(event: KeyboardEvent): void {\n    // Special handling for + and - to make them easy to add\n    if (['+', '-'].includes(event.key)) {\n      // Don't add operators at the beginning of the expression\n      const currentValue = this.expressionControl.value || '';\n      const cursorPos = this.expressionInput?.nativeElement.selectionStart ?? 0;\n      \n      if (currentValue === '' || cursorPos === 0) {\n        // Don't allow operator at the start\n        if (event.key === '-') {\n          event.preventDefault();\n        }\n      }\n      \n      // If we just selected an entity and are adding an operator, ensure it's added after\n      if (this.lastSelectedEntity && \n          cursorPos === this.currentPosition + this.lastSelectedEntity.name.length) {\n        // Allow the operator to be added (default behavior)\n        // Reset last selected entity to avoid future issues\n        setTimeout(() => {\n          this.lastSelectedEntity = null;\n          \n          // Update the current position to after the operator for the next selection\n          const newPos = cursorPos + 1;  // +1 for the operator\n          this.currentPosition = newPos;\n          this.currentWord = '';\n        }, 10);\n      }\n    }\n  }\n\n  onOptionSelected(entity: ExpressionEntity): void {\n    // Store the selected entity for later reference\n    this.lastSelectedEntity = entity;\n    \n    // Get the current value and cursor position from the input element directly\n    const inputElement = this.expressionInput.nativeElement;\n    const inputValue = inputElement.value;\n    const currentCursorPos = inputElement.selectionStart ?? inputValue.length;\n    \n    // Re-calculate the current word position based on current cursor position\n    // Handle quotes by finding the complete word boundary\n    let startPos = currentCursorPos;\n    let inQuotes = false;\n    \n    // Find start position, considering quotes\n    while (startPos > 0) {\n      const char = inputValue[startPos - 1];\n      if (char === '\"') {\n        inQuotes = !inQuotes;\n        startPos--;\n        if (!inQuotes) break; // Found opening quote\n      } else if (!inQuotes && ['+', '-', ' '].includes(char)) {\n        break;\n      } else {\n        startPos--;\n      }\n    }\n    \n    // Find end position, considering quotes\n    let endPos = currentCursorPos;\n    inQuotes = false;\n    while (endPos < inputValue.length) {\n      const char = inputValue[endPos];\n      if (char === '\"') {\n        endPos++;\n        inQuotes = !inQuotes;\n        if (!inQuotes) break; // Found closing quote\n      } else if (!inQuotes && ['+', '-', ' '].includes(char)) {\n        break;\n      } else {\n        endPos++;\n      }\n    }\n    \n    // Create the display value (with names) and internal value (with IDs)\n    const beforeCursor = inputValue.substring(0, startPos);\n    const afterCursor = inputValue.substring(endPos);\n    const quotedEntityName = this.autoQuoteIfNeeded(entity.name);\n    const displayValue = beforeCursor + quotedEntityName + afterCursor;\n    \n    // Build internal expression by converting names to IDs\n    const internalValue = this.convertDisplayToInternal(displayValue);\n    \n    // Update both expressions\n    this.displayExpression = displayValue;\n    this.internalExpression = internalValue;\n    this.fullExpression = displayValue;\n    this.expressionControl.setValue(displayValue);\n    \n    // Emit the internal (ID-based) expression to parent component\n    this.onChange(internalValue);\n    \n    // Move cursor to end of inserted entity name (accounting for quotes)\n    setTimeout(() => {\n      const newCursorPosition = startPos + quotedEntityName.length;\n      inputElement.setSelectionRange(newCursorPosition, newCursorPosition);\n      inputElement.focus();\n      \n      // Reset autocomplete state\n      this.currentPosition = newCursorPosition;\n      this.currentWord = '';\n    }, 10);\n  }\n\n  isEntityInExpression(entity: ExpressionEntity, expression: string): boolean {\n    if (!expression) return false;\n    \n    // Use the expression parser to check if entity is in the expression\n    const operations = this.expressionParser.parseExpression(expression);\n    return operations.some(op => op.entity === entity.name);\n  }\n\n  // ControlValueAccessor methods\n  writeValue(value: string): void {\n    this.internalExpression = value;\n    \n    // If entities are already loaded, convert immediately\n    if (this.allEntities.length > 0) {\n      const displayValue = this.convertInternalToDisplay(value);\n      this.displayExpression = displayValue;\n      this.expressionControl.setValue(displayValue);\n    } else {\n      // Wait for entities to load, then convert\n      this.entities$.pipe(\n        map(() => this.allEntities),\n        // Wait until entities are actually loaded\n        switchMap(entities => {\n          if (entities.length > 0) {\n            return of(entities);\n          } else {\n            // If still no entities, wait a bit more\n            return this.entities$.pipe(debounceTime(100));\n          }\n        }),\n        // Take first emission when entities are available\n        map(() => {\n          const displayValue = this.convertInternalToDisplay(value);\n          this.displayExpression = displayValue;\n          this.expressionControl.setValue(displayValue);\n          return displayValue;\n        })\n      ).subscribe();\n      \n      // Set the raw value initially in case conversion fails\n      this.displayExpression = value;\n      this.expressionControl.setValue(value);\n    }\n  }\n\n  registerOnChange(fn: any): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: any): void {\n    this.onTouched = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    if (isDisabled) {\n      this.expressionControl.disable();\n    } else {\n      this.expressionControl.enable();\n    }\n  }\n\n  onBlur(): void {\n    this.onTouched();\n  }\n\n  /**\n   * Convert display expression (with names) to internal expression (with IDs/emails)\n   */\n  private convertDisplayToInternal(displayExpression: string): string {\n    if (!displayExpression) return '';\n    \n    // Parse the expression to get individual tokens\n    const tokens = this.parseExpressionTokens(displayExpression);\n    \n    // Convert each entity name to its corresponding ID/email\n    const convertedTokens = tokens.map(token => {\n      if (this.isOperator(token)) {\n        return token; // Keep operators as is\n      }\n      \n      // Handle quoted entities - remove quotes for lookup but preserve for output if needed\n      let lookupToken = token.trim();\n      let wasQuoted = false;\n      \n      if (lookupToken.startsWith('\"') && lookupToken.endsWith('\"')) {\n        lookupToken = lookupToken.slice(1, -1);\n        wasQuoted = true;\n      }\n      \n      // Find the entity by name\n      const entity = this.allEntities.find(e => e.name === lookupToken);\n      if (entity) {\n        // For users, use email as ID; for others, use the actual ID\n        const entityId = entity.type === 'user' ? entity.id : entity.id;\n        // Add quotes if the original was quoted or if the ID contains special characters\n        return (wasQuoted || this.shouldQuoteEntity(entityId)) ? `\"${entityId}\"` : entityId;\n      }\n      \n      // If not found, return original token (might be manually typed)\n      return token;\n    });\n    \n    return convertedTokens.join('');\n  }\n\n  /**\n   * Convert internal expression (with IDs/emails) to display expression (with names)\n   */\n  private convertInternalToDisplay(internalExpression: string): string {\n    if (!internalExpression) return '';\n    \n    // Parse the expression to get individual tokens\n    const tokens = this.parseExpressionTokens(internalExpression);\n    \n    // Convert each ID/email to its corresponding display name\n    const convertedTokens = tokens.map(token => {\n      if (this.isOperator(token)) {\n        return token; // Keep operators as is\n      }\n      \n      // Handle quoted entities - remove quotes for lookup but preserve structure\n      let lookupToken = token.trim();\n      let wasQuoted = false;\n      \n      if (lookupToken.startsWith('\"') && lookupToken.endsWith('\"')) {\n        lookupToken = lookupToken.slice(1, -1);\n        wasQuoted = true;\n      }\n      \n      // Find the entity by ID/email\n      const entity = this.allEntities.find(e => e.id === lookupToken);\n      if (entity) {\n        // Add quotes if the original was quoted or if the name contains special characters\n        return (wasQuoted || this.shouldQuoteEntity(entity.name)) ? `\"${entity.name}\"` : entity.name;\n      }\n      \n      // If not found, return original token\n      return token;\n    });\n    \n    return convertedTokens.join('');\n  }\n\n  /**\n   * Parse expression into tokens (entities and operators)\n   * Supports quoted entities to handle hyphens in entity names\n   */\n  private parseExpressionTokens(expression: string): string[] {\n    if (!expression) return [];\n    \n    const tokens: string[] = [];\n    let currentToken = '';\n    let inQuotes = false;\n    \n    for (let i = 0; i < expression.length; i++) {\n      const char = expression[i];\n      \n      if (char === '\"') {\n        // Handle quote character\n        currentToken += char;\n        inQuotes = !inQuotes;\n      } else if (!inQuotes && (char === '+' || char === '-')) {\n        // Only treat as operators when not inside quotes\n        if (currentToken.trim()) {\n          tokens.push(currentToken.trim());\n          currentToken = '';\n        }\n        // Save operator\n        tokens.push(char);\n      } else {\n        currentToken += char;\n      }\n    }\n    \n    // Save last token if it exists\n    if (currentToken.trim()) {\n      tokens.push(currentToken.trim());\n    }\n    \n    return tokens;\n  }\n\n  /**\n   * Check if a token is an operator\n   */\n  private isOperator(token: string): boolean {\n    return token === '+' || token === '-';\n  }\n\n  /**\n   * Check if an entity name/ID should be quoted\n   * Quotes are needed for entities containing operators, spaces, parentheses, colons, commas, or apostrophes\n   */\n  private shouldQuoteEntity(entityValue: string): boolean {\n    return /[+\\-\\s():,']/.test(entityValue);\n  }\n\n  /**\n   * Automatically add quotes to entity if needed\n   */\n  private autoQuoteIfNeeded(entityValue: string): string {\n    return this.shouldQuoteEntity(entityValue) ? `\"${entityValue}\"` : entityValue;\n  }\n}","<mat-form-field appearance=\"outline\" class=\"expression-field\">\r\n  <mat-label>{{ label }}</mat-label>\r\n  <input \r\n    matInput \r\n    #expressionInput\r\n    [formControl]=\"expressionControl\"\r\n    [placeholder]=\"placeholder\"\r\n    [matAutocomplete]=\"auto\"\r\n    (blur)=\"onBlur()\"\r\n    (keydown)=\"onKeyDown($event)\"\r\n    [required]=\"required\">\r\n  \r\n  <mat-progress-spinner \r\n    *ngIf=\"isLoading\" \r\n    matSuffix \r\n    color=\"primary\" \r\n    diameter=\"16\" \r\n    mode=\"indeterminate\">\r\n  </mat-progress-spinner>\r\n  \r\n  <mat-autocomplete #auto=\"matAutocomplete\" [displayWith]=\"displayFn\" (optionSelected)=\"onOptionSelected($event.option.value)\">\r\n    <mat-option *ngFor=\"let entity of filteredEntities | async\" [value]=\"entity\">\r\n      <span class=\"entity-option\" [class.group]=\"entity.type === 'group' || entity.type === 'artifactGroup'\">\r\n        <mat-icon *ngIf=\"entity.type === 'user'\">person</mat-icon>\r\n        <mat-icon *ngIf=\"entity.type === 'group'\">group</mat-icon>\r\n        <mat-icon *ngIf=\"entity.type === 'artifact'\">insert_chart</mat-icon>\r\n        <mat-icon *ngIf=\"entity.type === 'artifactGroup'\">folder</mat-icon>\r\n        {{ entity.name }}\r\n      </span>\r\n    </mat-option>\r\n    <mat-option *ngIf=\"(filteredEntities | async)?.length === 0\" disabled>\r\n      No matching entities\r\n    </mat-option>\r\n  </mat-autocomplete>\r\n  \r\n  <mat-hint *ngIf=\"hint && !hasError\">{{ hint }}</mat-hint>\r\n  <mat-error *ngIf=\"hasError\">{{ errorMessage }}</mat-error>\r\n</mat-form-field>","import { Component, Inject, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatNativeDateModule } from '@angular/material/core';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { ExpressionInputComponent } from '../expression-input/expression-input.component';\nimport { FormsModule, ReactiveFormsModule, FormBuilder, FormGroup, Validators, FormArray, AbstractControl, ValidationErrors } from '@angular/forms';\nimport { AccessRule, TimeConstraint } from '../../models/access-rule.model';\nimport { AccessRuleService } from '../../services/access-rule.service';\nimport { Observable, of } from 'rxjs';\nimport { debounceTime, switchMap, map, catchError } from 'rxjs/operators';\n\n@Component({\n  selector: 'app-access-rule-dialog',\n  standalone: true,\n  imports: [\n    CommonModule,\n    MatDialogModule,\n    MatButtonModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatSelectModule,\n    MatCheckboxModule,\n    MatChipsModule,\n    MatIconModule,\n    MatSlideToggleModule,\n    MatTabsModule,\n    MatDatepickerModule,\n    MatNativeDateModule,\n    MatProgressSpinnerModule,\n    FormsModule,\n    ReactiveFormsModule,\n    ExpressionInputComponent\n  ],\n  templateUrl: './access-rule-dialog.component.html',\n  styleUrls: ['./access-rule-dialog.component.scss']\n})\nexport class AccessRuleDialogComponent implements OnInit {\n  ruleForm!: FormGroup;\n  availablePermissions = ['READ'];\n  availableApplications = ['Dashboard'];\n  customPermission = '';\n  showCustomPermissionField = false;\n  weekDays = [\n    { value: 0, name: 'Sunday' },\n    { value: 1, name: 'Monday' },\n    { value: 2, name: 'Tuesday' },\n    { value: 3, name: 'Wednesday' },\n    { value: 4, name: 'Thursday' },\n    { value: 5, name: 'Friday' },\n    { value: 6, name: 'Saturday' }\n  ];\n  hasTimeWindow = false;\n  hasDateWindow = false;\n  hasDayRestrictions = false;\n  \n  // Removed validation properties to simplify component\n\n  constructor(\n    private fb: FormBuilder,\n    private accessRuleService: AccessRuleService,\n    public dialogRef: MatDialogRef<AccessRuleDialogComponent>,\n    @Inject(MAT_DIALOG_DATA) public data: { \n      rule?: AccessRule, \n      isEdit: boolean,\n      currentApplication?: string,\n      isAdmin?: boolean\n    }\n  ) { }\n\n  ngOnInit(): void {\n    this.initializeForm();\n    \n    if (this.data.isEdit && this.data.rule) {\n      this.populateForm(this.data.rule);\n    }\n\n    // Check if we have time constraints and set UI toggles\n    if (this.data.rule?.timeConstraints) {\n      const constraints = this.data.rule.timeConstraints;\n      if (constraints.startTime && constraints.endTime) {\n        this.hasTimeWindow = true;\n      }\n      if (constraints.startDate && constraints.endDate) {\n        this.hasDateWindow = true;\n      }\n      if (constraints.daysOfWeek && constraints.daysOfWeek.length > 0) {\n        this.hasDayRestrictions = true;\n      }\n    }\n  }\n\n  initializeForm(): void {\n    // For non-admin users, pre-fill the application field with current app\n    const defaultApplication = this.data.isAdmin ? '' : (this.data.currentApplication || '');\n    \n    this.ruleForm = this.fb.group({\n      name: ['', [Validators.required]],\n      description: [''],\n      application: [defaultApplication, [Validators.required]],\n      userExpression: ['', [Validators.required]],\n      resourceExpression: ['', [Validators.required]],\n      permissions: [[], [Validators.required]],\n      status: ['Active'],\n      timeConstraints: this.fb.group({\n        startTime: [''],\n        endTime: [''],\n        startDate: [null],\n        endDate: [null],\n        daysOfWeek: [[]]\n      })\n    });\n    \n    // If not admin, disable the application field\n    if (!this.data.isAdmin) {\n      this.ruleForm.get('application')?.disable();\n    }\n    \n    // Removed expression validation to reduce API calls\n  }\n\n  populateForm(rule: AccessRule): void {\n    this.ruleForm.patchValue({\n      name: rule.name,\n      description: rule.description || '',\n      application: rule.application || '',\n      userExpression: rule.userExpression,\n      resourceExpression: rule.resourceExpression,\n      permissions: rule.permissions,\n      status: rule.status\n    });\n\n    if (rule.timeConstraints) {\n      this.ruleForm.get('timeConstraints')?.patchValue({\n        startTime: rule.timeConstraints.startTime,\n        endTime: rule.timeConstraints.endTime,\n        startDate: rule.timeConstraints.startDate ? new Date(rule.timeConstraints.startDate) : null,\n        endDate: rule.timeConstraints.endDate ? new Date(rule.timeConstraints.endDate) : null,\n        daysOfWeek: rule.timeConstraints.daysOfWeek || []\n      });\n    }\n  }\n\n  toggleTimeWindow(event: any): void {\n    this.hasTimeWindow = event.checked;\n    if (!this.hasTimeWindow) {\n      this.ruleForm.get('timeConstraints.startTime')?.setValue('');\n      this.ruleForm.get('timeConstraints.endTime')?.setValue('');\n    }\n  }\n\n  toggleDateWindow(event: any): void {\n    this.hasDateWindow = event.checked;\n    if (!this.hasDateWindow) {\n      this.ruleForm.get('timeConstraints.startDate')?.setValue(null);\n      this.ruleForm.get('timeConstraints.endDate')?.setValue(null);\n    }\n  }\n\n  toggleDayRestrictions(event: any): void {\n    this.hasDayRestrictions = event.checked;\n    if (!this.hasDayRestrictions) {\n      this.ruleForm.get('timeConstraints.daysOfWeek')?.setValue([]);\n    }\n  }\n\n  toggleCustomPermission(): void {\n    this.showCustomPermissionField = !this.showCustomPermissionField;\n    this.customPermission = '';\n  }\n\n  addCustomPermission(): void {\n    if (this.customPermission && this.customPermission.trim()) {\n      // Convert to uppercase to maintain consistency with predefined permissions\n      const formattedPermission = this.customPermission.trim().toUpperCase();\n      \n      // Check if it already exists\n      if (!this.availablePermissions.includes(formattedPermission)) {\n        // Add to available permissions\n        this.availablePermissions.push(formattedPermission);\n        \n        // Add to selected permissions\n        const currentPermissions = this.ruleForm.get('permissions')?.value || [];\n        this.ruleForm.get('permissions')?.setValue([...currentPermissions, formattedPermission]);\n        \n        // Reset custom permission field\n        this.customPermission = '';\n      }\n    }\n  }\n\n  onCancelClick(): void {\n    this.dialogRef.close();\n  }\n\n  // Removed validation methods to reduce API calls\n  \n  onSubmit(): void {\n    if (this.ruleForm.invalid) {\n      // Mark all fields as touched to show validation errors\n      this.ruleForm.markAllAsTouched();\n      return;\n    }\n\n    // Use getRawValue() to get all values including disabled fields\n    const formValue = this.ruleForm.getRawValue();\n    const accessRule: AccessRule = {\n      id: this.data.rule?.id || '',\n      name: formValue.name,\n      description: formValue.description,\n      application: formValue.application,\n      userExpression: formValue.userExpression,\n      resourceExpression: formValue.resourceExpression,\n      permissions: formValue.permissions,\n      status: formValue.status\n    };\n\n    // Only add time constraints if any were set\n    if (this.hasTimeWindow || this.hasDateWindow || this.hasDayRestrictions) {\n      accessRule.timeConstraints = {};\n\n      if (this.hasTimeWindow) {\n        accessRule.timeConstraints.startTime = formValue.timeConstraints.startTime;\n        accessRule.timeConstraints.endTime = formValue.timeConstraints.endTime;\n      }\n\n      if (this.hasDateWindow) {\n        accessRule.timeConstraints.startDate = formValue.timeConstraints.startDate;\n        accessRule.timeConstraints.endDate = formValue.timeConstraints.endDate;\n      }\n\n      if (this.hasDayRestrictions) {\n        accessRule.timeConstraints.daysOfWeek = formValue.timeConstraints.daysOfWeek;\n      }\n    }\n\n    this.dialogRef.close(accessRule);\n  }\n\n  isAdmin(): boolean {\n    return this.data.isAdmin === true;\n  }\n\n  getCurrentSelectedApplication(): string {\n    // Return the currently selected application from the form or fallback to data\n    const formApplication = this.ruleForm?.get('application')?.value;\n    return formApplication || this.data.currentApplication || 'admin';\n  }\n}","<div class=\"dialog-container\">\r\n  <h2 mat-dialog-title>{{ data.isEdit ? 'Edit' : 'Create' }} Access Rule</h2>\r\n  \r\n  <div mat-dialog-content>\r\n    <form [formGroup]=\"ruleForm\">\r\n      <div class=\"form-section\">\r\n        <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n          <mat-label>Rule Name</mat-label>\r\n          <input matInput formControlName=\"name\" required>\r\n          <mat-error *ngIf=\"ruleForm.get('name')?.hasError('required')\">\r\n            Name is required\r\n          </mat-error>\r\n        </mat-form-field>\r\n\r\n        <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n          <mat-label>Description</mat-label>\r\n          <textarea matInput formControlName=\"description\" rows=\"2\"></textarea>\r\n        </mat-form-field>\r\n\r\n        <!-- Admin users see dropdown selection -->\r\n        <ng-container *ngIf=\"isAdmin()\">\r\n          <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n            <mat-label>Application</mat-label>\r\n            <mat-select formControlName=\"application\" required>\r\n              <mat-option *ngFor=\"let app of availableApplications\" [value]=\"app\">\r\n                {{ app }}\r\n              </mat-option>\r\n            </mat-select>\r\n            <mat-error *ngIf=\"ruleForm.get('application')?.hasError('required')\">\r\n              Application is required\r\n            </mat-error>\r\n          </mat-form-field>\r\n        </ng-container>\r\n        \r\n        <!-- Non-admin users see read-only field -->\r\n        <ng-container *ngIf=\"!isAdmin()\">\r\n          <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n            <mat-label>Application</mat-label>\r\n            <input matInput formControlName=\"application\" readonly>\r\n            <mat-hint>Application is pre-set based on your access</mat-hint>\r\n          </mat-form-field>\r\n        </ng-container>\r\n\r\n        <mat-tab-group>\r\n          <mat-tab label=\"User Expression\">\r\n            <div class=\"tab-content\">\r\n              <app-expression-input\r\n                formControlName=\"userExpression\"\r\n                label=\"User Expression\"\r\n                placeholder=\"Enter user expression\"\r\n                hint=\"Example: group1+user3-group2\"\r\n                type=\"user\"\r\n                [required]=\"true\"\r\n                [currentApplication]=\"getCurrentSelectedApplication()\"\r\n                [isAdmin]=\"isAdmin()\">\r\n              </app-expression-input>\r\n              \r\n              <!-- Removed validation UI to simplify component -->\r\n            </div>\r\n          </mat-tab>\r\n          \r\n          <mat-tab label=\"Resource Expression\">\r\n            <div class=\"tab-content\">\r\n              <app-expression-input\r\n                formControlName=\"resourceExpression\"\r\n                label=\"Resource Expression\"\r\n                placeholder=\"Enter resource expression\"\r\n                hint=\"Example: art1+art2+grp1\"\r\n                type=\"resource\"\r\n                [required]=\"true\"\r\n                [currentApplication]=\"getCurrentSelectedApplication()\"\r\n                [isAdmin]=\"isAdmin()\">\r\n              </app-expression-input>\r\n              \r\n              <!-- Removed validation UI to simplify component -->\r\n            </div>\r\n          </mat-tab>\r\n        </mat-tab-group>\r\n\r\n        <div class=\"form-section\">\r\n          <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n            <mat-label>Permissions</mat-label>\r\n            <mat-select formControlName=\"permissions\" multiple required>\r\n              <mat-option *ngFor=\"let permission of availablePermissions\" [value]=\"permission\">\r\n                {{ permission }}\r\n              </mat-option>\r\n            </mat-select>\r\n            <mat-error *ngIf=\"ruleForm.get('permissions')?.hasError('required')\">\r\n              Select at least one permission\r\n            </mat-error>\r\n          </mat-form-field>\r\n          \r\n          <div class=\"custom-permission-row\">\r\n            <button mat-stroked-button type=\"button\" color=\"primary\" (click)=\"toggleCustomPermission()\">\r\n              <mat-icon>add</mat-icon> Custom Permission\r\n            </button>\r\n          </div>\r\n          \r\n          <div *ngIf=\"showCustomPermissionField\" class=\"custom-permission-input\">\r\n            <mat-form-field appearance=\"outline\">\r\n              <mat-label>Custom Permission</mat-label>\r\n              <input matInput [(ngModel)]=\"customPermission\" [ngModelOptions]=\"{standalone: true}\" placeholder=\"Enter custom permission (e.g. APPROVE)\">\r\n            </mat-form-field>\r\n            <button mat-button color=\"primary\" (click)=\"addCustomPermission()\" [disabled]=\"!customPermission.trim()\">\r\n              <mat-icon>add_circle</mat-icon> Add\r\n            </button>\r\n          </div>\r\n        </div>\r\n\r\n        <div formGroupName=\"timeConstraints\">\r\n          <div class=\"time-constraints-section\">\r\n            <h3>Time Constraints</h3>\r\n            \r\n            <div class=\"time-constraint-row\">\r\n              <mat-slide-toggle (change)=\"toggleTimeWindow($event)\">\r\n                Time Window\r\n              </mat-slide-toggle>\r\n              \r\n              <div class=\"time-inputs\" *ngIf=\"hasTimeWindow\">\r\n                <mat-form-field appearance=\"outline\">\r\n                  <mat-label>Start Time</mat-label>\r\n                  <input matInput type=\"time\" formControlName=\"startTime\">\r\n                </mat-form-field>\r\n                \r\n                <mat-form-field appearance=\"outline\">\r\n                  <mat-label>End Time</mat-label>\r\n                  <input matInput type=\"time\" formControlName=\"endTime\">\r\n                </mat-form-field>\r\n              </div>\r\n            </div>\r\n\r\n            <div class=\"time-constraint-row\">\r\n              <mat-slide-toggle (change)=\"toggleDateWindow($event)\">\r\n                Date Range\r\n              </mat-slide-toggle>\r\n              \r\n              <div class=\"date-inputs\" *ngIf=\"hasDateWindow\">\r\n                <mat-form-field appearance=\"outline\">\r\n                  <mat-label>Start Date</mat-label>\r\n                  <input matInput [matDatepicker]=\"startPicker\" formControlName=\"startDate\">\r\n                  <mat-datepicker-toggle matSuffix [for]=\"startPicker\"></mat-datepicker-toggle>\r\n                  <mat-datepicker #startPicker></mat-datepicker>\r\n                </mat-form-field>\r\n                \r\n                <mat-form-field appearance=\"outline\">\r\n                  <mat-label>End Date</mat-label>\r\n                  <input matInput [matDatepicker]=\"endPicker\" formControlName=\"endDate\">\r\n                  <mat-datepicker-toggle matSuffix [for]=\"endPicker\"></mat-datepicker-toggle>\r\n                  <mat-datepicker #endPicker></mat-datepicker>\r\n                </mat-form-field>\r\n              </div>\r\n            </div>\r\n\r\n            <div class=\"time-constraint-row\">\r\n              <mat-slide-toggle (change)=\"toggleDayRestrictions($event)\">\r\n                Day Restrictions\r\n              </mat-slide-toggle>\r\n              \r\n              <div class=\"days-selection\" *ngIf=\"hasDayRestrictions\">\r\n                <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n                  <mat-label>Days of Week</mat-label>\r\n                  <mat-select formControlName=\"daysOfWeek\" multiple>\r\n                    <mat-option *ngFor=\"let day of weekDays\" [value]=\"day.value\">\r\n                      {{ day.name }}\r\n                    </mat-option>\r\n                  </mat-select>\r\n                </mat-form-field>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n\r\n        <div class=\"status-toggle\">\r\n          <label>Status: </label>\r\n          <mat-slide-toggle formControlName=\"status\" [checked]=\"ruleForm.get('status')?.value === 'Active'\" \r\n            (change)=\"ruleForm.get('status')?.setValue($event.checked ? 'Active' : 'Inactive')\">\r\n            {{ ruleForm.get('status')?.value }}\r\n          </mat-slide-toggle>\r\n        </div>\r\n      </div>\r\n    </form>\r\n  </div>\r\n  \r\n  <div mat-dialog-actions class=\"dialog-actions\">\r\n    <button mat-button (click)=\"onCancelClick()\">Cancel</button>\r\n    <button mat-flat-button color=\"primary\" (click)=\"onSubmit()\" \r\n            [disabled]=\"ruleForm.invalid\">\r\n      {{ data.isEdit ? 'Update' : 'Create' }}\r\n    </button>\r\n  </div>\r\n</div>","import { Component, Inject, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { ExpressionInputComponent } from '../expression-input/expression-input.component';\nimport { FormsModule, ReactiveFormsModule, FormBuilder, FormGroup, Validators, FormArray, FormControl } from '@angular/forms';\nimport { Artifact, Permission, ArtifactGroup } from '../../models/artifact.model';\nimport { ArtifactService } from '../../services/artifact.service';\nimport { AccessRuleService } from '../../services/access-rule.service';\nimport { Observable, of } from 'rxjs';\nimport { ExpressionParserService } from '../../services/expression-parser.service';\nimport { SyncExpressionResolverService } from '../../services/sync-expression-resolver.service';\nimport { MatTreeModule, MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree';\nimport { FlatTreeControl } from '@angular/cdk/tree';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\n\n// Interfaces for tree view\ninterface MemberNode {\n  id: string;\n  name: string;\n  type: string;\n  children?: MemberNode[];\n  metadata?: any;\n}\n\ninterface FlatMemberNode {\n  expandable: boolean;\n  name: string;\n  level: number;\n  id: string;\n  type: string;\n  metadata?: any;\n}\n\n@Component({\n  selector: 'app-artifact-dialog',\n  standalone: true,\n  imports: [\n    CommonModule,\n    MatDialogModule,\n    MatButtonModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatSelectModule,\n    MatCheckboxModule,\n    MatIconModule,\n    MatSlideToggleModule,\n    MatTabsModule,\n    MatChipsModule,\n    FormsModule,\n    ReactiveFormsModule,\n    ExpressionInputComponent,\n    MatTreeModule,\n    MatProgressSpinnerModule\n  ],\n  templateUrl: './artifact-dialog.component.html',\n  styleUrls: ['./artifact-dialog.component.scss']\n})\nexport class ArtifactDialogComponent implements OnInit {\n  artifactForm!: FormGroup;\n  availableCategories = ['Sales CRM', 'Finance System', 'HR Portal', 'Analytics Dashboard', 'Inventory Management', 'Customer Support', 'Marketing Platform'];\n  customCategory = '';\n  showCustomCategoryField = false;\n  selectedTabIndex = 0;\n  \n  // Metadata properties\n  metadata: { key: string; value: string }[] = [];\n  newMetadataKey: string = '';\n  newMetadataValue: string = '';\n  \n  // Members tree view properties\n  loadingMembers = false;\n  groupMembers: Artifact[] = [];\n  memberTreeData: MemberNode[] = [];\n  \n  // Parent groups properties (for regular artifacts)\n  loadingParentGroups = false;\n  parentGroups: ArtifactGroup[] = [];\n  parentGroupsTreeData: MemberNode[] = [];\n  \n  // Permissions properties\n  artifactPermissions: {userId: string, userName: string, permissions: string[]}[] = [];\n  loadingPermissions = false;\n  \n  // Tree control for members view\n  private _transformer = (node: MemberNode, level: number): FlatMemberNode => {\n    return {\n      expandable: !!node.children && node.children.length > 0,\n      name: node.name,\n      level: level,\n      id: node.id,\n      type: node.type,\n      metadata: node.metadata\n    };\n  };\n\n  treeControl = new FlatTreeControl<FlatMemberNode>(\n    node => node.level,\n    node => node.expandable\n  );\n\n  treeFlattener = new MatTreeFlattener(\n    this._transformer,\n    node => node.level,\n    node => node.expandable,\n    node => node.children\n  );\n\n  dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);\n\n  constructor(\n    private fb: FormBuilder,\n    private artifactService: ArtifactService,\n    private accessRuleService: AccessRuleService,\n    private expressionParser: ExpressionParserService,\n    private syncExpressionResolver: SyncExpressionResolverService,\n    public dialogRef: MatDialogRef<ArtifactDialogComponent>,\n    @Inject(MAT_DIALOG_DATA) public data: { \n      artifact?: Artifact, \n      isEdit: boolean, \n      isGroup: boolean,\n      currentApplication?: string,\n      isAdmin?: boolean\n    }\n  ) { }\n\n  ngOnInit(): void {\n    this.initializeForm();\n    this.loadExistingApplications();\n    \n    if (this.data.isEdit && this.data.artifact) {\n      this.populateForm(this.data.artifact);\n    }\n  }\n  \n  loadExistingApplications(): void {\n    this.artifactService.getUniqueApplications().subscribe(applications => {\n      // Merge existing applications with default ones\n      const allApplications = [...this.availableCategories, ...applications];\n      // Remove duplicates and sort\n      this.availableCategories = Array.from(new Set(allApplications)).sort();\n    });\n  }\n\n  initializeForm(): void {\n    // For non-admin users, pre-fill the application field with current app\n    const defaultApplication = this.data.isAdmin ? '' : (this.data.currentApplication || '');\n    \n    this.artifactForm = this.fb.group({\n      name: ['', [Validators.required]],\n      description: ['', [Validators.required]],\n      type: [this.data.isGroup ? 'RESOURCEGROUP' : 'RESOURCE', [Validators.required]],\n      category: [defaultApplication, this.data.isGroup ? [] : [Validators.required]],\n      expression: [''],\n      status: ['Active'],\n      permissions: this.fb.array([])\n    });\n    \n    // If not admin, disable the category (application) field\n    if (!this.data.isAdmin) {\n      this.artifactForm.get('category')?.disable();\n    }\n  }\n\n  populateForm(artifact: Artifact): void {\n    this.artifactForm.patchValue({\n      name: artifact.name,\n      description: artifact.description || '',\n      type: artifact.type,\n      category: artifact.application || '',\n      expression: artifact.expression || '',\n      status: artifact.status\n    });\n    \n    // Load existing metadata\n    this.loadMetadataFromArtifact(artifact);\n  }\n\n  loadMetadataFromArtifact(artifact: Artifact): void {\n    this.metadata = [];\n    \n    // Check if artifact has artifact_metadata and extract key-value pairs\n    // Exclude 'name' and 'category' as they are handled separately in the form\n    if (artifact.artifactMetadata) {\n      Object.entries(artifact.artifactMetadata).forEach(([key, value]) => {\n        if (key !== 'name' && key !== 'category') {\n          this.metadata.push({ key, value: String(value) });\n        }\n      });\n    }\n  }\n\n  addMetadata(): void {\n    if (this.newMetadataKey.trim() && this.newMetadataValue.trim()) {\n      // Check if key already exists\n      const existingIndex = this.metadata.findIndex(m => m.key === this.newMetadataKey.trim());\n      \n      if (existingIndex >= 0) {\n        // Update existing key\n        this.metadata[existingIndex].value = this.newMetadataValue.trim();\n      } else {\n        // Add new key-value pair\n        this.metadata.push({\n          key: this.newMetadataKey.trim(),\n          value: this.newMetadataValue.trim()\n        });\n      }\n      \n      // Clear input fields\n      this.newMetadataKey = '';\n      this.newMetadataValue = '';\n    }\n  }\n\n  editMetadata(index: number): void {\n    const metadata = this.metadata[index];\n    this.newMetadataKey = metadata.key;\n    this.newMetadataValue = metadata.value;\n    this.removeMetadata(index);\n  }\n\n  removeMetadata(index: number): void {\n    this.metadata.splice(index, 1);\n  }\n\n  toggleCustomCategory(): void {\n    this.showCustomCategoryField = !this.showCustomCategoryField;\n    this.customCategory = '';\n  }\n\n  addCustomCategory(): void {\n    if (this.customCategory && this.customCategory.trim()) {\n      // Format the category name (capitalize first letter of each word)\n      const formattedCategory = this.customCategory.trim()\n        .split(' ')\n        .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n        .join(' ');\n      \n      // Check if it already exists in available categories (case insensitive)\n      const existingCategory = this.availableCategories.find(cat => \n        cat.toLowerCase() === formattedCategory.toLowerCase()\n      );\n      \n      if (existingCategory) {\n        // If it already exists in dropdown, just select it\n        this.artifactForm.get('category')?.setValue(existingCategory);\n      } else {\n        // Add to available categories\n        this.availableCategories.push(formattedCategory);\n        this.availableCategories.sort(); // Keep sorted\n        \n        // Set as selected category\n        this.artifactForm.get('category')?.setValue(formattedCategory);\n      }\n      \n      // Reset custom category field and hide it\n      this.customCategory = '';\n      this.showCustomCategoryField = false;\n    }\n  }\n\n  getMetadataObject(): any {\n    const metadataObj: any = {\n      name: this.artifactForm.get('name')?.value,\n      category: this.artifactForm.get('category')?.value\n    };\n    \n    // Add custom metadata\n    this.metadata.forEach(meta => {\n      metadataObj[meta.key] = meta.value;\n    });\n    \n    return metadataObj;\n  }\n\n  onTabChange(event: any): void {\n    // console.log('Tab changed to:', event.index, event);\n    this.selectedTabIndex = event.index;\n    \n    // Load group members when switching to the Hierarchy tab for artifact groups\n    if (this.data.isEdit && this.data.artifact && this.data.isGroup && event.index === 2) {\n      this.loadGroupMembers();\n    }\n    \n    // Load parent groups when switching to the Hierarchy tab for regular artifacts\n    if (this.data.isEdit && this.data.artifact && !this.data.isGroup && event.index === 2) {\n      this.loadParentGroups();\n    }\n    \n    // If on Permissions tab, load permissions\n    if (event.index === 1 && this.data.isEdit && this.data.artifact) {\n      // console.log('Loading permissions for artifact:', this.data.artifact.id);\n      this.loadArtifactPermissions();\n    }\n  }\n  \n  loadArtifactPermissions(): void {\n    // console.log('loadArtifactPermissions called for artifact:', this.data.artifact);\n    \n    if (!this.data.artifact || !this.data.artifact.id) {\n      console.error('Artifact data or ID is missing');\n      return;\n    }\n\n    this.loadingPermissions = true;\n    this.artifactPermissions = [];\n    \n    // console.log('Calling getArtifactAccess for artifact ID:', this.data.artifact.id);\n    \n    if(this.data.isGroup){\n      this.accessRuleService.getArtifactGroupAccess(this.data.artifact.id).subscribe({\n      next: (accessMap) => {\n        // console.log('Received access map:', accessMap);\n        \n        // Check if we got any data\n        if (Object.keys(accessMap).length === 0) {\n          // console.log('Access map is empty - no permissions found for this artifact');\n          this.loadingPermissions = false;\n          return;\n        }\n        \n        // Convert the map to an array of objects for display\n        this.artifactPermissions = Object.entries(accessMap).map(([userId, permissions]) => {\n          return {\n            userId,\n            userName: userId, // We'll update this with actual names later if available\n            permissions\n          };\n        });\n        \n        // console.log('Processed permissions:', this.artifactPermissions);\n        this.loadingPermissions = false;\n        \n        // If we have permissions, try to load user names\n        if (this.artifactPermissions.length > 0) {\n          // Could add user name lookup here if needed\n        }\n      },\n      error: (error) => {\n        console.error('Error loading artifact permissions:', error);\n        this.loadingPermissions = false;\n      }\n    });\n    }\n    else{\n    // Try to fetch artifact access\n    this.accessRuleService.getArtifactAccess(this.data.artifact.id).subscribe({\n      next: (accessMap) => {\n        // console.log('Received access map:', accessMap);\n        \n        // Check if we got any data\n        if (Object.keys(accessMap).length === 0) {\n          // console.log('Access map is empty - no permissions found for this artifact');\n          this.loadingPermissions = false;\n          return;\n        }\n        \n        // Convert the map to an array of objects for display\n        this.artifactPermissions = Object.entries(accessMap).map(([userId, permissions]) => {\n          return {\n            userId,\n            userName: userId, // We'll update this with actual names later if available\n            permissions\n          };\n        });\n        \n        // console.log('Processed permissions:', this.artifactPermissions);\n        this.loadingPermissions = false;\n        \n        // If we have permissions, try to load user names\n        if (this.artifactPermissions.length > 0) {\n          // Could add user name lookup here if needed\n        }\n      },\n      error: (error) => {\n        console.error('Error loading artifact permissions:', error);\n        this.loadingPermissions = false;\n      }\n    });\n  }\n  }\n  \n  loadGroupMembers(): void {\n    if (!this.data.artifact || !this.data.artifact.expression || !this.data.isGroup) {\n      this.memberTreeData = [];\n      this.dataSource.data = [];\n      return;\n    }\n    \n    this.loadingMembers = true;\n    \n    // First, get all artifacts\n    this.artifactService.getArtifacts().subscribe(artifacts => {\n      // Get all artifact groups to resolve nested expressions\n      this.artifactService.getArtifactGroups().subscribe(groups => {\n        const expression = this.data.artifact?.expression || '';\n        \n        // Filter artifacts that match the expression (only RESOURCE type artifacts)\n        const resourceArtifacts = artifacts.filter(a => a.type === 'RESOURCE');\n        \n        // Use the sync expression resolver to find artifacts that match the expression\n        const matchingArtifacts = resourceArtifacts.filter(artifact => \n          this.syncExpressionResolver.isUserInExpression(artifact.id, expression, groups)\n        );\n        \n        this.groupMembers = matchingArtifacts;\n        \n        // Build tree structure\n        const membersNode: MemberNode = {\n          id: 'members_root',\n          name: 'Member Resources',\n          type: 'root',\n          children: matchingArtifacts.map(artifact => ({\n            id: artifact.id,\n            name: artifact.name,\n            type: 'artifact',\n            metadata: {\n              category: artifact.application,\n              description: artifact.description\n            }\n          }))\n        };\n        \n        this.memberTreeData = [membersNode];\n        this.dataSource.data = this.memberTreeData;\n        this.loadingMembers = false;\n        \n        // Auto-expand the root node\n        if (this.treeControl.dataNodes?.length > 0) {\n          const rootNode = this.treeControl.dataNodes[0];\n          this.treeControl.expand(rootNode);\n        }\n      });\n    });\n  }\n  \n  loadParentGroups(): void {\n    if (!this.data.artifact || !this.data.artifact.id) {\n      this.parentGroupsTreeData = [];\n      this.dataSource.data = [];\n      return;\n    }\n    \n    this.loadingParentGroups = true;\n    \n    this.artifactService.getGroupsForArtifact(this.data.artifact.id).subscribe(groups => {\n      this.parentGroups = groups;\n      \n      if (groups.length > 0) {\n        // Build tree structure for parent groups\n        const parentGroupsNode: MemberNode = {\n          id: 'parent_groups_root',\n          name: 'Parent Groups',\n          type: 'root',\n          children: groups.map(group => ({\n            id: group.id,\n            name: group.name,\n            type: 'artifactGroup',\n            metadata: {\n              description: group.description,\n              expression: group.expression,\n              status: group.status\n            }\n          }))\n        };\n        \n        this.parentGroupsTreeData = [parentGroupsNode];\n        this.dataSource.data = this.parentGroupsTreeData;\n        \n        // Auto-expand the root node\n        if (this.treeControl.dataNodes?.length > 0) {\n          const rootNode = this.treeControl.dataNodes[0];\n          this.treeControl.expand(rootNode);\n        }\n      } else {\n        this.parentGroupsTreeData = [];\n        this.dataSource.data = [];\n      }\n      \n      this.loadingParentGroups = false;\n    }, error => {\n      console.error('Error loading parent groups:', error);\n      this.parentGroupsTreeData = [];\n      this.dataSource.data = [];\n      this.loadingParentGroups = false;\n    });\n  }\n  \n  hasChild = (_: number, node: FlatMemberNode) => node.expandable;\n  \n  getNodeIcon(node: FlatMemberNode): string {\n    switch (node.type) {\n      case 'artifact':\n        return 'insert_chart';\n      case 'artifactGroup':\n        return 'folder';\n      case 'root':\n        return 'category';\n      default:\n        return 'circle';\n    }\n  }\n  \n  getNodeIconClass(node: FlatMemberNode): string {\n    switch (node.type) {\n      case 'artifact':\n        return 'artifact-node';\n      case 'artifactGroup':\n        return 'artifactGroup-node';\n      case 'root':\n        return 'root-node';\n      default:\n        return 'artifact-node';\n    }\n  }\n\n  onCancelClick(): void {\n    this.dialogRef.close();\n  }\n\n  private generateIdFromName(name: string): string {\n    if (!name || name.trim() === '') {\n      return `artifact_${Date.now()}`;\n    }\n    \n    // Create ID from name: lowercase, replace spaces/special chars with underscores\n    let baseId = name.trim().toLowerCase()\n      .replace(/[^a-zA-Z0-9_]/g, '_')  // Replace non-alphanumeric with underscore\n      .replace(/_+/g, '_')            // Replace multiple underscores with single\n      .replace(/^_|_$/g, '');         // Remove leading/trailing underscores\n    \n    // Add timestamp to ensure uniqueness\n    const timestamp = Date.now().toString().slice(-6);\n    return `${baseId}_${timestamp}`;\n  }\n\n  onSubmit(): void {\n    if (this.artifactForm.invalid) {\n      return;\n    }\n\n    // Use getRawValue() to get all values including disabled fields\n    const formValue = this.artifactForm.getRawValue();\n    \n    // Generate ID if creating new artifact\n    let artifactId = this.data.artifact?.id || '';\n    if (!this.data.isEdit || !artifactId) {\n      artifactId = this.generateIdFromName(formValue.name);\n    }\n    \n    const artifact: Artifact = {\n      id: artifactId,\n      name: formValue.name,\n      description: formValue.description || '',\n      type: formValue.type,\n      application: formValue.category,\n      expression: formValue.expression,\n      status: formValue.status,\n      permissions: this.data.artifact?.permissions || [],\n      artifactMetadata: this.getMetadataObject()\n    };\n\n    this.dialogRef.close(artifact);\n  }\n\n  isAdmin(): boolean {\n    return this.data.isAdmin === true;\n  }\n}","<div class=\"dialog-container\">\r\n  <h2 mat-dialog-title>{{ data.isEdit ? 'Edit' : 'Create' }} {{ data.isGroup ? 'Artifact Group' : 'Artifact' }}</h2>\r\n  \r\n  <div mat-dialog-content>\r\n    <form [formGroup]=\"artifactForm\">\r\n      <mat-tab-group (selectedTabChange)=\"onTabChange($event)\">\r\n        <mat-tab label=\"Details\">\r\n          <div class=\"tab-content\">\r\n            <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n              <mat-label>Name</mat-label>\r\n              <input matInput formControlName=\"name\" required>\r\n              <mat-error *ngIf=\"artifactForm.get('name')?.hasError('required')\">\r\n                Name is required\r\n              </mat-error>\r\n            </mat-form-field>\r\n            \r\n            <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n              <mat-label>Description</mat-label>\r\n              <textarea matInput formControlName=\"description\" rows=\"3\"></textarea>\r\n            </mat-form-field>\r\n            \r\n            <ng-container *ngIf=\"!data.isGroup\">\r\n              <!-- Admin users see dropdown selection -->\r\n              <ng-container *ngIf=\"isAdmin()\">\r\n                <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n                  <mat-label>Application</mat-label>\r\n                  <mat-select formControlName=\"category\" required>\r\n                    <mat-option *ngFor=\"let category of availableCategories\" [value]=\"category\">\r\n                      {{ category }}\r\n                    </mat-option>\r\n                  </mat-select>\r\n                  <mat-error *ngIf=\"artifactForm.get('category')?.hasError('required')\">\r\n                    Application is required\r\n                  </mat-error>\r\n                </mat-form-field>\r\n                \r\n                <div class=\"custom-category-row\">\r\n                  <button mat-stroked-button type=\"button\" color=\"primary\" (click)=\"toggleCustomCategory()\">\r\n                    <mat-icon>add</mat-icon> Custom Application\r\n                  </button>\r\n                </div>\r\n              </ng-container>\r\n              \r\n              <!-- Non-admin users see read-only field -->\r\n              <ng-container *ngIf=\"!isAdmin()\">\r\n                <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n                  <mat-label>Application</mat-label>\r\n                  <input matInput formControlName=\"category\" readonly>\r\n                  <mat-hint>Application is pre-set based on your access</mat-hint>\r\n                </mat-form-field>\r\n              </ng-container>\r\n              \r\n              <div *ngIf=\"showCustomCategoryField && isAdmin()\" class=\"custom-category-input\">\r\n                <mat-form-field appearance=\"outline\">\r\n                  <mat-label>Custom Application</mat-label>\r\n                  <input matInput [(ngModel)]=\"customCategory\" [ngModelOptions]=\"{standalone: true}\" \r\n                         placeholder=\"Enter application name (e.g. CRM System)\">\r\n                </mat-form-field>\r\n                <button mat-button color=\"primary\" (click)=\"addCustomCategory()\" [disabled]=\"!customCategory.trim()\">\r\n                  <mat-icon>add_circle</mat-icon> Add\r\n                </button>\r\n              </div>\r\n            </ng-container>\r\n\r\n            <!-- Metadata Editor -->\r\n            <div class=\"metadata-section\">\r\n              <h3>Metadata</h3>\r\n              <p class=\"metadata-hint\">Add custom key-value pairs for additional artifact properties</p>\r\n              \r\n              <!-- Existing Metadata Display -->\r\n              <div *ngIf=\"metadata.length > 0\" class=\"existing-metadata\">\r\n                <h4>Existing Metadata:</h4>\r\n                <div class=\"metadata-chips\">\r\n                  <mat-chip-listbox>\r\n                    <mat-chip-option *ngFor=\"let meta of metadata; let i = index\" class=\"metadata-chip\">\r\n                      <span class=\"metadata-key\">{{meta.key}}:</span>\r\n                      <span class=\"metadata-value\">{{meta.value}}</span>\r\n                      <button mat-icon-button class=\"chip-edit-btn\" (click)=\"editMetadata(i)\" [attr.aria-label]=\"'Edit ' + meta.key\">\r\n                        <mat-icon>edit</mat-icon>\r\n                      </button>\r\n                      <button mat-icon-button class=\"chip-delete-btn\" (click)=\"removeMetadata(i)\" [attr.aria-label]=\"'Delete ' + meta.key\">\r\n                        <mat-icon>close</mat-icon>\r\n                      </button>\r\n                    </mat-chip-option>\r\n                  </mat-chip-listbox>\r\n                </div>\r\n              </div>\r\n\r\n              <!-- Add New Metadata -->\r\n              <div class=\"add-metadata\">\r\n                <div class=\"metadata-input-row\">\r\n                  <mat-form-field appearance=\"outline\" class=\"metadata-key-field\">\r\n                    <mat-label>Key</mat-label>\r\n                    <input matInput [(ngModel)]=\"newMetadataKey\" placeholder=\"Enter key\" [ngModelOptions]=\"{standalone: true}\">\r\n                  </mat-form-field>\r\n                  \r\n                  <mat-form-field appearance=\"outline\" class=\"metadata-value-field\">\r\n                    <mat-label>Value</mat-label>\r\n                    <input matInput [(ngModel)]=\"newMetadataValue\" placeholder=\"Enter value\" [ngModelOptions]=\"{standalone: true}\">\r\n                  </mat-form-field>\r\n                  \r\n                  <button mat-icon-button color=\"primary\" (click)=\"addMetadata()\" \r\n                          [disabled]=\"!newMetadataKey.trim() || !newMetadataValue.trim()\"\r\n                          class=\"add-metadata-btn\">\r\n                    <mat-icon>add</mat-icon>\r\n                  </button>\r\n                </div>\r\n              </div>\r\n            </div>\r\n            \r\n            <ng-container *ngIf=\"data.isGroup\">\r\n              <app-expression-input\r\n                formControlName=\"expression\"\r\n                label=\"Expression\"\r\n                placeholder=\"Enter resource expression\"\r\n                hint=\"Example: artifact1+artifact2\"\r\n                type=\"resource\">\r\n              </app-expression-input>\r\n            </ng-container>\r\n\r\n            <div class=\"status-toggle\">\r\n              <label>Status: </label>\r\n              <mat-slide-toggle formControlName=\"status\" [checked]=\"artifactForm.get('status')?.value === 'Active'\" \r\n                (change)=\"artifactForm.get('status')?.setValue($event.checked ? 'Active' : 'Inactive')\">\r\n                {{ artifactForm.get('status')?.value }}\r\n              </mat-slide-toggle>\r\n            </div>\r\n          </div>\r\n        </mat-tab>\r\n        \r\n        <mat-tab label=\"Permissions\" [disabled]=\"!data.isEdit\">\r\n          <div class=\"tab-content permissions-tab\">\r\n            <!-- Loading state -->\r\n            <div *ngIf=\"loadingPermissions\" class=\"loading-container\">\r\n              <mat-spinner diameter=\"40\"></mat-spinner>\r\n              <p>Loading permissions...</p>\r\n            </div>\r\n            \r\n            <!-- Empty state -->\r\n            <div *ngIf=\"!loadingPermissions && artifactPermissions.length === 0\" class=\"empty-state\">\r\n              <mat-icon>security</mat-icon>\r\n              <p>No users have access to this {{ data.isGroup ? 'artifact group' : 'artifact' }}</p>\r\n              <p class=\"hint-text\">No access rules have been defined for this {{ data.isGroup ? 'artifact group' : 'artifact' }}</p>\r\n            </div>\r\n            \r\n            <!-- Permissions list -->\r\n            <div *ngIf=\"!loadingPermissions && artifactPermissions.length > 0\" class=\"permissions-list\">\r\n              <h3>Users with access to this {{ data.isGroup ? 'artifact group' : 'artifact' }}:</h3>\r\n              \r\n              <table class=\"permissions-table\">\r\n                <thead>\r\n                  <tr>\r\n                    <th>User ID</th>\r\n                    <th>Permissions</th>\r\n                  </tr>\r\n                </thead>\r\n                <tbody>\r\n                  <tr *ngFor=\"let item of artifactPermissions\">\r\n                    <td>{{ item.userName }}</td>\r\n                    <td>\r\n                      <div class=\"permission-badges\">\r\n                        <span class=\"permission-badge\" *ngFor=\"let perm of item.permissions\">{{ perm }}</span>\r\n                      </div>\r\n                    </td>\r\n                  </tr>\r\n                </tbody>\r\n              </table>\r\n            </div>\r\n          </div>\r\n        </mat-tab>\r\n        \r\n        <mat-tab label=\"Hierarchy\" [disabled]=\"!data.isEdit\">\r\n          <div class=\"tab-content hierarchy-tab\">\r\n            <div *ngIf=\"data.isGroup\">\r\n              <div *ngIf=\"loadingMembers\" class=\"loading-container\">\r\n                <mat-spinner diameter=\"40\"></mat-spinner>\r\n                <p>Loading member resources...</p>\r\n              </div>\r\n              \r\n              <div *ngIf=\"!loadingMembers && (!dataSource.data || dataSource.data.length === 0)\" class=\"empty-state\">\r\n                <mat-icon>category</mat-icon>\r\n                <p>No member resources found in this group</p>\r\n                <p class=\"hint-text\">Members are determined based on the group expression</p>\r\n              </div>\r\n              \r\n              <div *ngIf=\"!loadingMembers && groupMembers.length > 0\" class=\"members-summary\">\r\n                <p><strong>{{ groupMembers.length }}</strong> resources are members of this group</p>\r\n              </div>\r\n              \r\n              <mat-tree *ngIf=\"!loadingMembers && dataSource.data && dataSource.data.length > 0\"\r\n                      [dataSource]=\"dataSource\" \r\n                      [treeControl]=\"treeControl\" \r\n                      class=\"members-tree\">\r\n                <!-- Tree node template for leaf nodes -->\r\n                <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding>\r\n                  <div class=\"node-container\">\r\n                    <div class=\"icon-container\" [ngClass]=\"getNodeIconClass(node)\">\r\n                      <mat-icon>{{ getNodeIcon(node) }}</mat-icon>\r\n                    </div>\r\n                    <span class=\"node-name\">{{ node.name }}</span>\r\n                    <span *ngIf=\"node.metadata?.category\" class=\"node-category\">{{ node.metadata.category }}</span>\r\n                  </div>\r\n                </mat-tree-node>\r\n                \r\n                <!-- Tree node template for expandable nodes -->\r\n                <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding>\r\n                  <div class=\"node-container\">\r\n                    <button mat-icon-button matTreeNodeToggle\r\n                            [attr.aria-label]=\"'Toggle ' + node.name\">\r\n                      <mat-icon>{{ treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}</mat-icon>\r\n                    </button>\r\n                    <div class=\"icon-container\" [ngClass]=\"getNodeIconClass(node)\">\r\n                      <mat-icon>{{ getNodeIcon(node) }}</mat-icon>\r\n                    </div>\r\n                    <span class=\"node-name\">{{ node.name }}</span>\r\n                    <span class=\"member-count\" *ngIf=\"node.type === 'root'\">({{ groupMembers.length }})</span>\r\n                  </div>\r\n                </mat-tree-node>\r\n              </mat-tree>\r\n            </div>\r\n            \r\n            <!-- For non-group artifacts, show parent groups -->\r\n            <div *ngIf=\"!data.isGroup\">\r\n              <div *ngIf=\"loadingParentGroups\" class=\"loading-container\">\r\n                <mat-spinner diameter=\"40\"></mat-spinner>\r\n                <p>Loading parent groups...</p>\r\n              </div>\r\n              \r\n              <div *ngIf=\"!loadingParentGroups && (!dataSource.data || dataSource.data.length === 0)\" class=\"empty-state\">\r\n                <mat-icon>account_tree</mat-icon>\r\n                <p>This artifact is not a member of any groups</p>\r\n                <p class=\"hint-text\">Groups can include this artifact through their expressions</p>\r\n              </div>\r\n              \r\n              <div *ngIf=\"!loadingParentGroups && parentGroups.length > 0\" class=\"members-summary\">\r\n                <p><strong>{{ parentGroups.length }}</strong> parent group{{ parentGroups.length > 1 ? 's' : '' }}</p>\r\n              </div>\r\n              \r\n              <mat-tree *ngIf=\"!loadingParentGroups && dataSource.data && dataSource.data.length > 0\"\r\n                      [dataSource]=\"dataSource\" \r\n                      [treeControl]=\"treeControl\" \r\n                      class=\"members-tree\">\r\n                <!-- Tree node template for leaf nodes -->\r\n                <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding>\r\n                  <div class=\"node-container\">\r\n                    <div class=\"icon-container\" [ngClass]=\"getNodeIconClass(node)\">\r\n                      <mat-icon>{{ getNodeIcon(node) }}</mat-icon>\r\n                    </div>\r\n                    <span class=\"node-name\">{{ node.name }}</span>\r\n                    <span *ngIf=\"node.metadata?.description\" class=\"node-category\">{{ node.metadata.description }}</span>\r\n                  </div>\r\n                </mat-tree-node>\r\n                \r\n                <!-- Tree node template for expandable nodes -->\r\n                <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding>\r\n                  <div class=\"node-container\">\r\n                    <button mat-icon-button matTreeNodeToggle\r\n                            [attr.aria-label]=\"'Toggle ' + node.name\">\r\n                      <mat-icon>{{ treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}</mat-icon>\r\n                    </button>\r\n                    <div class=\"icon-container\" [ngClass]=\"getNodeIconClass(node)\">\r\n                      <mat-icon>{{ getNodeIcon(node) }}</mat-icon>\r\n                    </div>\r\n                    <span class=\"node-name\">{{ node.name }}</span>\r\n                    <span class=\"member-count\" *ngIf=\"node.type === 'root'\">({{ parentGroups.length }})</span>\r\n                  </div>\r\n                </mat-tree-node>\r\n              </mat-tree>\r\n            </div>\r\n            \r\n            <!-- Show this if in create mode -->\r\n            <div class=\"membership-message\" *ngIf=\"!data.isEdit\">\r\n              <p>Hierarchy is available after saving the {{ data.isGroup ? 'artifact group' : 'artifact' }}.</p>\r\n            </div>\r\n          </div>\r\n        </mat-tab>\r\n      </mat-tab-group>\r\n    </form>\r\n  </div>\r\n  \r\n  <div mat-dialog-actions class=\"dialog-actions\">\r\n    <button mat-button (click)=\"onCancelClick()\">Cancel</button>\r\n    <button mat-flat-button color=\"primary\" (click)=\"onSubmit()\" [disabled]=\"artifactForm.invalid\">\r\n      {{ data.isEdit ? 'Update' : 'Create' }}\r\n    </button>\r\n  </div>\r\n</div>","import { Component, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatTreeModule, MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree';\nimport { FlatTreeControl } from '@angular/cdk/tree';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { FormsModule } from '@angular/forms';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { GroupService } from '../../services/group.service';\nimport { ExpressionParserService } from '../../services/expression-parser.service';\nimport { SyncExpressionResolverService } from '../../services/sync-expression-resolver.service';\nimport { UserGroup } from '../../models/group.model';\n\ninterface GroupNode {\n  name: string;\n  description?: string;\n  id: string;\n  level: number;\n  expandable: boolean;\n  children?: GroupNode[];\n  memberCount?: number;\n  status: 'Active' | 'Inactive';\n}\n\ninterface FlatNode {\n  expandable: boolean;\n  name: string;\n  description?: string;\n  level: number;\n  id: string;\n  memberCount?: number;\n  status: 'Active' | 'Inactive';\n}\n\n@Component({\n  selector: 'app-group-hierarchy',\n  standalone: true,\n  imports: [\n    CommonModule,\n    MatTreeModule,\n    MatIconModule,\n    MatButtonModule,\n    MatInputModule,\n    MatFormFieldModule,\n    MatChipsModule,\n    FormsModule,\n    MatProgressSpinnerModule\n  ],\n  templateUrl: './group-hierarchy.component.html',\n  styleUrls: ['./group-hierarchy.component.scss']\n})\nexport class GroupHierarchyComponent implements OnInit {\n  private transformer = (node: GroupNode, level: number): FlatNode => {\n    return {\n      expandable: !!node.children && node.children.length > 0,\n      name: node.name,\n      description: node.description,\n      level: level,\n      id: node.id,\n      memberCount: node.memberCount,\n      status: node.status\n    };\n  };\n\n  treeControl = new FlatTreeControl<FlatNode>(\n    node => node.level,\n    node => node.expandable\n  );\n\n  treeFlattener = new MatTreeFlattener(\n    this.transformer,\n    node => node.level,\n    node => node.expandable,\n    node => node.children\n  );\n\n  dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);\n  searchQuery: string = '';\n  originalData: GroupNode[] = [];\n  isLoading: boolean = false;\n  hasError: boolean = false;\n  errorMessage: string = '';\n\n  constructor(\n    private groupService: GroupService,\n    private expressionParser: ExpressionParserService\n  ) {}\n\n  ngOnInit(): void {\n    this.generateGroupHierarchy();\n  }\n\n  generateGroupHierarchy(): void {\n    this.isLoading = true;\n    this.hasError = false;\n    \n    this.groupService.getGroups().subscribe({\n      next: (groups) => {\n        this.buildHierarchy(groups).then(groupHierarchy => {\n          this.originalData = groupHierarchy;\n          this.dataSource.data = groupHierarchy;\n          \n          // Expand the first level by default\n          if (this.treeControl.dataNodes && this.treeControl.dataNodes.length > 0) {\n            this.treeControl.expand(this.treeControl.dataNodes[0]);\n          }\n          this.isLoading = false;\n        });\n      },\n      error: (error) => {\n        console.error('Error fetching groups:', error);\n        this.hasError = true;\n        this.errorMessage = 'Failed to load groups. Please try again.';\n        this.isLoading = false;\n      }\n    });\n  }\n\n  async buildHierarchy(groups: UserGroup[]): Promise<GroupNode[]> {\n    if (!groups || groups.length === 0) {\n      return [];\n    }\n    \n    // First, identify parent-child relationships based on expressions\n    const groupRelations = new Map<string, Set<string>>();\n    \n    // For each group, check if it includes other groups in its expression\n    for (const group of groups) {\n      if (!group.expression) continue;\n      \n      // Parse the expression to find included groups\n      const operations = this.expressionParser.parseExpression(group.expression);\n      \n      // Find group references in the expression\n      const includedGroups = operations\n        .filter(op => op.type === 'include')\n        .map(op => op.entity)\n        .filter(entityId => groups.some(g => g.id === entityId));\n      \n      // Store the relationship (this group includes these other groups)\n      if (includedGroups.length > 0) {\n        if (!groupRelations.has(group.id)) {\n          groupRelations.set(group.id, new Set<string>());\n        }\n        includedGroups.forEach(childId => {\n          groupRelations.get(group.id)?.add(childId);\n        });\n      }\n    }\n    \n    // Find top-level groups (not included in any other group's expression)\n    const childGroups = new Set<string>();\n    groupRelations.forEach((children, _) => {\n      children.forEach(child => childGroups.add(child));\n    });\n    \n    const topLevelGroups = groups.filter(group => !childGroups.has(group.id));\n    \n    // Build the hierarchy recursively\n    const buildNode = (group: UserGroup, level: number): GroupNode => {\n      // Get child groups based on the relationships map\n      const childGroupIds = groupRelations.get(group.id) || new Set<string>();\n      const childGroups = groups.filter(g => childGroupIds.has(g.id));\n      \n      // Recursively build child nodes\n      const children = childGroups.map(childGroup => buildNode(childGroup, level + 1));\n      \n      return {\n        name: group.name,\n        description: group.description,\n        id: group.id,\n        level: level,\n        expandable: children.length > 0,\n        children: children.length > 0 ? children : undefined,\n        memberCount: group.memberCount,\n        status: group.status\n      };\n    };\n    \n    // Create hierarchy for each top-level group\n    return topLevelGroups.map(group => buildNode(group, 0));\n  }\n\n  hasChild = (_: number, node: FlatNode) => node.expandable;\n\n  getStatusClass(status: string): string {\n    return status === 'Active' ? 'status-active' : 'status-inactive';\n  }\n\n  applyFilter(event: Event): void {\n    const filterValue = (event.target as HTMLInputElement).value.toLowerCase();\n    \n    if (!filterValue) {\n      this.dataSource.data = this.originalData;\n      return;\n    }\n    \n    // Helper function to filter nodes\n    const filterNode = (node: GroupNode): GroupNode | null => {\n      const nameMatch = node.name.toLowerCase().includes(filterValue);\n      const descMatch = node.description?.toLowerCase().includes(filterValue) || false;\n      \n      if (nameMatch || descMatch) {\n        return {...node, children: node.children}; // Return the node if it matches\n      }\n      \n      // If node doesn't match, check its children\n      if (node.children) {\n        const filteredChildren = node.children\n          .map(child => filterNode(child))\n          .filter((child): child is GroupNode => child !== null);\n        \n        if (filteredChildren.length > 0) {\n          return {...node, children: filteredChildren};\n        }\n      }\n      \n      return null; // No match found in this branch\n    };\n    \n    const filteredData = this.originalData\n      .map(node => filterNode(node))\n      .filter(node => node !== null) as GroupNode[];\n    \n    this.dataSource.data = filteredData;\n    \n    // Expand all nodes if filtering\n    if (filterValue && this.treeControl.dataNodes) {\n      this.treeControl.expandAll();\n    }\n  }\n}","<div class=\"hierarchy-container\">\r\n  <div class=\"header\">\r\n    <h1>Group Hierarchy</h1>\r\n    <div class=\"actions\">\r\n      <button mat-flat-button color=\"primary\" class=\"add-button\">\r\n        <mat-icon>add</mat-icon> Add Group\r\n      </button>\r\n    </div>\r\n  </div>\r\n\r\n  <div class=\"content-container\">\r\n    <div class=\"search-container\">\r\n      <div class=\"search-field\">\r\n        <mat-icon>search</mat-icon>\r\n        <input placeholder=\"Search groups...\" [(ngModel)]=\"searchQuery\" (keyup)=\"applyFilter($event)\">\r\n      </div>\r\n      <div class=\"view-controls\">\r\n        <button mat-icon-button [disabled]=\"isLoading\" (click)=\"generateGroupHierarchy()\">\r\n          <mat-icon>refresh</mat-icon>\r\n        </button>\r\n      </div>\r\n    </div>\r\n\r\n    <div class=\"loading-container\" *ngIf=\"isLoading\">\r\n      <mat-spinner diameter=\"40\"></mat-spinner>\r\n      <p>Loading group hierarchy...</p>\r\n    </div>\r\n\r\n    <div class=\"error-container\" *ngIf=\"hasError\">\r\n      <mat-icon color=\"warn\">error</mat-icon>\r\n      <p>{{ errorMessage }}</p>\r\n      <button mat-raised-button color=\"primary\" (click)=\"generateGroupHierarchy()\">\r\n        Retry\r\n      </button>\r\n    </div>\r\n\r\n    <div class=\"tree-container\" *ngIf=\"!isLoading && !hasError\">\r\n      <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\r\n        <!-- Leaf node -->\r\n        <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding [style.padding-left]=\"node.level * 20 + 'px'\">\r\n          <div class=\"tree-node leaf-node\">\r\n            <div class=\"node-icon\">\r\n              <mat-icon>group</mat-icon>\r\n            </div>\r\n            <div class=\"node-content\">\r\n              <div class=\"node-name\">{{node.name}}</div>\r\n              <div class=\"node-description\" *ngIf=\"node.description\">{{node.description}}</div>\r\n            </div>\r\n            <div class=\"node-status\">\r\n              <span class=\"status-badge\" [ngClass]=\"getStatusClass(node.status)\">{{node.status}}</span>\r\n            </div>\r\n            <div class=\"node-actions\">\r\n              <button mat-icon-button>\r\n                <mat-icon>more_vert</mat-icon>\r\n              </button>\r\n            </div>\r\n          </div>\r\n        </mat-tree-node>\r\n        \r\n        <!-- Expandable node -->\r\n        <mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChild\">\r\n          <div class=\"tree-node expandable-node\" [class.expanded]=\"treeControl.isExpanded(node)\">\r\n            <div class=\"node-toggle\">\r\n              <button mat-icon-button matTreeNodeToggle>\r\n                <mat-icon>\r\n                  {{treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}\r\n                </mat-icon>\r\n              </button>\r\n            </div>\r\n            <div class=\"node-icon\">\r\n              <mat-icon>folder</mat-icon>\r\n            </div>\r\n            <div class=\"node-content\">\r\n              <div class=\"node-name\">{{node.name}}</div>\r\n              <div class=\"node-description\" *ngIf=\"node.description\">{{node.description}}</div>\r\n            </div>\r\n            <div class=\"node-count\" *ngIf=\"node.memberCount\">\r\n              {{node.memberCount}} members\r\n            </div>\r\n            <div class=\"node-status\">\r\n              <span class=\"status-badge\" [ngClass]=\"getStatusClass(node.status)\">{{node.status}}</span>\r\n            </div>\r\n            <div class=\"node-actions\">\r\n              <button mat-icon-button>\r\n                <mat-icon>more_vert</mat-icon>\r\n              </button>\r\n            </div>\r\n          </div>\r\n          \r\n          <div class=\"nested-tree-node\" [class.hidden]=\"!treeControl.isExpanded(node)\">\r\n            <ng-container matTreeNodeOutlet></ng-container>\r\n          </div>\r\n        </mat-nested-tree-node>\r\n      </mat-tree>\r\n    </div>\r\n  </div>\r\n</div>","import { Component, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatTreeModule, MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree';\nimport { FlatTreeControl } from '@angular/cdk/tree';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { FormsModule } from '@angular/forms';\nimport { UserService } from '../../services/user.service';\nimport { ExpressionParserService } from '../../services/expression-parser.service';\nimport { User } from '../../models/user.model';\n\ninterface OrgNode {\n  name: string;\n  position?: string;\n  id: string;\n  level: number;\n  expandable: boolean;\n  children?: OrgNode[];\n  userCount?: number;\n}\n\ninterface FlatNode {\n  expandable: boolean;\n  name: string;\n  position?: string;\n  level: number;\n  id: string;\n  userCount?: number;\n}\n\n@Component({\n  selector: 'app-organization-hierarchy',\n  standalone: true,\n  imports: [\n    CommonModule,\n    MatTreeModule,\n    MatIconModule,\n    MatButtonModule,\n    MatInputModule,\n    MatFormFieldModule,\n    MatProgressSpinnerModule,\n    FormsModule\n  ],\n  templateUrl: './organization-hierarchy.component.html',\n  styleUrls: ['./organization-hierarchy.component.scss']\n})\nexport class OrganizationHierarchyComponent implements OnInit {\n  private transformer = (node: OrgNode, level: number): FlatNode => {\n    return {\n      expandable: !!node.children && node.children.length > 0,\n      name: node.name,\n      position: node.position,\n      level: level,\n      id: node.id,\n      userCount: node.userCount\n    };\n  };\n\n  treeControl = new FlatTreeControl<FlatNode>(\n    node => node.level,\n    node => node.expandable\n  );\n\n  treeFlattener = new MatTreeFlattener(\n    this.transformer,\n    node => node.level,\n    node => node.expandable,\n    node => node.children\n  );\n\n  dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);\n  searchQuery: string = '';\n  originalData: OrgNode[] = [];\n  isLoading: boolean = false;\n  hasError: boolean = false;\n  errorMessage: string = '';\n\n  constructor(\n    private userService: UserService,\n    private expressionParser: ExpressionParserService\n  ) {}\n\n  ngOnInit(): void {\n    this.generateOrgHierarchy();\n  }\n\n  generateOrgHierarchy(): void {\n    this.isLoading = true;\n    this.hasError = false;\n    \n    this.userService.getUsers().subscribe({\n      next: (users) => {\n        this.buildHierarchy(users).then(orgHierarchy => {\n          this.originalData = orgHierarchy;\n          this.dataSource.data = orgHierarchy;\n          \n          // Expand the first level by default\n          if (this.treeControl.dataNodes && this.treeControl.dataNodes.length > 0) {\n            this.treeControl.expand(this.treeControl.dataNodes[0]);\n          }\n          this.isLoading = false;\n        });\n      },\n      error: (error) => {\n        console.error('Error fetching users:', error);\n        this.hasError = true;\n        this.errorMessage = 'Failed to load organization hierarchy. Please try again.';\n        this.isLoading = false;\n      }\n    });\n  }\n\n  async buildHierarchy(users: User[]): Promise<OrgNode[]> {\n    if (!users || users.length === 0) {\n      return [];\n    }\n    \n    // Find users with manager_id to build the reporting structure\n    const managerToReportsMap = new Map<string, User[]>();\n    \n    // Group users by their manager_id\n    for (const user of users) {\n      if (user.manager_id) {\n        if (!managerToReportsMap.has(user.manager_id)) {\n          managerToReportsMap.set(user.manager_id, []);\n        }\n        managerToReportsMap.get(user.manager_id)?.push(user);\n      }\n    }\n    \n    // Find top-level users (those without a manager)\n    const topLevelUsers = users.filter(user => !user.manager_id || user.manager_id === '');\n    \n    // Create the hierarchy recursively\n    const buildNode = (user: User, level: number): OrgNode => {\n      // Find direct reports using the map\n      const directReports = managerToReportsMap.get(user.id) || [];\n      \n      // Recursively build nodes for each direct report\n      const children = directReports.map(report => buildNode(report, level + 1));\n      \n      return {\n        name: user.name || `${user.first_name || ''} ${user.last_name || ''}`.trim() || user.id,\n        position: user.role,\n        id: user.id,\n        level: level,\n        expandable: children.length > 0,\n        children: children.length > 0 ? children : undefined,\n        userCount: children.length\n      };\n    };\n    \n    // Create hierarchy for each top-level user\n    return topLevelUsers.map(user => buildNode(user, 0));\n  }\n\n  hasChild = (_: number, node: FlatNode) => node.expandable;\n\n  applyFilter(event: Event): void {\n    const filterValue = (event.target as HTMLInputElement).value.toLowerCase();\n    \n    if (!filterValue) {\n      this.dataSource.data = this.originalData;\n      return;\n    }\n    \n    // Helper function to filter nodes\n    const filterNode = (node: OrgNode): OrgNode | null => {\n      const nameMatch = node.name.toLowerCase().includes(filterValue);\n      const positionMatch = node.position?.toLowerCase().includes(filterValue) || false;\n      \n      if (nameMatch || positionMatch) {\n        return {...node, children: node.children}; // Return the node if it matches\n      }\n      \n      // If node doesn't match, check its children\n      if (node.children) {\n        const filteredChildren = node.children\n          .map(child => filterNode(child))\n          .filter((child): child is OrgNode => child !== null);\n        \n        if (filteredChildren.length > 0) {\n          return {...node, children: filteredChildren};\n        }\n      }\n      \n      return null; // No match found in this branch\n    };\n    \n    const filteredData = this.originalData\n      .map(node => filterNode(node))\n      .filter(node => node !== null) as OrgNode[];\n    \n    this.dataSource.data = filteredData;\n    \n    // Expand all nodes if filtering\n    if (filterValue && this.treeControl.dataNodes) {\n      this.treeControl.expandAll();\n    }\n  }\n}","<div class=\"hierarchy-container\">\r\n  <div class=\"header\">\r\n    <h1>Organization Hierarchy</h1>\r\n    <div class=\"actions\">\r\n      <button mat-flat-button color=\"primary\" class=\"add-button\">\r\n        <mat-icon>add</mat-icon> Add Department\r\n      </button>\r\n    </div>\r\n  </div>\r\n\r\n  <div class=\"content-container\">\r\n    <div class=\"search-container\">\r\n      <div class=\"search-field\">\r\n        <mat-icon>search</mat-icon>\r\n        <input placeholder=\"Search organization...\" [(ngModel)]=\"searchQuery\" (keyup)=\"applyFilter($event)\">\r\n      </div>\r\n      <div class=\"view-controls\">\r\n        <button mat-icon-button [disabled]=\"isLoading\" (click)=\"generateOrgHierarchy()\">\r\n          <mat-icon>refresh</mat-icon>\r\n        </button>\r\n      </div>\r\n    </div>\r\n\r\n    <div class=\"loading-container\" *ngIf=\"isLoading\">\r\n      <mat-spinner diameter=\"40\"></mat-spinner>\r\n      <p>Loading organization hierarchy...</p>\r\n    </div>\r\n\r\n    <div class=\"error-container\" *ngIf=\"hasError\">\r\n      <mat-icon color=\"warn\">error</mat-icon>\r\n      <p>{{ errorMessage }}</p>\r\n      <button mat-raised-button color=\"primary\" (click)=\"generateOrgHierarchy()\">\r\n        Retry\r\n      </button>\r\n    </div>\r\n\r\n    <div class=\"tree-container\" *ngIf=\"!isLoading && !hasError\">\r\n      <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\r\n        <!-- Leaf node -->\r\n        <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding [style.padding-left]=\"node.level * 20 + 'px'\">\r\n          <div class=\"tree-node leaf-node\">\r\n            <div class=\"node-icon\">\r\n              <mat-icon>person</mat-icon>\r\n            </div>\r\n            <div class=\"node-content\">\r\n              <div class=\"node-name\">{{node.name}}</div>\r\n              <div class=\"node-position\" *ngIf=\"node.position\">{{node.position}}</div>\r\n            </div>\r\n            <div class=\"node-actions\">\r\n              <button mat-icon-button>\r\n                <mat-icon>more_vert</mat-icon>\r\n              </button>\r\n            </div>\r\n          </div>\r\n        </mat-tree-node>\r\n        \r\n        <!-- Expandable node -->\r\n        <mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChild\">\r\n          <div class=\"tree-node expandable-node\" [class.expanded]=\"treeControl.isExpanded(node)\">\r\n            <div class=\"node-toggle\">\r\n              <button mat-icon-button matTreeNodeToggle>\r\n                <mat-icon>\r\n                  {{treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}\r\n                </mat-icon>\r\n              </button>\r\n            </div>\r\n            <div class=\"node-icon\">\r\n              <mat-icon>supervisor_account</mat-icon>\r\n            </div>\r\n            <div class=\"node-content\">\r\n              <div class=\"node-name\">{{node.name}}</div>\r\n              <div class=\"node-position\" *ngIf=\"node.position\">{{node.position}}</div>\r\n            </div>\r\n            <div class=\"node-count\" *ngIf=\"node.userCount\">\r\n              {{node.userCount}} members\r\n            </div>\r\n            <div class=\"node-actions\">\r\n              <button mat-icon-button>\r\n                <mat-icon>more_vert</mat-icon>\r\n              </button>\r\n            </div>\r\n          </div>\r\n          \r\n          <div class=\"nested-tree-node\" [class.hidden]=\"!treeControl.isExpanded(node)\">\r\n            <ng-container matTreeNodeOutlet></ng-container>\r\n          </div>\r\n        </mat-nested-tree-node>\r\n      </mat-tree>\r\n    </div>\r\n  </div>\r\n</div>","import { Component, Inject, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { ExpressionInputComponent } from '../expression-input/expression-input.component';\r\nimport { FormsModule, ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\r\nimport { UserGroup } from '../../models/group.model';\r\nimport { UserService } from '../../services/user.service';\r\nimport { User } from '../../models/user.model';\r\nimport { GroupService } from '../../services/group.service';\r\nimport { AccessRuleService } from '../../services/access-rule.service';\r\nimport { Observable, map, of } from 'rxjs';\r\nimport { ExpressionParserService } from '../../services/expression-parser.service';\r\nimport { SyncExpressionResolverService } from '../../services/sync-expression-resolver.service';\r\nimport { MatTreeModule, MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree';\r\nimport { FlatTreeControl } from '@angular/cdk/tree';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\n\r\n// Interfaces for tree view\r\ninterface MemberNode {\r\n  id: string;\r\n  name: string;\r\n  type: string;\r\n  children?: MemberNode[];\r\n  metadata?: any;\r\n}\r\n\r\ninterface FlatMemberNode {\r\n  expandable: boolean;\r\n  name: string;\r\n  level: number;\r\n  id: string;\r\n  type: string;\r\n  metadata?: any;\r\n}\r\n\r\n@Component({\r\n  selector: 'app-user-group-dialog',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    MatDialogModule,\r\n    MatButtonModule,\r\n    MatFormFieldModule,\r\n    MatInputModule,\r\n    MatSelectModule,\r\n    MatCheckboxModule,\r\n    MatIconModule,\r\n    MatSlideToggleModule,\r\n    MatTabsModule,\r\n    FormsModule,\r\n    ReactiveFormsModule,\r\n    ExpressionInputComponent,\r\n    MatTreeModule,\r\n    MatProgressSpinnerModule\r\n  ],\r\n  templateUrl: './user-group-dialog.component.html',\r\n  styleUrls: ['./user-group-dialog.component.scss']\r\n})\r\nexport class UserGroupDialogComponent implements OnInit {\r\n  \r\n  groupForm!: FormGroup;\r\n  users: User[] = [];\r\n  parentGroups: UserGroup[] = [];\r\n  selectedTabIndex = 0;\r\n  \r\n  // Members tree view properties\r\n  loadingMembers = false;\r\n  groupMembers: User[] = [];\r\n  memberTreeData: MemberNode[] = [];\r\n  \r\n  // Permissions properties\r\n  groupPermissions: {artifactId: string, artifactName: string, permissions: string[]}[] = [];\r\n  loadingPermissions = false;\r\n  \r\n  // Tree control for members view\r\n  private _transformer = (node: MemberNode, level: number): FlatMemberNode => {\r\n    return {\r\n      expandable: !!node.children && node.children.length > 0,\r\n      name: node.name,\r\n      level: level,\r\n      id: node.id,\r\n      type: node.type,\r\n      metadata: node.metadata\r\n    };\r\n  };\r\n\r\n  treeControl = new FlatTreeControl<FlatMemberNode>(\r\n    node => node.level,\r\n    node => node.expandable\r\n  );\r\n\r\n  treeFlattener = new MatTreeFlattener(\r\n    this._transformer,\r\n    node => node.level,\r\n    node => node.expandable,\r\n    node => node.children\r\n  );\r\n\r\n  dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);\r\n\r\n  constructor(\r\n    private fb: FormBuilder,\r\n    private userService: UserService,\r\n    private groupService: GroupService,\r\n    private accessRuleService: AccessRuleService,\r\n    private expressionParser: ExpressionParserService,\r\n    private syncExpressionResolver: SyncExpressionResolverService,\r\n    public dialogRef: MatDialogRef<UserGroupDialogComponent>,\r\n    @Inject(MAT_DIALOG_DATA) public data: { group?: UserGroup, isEdit: boolean }\r\n  ) { }\r\n\r\n  ngOnInit(): void {\r\n    this.initializeForm();\r\n    this.loadUsers();\r\n    this.loadParentGroups();\r\n    \r\n    if (this.data.isEdit && this.data.group) {\r\n      this.populateForm(this.data.group);\r\n    }\r\n  }\r\n\r\n  initializeForm(): void {\r\n    this.groupForm = this.fb.group({\r\n      name: ['', [Validators.required]],\r\n      description: [''],\r\n      expression: [''],\r\n      parentGroup: [''],\r\n      owner: [''],\r\n      status: ['Active']\r\n    });\r\n  }\r\n\r\n  populateForm(group: UserGroup): void {\r\n    this.groupForm.patchValue({\r\n      name: group.name,\r\n      description: group.description || '',\r\n      expression: group.expression || '',\r\n      parentGroup: '', // Assuming we would look up the parent group ID\r\n      owner: '', // Assuming we would look up the owner ID\r\n      status: group.status\r\n    });\r\n  }\r\n\r\n  loadUsers(): void {\r\n    this.userService.getUsers().subscribe(users => {\r\n      this.users = users;\r\n    });\r\n  }\r\n\r\n  loadParentGroups(): void {\r\n    if (this.data.isEdit && this.data.group) {\r\n      // Filter out the current group to prevent circular references\r\n      this.groupService.getGroups().pipe(\r\n        map(groups => groups.filter(g => g.id !== this.data.group?.id))\r\n      ).subscribe(groups => {\r\n        this.parentGroups = groups;\r\n      });\r\n    } else {\r\n      this.groupService.getGroups().subscribe(groups => {\r\n        this.parentGroups = groups;\r\n      });\r\n    }\r\n  }\r\n\r\n  onTabChange(event: any): void {\r\n    // console.log('Tab changed to:', event.index, event);\r\n    this.selectedTabIndex = event.index;\r\n    \r\n    // Load group members when switching to the Members tab\r\n    if (this.data.isEdit && this.data.group && event.index === 1) {\r\n      this.loadGroupMembers();\r\n    }\r\n    \r\n    // Load permissions when switching to the Permissions tab\r\n    if (this.data.isEdit && this.data.group && event.index === 2) {\r\n      // console.log('Loading permissions for group:', this.data.group.id);\r\n      this.loadGroupPermissions();\r\n    }\r\n  }\r\n  \r\n  loadGroupMembers(): void {\r\n    if (!this.data.group || !this.data.group.expression) {\r\n      this.memberTreeData = [];\r\n      this.dataSource.data = [];\r\n      return;\r\n    }\r\n    \r\n    this.loadingMembers = true;\r\n    \r\n    // First, get all users\r\n    this.userService.getUsers().subscribe(users => {\r\n      // Get all groups to resolve nested expressions\r\n      this.groupService.getGroups().subscribe(groups => {\r\n        const expression = this.data.group?.expression || '';\r\n        \r\n        // Filter users that match the expression\r\n        const matchingUsers = users.filter(user => \r\n          this.syncExpressionResolver.isUserInExpression(user.id, expression, groups)\r\n        );\r\n        \r\n        this.groupMembers = matchingUsers;\r\n        \r\n        // Build tree structure\r\n        const membersNode: MemberNode = {\r\n          id: 'members_root',\r\n          name: 'Members',\r\n          type: 'root',\r\n          children: matchingUsers.map(user => ({\r\n            id: user.id,\r\n            name: this.getUserDisplayName(user),\r\n            type: 'user',\r\n            metadata: {\r\n              email: user.email,\r\n              department: user.department,\r\n              role: user.role\r\n            }\r\n          }))\r\n        };\r\n        \r\n        this.memberTreeData = [membersNode];\r\n        this.dataSource.data = this.memberTreeData;\r\n        this.loadingMembers = false;\r\n        \r\n        // Auto-expand the root node\r\n        if (this.treeControl.dataNodes?.length > 0) {\r\n          const rootNode = this.treeControl.dataNodes[0];\r\n          this.treeControl.expand(rootNode);\r\n        }\r\n      });\r\n    });\r\n  }\r\n  \r\n  loadGroupPermissions(): void {\r\n    // console.log('loadGroupPermissions called for group:', this.data.group);\r\n    if (!this.data.group || !this.data.group.id) {\r\n      console.error('Group data or ID is missing');\r\n      return;\r\n    }\r\n    this.loadingPermissions = true;\r\n    this.groupPermissions = [];\r\n    // console.log('Calling getUserGroupAccess for group ID:', this.data.group.id);\r\n    this.accessRuleService.getUserGroupAccess(this.data.group.id).subscribe({\r\n      next: (accessMap) => {\r\n        // console.log('Received access map:', accessMap);\r\n        \r\n        // Check if we got any data\r\n        if (Object.keys(accessMap).length === 0) {\r\n          // console.log('Access map is empty - no permissions found for this group');\r\n          this.loadingPermissions = false;\r\n          return;\r\n        }\r\n        \r\n        // Convert the map to an array of objects for display\r\n        this.groupPermissions = Object.entries(accessMap).map(([artifactId, permissions]) => {\r\n          return {\r\n            artifactId,\r\n            artifactName: artifactId, // We'll update this with actual names later if available\r\n            permissions\r\n          };\r\n        });\r\n        \r\n        // console.log('Processed permissions:', this.groupPermissions);\r\n        this.loadingPermissions = false;\r\n        \r\n        // If we have permissions, try to load artifact names\r\n        if (this.groupPermissions.length > 0) {\r\n          // Could add artifact name lookup here if needed\r\n        }\r\n      },\r\n      error: (error) => {\r\n        console.error('Error loading group permissions:', error);\r\n        this.loadingPermissions = false;\r\n      }\r\n    });\r\n  }\r\n\r\n  // Helper method to get user display name\r\n  getUserDisplayName(user: User): string {\r\n    if (user.name) {\r\n      return user.name;\r\n    }\r\n    \r\n    if (user.first_name || user.last_name) {\r\n      return `${user.first_name || ''} ${user.last_name || ''}`.trim();\r\n    }\r\n    \r\n    if (user.user_metadata?.name) {\r\n      return user.user_metadata.name as string;\r\n    }\r\n    \r\n    return user.id;\r\n  }\r\n  \r\n  hasChild = (_: number, node: FlatMemberNode) => node.expandable;\r\n  \r\n  getNodeIcon(node: FlatMemberNode): string {\r\n    switch (node.type) {\r\n      case 'user':\r\n        return 'person';\r\n      case 'root':\r\n        return 'people';\r\n      default:\r\n        return 'circle';\r\n    }\r\n  }\r\n  \r\n  getNodeIconClass(node: FlatMemberNode): string {\r\n    switch (node.type) {\r\n      case 'user':\r\n        return 'user-node';\r\n      case 'root':\r\n        return 'root-node';\r\n      default:\r\n        return 'user-node';\r\n    }\r\n  }\r\n\r\n  onCancelClick(): void {\r\n    this.dialogRef.close();\r\n  }\r\n\r\n  private generateIdFromName(name: string): string {\r\n    if (!name || name.trim() === '') {\r\n      return `group_${Date.now()}`;\r\n    }\r\n    \r\n    // Use the name directly as ID (just trim whitespace)\r\n    return name.trim();\r\n  }\r\n\r\n  onSubmit(): void {\r\n    if (this.groupForm.invalid) {\r\n      return;\r\n    }\r\n\r\n    const formValue = this.groupForm.value;\r\n    \r\n    // Generate ID if creating new group\r\n    let groupId = this.data.group?.id || '';\r\n    if (!this.data.isEdit || !groupId) {\r\n      groupId = this.generateIdFromName(formValue.name);\r\n    }\r\n\r\n    const group: UserGroup = {\r\n      id: groupId,\r\n      name: formValue.name || '',\r\n      description: formValue.description || '',\r\n      expression: formValue.expression || '',\r\n      memberCount: this.data.group?.memberCount || 0,\r\n      status: formValue.status\r\n    };\r\n\r\n    this.dialogRef.close(group);\r\n  }\r\n}","<div class=\"dialog-container\">\r\n  <h2 mat-dialog-title>{{ data.isEdit ? 'Edit' : 'Create' }} User Group</h2>\r\n  \r\n  <div mat-dialog-content>\r\n    <form [formGroup]=\"groupForm\">\r\n      <mat-tab-group (selectedTabChange)=\"onTabChange($event)\">\r\n        <mat-tab label=\"Details\">\r\n          <div class=\"tab-content\">\r\n            <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n              <mat-label>Group Name</mat-label>\r\n              <input matInput formControlName=\"name\" required>\r\n              <mat-error *ngIf=\"groupForm.get('name')?.hasError('required')\">\r\n                Name is required\r\n              </mat-error>\r\n            </mat-form-field>\r\n            \r\n            <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n              <mat-label>Description</mat-label>\r\n              <textarea matInput formControlName=\"description\" rows=\"3\"></textarea>\r\n            </mat-form-field>\r\n            \r\n            <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n              <mat-label>Parent Group</mat-label>\r\n              <mat-select formControlName=\"parentGroup\">\r\n                <mat-option [value]=\"\">None</mat-option>\r\n                <mat-option *ngFor=\"let group of parentGroups\" [value]=\"group.id\">\r\n                  {{ group.name }}\r\n                </mat-option>\r\n              </mat-select>\r\n            </mat-form-field>\r\n            \r\n            <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n              <mat-label>Owner</mat-label>\r\n              <mat-select formControlName=\"owner\">\r\n                <mat-option [value]=\"\">None</mat-option>\r\n                <mat-option *ngFor=\"let user of users\" [value]=\"user.id\">\r\n                  {{ user.name }}\r\n                </mat-option>\r\n              </mat-select>\r\n            </mat-form-field>\r\n            \r\n            <app-expression-input\r\n              formControlName=\"expression\"\r\n              label=\"Expression\"\r\n              placeholder=\"Enter user expression\"\r\n              hint=\"Example: user1+user2-user3\"\r\n              type=\"user\">\r\n            </app-expression-input>\r\n\r\n            <div class=\"status-toggle\">\r\n              <label>Status: </label>\r\n              <mat-slide-toggle formControlName=\"status\" [checked]=\"groupForm.get('status')?.value === 'Active'\" \r\n                (change)=\"groupForm.get('status')?.setValue($event.checked ? 'Active' : 'Inactive')\">\r\n                {{ groupForm.get('status')?.value }}\r\n              </mat-slide-toggle>\r\n            </div>\r\n          </div>\r\n        </mat-tab>\r\n        \r\n        <mat-tab label=\"Members\" [disabled]=\"!data.isEdit\">\r\n          <div class=\"tab-content members-tab\">\r\n            <div *ngIf=\"loadingMembers\" class=\"loading-container\">\r\n              <mat-spinner diameter=\"40\"></mat-spinner>\r\n              <p>Loading group members...</p>\r\n            </div>\r\n            \r\n            <div *ngIf=\"!loadingMembers && (!dataSource.data || dataSource.data.length === 0)\" class=\"empty-state\">\r\n              <mat-icon>people</mat-icon>\r\n              <p>No members found in this group</p>\r\n              <p class=\"hint-text\">Members are determined based on the group expression</p>\r\n            </div>\r\n            \r\n            <div *ngIf=\"!loadingMembers && groupMembers.length > 0\" class=\"members-summary\">\r\n              <p><strong>{{ groupMembers.length }}</strong> users are members of this group</p>\r\n            </div>\r\n            \r\n            <mat-tree *ngIf=\"!loadingMembers && dataSource.data && dataSource.data.length > 0\"\r\n                     [dataSource]=\"dataSource\" \r\n                     [treeControl]=\"treeControl\" \r\n                     class=\"members-tree\">\r\n              <!-- Tree node template for leaf nodes -->\r\n              <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding>\r\n                <div class=\"node-container\">\r\n                  <div class=\"icon-container\" [ngClass]=\"getNodeIconClass(node)\">\r\n                    <mat-icon>{{ getNodeIcon(node) }}</mat-icon>\r\n                  </div>\r\n                  <span class=\"node-name\">{{ node.name }}</span>\r\n                  <span *ngIf=\"node.metadata?.email\" class=\"node-email\">{{ node.metadata.email }}</span>\r\n                </div>\r\n              </mat-tree-node>\r\n              \r\n              <!-- Tree node template for expandable nodes -->\r\n              <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding>\r\n                <div class=\"node-container\">\r\n                  <button mat-icon-button matTreeNodeToggle\r\n                          [attr.aria-label]=\"'Toggle ' + node.name\">\r\n                    <mat-icon>{{ treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}</mat-icon>\r\n                  </button>\r\n                  <div class=\"icon-container\" [ngClass]=\"getNodeIconClass(node)\">\r\n                    <mat-icon>{{ getNodeIcon(node) }}</mat-icon>\r\n                  </div>\r\n                  <span class=\"node-name\">{{ node.name }}</span>\r\n                  <span class=\"member-count\" *ngIf=\"node.type === 'root'\">({{ groupMembers.length }})</span>\r\n                </div>\r\n              </mat-tree-node>\r\n            </mat-tree>\r\n          </div>\r\n        </mat-tab>\r\n        \r\n        <mat-tab label=\"Permissions\" [disabled]=\"!data.isEdit\">\r\n          <div class=\"tab-content permissions-tab\">\r\n            <!-- Loading state -->\r\n            <div *ngIf=\"loadingPermissions\" class=\"loading-container\">\r\n              <mat-spinner diameter=\"40\"></mat-spinner>\r\n              <p>Loading group permissions...</p>\r\n            </div>\r\n            \r\n            <!-- Empty state -->\r\n            <div *ngIf=\"!loadingPermissions && groupPermissions.length === 0\" class=\"empty-state\">\r\n              <mat-icon>security</mat-icon>\r\n              <p>No permissions found for this group</p>\r\n              <p class=\"hint-text\">This group doesn't have access to any artifacts</p>\r\n            </div>\r\n            \r\n            <!-- Permissions list -->\r\n            <div *ngIf=\"!loadingPermissions && groupPermissions.length > 0\" class=\"permissions-list\">\r\n              <h3>Artifacts this group has access to:</h3>\r\n              \r\n              <table class=\"permissions-table\">\r\n                <thead>\r\n                  <tr>\r\n                    <th>Artifact ID</th>\r\n                    <th>Permissions</th>\r\n                  </tr>\r\n                </thead>\r\n                <tbody>\r\n                  <tr *ngFor=\"let item of groupPermissions\">\r\n                    <td>{{ item.artifactName }}</td>\r\n                    <td>\r\n                      <div class=\"permission-badges\">\r\n                        <span class=\"permission-badge\" *ngFor=\"let perm of item.permissions\">{{ perm }}</span>\r\n                      </div>\r\n                    </td>\r\n                  </tr>\r\n                </tbody>\r\n              </table>\r\n            </div>\r\n          </div>\r\n        </mat-tab>\r\n      </mat-tab-group>\r\n    </form>\r\n  </div>\r\n  \r\n  <div mat-dialog-actions class=\"dialog-actions\">\r\n    <button mat-button (click)=\"onCancelClick()\">Cancel</button>\r\n    <button mat-flat-button color=\"primary\" (click)=\"onSubmit()\" [disabled]=\"groupForm.invalid\">\r\n      {{ data.isEdit ? 'Update' : 'Create' }}\r\n    </button>\r\n  </div>\r\n</div>","import { Injectable, Inject, Optional } from '@angular/core';\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { AuthService } from '../services/auth.service';\nimport { MEDHA_ONE_ACCESS_CONFIG } from '../config/medha-config.token';\nimport { MedhaOneAccessConfig } from '../config/medha-config.interface';\n\n@Injectable()\nexport class AuthInterceptor implements HttpInterceptor {\n  constructor(\n    @Optional() private authService: AuthService,\n    @Optional() @Inject(MEDHA_ONE_ACCESS_CONFIG) private config: MedhaOneAccessConfig\n  ) {}\n\n  intercept(req: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n    // If our services are not available, pass through immediately\n    if (!this.config || !this.authService || !this.config.apiUrl) {\n      return next.handle(req);\n    }\n\n    const debug = this.config.debugInterceptor;\n    \n    // Normalize URLs for comparison\n    const normalizedApiUrl = this.normalizeUrl(this.config.apiUrl);\n    const normalizedReqUrl = this.normalizeUrl(req.url);\n    \n    \n    // Check if this is a request to our specific API\n    const isOurApiCall = normalizedReqUrl.startsWith(normalizedApiUrl);\n    \n    // If not our API call, pass through unchanged - DO NOT MODIFY\n    if (!isOurApiCall) {\n      return next.handle(req);\n    }\n    \n    // Check if authorization header already exists (from another interceptor)\n    if (req.headers.has('Authorization')) {\n      return next.handle(req);\n    }\n    \n    // Only add our auth to our API calls that don't have auth yet\n    try {\n      // Extract endpoint relative to our API base URL\n      const endpoint = normalizedReqUrl.substring(normalizedApiUrl.length);\n      const cleanEndpoint = endpoint.startsWith('/') ? endpoint : '/' + endpoint;\n      const method = req.method;\n      \n      \n      // Generate token for this specific request\n      const token = this.authService.generateToken(cleanEndpoint, method);\n      \n      // Clone and add ONLY our authorization header\n      const authReq = req.clone({\n        setHeaders: {\n          'Authorization': `Bearer ${token}`\n        }\n      });\n      \n      \n      return next.handle(authReq);\n    } catch (error) {\n      // If token generation fails, pass through the original request\n      console.warn('[MedhaOneAccess Interceptor] Failed to generate auth token', error);\n      return next.handle(req);\n    }\n  }\n\n  private normalizeUrl(url: string): string {\n    // Remove protocol if present\n    let normalized = url.replace(/^https?:\\/\\//, '');\n    // Remove trailing slashes\n    normalized = normalized.replace(/\\/+$/, '');\n    // Ensure consistent formatting\n    return normalized.toLowerCase();\n  }\n}","/*\r\n * Public API Surface of medha-one-access\r\n */\r\n\r\n// Main library exports\r\nexport * from './lib/medha-one-access.module';\r\nexport * from './lib/medha-one-access.component';\r\nexport * from './lib/medha-one-access.routes';\r\n\r\n// Configuration\r\nexport * from './lib/config/medha-config.interface';\r\nexport * from './lib/config/medha-config.token';\r\n\r\n// Components - All standalone components are exported individually\r\nexport * from './lib/components/access-rule-dialog/access-rule-dialog.component';\r\nexport * from './lib/components/access-rules/access-rules.component';\r\nexport * from './lib/components/add-user-dialog/add-user-dialog.component';\r\nexport * from './lib/components/artifact-dialog/artifact-dialog.component';\r\nexport * from './lib/components/artifact-hierarchy/artifact-hierarchy.component';\r\nexport * from './lib/components/artifacts/artifacts.component';\r\nexport * from './lib/components/combined-hierarchy/combined-hierarchy.component';\r\nexport * from './lib/components/confirm-dialog/confirm-dialog.component';\r\nexport * from './lib/components/edit-user-dialog/edit-user-dialog.component';\r\nexport * from './lib/components/expression-input/expression-input.component';\r\nexport * from './lib/components/group-hierarchy/group-hierarchy.component';\r\nexport * from './lib/components/hierarchy/hierarchy.component';\r\nexport * from './lib/components/organization-hierarchy/organization-hierarchy.component';\r\nexport * from './lib/components/organization-tree/organization-tree.component';\r\nexport * from './lib/components/sidebar/sidebar.component';\r\nexport * from './lib/components/user-group-dialog/user-group-dialog.component';\r\nexport * from './lib/components/user-groups/user-groups.component';\r\nexport * from './lib/components/user-management/user-management.component';\r\n\r\n// Services\r\nexport { AccessRuleService } from './lib/services/access-rule.service';\r\nexport { AppContextService } from './lib/services/app-context.service';\r\nexport { ArtifactService } from './lib/services/artifact.service';\r\nexport { ArtifactHierarchyService } from './lib/services/artifact-hierarchy.service';\r\nexport { AuthService } from './lib/services/auth.service';\r\nexport { ExpressionParserService } from './lib/services/expression-parser.service';\r\nexport { GroupService } from './lib/services/group.service';\r\nexport { HierarchyService } from './lib/services/hierarchy.service';\r\nexport { MedhaHttpService } from './lib/services/medha-http.service';\r\nexport { SyncExpressionResolverService } from './lib/services/sync-expression-resolver.service';\r\nexport { UserService } from './lib/services/user.service';\r\n\r\n// Models  \r\nexport type { AccessRule } from './lib/models/access-rule.model';\r\nexport type { Artifact, ArtifactGroup } from './lib/models/artifact.model';\r\nexport type { UserGroup as LibraryUserGroup, GroupMember } from './lib/models/group.model';\r\nexport type { User, UserGroup as UserModelGroup, UserResponse } from './lib/models/user.model';\r\n\r\n// Interceptors\r\nexport * from './lib/interceptors/auth.interceptor';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i1.UserService","i2.GroupService","i3.ArtifactService","map","i1.HierarchyService","i3","i4","i7","i9","i1","i6","i8","i10","i5","i11","i12","i13","i2.HierarchyService","i3.ExpressionParserService","i4.SyncExpressionResolverService","i5.AccessRuleService","i16","i17","i1.GroupService","i2.ArtifactService","i1.ArtifactService","i2.ExpressionParserService","i3.SyncExpressionResolverService","i1.ArtifactHierarchyService","i2.AppContextService","i1.AccessRuleService","i3.UserService","i4.ArtifactService","i14","i18","i15"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAGa,uBAAuB,GAAG,IAAI,cAAc,CAAuB,yBAAyB;;MCc5F,gBAAgB,CAAA;AAP7B,IAAA,WAAA,GAAA;AAQY,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,YAAY,EAAU,CAAC;QAExD,IAAU,CAAA,UAAA,GAAW,OAAO,CAAC;AAE7B,QAAA,IAAA,CAAA,QAAQ,GAAc;AACpB,YAAA;AACE,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,QAAQ,EAAE,OAAO;AAClB,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,WAAW;AACjB,gBAAA,IAAI,EAAE,WAAW;AACjB,gBAAA,QAAQ,EAAE,WAAW;AACtB,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,cAAc;AACpB,gBAAA,IAAI,EAAE,UAAU;AAChB,gBAAA,QAAQ,EAAE,cAAc;AACzB,aAAA;SACF,CAAC;AAiBH,KAAA;IAfC,QAAQ,GAAA;;AAEN,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC7C,SAAA;KACF;AAED,IAAA,UAAU,CAAC,QAAgB,EAAA;AACzB,QAAA,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;AAC3B,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACtC;AAED,IAAA,QAAQ,CAAC,QAAgB,EAAA;AACvB,QAAA,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC;KACrC;;8GArCU,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhB,gBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,ECjB7B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,OAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,2bAcM,EDDM,MAAA,EAAA,CAAA,kwBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,2JAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;4FAI1B,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAP5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,cACX,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,aAAa,CAAC,EAAA,QAAA,EAAA,2bAAA,EAAA,MAAA,EAAA,CAAA,kwBAAA,CAAA,EAAA,CAAA;8BAK5B,gBAAgB,EAAA,CAAA;sBAAzB,MAAM;;;MEVI,WAAW,CAAA;AAGtB,IAAA,WAAA,CAC2C,MAA4B,EAAA;QAA5B,IAAM,CAAA,MAAA,GAAN,MAAM,CAAsB;AAErE,QAAA,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;KACnC;AAED;;;AAGG;IACH,aAAa,CAAC,QAAgB,EAAE,MAAc,EAAA;AAC5C,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAC7B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,CAAA,eAAA,EAAkB,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAC;;QAGhF,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;AACjD,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC;KACxB;AAED;;AAEG;AACK,IAAA,aAAa,CAAC,IAAY,EAAA;;AAEhC,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;;;;AAK3D,QAAA,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;AAC5B,QAAA,EAAE,CAAC,QAAQ,GAAG,EAAE,CAAC;AACjB,QAAA,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEhC,QAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC7B,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/B,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,GAAG,EAAE,CAAC;;QAGtC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE;AAChD,YAAA,EAAE,EAAE,EAAE;AACN,YAAA,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG;AACvB,YAAA,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK;AAC5B,SAAA,CAAC,CAAC;;;AAIH,QAAA,OAAO,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;KAC3D;AAED;;AAEG;IACK,aAAa,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;KACpD;;AA1DU,WAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,kBAIZ,uBAAuB,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAJtB,WAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFV,MAAM,EAAA,CAAA,CAAA;4FAEP,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;0BAKI,MAAM;2BAAC,uBAAuB,CAAA;;;MCMtB,gBAAgB,CAAA;AAC3B,IAAA,WAAA,CACU,IAAgB,EACJ,WAAwB,EACS,MAA4B,EAAA;QAFzE,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAY;QACJ,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QACS,IAAM,CAAA,MAAA,GAAN,MAAM,CAAsB;KAC/E;AAEJ;;AAEG;IACK,cAAc,CAAC,QAAgB,EAAE,MAAc,EAAA;QACrD,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACrC,OAAO,IAAI,WAAW,EAAE,CAAC;AAC1B,SAAA;QAED,IAAI;AACF,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC/D,OAAO,IAAI,WAAW,CAAC;gBACrB,eAAe,EAAE,CAAU,OAAA,EAAA,KAAK,CAAE,CAAA;AACnC,aAAA,CAAC,CAAC;AACJ,SAAA;AAAC,QAAA,OAAO,KAAK,EAAE;YACd,OAAO,IAAI,WAAW,EAAE,CAAC;AAC1B,SAAA;KACF;AAED;;AAEG;AACK,IAAA,eAAe,CAAC,GAAW,EAAA;AACjC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE;AACxB,YAAA,OAAO,GAAG,CAAC;AACZ,SAAA;;AAGD,QAAA,IAAI,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;;AAGnD,QAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC7B,YAAA,QAAQ,GAAG,GAAG,GAAG,QAAQ,CAAC;AAC3B,SAAA;AAED,QAAA,OAAO,QAAQ,CAAC;KACjB;AAED;;AAEG;IACK,YAAY,CAAC,eAAkF,EAAE,WAAwB,EAAA;QAC/H,IAAI,OAAO,GAAG,WAAW,CAAC;AAE1B,QAAA,IAAI,eAAe,EAAE;YACnB,IAAI,eAAe,YAAY,WAAW,EAAE;;gBAE1C,eAAe,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,IAAG;oBACnC,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC3C,oBAAA,IAAI,MAAM,EAAE;AACV,wBAAA,MAAM,CAAC,OAAO,CAAC,KAAK,IAAG;4BACrB,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACpC,yBAAC,CAAC,CAAC;AACJ,qBAAA;AACH,iBAAC,CAAC,CAAC;AACJ,aAAA;AAAM,iBAAA;;gBAEL,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,GAAG,IAAG;AACzC,oBAAA,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;AACnC,oBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,wBAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAG;4BAChB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AACnC,yBAAC,CAAC,CAAC;AACJ,qBAAA;AAAM,yBAAA;wBACL,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACnC,qBAAA;AACH,iBAAC,CAAC,CAAC;AACJ,aAAA;AACF,SAAA;AAED,QAAA,OAAO,OAAO,CAAC;KAChB;AAED;;AAEG;AACK,IAAA,WAAW,CAAC,KAAwB,EAAA;QAC1C,IAAI,YAAY,GAAG,2BAA2B,CAAC;QAC/C,IAAI,mBAAmB,GAAG,yCAAyC,CAAC;AAEpE,QAAA,IAAI,KAAK,CAAC,KAAK,YAAY,UAAU,EAAE;;YAErC,YAAY,GAAG,iBAAiB,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACtD,mBAAmB,GAAG,4DAA4D,CAAC;AACpF,SAAA;AAAM,aAAA;;YAEL,QAAQ,KAAK,CAAC,MAAM;AAClB,gBAAA,KAAK,GAAG;oBACN,YAAY,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,aAAa,CAAC;oBACrD,mBAAmB,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,iDAAiD,CAAC;oBAChG,MAAM;AACR,gBAAA,KAAK,GAAG;oBACN,YAAY,GAAG,cAAc,CAAC;oBAC9B,mBAAmB,GAAG,qEAAqE,CAAC;oBAC5F,MAAM;AACR,gBAAA,KAAK,GAAG;oBACN,YAAY,GAAG,WAAW,CAAC;oBAC3B,mBAAmB,GAAG,oDAAoD,CAAC;oBAC3E,MAAM;AACR,gBAAA,KAAK,GAAG;oBACN,YAAY,GAAG,WAAW,CAAC;oBAC3B,mBAAmB,GAAG,uCAAuC,CAAC;oBAC9D,MAAM;AACR,gBAAA,KAAK,GAAG;oBACN,YAAY,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,UAAU,CAAC;oBAClD,mBAAmB,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,sDAAsD,CAAC;oBACrG,MAAM;AACR,gBAAA,KAAK,GAAG;oBACN,YAAY,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,kBAAkB,CAAC;oBAC1D,mBAAmB,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,+BAA+B,CAAC;oBAC9E,MAAM;AACR,gBAAA,KAAK,GAAG;oBACN,YAAY,GAAG,uBAAuB,CAAC;oBACvC,mBAAmB,GAAG,kDAAkD,CAAC;oBACzE,MAAM;AACR,gBAAA;AACE,oBAAA,YAAY,GAAG,CAAS,MAAA,EAAA,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;oBACjF,mBAAmB,GAAG,iDAAiD,CAAC;AAC3E,aAAA;AACF,SAAA;AAED,QAAA,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE;YAC3B,MAAM,EAAE,KAAK,CAAC,MAAM;AACpB,YAAA,OAAO,EAAE,YAAY;YACrB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,GAAG,EAAE,KAAK,CAAC,GAAG;AACf,SAAA,CAAC,CAAC;;AAGH,QAAA,OAAO,UAAU,CAAC;AAChB,YAAA,GAAG,KAAK;AACR,YAAA,OAAO,EAAE,YAAY;AACrB,YAAA,WAAW,EAAE,mBAAmB;AAChC,YAAA,aAAa,EAAE,KAAK;AACrB,SAAA,CAAC,CAAC;KACJ;AAED;;AAEG;IACH,GAAG,CAAI,GAAW,EAAE,OAAqB,EAAA;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACzD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAEjE,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,GAAG,OAAO;YACV,OAAO;SACR,CAAC;QAGF,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,GAAG,EAAE,cAAc,CAAC,CAAC,IAAI,CAC/C,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CACxC,CAAC;KACH;AAED;;AAEG;AACH,IAAA,IAAI,CAAI,GAAW,EAAE,IAAS,EAAE,OAAqB,EAAA;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC1D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAEjE,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,GAAG,OAAO;YACV,OAAO;SACR,CAAC;QAGF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAI,GAAG,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,IAAI,CACtD,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CACxC,CAAC;KACH;AAED;;AAEG;AACH,IAAA,GAAG,CAAI,GAAW,EAAE,IAAS,EAAE,OAAqB,EAAA;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACzD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAEjE,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,GAAG,OAAO;YACV,OAAO;SACR,CAAC;QAGF,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,GAAG,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,IAAI,CACrD,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CACxC,CAAC;KACH;AAED;;AAEG;IACH,MAAM,CAAI,GAAW,EAAE,OAAqB,EAAA;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC5D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAEjE,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,GAAG,OAAO;YACV,OAAO;SACR,CAAC;QAGF,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAI,GAAG,EAAE,cAAc,CAAC,CAAC,IAAI,CAClD,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CACxC,CAAC;KACH;AAED;;AAEG;AACH,IAAA,KAAK,CAAI,GAAW,EAAE,IAAS,EAAE,OAAqB,EAAA;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC3D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAEjE,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,GAAG,OAAO;YACV,OAAO;SACR,CAAC;AAGF,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAI,GAAG,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;KACtD;AAED;;AAEG;IACH,IAAI,CAAI,GAAW,EAAE,OAAqB,EAAA;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC1D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAEjE,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,GAAG,OAAO;YACV,OAAO;SACR,CAAC;QAGF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAI,GAAG,EAAE,cAAc,CAAC,CAAC;KAC/C;AAED;;AAEG;IACH,OAAO,CAAI,GAAW,EAAE,OAAqB,EAAA;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAC7D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAEjE,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,GAAG,OAAO;YACV,OAAO;SACR,CAAC;QAGF,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAI,GAAG,EAAE,cAAc,CAAC,CAAC;KAClD;;AA5QU,gBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,oFAIL,uBAAuB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAJlC,gBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA,CAAA;4FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;0BAII,QAAQ;;0BACR,QAAQ;;0BAAI,MAAM;2BAAC,uBAAuB,CAAA;;;MCVlC,WAAW,CAAA;IAGtB,WACU,CAAA,SAA2B,EACM,MAA4B,EAAA;QAD7D,IAAS,CAAA,SAAA,GAAT,SAAS,CAAkB;QACM,IAAM,CAAA,MAAA,GAAN,MAAM,CAAsB;QAErE,IAAI,CAAC,MAAM,GAAG,CAAA,EAAG,MAAM,CAAC,MAAM,QAAQ,CAAC;KACxC;AAED;;AAEG;AACH,IAAA,QAAQ,CAAC,IAAe,GAAA,CAAC,EAAE,KAAc,EAAE,aAAiB,IAAI,EAAA;AAC9D,QAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE;AAC1B,aAAA,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC5B,aAAA,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAE5B,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChD,SAAA;QAED,IAAI,UAAU,KAAK,IAAI,EAAE;AACvB,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;AACtD,SAAA;AAED,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAiB,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CACrE,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAClE,CAAC;KACH;AAED;;AAEG;AACH,IAAA,WAAW,CAAC,EAAO,EAAA;AACjB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAe,CAAG,EAAA,IAAI,CAAC,MAAM,CAAI,CAAA,EAAA,EAAE,EAAE,CAAC,CAAC,IAAI,CAClE,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAC9C,CAAC;KACH;AAED;;AAEG;AACH,IAAA,OAAO,CAAC,IAAU,EAAE,MAAA,GAAkB,KAAK,EAAA;;QAEzC,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;;AAGpD,QAAA,MAAM,GAAG,GAAG,MAAM,GAAG,CAAG,EAAA,IAAI,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;AAEhE,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAe,GAAG,EAAE,WAAW,CAAC,CAAC,IAAI,CAC7D,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,EACrD,UAAU,CAAC,KAAK,IAAG;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;;AAG7C,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE;;gBAExB,MAAM,YAAY,GAAG,MAAM,GAAG,oCAAoC,GAAG,iDAAiD,CAAC;gBACvH,MAAM,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AAC3C,aAAA;AAAM,iBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE;;gBAE/B,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,4BAA4B,CAAC;gBAC1E,MAAM,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AAC3C,aAAA;AAED,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACH;AAED;;AAEG;AACH,IAAA,UAAU,CAAC,IAAU,EAAA;;QAEnB,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAGpD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAe,CAAG,EAAA,IAAI,CAAC,MAAM,CAAI,CAAA,EAAA,IAAI,CAAC,EAAE,CAAA,CAAE,EAAE,WAAW,CAAC,CAAC,IAAI,CACpF,GAAG,CAAC,QAAQ,IAAG;AACb,YAAA,OAAO,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;AAC9C,SAAC,CAAC,EACF,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAuB,oBAAA,EAAA,IAAI,CAAC,EAAE,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;;AAGxD,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE;;gBAExB,OAAO,CAAC,IAAI,CAAC,CAAA,4BAAA,EAA+B,IAAI,CAAC,EAAE,CAAoC,kCAAA,CAAA,CAAC,CAAC;gBACzF,MAAM,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,4CAA4C,EAAE,CAAC;AAC3E,aAAA;AAAM,iBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE;;gBAE/B,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,4BAA4B,CAAC;gBAC1E,MAAM,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AAC3C,aAAA;AAED,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACH;AAED;;AAEG;AACH,IAAA,UAAU,CAAC,EAAU,EAAA;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA,EAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAA,CAAE,CAAC,CAAC,IAAI,CACvD,GAAG,CAAC,QAAQ,IAAG;;AAEb,YAAA,OAAO,IAAI,CAAC;AACd,SAAC,CAAC,EACF,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAA,0BAAA,EAA6B,EAAE,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AACzD,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACH;AAED;;AAEG;AACH,IAAA,SAAS,CAAC,IAAe,GAAA,CAAC,EAAE,KAAc,EAAE,UAAoB,EAAA;AAC9D,QAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE;AAC1B,aAAA,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC5B,aAAA,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAEjC,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChD,SAAA;AAED,QAAA,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI,EAAE;AACnD,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;AACtD,SAAA;AAED,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAiB,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CACrE,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,CACvE,CAAC;KACH;AAED;;AAEG;AACH,IAAA,eAAe,CAAC,OAAe,EAAA;QAC7B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAA8C,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,YAAA,EAAe,OAAO,CAAU,QAAA,CAAA,CAAC,CAAC,IAAI,CAChI,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAChF,CAAC;KACH;AAED;;AAEG;AACH,IAAA,aAAa,CAAC,MAAc,EAAA;AAC1B,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAA4C,GAAG,IAAI,CAAC,MAAM,CAAI,CAAA,EAAA,MAAM,SAAS,CAAC,CAAC,IAAI,CAC1G,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,CAAC,CACtF,CAAC;KACH;AAED;;AAEG;AACK,IAAA,qBAAqB,CAAC,QAAsB,EAAA;;AAElD,QAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,aAAa,EAAE,UAAU,IAAI,EAAE,CAAC;AACnF,QAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,aAAa,EAAE,SAAS,IAAI,EAAE,CAAC;AAChF,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC;AACpE,QAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,aAAa,EAAE,UAAU,IAAI,EAAE,CAAC;AACnF,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC;AACjE,QAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,aAAa,EAAE,UAAU,IAAI,EAAE,CAAC;QAEnF,OAAO;YACL,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,MAAM,EAAE,QAAQ,CAAC,MAAM;AACvB,YAAA,UAAU,EAAE,UAAU;AACtB,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,UAAU,EAAE,UAAU;AACtB,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,UAAU,EAAE,UAAU;YACtB,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,UAAU,EAAE,QAAQ,CAAC,UAAU;;AAG/B,YAAA,IAAI,EAAE,CAAG,EAAA,UAAU,IAAI,SAAS,CAAA,CAAE,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,aAAa,EAAE,IAAI,IAAI,QAAQ,CAAC,EAAE;YACxF,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,QAAQ,GAAG,UAAU;;AAE/C,YAAA,SAAS,EAAE,CAAC;AACZ,YAAA,MAAM,EAAE,CAAC;AACT,YAAA,WAAW,EAAE,UAAU;SACxB,CAAC;KACH;AAED;;AAEG;AACK,IAAA,0BAA0B,CAAC,QAAsB,EAAA;;AAEvD,QAAA,IAAI,SAAS,GAAG,QAAQ,CAAC,EAAE,CAAC;;AAG5B,QAAA,IAAI,QAAQ,CAAC,aAAa,EAAE,IAAI,EAAE;AAChC,YAAA,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAc,CAAC;AACnD,SAAA;AAAM,aAAA,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,SAAS,EAAE;AACpD,YAAA,SAAS,GAAG,CAAG,EAAA,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAA,CAAA,EAAI,QAAQ,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;AAC/E,SAAA;aAAM,IAAI,QAAQ,CAAC,WAAW,EAAE;AAC/B,YAAA,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC;AAClC,SAAA;QAED,OAAO;YACL,EAAE,EAAE,QAAQ,CAAC,EAAE;AACf,YAAA,IAAI,EAAE,WAAW;AACjB,YAAA,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,EAAE;YACrC,MAAM,EAAE,QAAQ,CAAC,MAAM;AACvB,YAAA,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,UAAU,EAAE,QAAQ,CAAC,UAAU;;AAG/B,YAAA,WAAW,EAAE,CAAC;SACf,CAAC;KACH;AAED;;AAEG;IACH,cAAc,GAAA;QACZ,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CACzB,GAAG,CAAC,KAAK,IAAG;YACV,MAAM,WAAW,GAAG,KAAK;iBACtB,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC;iBAC5B,MAAM,CAAC,CAAC,IAAI,KAAqB,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;AAC3F,iBAAA,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC;AACzD,iBAAA,IAAI,EAAE,CAAC;AACV,YAAA,OAAO,WAAW,CAAC;AACrB,SAAC,CAAC,EACF,UAAU,CAAC,KAAK,IAAG;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;AACnD,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;KACH;AAED;;AAEG;IACH,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CACzB,GAAG,CAAC,KAAK,IAAG;YACV,MAAM,KAAK,GAAG,KAAK;iBAChB,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC;iBACtB,MAAM,CAAC,CAAC,IAAI,KAAqB,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;AAC3F,iBAAA,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC;AACzD,iBAAA,IAAI,EAAE,CAAC;AACV,YAAA,OAAO,KAAK,CAAC;AACf,SAAC,CAAC,EACF,UAAU,CAAC,KAAK,IAAG;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;AAC7C,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;KACH;AAED;;AAEG;AACK,IAAA,oBAAoB,CAAC,IAAU,EAAA;;AAErC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC;;AAG1C,QAAA,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AACzB,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE;AAC7B,YAAA,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC;AACnC,SAAA;;;QAID,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,KAAK,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;QACvF,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,KAAK,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC;QAC3G,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE/E,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,MAAM,KAAK,SAAS,GAAG,IAAI,GAAG,MAAM;YAC5C,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,YAAA,UAAU,EAAE,UAAU;AACtB,YAAA,eAAe,EAAE,eAAe;AAChC,YAAA,QAAQ,EAAE,QAAQ;YAClB,WAAW,EAAE,IAAI,CAAC,WAAW;;AAE7B,YAAA,aAAa,EAAE;AACb,gBAAA,IAAI,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;;AAE7B,gBAAA,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,IAAI,CAAG,EAAA,IAAI,CAAC,UAAU,IAAI,EAAE,CAAI,CAAA,EAAA,IAAI,CAAC,SAAS,IAAI,EAAE,CAAE,CAAA,CAAC,IAAI,EAAE;gBAC7F,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,UAAU,EAAE,IAAI,CAAC,UAAU;AAC5B,aAAA;SACF,CAAC;KACH;;AA7TU,WAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,+CAKZ,uBAAuB,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AALtB,WAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFV,MAAM,EAAA,CAAA,CAAA;4FAEP,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;0BAMI,MAAM;2BAAC,uBAAuB,CAAA;;;MCLtB,YAAY,CAAA;IAIvB,WACU,CAAA,SAA2B,EACM,MAA4B,EAAA;QAD7D,IAAS,CAAA,SAAA,GAAT,SAAS,CAAkB;QACM,IAAM,CAAA,MAAA,GAAN,MAAM,CAAsB;QAErE,IAAI,CAAC,MAAM,GAAG,CAAA,EAAG,MAAM,CAAC,MAAM,QAAQ,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,CAAA,EAAG,MAAM,CAAC,MAAM,aAAa,CAAC;KACpD;AAED,IAAA,SAAS,CAAC,IAAe,GAAA,CAAC,EAAE,KAAc,EAAE,UAAgB,EAAA;AAC1D,QAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE;AAC1B,aAAA,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC5B,aAAA,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAEjC,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChD,SAAA;AAED,QAAA,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI,EAAE;AACnD,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;AACtD,SAAA;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAC5D,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,EAC1E,UAAU,CAAC,KAAK,IAAG;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;AAC/C,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;KACH;AAED,IAAA,YAAY,CAAC,EAAU,EAAA;AACrB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAM,CAAA,EAAG,IAAI,CAAC,MAAM,CAAI,CAAA,EAAA,EAAE,CAAE,CAAA,CAAC,CAAC,IAAI,CACzD,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,EAChD,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAA,6BAAA,EAAgC,EAAE,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AAC5D,YAAA,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;SACtB,CAAC,CACH,CAAC;KACH;AAED,IAAA,eAAe,CAAC,OAAe,EAAA;QAC7B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAqC,CAAA,EAAG,IAAI,CAAC,aAAa,CAAA,CAAA,EAAI,OAAO,CAAU,QAAA,CAAA,CAAC,CAAC,IAAI,CAC5G,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAC/F,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAA,iCAAA,EAAoC,OAAO,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AACrE,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;KACH;AAED,IAAA,QAAQ,CAAC,KAAgB,EAAE,MAAA,GAAkB,KAAK,EAAA;AAChD,QAAA,MAAM,YAAY,GAAG;YACnB,EAAE,EAAE,KAAK,CAAC,EAAE;AACZ,YAAA,IAAI,EAAE,WAAW;AACjB,YAAA,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;AACtB,YAAA,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;AAClC,YAAA,MAAM,EAAE,KAAK,CAAC,MAAM,KAAK,QAAQ;AACjC,YAAA,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;AACpC,YAAA,aAAa,EAAE;AACb,gBAAA,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;AACtB,gBAAA,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;AACrC,aAAA;SACF,CAAC;;AAGF,QAAA,MAAM,GAAG,GAAG,MAAM,GAAG,CAAG,EAAA,IAAI,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;AAEhE,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAM,GAAG,EAAE,YAAY,CAAC,CAAC,IAAI,CACrD,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,EACtD,UAAU,CAAC,KAAK,IAAG;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;;AAG9C,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE;AACvF,gBAAA,OAAO,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;gBAC9D,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACnC,aAAA;AAAM,iBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE;;gBAE/B,MAAM,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,qDAAqD,EAAE,CAAC;AACpF,aAAA;AAAM,iBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE;;gBAE/B,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,6BAA6B,CAAC;gBAC3E,MAAM,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AAC3C,aAAA;AAED,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACH;AAED,IAAA,WAAW,CAAC,KAAgB,EAAA;AAC1B,QAAA,MAAM,YAAY,GAAG;AACnB,YAAA,IAAI,EAAE,WAAW;AACjB,YAAA,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;AAClC,YAAA,MAAM,EAAE,KAAK,CAAC,MAAM,KAAK,QAAQ;YACjC,WAAW,EAAE,KAAK,CAAC,WAAW;AAC9B,YAAA,aAAa,EAAE;gBACb,IAAI,EAAE,KAAK,CAAC,IAAI;AACjB,aAAA;SACF,CAAC;AAEF,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAM,CAAG,EAAA,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,EAAE,CAAE,CAAA,EAAE,YAAY,CAAC,CAAC,IAAI,CAC7E,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,EACtD,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAwB,qBAAA,EAAA,KAAK,CAAC,EAAE,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;;AAG1D,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE;;gBAExB,OAAO,CAAC,IAAI,CAAC,CAAA,6BAAA,EAAgC,KAAK,CAAC,EAAE,CAAoC,kCAAA,CAAA,CAAC,CAAC;;gBAE3F,MAAM,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,6CAA6C,EAAE,CAAC;AAC5E,aAAA;AAAM,iBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE;;gBAE/B,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,6BAA6B,CAAC;gBAC3E,MAAM,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AAC3C,aAAA;AAED,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACH;AAED,IAAA,WAAW,CAAC,EAAU,EAAA;AACpB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAM,CAAG,EAAA,IAAI,CAAC,MAAM,CAAI,CAAA,EAAA,EAAE,EAAE,CAAC,CAAC,IAAI,CAC5D,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,EACrB,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAA,qBAAA,EAAwB,EAAE,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AACpD,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;SAClB,CAAC,CACH,CAAC;KACH;IAED,gBAAgB,CAAC,OAAe,EAAE,MAAc,EAAA;;AAE9C,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CACpC,GAAG,CAAC,KAAK,IAAG;AACV,YAAA,IAAI,CAAC,KAAK;AAAE,gBAAA,OAAO,KAAK,CAAC;;AAGzB,YAAA,MAAM,iBAAiB,GAAG,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;AACjD,YAAA,MAAM,iBAAiB,GAAG,iBAAiB,GAAG,CAAA,EAAG,iBAAiB,CAAA,CAAA,EAAI,MAAM,CAAE,CAAA,GAAG,MAAM,CAAC;AAExF,YAAA,MAAM,YAAY,GAAG;AACnB,gBAAA,GAAG,KAAK;AACR,gBAAA,UAAU,EAAE,iBAAiB;aAC9B,CAAC;;YAGF,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,SAAS,EAAE,CAAC;AAC3C,YAAA,OAAO,IAAI,CAAC;AACd,SAAC,CAAC,EACF,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAuB,oBAAA,EAAA,MAAM,CAAa,UAAA,EAAA,OAAO,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AAC3E,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;SAClB,CAAC,CACH,CAAC;KACH;IAED,qBAAqB,CAAC,OAAe,EAAE,MAAc,EAAA;;AAEnD,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CACpC,GAAG,CAAC,KAAK,IAAG;AACV,YAAA,IAAI,CAAC,KAAK;AAAE,gBAAA,OAAO,KAAK,CAAC;;AAGzB,YAAA,MAAM,iBAAiB,GAAG,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;AACjD,YAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC;AAAE,gBAAA,OAAO,KAAK,CAAC;;;AAItD,YAAA,MAAM,iBAAiB,GAAG,CAAA,EAAG,iBAAiB,CAAI,CAAA,EAAA,MAAM,EAAE,CAAC;AAE3D,YAAA,MAAM,YAAY,GAAG;AACnB,gBAAA,GAAG,KAAK;AACR,gBAAA,UAAU,EAAE,iBAAiB;aAC9B,CAAC;;YAGF,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,SAAS,EAAE,CAAC;AAC3C,YAAA,OAAO,IAAI,CAAC;AACd,SAAC,CAAC,EACF,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAyB,sBAAA,EAAA,MAAM,CAAe,YAAA,EAAA,OAAO,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AAC/E,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;SAClB,CAAC,CACH,CAAC;KACH;AAED;;AAEG;AACK,IAAA,sBAAsB,CAAC,QAAa,EAAA;AAC1C,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,EAAe,CAAC;QAEtC,OAAO;YACL,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,IAAI,EAAE,QAAQ,CAAC,aAAa,EAAE,IAAI,IAAI,QAAQ,CAAC,EAAE;AACjD,YAAA,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,EAAE;AACvC,YAAA,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,EAAE;AACrC,YAAA,WAAW,EAAE,CAAC;YACd,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,QAAQ,GAAG,UAAU;AAC/C,YAAA,SAAS,EAAE,QAAQ,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,SAAS;AAC1E,YAAA,SAAS,EAAE,QAAQ,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,SAAS;SAC3E,CAAC;KACH;AAED;;AAEG;IACK,wBAAwB,CAAC,QAAa,EAAE,OAAe,EAAA;QAC7D,OAAO;YACL,MAAM,EAAE,QAAQ,CAAC,EAAE;YACnB,QAAQ,EAAE,GAAG,QAAQ,CAAC,UAAU,IAAI,EAAE,IAAI,QAAQ,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,EAAE;AAC1F,YAAA,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,EAAE;AAC3B,YAAA,OAAO,EAAE,QAAQ,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,IAAI,EAAE;YACzE,YAAY,EAAE,IAAI;SACnB,CAAC;KACH;;AA9NU,YAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,+CAMb,uBAAuB,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AANtB,YAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cAFX,MAAM,EAAA,CAAA,CAAA;4FAEP,YAAY,EAAA,UAAA,EAAA,CAAA;kBAHxB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;0BAOI,MAAM;2BAAC,uBAAuB,CAAA;;;MCNtB,eAAe,CAAA;IAI1B,WACU,CAAA,SAA2B,EACM,MAA4B,EAAA;QAD7D,IAAS,CAAA,SAAA,GAAT,SAAS,CAAkB;QACM,IAAM,CAAA,MAAA,GAAN,MAAM,CAAsB;QAErE,IAAI,CAAC,MAAM,GAAG,CAAA,EAAG,MAAM,CAAC,MAAM,YAAY,CAAC;QAC3C,IAAI,CAAC,iBAAiB,GAAG,CAAA,EAAG,MAAM,CAAC,MAAM,iBAAiB,CAAC;KAC5D;IAED,YAAY,CAAC,OAAe,CAAC,EAAE,KAAc,EAAE,UAAA,GAAkB,IAAI,EAAE,eAAwB,EAAA;AAC7F,QAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE;aAC1B,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEhC,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChD,SAAA;QAED,IAAI,UAAU,KAAK,IAAI,EAAE;AACvB,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;AACtD,SAAA;AAED,QAAA,IAAI,eAAe,EAAE;YACnB,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC;AAC1D,SAAA;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAC5D,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAC/E,UAAU,CAAC,KAAK,IAAG;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;AAClD,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;KACH;AAED,IAAA,eAAe,CAAC,EAAU,EAAA;AACxB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAM,CAAA,EAAG,IAAI,CAAC,MAAM,CAAI,CAAA,EAAA,EAAE,CAAE,CAAA,CAAC,CAAC,IAAI,CACzD,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,EACrD,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAA,gCAAA,EAAmC,EAAE,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AAC/D,YAAA,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;SACtB,CAAC,CACH,CAAC;KACH;IAED,iBAAiB,CAAC,OAAe,CAAC,EAAE,KAAc,EAAE,UAAA,GAAsB,IAAI,EAAE,eAAwB,EAAA;AACtG,QAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE;AAC1B,aAAA,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC5B,aAAA,GAAG,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;QAEzC,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChD,SAAA;QAED,IAAI,UAAU,KAAK,IAAI,EAAE;AACvB,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;AACtD,SAAA;AAED,QAAA,IAAI,eAAe,EAAE;YACnB,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC;AAC1D,SAAA;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAC5D,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,CAAC,EAC9E,UAAU,CAAC,KAAK,IAAG;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;AACxD,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;KACH;AAED,IAAA,oBAAoB,CAAC,EAAU,EAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAM,CAAA,EAAG,IAAI,CAAC,MAAM,CAAI,CAAA,EAAA,EAAE,CAAE,CAAA,CAAC,CAAC,IAAI,CACzD,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,EACpD,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAA,sCAAA,EAAyC,EAAE,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AACrE,YAAA,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;SACtB,CAAC,CACH,CAAC;KACH;AAED,IAAA,wBAAwB,CAAC,OAAe,EAAA;QACtC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAsC,CAAA,EAAG,IAAI,CAAC,iBAAiB,IAAI,OAAO,CAAA,SAAA,CAAW,CAAC,CAAC,IAAI,CAClH,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC,EACxF,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAA,kCAAA,EAAqC,OAAO,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AACtE,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;KACH;AAED,IAAA,oBAAoB,CAAC,UAAkB,EAAA;QACrC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAuC,CAAA,EAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAA,OAAA,CAAS,CAAC,CAAC,IAAI,CACzG,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,CAAC,EACrF,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAA,mCAAA,EAAsC,UAAU,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AAC1E,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;KACH;IAED,qBAAqB,GAAA;QACnB,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAC7B,GAAG,CAAC,SAAS,IAAG;YACd,MAAM,YAAY,GAAG,SAAS;AAC3B,iBAAA,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;iBAC9E,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,WAAW,CAAC;iBACrC,MAAM,CAAC,WAAW,IAAI,WAAW,KAAK,SAAS,CAAa,CAAC;;AAGhE,YAAA,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAClD,SAAC,CAAC,EACF,UAAU,CAAC,KAAK,IAAG;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;AAC5D,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;KACH;AAED,IAAA,WAAW,CAAC,QAAkB,EAAA;QAC5B,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;AAE5D,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAM,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,IAAI,CAChE,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,EACrD,UAAU,CAAC,KAAK,IAAG;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;AACjD,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACH;AAED,IAAA,cAAc,CAAC,QAAkB,EAAA;QAC/B,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;AAE5D,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAM,CAAG,EAAA,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,EAAE,CAAE,CAAA,EAAE,eAAe,CAAC,CAAC,IAAI,CACnF,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,EACrD,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAA2B,wBAAA,EAAA,QAAQ,CAAC,EAAE,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AAChE,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACH;AAED,IAAA,cAAc,CAAC,EAAU,EAAA;AACvB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAM,CAAG,EAAA,IAAI,CAAC,MAAM,CAAI,CAAA,EAAA,EAAE,EAAE,CAAC,CAAC,IAAI,CAC5D,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,EACrB,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAA,wBAAA,EAA2B,EAAE,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AACvD,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;SAClB,CAAC,CACH,CAAC;KACH;AAED;;AAEG;AACK,IAAA,qBAAqB,CAAC,QAAa,EAAA;AACzC,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,EAAc,CAAC;AAErC,QAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,KAAK,UAAU,CAAC;AAChD,QAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,KAAK,eAAe,CAAC;QAElD,OAAO;YACL,EAAE,EAAE,QAAQ,CAAC,EAAE;AACf,YAAA,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,iBAAiB,EAAE,IAAI,IAAI,QAAQ,CAAC,EAAE;AACtE,YAAA,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,EAAE;YACvC,IAAI,EAAE,QAAQ,CAAC,IAAI;AACnB,YAAA,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,EAAE;YACvC,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,QAAQ,GAAG,UAAU;YAC/C,aAAa,EAAE,OAAO,GAAG,CAAC,GAAG,SAAS;YACtC,UAAU,EAAE,OAAO,GAAG,QAAQ,CAAC,UAAU,GAAG,SAAS;AACrD,YAAA,WAAW,EAAE,EAAE;YACf,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,eAAe,EAAE,QAAQ,CAAC,eAAe;AACzC,YAAA,gBAAgB,EAAE,QAAQ,CAAC,iBAAiB,IAAI,EAAE;AAClD,YAAA,SAAS,EAAE,QAAQ,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,SAAS;AAC1E,YAAA,SAAS,EAAE,QAAQ,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,SAAS;SAC3E,CAAC;KACH;AAED;;AAEG;AACK,IAAA,0BAA0B,CAAC,QAAa,EAAA;AAC9C,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,EAAmB,CAAC;QAE1C,OAAO;YACL,EAAE,EAAE,QAAQ,CAAC,EAAE;AACf,YAAA,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,iBAAiB,EAAE,IAAI,IAAI,QAAQ,CAAC,EAAE;AACtE,YAAA,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,EAAE;YACvC,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,QAAQ,GAAG,UAAU;AAC/C,YAAA,aAAa,EAAE,CAAC;AAChB,YAAA,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,EAAE;AACvC,YAAA,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,EAAE;AACrC,YAAA,IAAI,EAAE,eAAe;AACrB,YAAA,SAAS,EAAE,QAAQ,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,SAAS;AAC1E,YAAA,SAAS,EAAE,QAAQ,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,SAAS;SAC3E,CAAC;KACH;AAED;;AAEG;AACK,IAAA,kBAAkB,CAAC,IAAY,EAAA;QACrC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;AAC/B,YAAA,OAAO,YAAY,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AACjC,SAAA;;QAGD,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;AACnC,aAAA,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;AAC9B,aAAA,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;AACnB,aAAA,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;;AAGzB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,QAAA,OAAO,CAAG,EAAA,MAAM,CAAI,CAAA,EAAA,SAAS,EAAE,CAAC;KACjC;AAED;;AAEG;AACK,IAAA,oBAAoB,CAAC,QAAkB,EAAA;;AAE7C,QAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC;;QAG5C,MAAM,QAAQ,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,KAAK,EAAE,GAAG,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC3F,MAAM,eAAe,GAAG,CAAC,QAAQ,CAAC,eAAe,IAAI,QAAQ,CAAC,eAAe,KAAK,EAAE,GAAG,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC;AAEvH,QAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,KAAK,eAAe,CAAC;;AAGlD,QAAA,IAAI,UAAU,GAAG,QAAQ,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC3C,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACrD,SAAA;;QAGD,MAAM,gBAAgB,GAAQ,EAAE,CAAC;;QAGjC,IAAI,QAAQ,CAAC,gBAAgB,EAAE;YAC7B,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;AAC5D,SAAA;AAED,QAAA,MAAM,OAAO,GAAQ;AACnB,YAAA,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,QAAQ,CAAC,IAAI;AACnB,YAAA,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE;AACzB,YAAA,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,EAAE;AACvC,YAAA,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,EAAE;AACvC,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,iBAAiB,EAAE,gBAAgB;SACpC,CAAC;;AAGF,QAAA,IAAI,OAAO,IAAI,QAAQ,CAAC,UAAU,EAAE;AAClC,YAAA,OAAO,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;AAC1C,SAAA;;AAGD,QAAA,IAAI,QAAQ;AAAE,YAAA,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC1C,QAAA,IAAI,eAAe;AAAE,YAAA,OAAO,CAAC,eAAe,GAAG,eAAe,CAAC;AAE/D,QAAA,OAAO,OAAO,CAAC;KAChB;;AA5QU,eAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,+CAMhB,uBAAuB,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AANtB,eAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cAFd,MAAM,EAAA,CAAA,CAAA;4FAEP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;0BAOI,MAAM;2BAAC,uBAAuB,CAAA;;;MCHtB,uBAAuB,CAAA;AAClC,IAAA,WAAA,CACU,WAAwB,EACxB,YAA0B,EAC1B,eAAgC,EAAA;QAFhC,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QACxB,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;QAC1B,IAAe,CAAA,eAAA,GAAf,eAAe,CAAiB;KACrC;AAEL;;AAEG;AACH,IAAA,eAAe,CAAC,UAAkB,EAAA;QAChC,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;QAED,MAAM,UAAU,GAA0B,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,wBAAwB,CAAC;AACvC,QAAA,IAAI,KAAK,CAAC;QACV,IAAI,YAAY,GAAG,IAAI,CAAC;AAExB,QAAA,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,EAAE;YAChD,MAAM,GAAG,QAAQ,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;AACnC,YAAA,IAAI,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;;AAGlC,YAAA,IAAI,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAChE,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5C,aAAA;;AAGD,YAAA,IAAI,YAAY,IAAI,CAAC,QAAQ,EAAE;AAC7B,gBAAA,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;AAC7D,aAAA;AAAM,iBAAA,IAAI,QAAQ,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;AACxC,gBAAA,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;AAC7D,aAAA;iBAAM,IAAI,QAAQ,KAAK,GAAG,EAAE;AAC3B,gBAAA,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;AAC7D,aAAA;YAED,YAAY,GAAG,KAAK,CAAC;AACtB,SAAA;AAED,QAAA,OAAO,UAAU,CAAC;KACnB;AAED;;AAEG;AACH,IAAA,kBAAkB,CAAC,UAAkB,EAAA;QACnC,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC1B,SAAA;;AAGD,QAAA,IAAI,8BAA8B,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACnD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,0JAA0J,EAAE,CAAC;AACrM,SAAA;;AAGD,QAAA,MAAM,UAAU,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC;AACzD,QAAA,IAAI,UAAU,GAAG,CAAC,KAAK,CAAC,EAAE;YACxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,sCAAsC,EAAE,CAAC;AACjF,SAAA;;AAGD,QAAA,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YAC/B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,2CAA2C,EAAE,CAAC;AACtF,SAAA;;AAGD,QAAA,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YAC5D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,0CAA0C,EAAE,CAAC;AACrF,SAAA;AAED,QAAA,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YACxD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,wCAAwC,EAAE,CAAC;AACnF,SAAA;AAED,QAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;KAC1B;AAED;;AAEG;AACH,IAAA,qBAAqB,CAAC,UAAkB,EAAA;QACtC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;AACpD,QAAA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;AAC3B,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AACf,SAAA;;AAGD,QAAA,OAAO,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;KACrE;AAED;;AAEG;AACH,IAAA,yBAAyB,CAAC,UAAkB,EAAA;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;AACpD,QAAA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;AAC3B,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AACf,SAAA;;AAGD,QAAA,OAAO,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;KACzE;AAED;;AAEG;AACK,IAAA,qBAAqB,CAC3B,UAAiC,EACjC,KAAa,EACb,WAAwB,EAAA;AAExB,QAAA,IAAI,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE;YAC9B,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AACpC,SAAA;AAED,QAAA,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;AAEpC,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAClD,SAAS,CAAC,OAAO,IAAG;;AAElB,YAAA,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE;AAChC,gBAAA,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5C,aAAA;AAAM,iBAAA,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE;AACvC,gBAAA,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/C,aAAA;;AAGD,YAAA,OAAO,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,KAAK,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;SACvE,CAAC,CACH,CAAC;KACH;AAED;;AAEG;AACK,IAAA,yBAAyB,CAC/B,UAAiC,EACjC,KAAa,EACb,eAA4B,EAAA;AAE5B,QAAA,IAAI,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE;YAC9B,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;AACxC,SAAA;AAED,QAAA,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;AAEpC,QAAA,OAAO,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CACtD,SAAS,CAAC,WAAW,IAAG;;AAEtB,YAAA,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE;AAChC,gBAAA,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACpD,aAAA;AAAM,iBAAA,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE;AACvC,gBAAA,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AACvD,aAAA;;AAGD,YAAA,OAAO,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,KAAK,GAAG,CAAC,EAAE,eAAe,CAAC,CAAC;SAC/E,CAAC,CACH,CAAC;KACH;AAED;;AAEG;AACK,IAAA,iBAAiB,CAAC,QAAgB,EAAA;;AAExC,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,IAAI,CAChD,SAAS,CAAC,IAAI,IAAG;AACf,YAAA,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE;gBAChC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AACtB,aAAA;;AAGD,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAClD,SAAS,CAAC,KAAK,IAAG;AAChB,gBAAA,IAAI,KAAK,IAAI,KAAK,CAAC,UAAU,EAAE;;oBAE7B,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AACrD,iBAAA;;AAGD,gBAAA,OAAO,EAAE,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACrC,aAAC,CAAC,EACF,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CACzB,CAAC;AACJ,SAAC,CAAC,EACF,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CACzB,CAAC;KACH;AAED;;AAEG;AACK,IAAA,qBAAqB,CAAC,QAAgB,EAAA;;AAE5C,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,IAAI,CACxD,SAAS,CAAC,QAAQ,IAAG;AACnB,YAAA,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,UAAU,EAAE;gBAC5C,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1B,aAAA;;YAGD,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,eAAe,IAAI,QAAQ,CAAC,UAAU,EAAE;;gBAExE,OAAO,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAC5D,aAAA;;AAGD,YAAA,OAAO,EAAE,CAAC,QAAQ,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC3C,SAAC,CAAC,EACF,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CACzB,CAAC;KACH;AAED;;AAEG;IACH,aAAa,CAAC,MAAc,EAAE,OAAe,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CACjD,SAAS,CAAC,KAAK,IAAG;AAChB,YAAA,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AAC/B,gBAAA,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;AAClB,aAAA;YAED,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CACtD,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CACzC,CAAC;AACJ,SAAC,CAAC,EACF,UAAU,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAC5B,CAAC;KACH;AAED;;AAEG;AACH,IAAA,aAAa,CAAC,MAAc,EAAA;AAC1B,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,IAAI,CACvC,SAAS,CAAC,MAAM,IAAG;YACjB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AAClC,gBAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AACf,aAAA;;AAGD,YAAA,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,IAClC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CACvC,GAAG,CAAC,QAAQ,IAAI,QAAQ,GAAG,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAC5C,CACF,CAAC;YAEF,OAAO,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAC/B,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,IAAI,CAAa,CAAC,CAC9D,CAAC;AACJ,SAAC,CAAC,EACF,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CACzB,CAAC;KACH;;qHAlQU,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAvB,uBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFtB,MAAM,EAAA,CAAA,CAAA;4FAEP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;MCHY,6BAA6B,CAAA;AAIxC,IAAA,WAAA,GAAA;;AAFQ,QAAA,IAAA,CAAA,oBAAoB,GAAG,IAAI,GAAG,EAAuB,CAAC;KAE7C;AAEjB;;;AAGG;AACH,IAAA,eAAe,CAAC,UAAkB,EAAA;QAChC,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;QAED,MAAM,UAAU,GAA0B,EAAE,CAAC;;QAG7C,MAAM,KAAK,GAAG,wBAAwB,CAAC;AACvC,QAAA,IAAI,KAAK,CAAC;QACV,IAAI,YAAY,GAAG,IAAI,CAAC;AAExB,QAAA,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,EAAE;YAChD,MAAM,GAAG,QAAQ,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC;AACtC,YAAA,IAAI,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;;AAG9B,YAAA,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAClD,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9B,aAAA;;AAGD,YAAA,IAAI,YAAY,IAAI,CAAC,QAAQ,EAAE;gBAC7B,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;AAC9C,aAAA;AAAM,iBAAA,IAAI,QAAQ,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;gBACxC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;AAC9C,aAAA;iBAAM,IAAI,QAAQ,KAAK,GAAG,EAAE;gBAC3B,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;AAC9C,aAAA;YAED,YAAY,GAAG,KAAK,CAAC;AACtB,SAAA;AAED,QAAA,OAAO,UAAU,CAAC;KACnB;AAED;;AAEG;AACH,IAAA,kBAAkB,CAAC,MAAc,EAAE,UAAkB,EAAE,SAAgD,EAAA;;;AAIrG,QAAA,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,KAAK,CAAC;;AAG9B,QAAA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;;QAGxC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,KAAK,GAAG,CAAC,KAAa;;YAE3D,IAAI,KAAK,GAAG,EAAE,EAAE;AACd,gBAAA,OAAO,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;AAC3E,gBAAA,OAAO,KAAK,CAAC;AACd,aAAA;;YAGD,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;;;YAI9C,IAAI,YAAY,GAAG,KAAK,CAAC;;AAGzB,YAAA,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE;gBAC3B,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;;;gBAIlC,IAAI,QAAQ,KAAK,MAAM,EAAE;AACvB,oBAAA,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,EAAE;wBACzB,YAAY,GAAG,IAAI,CAAC;AACrB,qBAAA;AAAM,yBAAA,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,EAAE;wBAChC,YAAY,GAAG,KAAK,CAAC;AACtB,qBAAA;oBACD,SAAS;AACV,iBAAA;;AAGD,gBAAA,MAAM,gBAAgB,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;gBAChE,IAAI,gBAAgB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;;AAEpD,oBAAA,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;AAE/D,oBAAA,IAAI,eAAe,IAAI,eAAe,CAAC,UAAU,EAAE;;AAEjD,wBAAA,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;;AAG5B,wBAAA,MAAM,qBAAqB,GAAG,eAAe,CAAC,eAAe,CAAC,UAAU,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;AAErF,wBAAA,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,qBAAqB,EAAE;4BAClD,YAAY,GAAG,IAAI,CAAC;AACrB,yBAAA;AAAM,6BAAA,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,qBAAqB,EAAE;4BACzD,YAAY,GAAG,KAAK,CAAC;AACtB,yBAAA;;AAGD,wBAAA,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAChC,qBAAA;AACF,iBAAA;AACF,aAAA;AAED,YAAA,OAAO,YAAY,CAAC;AACtB,SAAC,CAAC;;AAGF,QAAA,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;KACpC;;2HAtHU,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAA7B,6BAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,6BAA6B,cAF5B,MAAM,EAAA,CAAA,CAAA;4FAEP,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAHzC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;MCYY,gBAAgB,CAAA;IAG3B,WACU,CAAA,SAA2B,EAC3B,WAAwB,EACxB,gBAAyC,EACzC,sBAAqD,EACpB,MAA4B,EAAA;QAJ7D,IAAS,CAAA,SAAA,GAAT,SAAS,CAAkB;QAC3B,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QACxB,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAyB;QACzC,IAAsB,CAAA,sBAAA,GAAtB,sBAAsB,CAA+B;QACpB,IAAM,CAAA,MAAA,GAAN,MAAM,CAAsB;AAErE,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;KAC7B;AAED;;;;;AAKG;AACH,IAAA,qBAAqB,CAAC,MAAc,EAAE,WAAmB,CAAC,EAAE,aAAqB,CAAC,EAAA;AAChF,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAG,EAAA,IAAI,CAAC,MAAM,CAAwB,qBAAA,EAAA,MAAM,EAAE,EAAE;AACxE,YAAA,MAAM,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,QAAQ,EAAE,EAAE;AAC/E,SAAA,CAAC,CAAC;KACJ;AAED;;AAEG;IACH,oBAAoB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAG,EAAA,IAAI,CAAC,MAAM,CAA+B,6BAAA,CAAA,CAAC,CAAC;KAC1E;AAED;;AAEG;IACH,kBAAkB,GAAA;QAChB,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,IAAI,CACrCC,KAAG,CAAC,KAAK,IAAI,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,CACrD,CAAC;KACH;AAED;;AAEG;IACH,mBAAmB,GAAA;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,IAAI,CACtCA,KAAG,CAAC,MAAM,IAAI,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAC,CACxD,CAAC;KACH;AAED;;AAEG;IACH,sBAAsB,GAAA;;;AAIpB,QAAA,OAAO,QAAQ,CAAC;AACd,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;AAC5B,YAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;AAC5B,SAAA,CAAC,CAAC,IAAI;;QAELA,KAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,KAAI;;;AAGtB,YAAA,MAAM,YAAY,GAAG,IAAI,GAAG,EAAyB,CAAC;AACtD,YAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAoB,CAAC;AACrD,YAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;;;AAI3C,YAAA,MAAM,CAAC,OAAO,CAAC,KAAK,IAAG;AACrB,gBAAA,MAAM,IAAI,GAAkB;oBAC1B,EAAE,EAAE,KAAK,CAAC,EAAE;AACZ,oBAAA,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;AACrC,oBAAA,IAAI,EAAE,OAAO;AACb,oBAAA,QAAQ,EAAE;wBACR,WAAW,EAAE,KAAK,CAAC,WAAW;wBAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;wBAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;AACrB,qBAAA;AACD,oBAAA,QAAQ,EAAE,EAAE;iBACb,CAAC;gBAEF,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;;gBAGjC,IAAI,KAAK,CAAC,UAAU,EAAE;AACpB,oBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;;AAG3E,oBAAA,UAAU,CAAC,OAAO,CAAC,SAAS,IAAG;wBAC7B,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;;wBAGzC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE;AACvE,4BAAA,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;;AAG/B,4BAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AACnC,gCAAA,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACpC,6BAAA;AACD,4BAAA,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAChD,yBAAA;AACH,qBAAC,CAAC,CAAC;AACJ,iBAAA;AACH,aAAC,CAAC,CAAC;;YAGH,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,OAAO,KAAI;;AAErC,gBAAA,IAAI,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;oBACjC,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAC1D,oBAAA,aAAa,CAAC,OAAO,CAAC,OAAO,IAAG;wBAC9B,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;wBAC5C,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE;4BACpD,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,gCAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;AACvC,4BAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC/B,yBAAA;AACH,qBAAC,CAAC,CAAC;AACJ,iBAAA;;;AAID,gBAAA,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;AACxD,gBAAA,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;AAC7C,oBAAA,OAAO;AACR,iBAAA;gBAED,MAAM,SAAS,GAAG,KAAK;AACpB,qBAAA,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AACzE,qBAAA,GAAG,CAAC,IAAI,KAAK;oBACZ,EAAE,EAAE,IAAI,CAAC,EAAE;AACX,oBAAA,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;AACnC,oBAAA,IAAI,EAAE,MAAM;AACZ,oBAAA,QAAQ,EAAE;wBACR,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;AACpB,qBAAA;AACF,iBAAA,CAAC,CAAC,CAAC;;AAGN,gBAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;oBACxB,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,wBAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;oBACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;AAClC,iBAAA;AACH,aAAC,CAAC,CAAC;;YAGH,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;AACjD,iBAAA,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;;YAGlD,MAAM,cAAc,GAAG,KAAK;AACzB,iBAAA,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACpD,iBAAA,GAAG,CAAC,IAAI,KAAK;gBACZ,EAAE,EAAE,IAAI,CAAC,EAAE;AACX,gBAAA,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;AACnC,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,QAAQ,EAAE;oBACR,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;AACpB,iBAAA;AACF,aAAA,CAAC,CAAC,CAAC;;;YAKN,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;;;;;;AAOpD,YAAA,MAAM,SAAS,GAAoB;AACjC,gBAAA;AACE,oBAAA,EAAE,EAAE,aAAa;AACjB,oBAAA,IAAI,EAAE,QAAQ;AACd,oBAAA,IAAI,EAAE,MAAM;oBACZ,QAAQ,EAAE,SAAS;AACpB,iBAAA;aACF,CAAC;;AAGF,YAAA,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC7B,SAAS,CAAC,IAAI,CAAC;AACb,oBAAA,EAAE,EAAE,YAAY;AAChB,oBAAA,IAAI,EAAE,iBAAiB;AACvB,oBAAA,IAAI,EAAE,MAAM;AACZ,oBAAA,QAAQ,EAAE,cAAc;AACzB,iBAAA,CAAC,CAAC;AACJ,aAAA;;AAGD,YAAA,OAAO,SAAS,CAAC;SAClB,CAAC,CACH,CAAC;KACH;AAED;;AAEG;AACH,IAAA,uBAAuB,CAAC,MAAc,EAAA;AACpC,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAChDA,KAAG,CAAC,MAAM,IAAG;YACX,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK;gBAC1B,EAAE,EAAE,KAAK,CAAC,EAAE;AACZ,gBAAA,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;AACrC,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,QAAQ,EAAE;oBACR,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;AACrB,iBAAA;AACF,aAAA,CAAC,CAAC,CAAC;SACL,CAAC,CACH,CAAC;KACH;AAED;;AAEG;AACK,IAAA,0BAA0B,CAAC,KAAa,EAAA;;AAE9C,QAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgB,CAAC;AACxC,QAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;AACjD,QAAA,MAAM,WAAW,GAAG,IAAI,GAAG,EAAoB,CAAC;;AAGhD,QAAA,KAAK,CAAC,OAAO,CAAC,IAAI,IAAG;YACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;;AAG3B,YAAA,MAAM,IAAI,GAAkB;gBAC1B,EAAE,EAAE,IAAI,CAAC,EAAE;AACX,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,QAAQ,EAAE;oBACR,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;AACpB,iBAAA;aACF,CAAC;;YAGF,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,gBAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;;gBAGjC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;oBACrC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACtC,iBAAA;AACD,gBAAA,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACjD,aAAA;iBAAM,IAAI,IAAI,CAAC,WAAW,EAAE;;AAE3B,gBAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IACjD,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,CAChD,CAAC;AACF,gBAAA,IAAI,OAAO,EAAE;AACX,oBAAA,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;;oBAG5B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;wBAChC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACjC,qBAAA;AACD,oBAAA,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5C,iBAAA;AACF,aAAA;;YAGD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AAC7B,SAAC,CAAC,CAAC;;QAGH,MAAM,SAAS,GAAoB,EAAE,CAAC;QACtC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,KAAI;AAC3B,YAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;;AAEnB,gBAAA,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtB,aAAA;;AAGD,YAAA,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBACvB,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,IAAI,EAAE,CAAC;AAClF,aAAA;AACH,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,SAAS,CAAC;KAClB;AAED;;AAEG;AACK,IAAA,2BAA2B,CAAC,MAAmB,EAAA;;AAErD,QAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqB,CAAC;AAC9C,QAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;AACjD,QAAA,MAAM,WAAW,GAAG,IAAI,GAAG,EAAoB,CAAC;AAChD,QAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;;AAG3C,QAAA,MAAM,CAAC,OAAO,CAAC,KAAK,IAAG;YACrB,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAClD,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;;AAG9B,YAAA,MAAM,IAAI,GAAkB;gBAC1B,EAAE,EAAE,KAAK,CAAC,EAAE;AACZ,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,QAAQ,EAAE;oBACR,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;AACrB,iBAAA;aACF,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;;YAG5B,IAAI,KAAK,CAAC,UAAU,EAAE;AACpB,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;;AAG3E,gBAAA,UAAU,CAAC,OAAO,CAAC,SAAS,IAAG;oBAC7B,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;;AAEzC,oBAAA,IAAI,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AAC1D,wBAAA,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;;AAG/B,wBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AAC9B,4BAAA,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC/B,yBAAA;AACD,wBAAA,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC3C,qBAAA;AACH,iBAAC,CAAC,CAAC;AACJ,aAAA;AACH,SAAC,CAAC,CAAC;;QAGH,MAAM,SAAS,GAAoB,EAAE,CAAC;QACtC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,KAAI;;AAE3B,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AAC7B,gBAAA,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtB,aAAA;;AAGD,YAAA,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBACvB,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,IAAI,EAAE,CAAC;AAClF,aAAA;AACH,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,SAAS,CAAC;KAClB;;AAGO,IAAA,kBAAkB,CAAC,IAAU,EAAA;QACnC,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,OAAO,IAAI,CAAC,IAAI,CAAC;AAClB,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,EAAE;AACrC,YAAA,OAAO,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAI,CAAA,EAAA,IAAI,CAAC,SAAS,IAAI,EAAE,CAAA,CAAE,CAAC,IAAI,EAAE,CAAC;AAClE,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE;AAC5B,YAAA,OAAO,IAAI,CAAC,aAAa,CAAC,IAAc,CAAC;AAC1C,SAAA;QAED,OAAO,IAAI,CAAC,EAAE,CAAC;KAChB;;AAGO,IAAA,aAAa,CAAC,IAAU,EAAE,UAAmB,EAAE,SAAsB,EAAE,EAAA;AAC7E,QAAA,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,KAAK,CAAC;;AAG9B,QAAA,OAAO,IAAI,CAAC,sBAAsB,CAAC,kBAAkB,CACnD,IAAI,CAAC,EAAE,EACP,UAAU,EACV,MAAM;SACP,CAAC;KACH;;IAGO,gBAAgB,CAAC,IAAU,EAAE,MAAmB,EAAA;QACtD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;KACjF;;AAGO,IAAA,mBAAmB,CAAC,KAAgB,EAAA;QAC1C,IAAI,KAAK,CAAC,IAAI,EAAE;YACd,OAAO,KAAK,CAAC,IAAI,CAAC;AACnB,SAAA;AAED,QAAA,IAAI,KAAK,CAAC,aAAa,EAAE,IAAI,EAAE;AAC7B,YAAA,OAAO,KAAK,CAAC,aAAa,CAAC,IAAc,CAAC;AAC3C,SAAA;QAED,OAAO,KAAK,CAAC,EAAE,CAAC;KACjB;;AAzZU,gBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,qJAQjB,uBAAuB,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AARtB,gBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA,CAAA;4FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;0BASI,MAAM;2BAAC,uBAAuB,CAAA;;;MC8JtB,0BAA0B,CAAA;AA8BrC,IAAA,WAAA,CAAoB,gBAAkC,EAAA;QAAlC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;AA7B9C,QAAA,IAAA,CAAA,YAAY,GAAG,CAAC,IAAmB,EAAE,KAAa,KAAc;YACtE,OAAO;AACL,gBAAA,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACvD,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,gBAAA,KAAK,EAAE,KAAK;gBACZ,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC;AACJ,SAAC,CAAC;QAEF,IAAW,CAAA,WAAA,GAAG,IAAI,eAAe,CAC/B,IAAI,IAAI,IAAI,CAAC,KAAK,EAClB,IAAI,IAAI,IAAI,CAAC,UAAU,CACxB,CAAC;AAEF,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,gBAAgB,CAClC,IAAI,CAAC,YAAY,EACjB,IAAI,IAAI,IAAI,CAAC,KAAK,EAClB,IAAI,IAAI,IAAI,CAAC,UAAU,EACvB,IAAI,IAAI,IAAI,CAAC,QAAQ,CACtB,CAAC;AAEF,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAE7E,IAAO,CAAA,OAAA,GAAG,IAAI,CAAC;QACf,IAAU,CAAA,UAAA,GAAG,EAAE,CAAC;QAChB,IAAY,CAAA,YAAA,GAAoB,EAAE,CAAC;QA+BnC,IAAQ,CAAA,QAAA,GAAG,CAAC,CAAS,EAAE,IAAc,KAAK,IAAI,CAAC,UAAU,CAAC;KA7BA;IAE1D,QAAQ,GAAA;QACN,IAAI,CAAC,aAAa,EAAE,CAAC;KACtB;IAED,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;AAEpB,QAAA,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,EAAE,CAAC,SAAS,CAAC;AACvD,YAAA,IAAI,EAAE,CAAC,SAAS,KAAI;AAClB,gBAAA,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;AAC9B,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,SAAS,CAAC;AACjC,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;;AAGrB,gBAAA,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;oBACvE,IAAI,CAAC,WAAW,CAAC,SAAS;yBACvB,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC;AAChC,yBAAA,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,iBAAA;aACF;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;AACjD,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;aACtB;AACF,SAAA,CAAC,CAAC;KACJ;AAID,IAAA,WAAW,CAAC,IAAc,EAAA;QACxB,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,QAAQ,CAAC;AAClB,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,OAAO,CAAC;AACjB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,QAAQ,CAAC;AAClB,YAAA;AACE,gBAAA,OAAO,QAAQ,CAAC;AACnB,SAAA;KACF;AAED,IAAA,gBAAgB,CAAC,IAAc,EAAA;QAC7B,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,WAAW,CAAC;AACrB,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,YAAY,CAAC;AACtB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,WAAW,CAAC;AACrB,YAAA;AACE,gBAAA,OAAO,WAAW,CAAC;AACtB,SAAA;KACF;IAED,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC;YACzC,OAAO;AACR,SAAA;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;;AAGjD,QAAA,MAAM,UAAU,GAAG,CAAC,IAAmB,KAA0B;;AAE/D,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAE/D,YAAA,IAAI,SAAS,EAAE;AACb,gBAAA,OAAO,EAAC,GAAG,IAAI,EAAC,CAAC;AAClB,aAAA;;YAGD,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7C,gBAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ;qBACnC,GAAG,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;qBAC/B,MAAM,CAAC,KAAK,IAAI,KAAK,KAAK,IAAI,CAAoB,CAAC;AAEtD,gBAAA,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC/B,OAAO,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAC,CAAC;AAC9C,iBAAA;AACF,aAAA;YAED,OAAO,IAAI,CAAC;AACd,SAAC,CAAC;AAEF,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY;aACnC,GAAG,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;aAC7B,MAAM,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,CAAoB,CAAC;AAEpD,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,YAAY,CAAC;;AAGpC,QAAA,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1F,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;AAC9B,SAAA;KACF;;wHAhIU,0BAA0B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA1B,0BAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,0BAA0B,EA1J3B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqDT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,ykCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA9DC,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,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,EACZ,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,4BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,wBAAwB,EACxB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,0WACd,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;4FA4JF,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAvKtC,SAAS;+BACE,wBAAwB,EAAA,UAAA,EACtB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,aAAa;wBACb,aAAa;wBACb,eAAe;wBACf,wBAAwB;wBACxB,kBAAkB;wBAClB,cAAc;wBACd,WAAW;qBACZ,EACS,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqDT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,ykCAAA,CAAA,EAAA,CAAA;;;MC1DU,yBAAyB,CAAA;AAiEpC,IAAA,WAAA,CACU,WAAwB,EAAA;QAAxB,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QAjEzB,IAAU,CAAA,UAAA,GAAY,IAAI,CAAC;QAC3B,IAAM,CAAA,MAAA,GAAW,EAAE,CAAC;QAC7B,IAAW,CAAA,WAAA,GAAW,EAAE,CAAC;;AAGzB,QAAA,IAAA,CAAA,gBAAgB,GAAe;AAC7B,YAAA;AACE,gBAAA,IAAI,EAAE,cAAc;AACpB,gBAAA,IAAI,EAAE,cAAc;AACpB,gBAAA,QAAQ,EAAE,IAAI;AACd,gBAAA,MAAM,EAAE,IAAI;AACZ,gBAAA,QAAQ,EAAE;AACR,oBAAA;AACE,wBAAA,IAAI,EAAE,aAAa;AACnB,wBAAA,IAAI,EAAE,YAAY;AAClB,wBAAA,OAAO,EAAE,EAAE;AACX,wBAAA,QAAQ,EAAE,IAAI;AACd,wBAAA,QAAQ,EAAE;AACR,4BAAA;AACE,gCAAA,IAAI,EAAE,eAAe;AACrB,gCAAA,IAAI,EAAE,MAAM;AACZ,gCAAA,OAAO,EAAE,CAAC;AACX,6BAAA;AACD,4BAAA;AACE,gCAAA,IAAI,EAAE,cAAc;AACpB,gCAAA,IAAI,EAAE,MAAM;AACZ,gCAAA,OAAO,EAAE,EAAE;AACZ,6BAAA;AACD,4BAAA;AACE,gCAAA,IAAI,EAAE,aAAa;AACnB,gCAAA,IAAI,EAAE,MAAM;AACZ,gCAAA,OAAO,EAAE,CAAC;AACX,6BAAA;AACF,yBAAA;AACF,qBAAA;AACD,oBAAA;AACE,wBAAA,IAAI,EAAE,WAAW;AACjB,wBAAA,IAAI,EAAE,YAAY;AAClB,wBAAA,OAAO,EAAE,EAAE;AACX,wBAAA,QAAQ,EAAE,IAAI;AACd,wBAAA,QAAQ,EAAE;AACR,4BAAA;AACE,gCAAA,IAAI,EAAE,cAAc;AACpB,gCAAA,IAAI,EAAE,MAAM;AACZ,gCAAA,OAAO,EAAE,CAAC;AACX,6BAAA;AACD,4BAAA;AACE,gCAAA,IAAI,EAAE,aAAa;AACnB,gCAAA,IAAI,EAAE,MAAM;AACZ,gCAAA,OAAO,EAAE,CAAC;AACX,6BAAA;AACF,yBAAA;AACF,qBAAA;AACD,oBAAA;AACE,wBAAA,IAAI,EAAE,OAAO;AACb,wBAAA,IAAI,EAAE,YAAY;AAClB,wBAAA,OAAO,EAAE,EAAE;AACX,wBAAA,QAAQ,EAAE,KAAK;AACf,wBAAA,QAAQ,EAAE,EAAE;AACb,qBAAA;AACF,iBAAA;AACF,aAAA;SACF,CAAC;KAIG;IAEL,QAAQ,GAAA;QACN,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,yBAAyB,EAAE,CAAC;AAClC,SAAA;KACF;IAED,yBAAyB,GAAA;;AAEvB,QAAA,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,IAAI,IAAG;AACzD,YAAA,IAAI,IAAI,EAAE;;gBAER,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;;gBAGxC,IAAI,CAAC,gBAAgB,GAAG,CAAC;AACvB,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,IAAI,EAAE,cAAc;AACpB,wBAAA,QAAQ,EAAE,IAAI;AACd,wBAAA,MAAM,EAAE,IAAI;AACZ,wBAAA,QAAQ,EAAE,EAAE;AACb,qBAAA,CAAC,CAAC;;AAGH,gBAAA,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE;oBACvC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC;oBACtD,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC;AAChD,wBAAA,IAAI,EAAE,CAAC,OAAO,KAAI;AAChB,4BAAA,IAAI,OAAO,EAAE;gCACX,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAC9C,gCAAA,MAAM,WAAW,GAAa;AAC5B,oCAAA,IAAI,EAAE,WAAW;AACjB,oCAAA,IAAI,EAAE,YAAY;AAClB,oCAAA,QAAQ,EAAE,IAAI;AACd,oCAAA,QAAQ,EAAE,CAAC;4CACT,IAAI,EAAE,QAAQ,GAAG,cAAc;AAC/B,4CAAA,IAAI,EAAE,MAAM;AACZ,4CAAA,OAAO,EAAE,CAAC;yCACX,CAAC;iCACH,CAAC;AACF,gCAAA,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;AACtD,6BAAA;yBACF;wBACD,KAAK,EAAE,MAAK;;AAEV,4BAAA,IAAI,SAAS,EAAE;AACb,gCAAA,MAAM,WAAW,GAAa;AAC5B,oCAAA,IAAI,EAAE,SAAS;AACf,oCAAA,IAAI,EAAE,YAAY;AAClB,oCAAA,QAAQ,EAAE,IAAI;AACd,oCAAA,QAAQ,EAAE,CAAC;4CACT,IAAI,EAAE,QAAQ,GAAG,cAAc;AAC/B,4CAAA,IAAI,EAAE,MAAM;AACZ,4CAAA,OAAO,EAAE,CAAC;yCACX,CAAC;iCACH,CAAC;AACF,gCAAA,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;AACtD,6BAAA;yBACF;AACF,qBAAA,CAAC,CAAC;AACJ,iBAAA;;gBAGD,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC;AACpD,oBAAA,IAAI,EAAE,CAAC,MAAM,KAAI;AACf,wBAAA,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AAC/B,4BAAA,MAAM,UAAU,GAAa;AAC3B,gCAAA,IAAI,EAAE,kBAAkB;AACxB,gCAAA,IAAI,EAAE,YAAY;AAClB,gCAAA,QAAQ,EAAE,IAAI;gCACd,OAAO,EAAE,MAAM,CAAC,MAAM;gCACtB,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK;AAC7B,oCAAA,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE;AAC5B,oCAAA,IAAI,EAAE,MAAM;AACZ,oCAAA,OAAO,EAAE,KAAK,CAAC,WAAW,IAAI,CAAC;AAChC,iCAAA,CAAC,CAAC;6BACJ,CAAC;AACF,4BAAA,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;AACrD,yBAAA;qBACF;oBACD,KAAK,EAAE,MAAK;;AAEV,wBAAA,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;qBAC7C;AACF,iBAAA,CAAC,CAAC;AACJ,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;;AAGO,IAAA,WAAW,CAAC,IAAU,EAAA;QAC5B,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,OAAO,IAAI,CAAC,IAAI,CAAC;AAClB,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,EAAE;AACrC,YAAA,OAAO,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAI,CAAA,EAAA,IAAI,CAAC,SAAS,IAAI,EAAE,CAAA,CAAE,CAAC,IAAI,EAAE,CAAC;AAClE,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE;AAC5B,YAAA,OAAO,IAAI,CAAC,aAAa,CAAC,IAAc,CAAC;AAC1C,SAAA;QAED,OAAO,IAAI,CAAC,EAAE,CAAC;KAChB;AAED,IAAA,UAAU,CAAC,IAAc,EAAA;AACvB,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;KAChC;IAED,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB,OAAO,IAAI,CAAC,gBAAgB,CAAC;AAC9B,SAAA;;AAGD,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAc,KAChE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CACtD,CAAC;KACH;IAEO,UAAU,CAAC,IAAc,EAAE,KAAa,EAAA;;AAE9C,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;;QAG5D,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;;YAG7E,OAAO,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;AAChD,SAAA;;AAGD,QAAA,OAAO,WAAW,CAAC;KACpB;AAEO,IAAA,QAAQ,CAAC,GAAQ,EAAA;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;KACxC;;uHA/MU,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAR,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;2GAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7BtC,0iEA4Cc,EDvBV,MAAA,EAAA,CAAA,0/DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,ogBACZ,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;4FAKF,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAZrC,SAAS;+BACE,uBAAuB,EAAA,UAAA,EACrB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,aAAa;wBACb,eAAe;wBACf,WAAW;AACZ,qBAAA,EAAA,QAAA,EAAA,0iEAAA,EAAA,MAAA,EAAA,CAAA,0/DAAA,CAAA,EAAA,CAAA;+FAKQ,UAAU,EAAA,CAAA;sBAAlB,KAAK;gBACG,MAAM,EAAA,CAAA;sBAAd,KAAK;;;MEOK,sBAAsB,CAAA;AAUjC,IAAA,WAAA,CACU,EAAe,EACf,WAAwB,EACzB,SAA+C,EACtB,IAAS,EAAA;QAHjC,IAAE,CAAA,EAAA,GAAF,EAAE,CAAa;QACf,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QACzB,IAAS,CAAA,SAAA,GAAT,SAAS,CAAsC;QACtB,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAK;QAZ3C,IAAS,CAAA,SAAA,GAAG,SAAS,CAAC;QACtB,IAAiB,CAAA,iBAAA,GAAW,EAAE,CAAC;QAE/B,IAAW,CAAA,WAAA,GAAa,EAAE,CAAC;QAC3B,IAAK,CAAA,KAAA,GAAa,EAAE,CAAC;AACrB,QAAA,IAAA,CAAA,mBAAmB,GAAyB,EAAE,CAAC,EAAE,CAAC,CAAC;AACnD,QAAA,IAAA,CAAA,aAAa,GAAyB,EAAE,CAAC,EAAE,CAAC,CAAC;QAQ3C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;AAC5B,YAAA,SAAS,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC;AACpC,YAAA,QAAQ,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC;AACnC,YAAA,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;YACpD,MAAM,EAAE,CAAC,IAAI,CAAC;YACd,UAAU,EAAE,CAAC,EAAE,CAAC;YAChB,IAAI,EAAE,CAAC,EAAE,CAAC;YACV,OAAO,EAAE,CAAC,EAAE,CAAC;AACd,SAAA,CAAC,CAAC;KACJ;IAED,QAAQ,GAAA;QACN,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC7B,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,iBAAiB,EAAE,CAAC;KAC1B;IAED,qBAAqB,GAAA;QACnB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,KAAK,IAAG;;AAE5C,YAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,IACxC,IAAI,CAAC,IAAI,KAAK,MAAM;AACpB,gBAAA,IAAI,CAAC,MAAM,KAAK,IAAI,CACrB,CAAC;AACJ,SAAC,CAAC,CAAC;KACJ;IAED,uBAAuB,GAAA;QACrB,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,WAAW,IAAG;AACxD,YAAA,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;AACjC,SAAC,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,KAAK,IAAG;AAC5C,YAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AACrB,SAAC,CAAC,CAAC;KACJ;IAED,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAE,CAAC,YAAY,CAAC,IAAI,CAC3E,SAAS,CAAC,EAAE,CAAC,EACb,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,CACjE,CAAC;AAEF,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,YAAY,CAAC,IAAI,CAC/D,SAAS,CAAC,EAAE,CAAC,EACb,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,CAC3D,CAAC;KACH;IAEO,cAAc,CAAC,OAAiB,EAAE,KAAa,EAAA;AACrD,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;;AAGtF,QAAA,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC,EAAE;AAC3E,YAAA,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACzB,SAAA;AAED,QAAA,OAAO,QAAQ,CAAC;KACjB;AAED,IAAA,WAAW,CAAC,GAAW,EAAA;AACrB,QAAA,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;KACtB;IAED,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;KACxB;IAED,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;AACvB,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;;AAGtC,YAAA,MAAM,OAAO,GAAS;gBACpB,EAAE,EAAE,SAAS,CAAC,KAAK;AACnB,gBAAA,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,UAAU,EAAE,SAAS,CAAC,SAAS;gBAC/B,SAAS,EAAE,SAAS,CAAC,QAAQ;gBAC7B,KAAK,EAAE,SAAS,CAAC,KAAK;AACtB,gBAAA,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,EAAE;AAC1B,gBAAA,UAAU,EAAE,SAAS,CAAC,UAAU,IAAI,EAAE;AACtC,gBAAA,UAAU,EAAE,SAAS,CAAC,OAAO,IAAI,IAAI;AACrC,gBAAA,aAAa,EAAE;oBACb,IAAI,EAAE,GAAG,SAAS,CAAC,SAAS,CAAI,CAAA,EAAA,SAAS,CAAC,QAAQ,CAAE,CAAA;AACrD,iBAAA;;gBAED,IAAI,EAAE,GAAG,SAAS,CAAC,SAAS,CAAI,CAAA,EAAA,SAAS,CAAC,QAAQ,CAAE,CAAA;gBACpD,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,QAAQ,GAAG,UAAU;AAChD,gBAAA,SAAS,EAAE,CAAC;AACZ,gBAAA,MAAM,EAAE,CAAC;aACV,CAAC;;YAGF,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC;AAC1C,gBAAA,IAAI,EAAE,CAAC,IAAI,KAAI;AACb,oBAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;iBAC5B;AACD,gBAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,oBAAA,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;;AAE3C,oBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE;;AAExB,wBAAA,IAAI,OAAO,CAAC,uEAAuE,CAAC,EAAE;4BACpF,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,SAAS,CAAC;AAChD,gCAAA,IAAI,EAAE,CAAC,IAAI,KAAI;AACb,oCAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;iCAC5B;AACD,gCAAA,KAAK,EAAE,CAAC,WAAW,KAAI;AACrB,oCAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,WAAW,CAAC,CAAC;oCACnD,KAAK,CAAC,yBAAyB,IAAI,WAAW,CAAC,OAAO,IAAI,WAAW,CAAC,CAAC,CAAC;iCACzE;AACF,6BAAA,CAAC,CAAC;AACJ,yBAAA;AACF,qBAAA;AAAM,yBAAA;wBACL,KAAK,CAAC,sBAAsB,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC;AAC1D,qBAAA;iBACF;AACF,aAAA,CAAC,CAAC;AACJ,SAAA;KACF;;AAzIU,sBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,mGAcvB,eAAe,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;wGAdd,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtCnC,gpJAgHM,EAAA,MAAA,EAAA,CAAA,i/DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1FF,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,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,mBAAmB,EACnB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,8BACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,qBAAqB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,KAAA,CAAA,eAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,8BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,KAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,mDAAA,EAAA,QAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,yBAAyB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;4FAKhB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBApBlC,SAAS;+BACE,qBAAqB,EAAA,UAAA,EACnB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,eAAe;wBACf,kBAAkB;wBAClB,cAAc;wBACd,eAAe;wBACf,eAAe;wBACf,aAAa;wBACb,oBAAoB;wBACpB,aAAa;wBACb,qBAAqB;wBACrB,yBAAyB;AAC1B,qBAAA,EAAA,QAAA,EAAA,gpJAAA,EAAA,MAAA,EAAA,CAAA,i/DAAA,CAAA,EAAA,CAAA;;0BAkBE,MAAM;2BAAC,eAAe,CAAA;;;MExCd,iBAAiB,CAAA;IAG5B,WACU,CAAA,SAA2B,EACM,MAA4B,EAAA;QAD7D,IAAS,CAAA,SAAA,GAAT,SAAS,CAAkB;QACM,IAAM,CAAA,MAAA,GAAN,MAAM,CAAsB;QAErE,IAAI,CAAC,MAAM,GAAG,CAAA,EAAG,MAAM,CAAC,MAAM,eAAe,CAAC;KAC/C;IAED,cAAc,CAAC,OAAe,CAAC,EAAE,KAAc,EAAE,UAAA,GAAkB,IAAI,EAAE,eAAwB,EAAA;AAC/F,QAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE;aAC1B,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEhC,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChD,SAAA;QAED,IAAI,UAAU,KAAK,IAAI,EAAE;AACvB,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;AACtD,SAAA;AAED,QAAA,IAAI,eAAe,EAAE;YACnB,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC;AAC1D,SAAA;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAC5D,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EACzE,UAAU,CAAC,KAAK,IAAG;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;AACrD,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;KACH;AAED,IAAA,iBAAiB,CAAC,EAAU,EAAA;AAC1B,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAM,CAAA,EAAG,IAAI,CAAC,MAAM,CAAI,CAAA,EAAA,EAAE,CAAE,CAAA,CAAC,CAAC,IAAI,CACzD,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,EAC/C,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAA,mCAAA,EAAsC,EAAE,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AAClE,YAAA,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;SACtB,CAAC,CACH,CAAC;KACH;AAED,IAAA,aAAa,CAAC,IAAgB,EAAA;QAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;AAEtD,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAM,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,IAAI,CAC5D,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,EACvD,UAAU,CAAC,KAAK,IAAG;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;AACpD,YAAA,OAAO,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,CAAA,4BAAA,EAA+B,KAAK,CAAC,OAAO,CAAE,CAAA,CAAC,CAAC,CAAC;SACpF,CAAC,CACH,CAAC;KACH;AAED,IAAA,gBAAgB,CAAC,IAAgB,EAAA;QAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;AAEtD,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAM,CAAG,EAAA,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,CAAE,CAAA,EAAE,WAAW,CAAC,CAAC,IAAI,CAC3E,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,EACvD,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAA8B,2BAAA,EAAA,IAAI,CAAC,EAAE,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AAC/D,YAAA,OAAO,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,CAAA,4BAAA,EAA+B,KAAK,CAAC,OAAO,CAAE,CAAA,CAAC,CAAC,CAAC;SACpF,CAAC,CACH,CAAC;KACH;AAED,IAAA,gBAAgB,CAAC,EAAU,EAAA;AACzB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAM,CAAG,EAAA,IAAI,CAAC,MAAM,CAAI,CAAA,EAAA,EAAE,EAAE,CAAC,CAAC,IAAI,CAC5D,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,EACrB,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAA,2BAAA,EAA8B,EAAE,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AAC1D,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;SAClB,CAAC,CACH,CAAC;KACH;AAED,IAAA,WAAW,CAAC,MAAc,EAAE,UAAkB,EAAE,UAAkB,EAAA;QAChE,MAAM,GAAG,GAAG,CAAG,EAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,aAAA,CAAe,CAAC;AACjD,QAAA,MAAM,MAAM,GAAG;AACb,YAAA,OAAO,EAAE,MAAM;AACf,YAAA,WAAW,EAAE,UAAU;AACvB,YAAA,UAAU,EAAE,UAAU;SACvB,CAAC;AAEF,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAM,GAAG,EAAE,MAAM,CAAC,CAAC,IAAI,CAC/C,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,IAAI,KAAK,CAAC,EAC1C,UAAU,CAAC,KAAK,IAAG;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;AAC/C,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;SAClB,CAAC,CACH,CAAC;KACH;AAED,IAAA,aAAa,CAAC,MAAc,EAAA;QAC1B,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,aAAA,EAAgB,MAAM,CAAA,CAAE,CAAC;;AAG1D,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAM,GAAG,CAAC,CAAC,IAAI,CACtC,GAAG,CAAC,QAAQ,IAAG;;;YAGb,OAAO,QAAQ,IAAI,EAAE,CAAC;AACxB,SAAC,CAAC,EACF,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAA,+BAAA,EAAkC,MAAM,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AAClE,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;KACH;;AAID,IAAA,kBAAkB,CAAC,OAAe,EAAA;QAChC,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,kBAAA,EAAqB,OAAO,CAAA,CAAE,CAAC;;AAEhE,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAM,GAAG,CAAC,CAAC,IAAI,CACtC,GAAG,CAAC,QAAQ,IAAG;;YAEb,MAAM,mBAAmB,GAA6B,EAAE,CAAC;AACzD,YAAA,IAAI,QAAQ,IAAI,QAAQ,CAAC,cAAc,EAAE;AACvC,gBAAA,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,KAAI;AAC5E,oBAAA,mBAAmB,CAAC,UAAU,CAAC,GAAG,WAAuB,CAAC;AAC5D,iBAAC,CAAC,CAAC;AACJ,aAAA;AAAM,iBAAA;;AAEN,aAAA;AACD,YAAA,OAAO,mBAAmB,CAAC;AAC7B,SAAC,CAAC,EACF,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAA,qCAAA,EAAwC,OAAO,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AACzE,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;KACH;;AAGD,IAAA,aAAa,CAAC,MAAc,EAAA;QAC1B,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,OAAA,EAAU,MAAM,CAAA,OAAA,CAAS,CAAC;;AAG3D,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAM,GAAG,CAAC,CAAC,IAAI,CACtC,GAAG,CAAC,QAAQ,IAAG;;AAEb,YAAA,OAAO,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC;AAC5D,SAAC,CAAC,EACF,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAA,+BAAA,EAAkC,MAAM,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AAClE,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;KACH;;AAGD,IAAA,eAAe,CAAC,OAAe,EAAA;QAC7B,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,YAAA,EAAe,OAAO,CAAA,QAAA,CAAU,CAAC;;AAGlE,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAM,GAAG,CAAC,CAAC,IAAI,CACtC,GAAG,CAAC,QAAQ,IAAG;;AAEb,YAAA,OAAO,QAAQ,IAAI,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,GAAG,EAAE,CAAC;AAC9D,SAAC,CAAC,EACF,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAA,iCAAA,EAAoC,OAAO,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AACrE,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;KACH;AAED,IAAA,iBAAiB,CAAC,UAAkB,EAAA;QAClC,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,iBAAA,EAAoB,UAAU,CAAA,CAAE,CAAC;;AAGlE,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAM,GAAG,CAAC,CAAC,IAAI,CACtC,GAAG,CAAC,QAAQ,IAAG;;YAEb,MAAM,eAAe,GAA6B,EAAE,CAAC;;AAErD,YAAA,IAAI,QAAQ,IAAI,QAAQ,CAAC,iBAAiB,EAAE;;AAE1C,gBAAA,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,KAAI;AAC3E,oBAAA,eAAe,CAAC,MAAM,CAAC,GAAG,WAAuB,CAAC;AACpD,iBAAC,CAAC,CAAC;AACJ,aAAA;AAAM,iBAAA;;AAEN,aAAA;AACD,YAAA,OAAO,eAAe,CAAC;AACzB,SAAC,CAAC,EACF,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAA,mCAAA,EAAsC,UAAU,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AAC1E,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;KACH;AAED,IAAA,sBAAsB,CAAC,UAAkB,EAAA;QACvC,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,sBAAA,EAAyB,UAAU,CAAA,CAAE,CAAC;;AAGvE,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAM,GAAG,CAAC,CAAC,IAAI,CACtC,GAAG,CAAC,QAAQ,IAAG;;YAEb,MAAM,eAAe,GAA6B,EAAE,CAAC;;AAErD,YAAA,IAAI,QAAQ,IAAI,QAAQ,CAAC,iBAAiB,EAAE;;AAE1C,gBAAA,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,KAAI;AAC3E,oBAAA,eAAe,CAAC,MAAM,CAAC,GAAG,WAAuB,CAAC;AACpD,iBAAC,CAAC,CAAC;AACJ,aAAA;AAAM,iBAAA;;AAEN,aAAA;AACD,YAAA,OAAO,eAAe,CAAC;AACzB,SAAC,CAAC,EACF,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAA,mCAAA,EAAsC,UAAU,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AAC1E,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;KACH;;AAED,IAAA,iBAAiB,CAAC,UAAkB,EAAA;QAClC,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,WAAA,EAAc,UAAU,CAAA,OAAA,CAAS,CAAC;;AAGnE,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAM,GAAG,CAAC,CAAC,IAAI,CACtC,GAAG,CAAC,QAAQ,IAAG;;AAEb,YAAA,OAAO,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC;AAC5D,SAAC,CAAC,EACF,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAA,mCAAA,EAAsC,UAAU,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AAC1E,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;KACH;;AAGD,IAAA,gBAAgB,CAAC,OAAe,EAAA;QAC9B,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,gBAAA,EAAmB,OAAO,CAAA,SAAA,CAAW,CAAC;;AAGvE,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAM,GAAG,CAAC,CAAC,IAAI,CACtC,GAAG,CAAC,QAAQ,IAAG;;AAEb,YAAA,OAAO,QAAQ,IAAI,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,GAAG,EAAE,CAAC;AAChE,SAAC,CAAC,EACF,UAAU,CAAC,KAAK,IAAG;YACjB,OAAO,CAAC,KAAK,CAAC,CAAA,kCAAA,EAAqC,OAAO,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AACtE,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;KACH;IAED,kBAAkB,CAAC,UAAkB,EAAE,IAAyB,EAAA;QAC9D,MAAM,GAAG,GAAG,CAAG,EAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,qBAAA,CAAuB,CAAC;AACzD,QAAA,MAAM,MAAM,GAAG;AACb,YAAA,UAAU,EAAE,UAAU;AACtB,YAAA,eAAe,EAAE,IAAI,CAAC,WAAW,EAAE;SACpC,CAAC;AAEF,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAM,GAAG,EAAE,MAAM,CAAC,CAAC,IAAI,CAC/C,UAAU,CAAC,KAAK,IAAG;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;AACrD,YAAA,OAAO,EAAE,CAAC;AACR,gBAAA,KAAK,EAAE,KAAK;AACZ,gBAAA,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,qCAAqC,CAAC;AAChE,gBAAA,gBAAgB,EAAE,EAAE;AACrB,aAAA,CAAC,CAAC;SACJ,CAAC,CACH,CAAC;KACH;AAED;;AAEG;AACK,IAAA,uBAAuB,CAAC,QAAa,EAAA;AAC3C,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,EAAgB,CAAC;;QAGvC,MAAM,eAAe,GAAmB,EAAE,CAAC;QAC3C,IAAI,QAAQ,CAAC,gBAAgB,EAAE;AAC7B,YAAA,IAAI,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE;gBACxC,eAAe,CAAC,SAAS,GAAG,QAAQ,CAAC,gBAAgB,CAAC,UAAU,CAAC;AAClE,aAAA;AACD,YAAA,IAAI,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE;gBACtC,eAAe,CAAC,OAAO,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC;AAC9D,aAAA;AACD,YAAA,IAAI,QAAQ,CAAC,gBAAgB,CAAC,YAAY,EAAE;gBAC1C,eAAe,CAAC,UAAU,GAAG,QAAQ,CAAC,gBAAgB,CAAC,YAAY,CAAC;AACrE,aAAA;AACD,YAAA,IAAI,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE;gBACxC,eAAe,CAAC,SAAS,GAAG,QAAQ,CAAC,gBAAgB,CAAC,UAAU,CAAC;AAClE,aAAA;AACD,YAAA,IAAI,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE;gBACtC,eAAe,CAAC,OAAO,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC;AAC9D,aAAA;AACF,SAAA;;AAGD,QAAA,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE;AAClE,YAAA,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC;AACpC,SAAA;QACD,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC;AACpB,SAAA;QAED,OAAO;YACL,EAAE,EAAE,QAAQ,CAAC,EAAE;AACf,YAAA,IAAI,EAAE,IAAI;YACV,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,cAAc,EAAE,QAAQ,CAAC,eAAe;YACxC,kBAAkB,EAAE,QAAQ,CAAC,mBAAmB;AAChD,YAAA,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,EAAE;AACvC,YAAA,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,EAAE;YACvC,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,QAAQ,GAAG,UAAU;AAC/C,YAAA,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,eAAe,GAAG,SAAS;AACtF,YAAA,SAAS,EAAE,QAAQ,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,SAAS;AAC1E,YAAA,SAAS,EAAE,QAAQ,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,SAAS;SAC3E,CAAC;KACH;AAED;;AAEG;AACK,IAAA,sBAAsB,CAAC,IAAgB,EAAA;;AAE7C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC;;QAGxC,IAAI,eAAe,GAAQ,IAAI,CAAC;QAChC,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,YAAA,eAAe,GAAG;AAChB,gBAAA,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,SAAS;AAC1C,gBAAA,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO;AACtC,gBAAA,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,UAAU;AAC7C,gBAAA,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,SAAS;AAC1C,gBAAA,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO;aACvC,CAAC;;YAGF,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,GAAG,IAAG;AACzC,gBAAA,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;AACtC,oBAAA,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;AAC7B,iBAAA;AACH,aAAC,CAAC,CAAC;;YAGH,IAAI,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC7C,eAAe,GAAG,IAAI,CAAC;AACxB,aAAA;AACF,SAAA;AAED,QAAA,MAAM,OAAO,GAAG;YACd,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,YAAA,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;YACnC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,eAAe,EAAE,IAAI,CAAC,cAAc;YACpC,mBAAmB,EAAE,IAAI,CAAC,kBAAkB;YAC5C,WAAW,EAAE,IAAI,CAAC,WAAW;AAC7B,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,gBAAgB,EAAE,eAAe;AACjC,YAAA,aAAa,EAAE;gBACb,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,gBAAA,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;AACpC,aAAA;SACF,CAAC;AAEF,QAAA,OAAO,OAAO,CAAC;KAChB;;AAtXU,iBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,+CAKlB,uBAAuB,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AALtB,iBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA,CAAA;4FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;0BAMI,MAAM;2BAAC,uBAAuB,CAAA;;;MCyBtB,uBAAuB,CAAA;IAYlC,WACU,CAAA,EAAe,EACf,WAAwB,EACxB,iBAAoC,EACrC,SAAgD,EACvB,IAAoB,EAC5C,QAAqB,EAAA;QALrB,IAAE,CAAA,EAAA,GAAF,EAAE,CAAa;QACf,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QACxB,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB,CAAmB;QACrC,IAAS,CAAA,SAAA,GAAT,SAAS,CAAuC;QACvB,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAgB;QAC5C,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAa;QAhB/B,IAAS,CAAA,SAAA,GAAG,SAAS,CAAC;QACtB,IAAe,CAAA,eAAA,GAAwE,EAAE,CAAC;QAC1F,IAAkB,CAAA,kBAAA,GAAG,KAAK,CAAC;QAC3B,IAAiB,CAAA,iBAAA,GAAW,EAAE,CAAC;QAE/B,IAAW,CAAA,WAAA,GAAa,EAAE,CAAC;QAC3B,IAAK,CAAA,KAAA,GAAa,EAAE,CAAC;AACrB,QAAA,IAAA,CAAA,mBAAmB,GAAyB,EAAE,CAAC,EAAE,CAAC,CAAC;AACnD,QAAA,IAAA,CAAA,aAAa,GAAyB,EAAE,CAAC,EAAE,CAAC,CAAC;QAU3C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;AAC5B,YAAA,SAAS,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC;AACpC,YAAA,QAAQ,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC;AACnC,YAAA,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;YACpD,MAAM,EAAE,CAAC,IAAI,CAAC;YACd,UAAU,EAAE,CAAC,EAAE,CAAC;YAChB,IAAI,EAAE,CAAC,EAAE,CAAC;YACV,OAAO,EAAE,CAAC,EAAE,CAAC;AACd,SAAA,CAAC,CAAC;KACJ;IAED,QAAQ,GAAA;QACN,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC7B,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AAC/B,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5B,IAAI,SAAS,GAAG,EAAE,CAAC;YACnB,IAAI,QAAQ,GAAG,EAAE,CAAC;;YAGlB,IAAI,IAAI,CAAC,IAAI,EAAE;gBACb,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACvC,gBAAA,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/B,gBAAA,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;AAC/C,aAAA;AAAM,iBAAA,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,EAAE;AAC5C,gBAAA,SAAS,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;AAClC,gBAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;AACjC,aAAA;;AAGD,YAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;AACvB,gBAAA,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,SAAS;AACvC,gBAAA,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,QAAQ;AACpC,gBAAA,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;gBACvB,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,SAAS,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC;AAC5E,gBAAA,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE;AACjC,gBAAA,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;AACrB,gBAAA,OAAO,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;AACjC,aAAA,CAAC,CAAC;AACJ,SAAA;KACF;IAED,qBAAqB,GAAA;QACnB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,KAAK,IAAG;;AAE5C,YAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,IACxC,IAAI,CAAC,IAAI,KAAK,MAAM;gBACpB,IAAI,CAAC,MAAM,KAAK,IAAI;iBACnB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;aACpD,CAAC;AACJ,SAAC,CAAC,CAAC;KACJ;IAED,uBAAuB,GAAA;QACrB,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,WAAW,IAAG;AACxD,YAAA,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;AACjC,SAAC,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,KAAK,IAAG;AAC5C,YAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AACrB,SAAC,CAAC,CAAC;KACJ;IAED,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAE,CAAC,YAAY,CAAC,IAAI,CAC3E,SAAS,CAAC,EAAE,CAAC,EACb,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,CACjE,CAAC;AAEF,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,YAAY,CAAC,IAAI,CAC/D,SAAS,CAAC,EAAE,CAAC,EACb,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,CAC3D,CAAC;KACH;IAEO,cAAc,CAAC,OAAiB,EAAE,KAAa,EAAA;AACrD,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;;AAGtF,QAAA,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC,EAAE;AAC3E,YAAA,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACzB,SAAA;AAED,QAAA,OAAO,QAAQ,CAAC;KACjB;AAED,IAAA,WAAW,CAAC,GAAW,EAAA;AACrB,QAAA,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;QAErB,IAAI,GAAG,KAAK,aAAa,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9D,IAAI,CAAC,mBAAmB,EAAE,CAAC;AAC5B,SAAA;KACF;IAED,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;AACzC,YAAA,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC5C,OAAO;AACR,SAAA;AAED,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;AAC/B,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;;AAG1B,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAEjE,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC;AAC7D,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;;gBAEjB,MAAM,iBAAiB,GAAG,QAAQ,GAAG,0BAA0B,CAAC,IAAI,EAAE,CAAC;gBACvE,MAAM,SAAS,GAAG,QAAQ,GAAG,iBAAiB,CAAC,IAAI,QAAQ,IAAI,EAAE,CAAC;;AAGlE,gBAAA,IAAI,CAAC,CAAC,iBAAiB,IAAI,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,KAAK,CAAC;AAClE,qBAAC,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE;AACvD,oBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;oBAChC,OAAO;AACR,iBAAA;;;AAID,gBAAA,IAAI,iBAAiB,IAAI,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AAClE,oBAAA,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,OAAO,CAAgB,KAAI;wBACpG,MAAM,YAAY,GAAG,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC;wBACzE,OAAO;4BACL,UAAU;4BACV,YAAY;AACZ,4BAAA,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;yBAC3H,CAAC;AACJ,qBAAC,CAAC,CAAC;AACJ,iBAAA;AAAM,qBAAA;AACL,oBAAA,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,KAAI;wBACjF,OAAO;4BACL,UAAU;AACV,4BAAA,YAAY,EAAE,UAAU;4BACxB,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,IAAI,WAAW,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;yBAC3F,CAAC;AACJ,qBAAC,CAAC,CAAC;AACJ,iBAAA;AACD,gBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;aACjC;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;gBACxD,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;AAC7C,gBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;aACjC;AACF,SAAA,CAAC,CAAC;KACJ;IAED,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;KACxB;IAED,MAAM,GAAA;QACJ,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACzC,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YACtC,MAAM,QAAQ,GAAG,CAAA,EAAG,SAAS,CAAC,SAAS,CAAA,CAAA,EAAI,SAAS,CAAC,QAAQ,CAAA,CAAE,CAAC;;;AAKhE,YAAA,MAAM,WAAW,GAAS;AACxB,gBAAA,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI;gBACjB,EAAE,EAAE,SAAS,CAAC,KAAK;AACnB,gBAAA,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,UAAU,EAAE,SAAS,CAAC,SAAS;gBAC/B,SAAS,EAAE,SAAS,CAAC,QAAQ;gBAC7B,KAAK,EAAE,SAAS,CAAC,KAAK;AACtB,gBAAA,UAAU,EAAE,SAAS,CAAC,UAAU,IAAI,EAAE;AACtC,gBAAA,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,EAAE;AAC1B,gBAAA,UAAU,EAAE,SAAS,CAAC,OAAO,IAAI,IAAI;AACrC,gBAAA,aAAa,EAAE;oBACb,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;AACvC,oBAAA,IAAI,EAAE,QAAQ;AACf,iBAAA;;AAED,gBAAA,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,QAAQ,GAAG,UAAU;aACjD,CAAC;;;YAKF,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC;AACjD,gBAAA,IAAI,EAAE,CAAC,IAAI,KAAI;;AAEb,oBAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;iBAC5B;AACD,gBAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,oBAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;;AAE7C,oBAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;iBAC5B;AACF,aAAA,CAAC,CAAC;AACJ,SAAA;KACF;;AA1NU,uBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,iIAiBxB,eAAe,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;yGAjBd,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1CpC,w7LAmJM,EAAA,MAAA,EAAA,CAAA,+gIAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1HF,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,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,EAAAA,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,EAAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,qBAAqB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,KAAA,CAAA,eAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,8BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,KAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,mDAAA,EAAA,QAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACrB,wBAAwB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,yBAAyB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;4FAKhB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBArBnC,SAAS;+BACE,sBAAsB,EAAA,UAAA,EACpB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,eAAe;wBACf,kBAAkB;wBAClB,cAAc;wBACd,eAAe;wBACf,eAAe;wBACf,aAAa;wBACb,oBAAoB;wBACpB,aAAa;wBACb,qBAAqB;wBACrB,wBAAwB;wBACxB,yBAAyB;AAC1B,qBAAA,EAAA,QAAA,EAAA,w7LAAA,EAAA,MAAA,EAAA,CAAA,+gIAAA,CAAA,EAAA,CAAA;;0BAqBE,MAAM;2BAAC,eAAe,CAAA;;;MEgBd,sBAAsB,CAAA;IACjC,WACS,CAAA,SAA+C,EACtB,IAM/B,EAAA;QAPM,IAAS,CAAA,SAAA,GAAT,SAAS,CAAsC;QACtB,IAAI,CAAA,IAAA,GAAJ,IAAI,CAMnC;KACC;IAEJ,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;KAC5B;IAED,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;KAC7B;;AAlBU,sBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,8CAGvB,eAAe,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAHd,sBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,EA5DvB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;AAwBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,6YAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA7BC,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,waACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAX,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;4FA8DJ,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBArElC,SAAS;+BACE,oBAAoB,EAAA,UAAA,EAClB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,eAAe;wBACf,eAAe;wBACf,aAAa;qBACd,EACS,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;AAwBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,6YAAA,CAAA,EAAA,CAAA;;0BAuCE,MAAM;2BAAC,eAAe,CAAA;;;MCjBd,uBAAuB,CAAA;AAwBlC,IAAA,WAAA,CACU,WAAwB,EACxB,gBAAkC,EAClC,gBAAyC,EACzC,sBAAqD,EACrD,iBAAoC,EACpC,MAAiB,EACjB,QAAqB,EACrB,GAAsB,EAAA;QAPtB,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QACxB,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAClC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAyB;QACzC,IAAsB,CAAA,sBAAA,GAAtB,sBAAsB,CAA+B;QACrD,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB,CAAmB;QACpC,IAAM,CAAA,MAAA,GAAN,MAAM,CAAW;QACjB,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAa;QACrB,IAAG,CAAA,GAAA,GAAH,GAAG,CAAmB;QA/BhC,IAAgB,CAAA,gBAAA,GAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC3D,IAAU,CAAA,UAAA,GAAW,EAAE,CAAC;QACxB,IAAkB,CAAA,kBAAA,GAAW,EAAE,CAAC;QAChC,IAAW,CAAA,WAAA,GAAW,EAAE,CAAC;;QAGzB,IAAY,CAAA,YAAA,GAAW,KAAK,CAAC;QAEpB,IAAW,CAAA,WAAA,GAAqC,OAAO,CAAC;AACvD,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,YAAY,EAAoC,CAAC;QAE5E,IAAS,CAAA,SAAA,GAAqC,OAAO,CAAC;QACtD,IAAU,CAAA,UAAA,GAAgB,EAAE,CAAC;QAC7B,IAAkB,CAAA,kBAAA,GAAgB,EAAE,CAAC;QACrC,IAAa,CAAA,aAAA,GAAU,EAAE,CAAC;;QAG1B,IAAO,CAAA,OAAA,GAAG,KAAK,CAAC;QAChB,IAAa,CAAA,aAAA,GAAG,KAAK,CAAC;QACtB,IAAgB,CAAA,gBAAA,GAAG,KAAK,CAAC;QACzB,IAAK,CAAA,KAAA,GAAG,EAAE,CAAC;KAYP;IAEJ,QAAQ,GAAA;;QAEN,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;AACnC,SAAA;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,aAAa,EAAE,CAAC;KACtB;AAED,IAAA,WAAW,CAAC,OAAsB,EAAA;;QAEhC,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,YAAY,EAAE;YACjE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC;AACtD,SAAA;KACF;IAED,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;AAEhB,QAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;AACxB,aAAA,IAAI,CACH,UAAU,CAAC,KAAK,IAAG;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;AAC7C,YAAA,IAAI,CAAC,KAAK,GAAG,+CAA+C,CAAC;YAC7D,IAAI,CAAC,gBAAgB,CAAC,CAAA,OAAA,EAAU,IAAI,CAAC,KAAK,CAAE,CAAA,CAAC,CAAC;AAC9C,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AAChB,SAAC,CAAC,EACF,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,CACrC;aACA,SAAS,CAAC,KAAK,IAAG;AACjB,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;AACxB,YAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;;AAGlC,SAAC,CAAC,CAAC;KACN;IAGD,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAE1B,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;AACzB,aAAA,IAAI,CACH,UAAU,CAAC,KAAK,IAAG;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;AAC9C,YAAA,IAAI,CAAC,gBAAgB,CAAC,4BAA4B,CAAC,CAAC;AACpD,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AAChB,SAAC,CAAC,EACF,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,CAC3C;AACA,aAAA,SAAS,CAAC,CAAC,SAA2B,KAAI;;YAEzC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,KAAK;gBACxC,EAAE,EAAE,KAAK,CAAC,EAAE;AACZ,gBAAA,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;AACtB,gBAAA,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;AACpC,gBAAA,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;AAClC,gBAAA,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,CAAC;gBACnC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,QAAQ,GAAG,UAAU;AAC5C,gBAAA,SAAS,EAAE,KAAK,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,SAAS;AACpE,gBAAA,SAAS,EAAE,KAAK,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,SAAS;AACrE,aAAA,CAAC,CAAC,CAAC;AAEN,SAAC,CAAC,CAAC;KACN;IAED,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,EAAE,CAAC,IAAI,CACjD,UAAU,CAAC,KAAK,IAAG;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;AACjD,YAAA,IAAI,CAAC,gBAAgB,CAAC,uCAAuC,CAAC,CAAC;AAC/D,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AAChB,SAAC,CAAC,EACF,QAAQ,CAAC,MAAM,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,CAC9C,CAAC,SAAS,CAAC,aAAa,IAAG;AAC1B,YAAA,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;AACrC,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,SAAS,CAAC,GAAqC,EAAA;AAC7C,QAAA,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;AACrB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KAC3B;IAED,cAAc,GAAA;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;AACzD,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,UAAU,EAAE,yBAAyB;AACtC,SAAA,CAAC,CAAC;QAEH,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;AACzC,YAAA,IAAI,MAAM,EAAE;;AAEV,gBAAA,IAAI,CAAC,SAAS,EAAE,CAAC;AACjB,gBAAA,IAAI,CAAC,gBAAgB,CAAC,yBAAyB,CAAC,CAAC;AAClD,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,UAAU,CAAC,IAAU,EAAA;QACnB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;AAC1D,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,UAAU,EAAE,yBAAyB;AACrC,YAAA,IAAI,EAAE;gBACJ,IAAI,EAAE,IAAI;AACX,aAAA;AACF,SAAA,CAAC,CAAC;QAEH,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;AACzC,YAAA,IAAI,MAAM,EAAE;;;gBAGV,IAAI,CAAC,SAAS,EAAE,CAAC;AACjB,gBAAA,IAAI,CAAC,gBAAgB,CAAC,2BAA2B,CAAC,CAAC;AACpD,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,YAAY,CAAC,IAAU,EAAA;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;AACzD,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,IAAI,EAAE;AACJ,gBAAA,KAAK,EAAE,aAAa;AACpB,gBAAA,OAAO,EAAE,CAAA,gCAAA,EAAmC,IAAI,CAAC,IAAI,CAAG,CAAA,CAAA;AACxD,gBAAA,WAAW,EAAE,QAAQ;AACrB,gBAAA,UAAU,EAAE,QAAQ;AACpB,gBAAA,KAAK,EAAE,MAAM;AACd,aAAA;AACF,SAAA,CAAC,CAAC;QAEH,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,SAAS,IAAG;AAC5C,YAAA,IAAI,SAAS,EAAE;gBACb,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;AACjC,qBAAA,IAAI,CACH,UAAU,CAAC,KAAK,IAAG;AACjB,oBAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;AAC7C,oBAAA,IAAI,CAAC,gBAAgB,CAAC,0CAA0C,CAAC,CAAC;AAClE,oBAAA,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;AAClB,iBAAC,CAAC,CACH;qBACA,SAAS,CAAC,QAAQ,IAAG;AACpB,oBAAA,IAAI,QAAQ,EAAE;AACZ,wBAAA,IAAI,CAAC,SAAS,EAAE,CAAC;AACjB,wBAAA,IAAI,CAAC,gBAAgB,CAAC,2BAA2B,CAAC,CAAC;AACpD,qBAAA;AACH,iBAAC,CAAC,CAAC;AACN,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;;IAGO,cAAc,GAAA;QACpB,OAAO,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;KACvC;IAED,eAAe,GAAA;QACb,yEAA0E,CAAC,IAAI,CAAC,CAAC,EAAE,wBAAwB,EAAE,KAAI;YAC/G,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE;AAC3D,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;AACxB,aAAA,CAAC,CAAC;YAEH,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;AACzC,gBAAA,IAAI,MAAM,EAAE;;AAEV,oBAAA,MAAM,QAAQ,GAAmB;wBAC/B,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;AACnC,wBAAA,IAAI,EAAE,WAAW;wBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,WAAW,EAAE,MAAM,CAAC,WAAW;AAC/B,wBAAA,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;AACnC,wBAAA,MAAM,EAAE,IAAI;AACZ,wBAAA,aAAa,EAAE;4BACb,IAAI,EAAE,MAAM,CAAC,IAAI;4BACjB,WAAW,EAAE,MAAM,CAAC,WAAW;AAChC,yBAAA;qBACF,CAAC;AAEF,oBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC;AAC/B,yBAAA,IAAI,CACH,UAAU,CAAC,KAAK,IAAG;AACjB,wBAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;AAC9C,wBAAA,IAAI,CAAC,gBAAgB,CAAC,2CAA2C,CAAC,CAAC;AACnE,wBAAA,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;AAClB,qBAAC,CAAC,CACH;yBACA,SAAS,CAAC,KAAK,IAAG;AACjB,wBAAA,IAAI,KAAK,EAAE;AACT,4BAAA,IAAI,CAAC,gBAAgB,CAAC,iCAAiC,CAAC,CAAC;AACzD,4BAAA,IAAI,CAAC,UAAU,EAAE,CAAC;AACnB,yBAAA;AACH,qBAAC,CAAC,CAAC;AACN,iBAAA;AACH,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,WAAW,CAAC,KAAgB,EAAA;QAC1B,yEAA0E,CAAC,IAAI,CAAC,CAAC,EAAE,wBAAwB,EAAE,KAAI;YAC/G,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE;AAC3D,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,IAAI,EAAE;AACJ,oBAAA,MAAM,EAAE,IAAI;AACZ,oBAAA,KAAK,EAAE;wBACL,EAAE,EAAE,KAAK,CAAC,EAAE;wBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,WAAW,EAAE,KAAK,CAAC,WAAW;wBAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;wBAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,WAAW,EAAE,KAAK,CAAC,WAAW;AAC/B,qBAAA;AACF,iBAAA;AACF,aAAA,CAAC,CAAC;YAEH,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;AACzC,gBAAA,IAAI,MAAM,EAAE;;;AAGV,oBAAA,MAAM,YAAY,GAAmB;wBACnC,EAAE,EAAE,KAAK,CAAC,EAAE;wBACZ,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,WAAW,EAAE,MAAM,CAAC,WAAW;wBAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;;AAE7B,wBAAA,IAAI,EAAE,WAAoB;AAC1B,wBAAA,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,QAAQ;AAClC,wBAAA,aAAa,EAAE;4BACb,IAAI,EAAE,MAAM,CAAC,IAAI;4BACjB,WAAW,EAAE,MAAM,CAAC,WAAW;AAChC,yBAAA;qBACF,CAAC;AAEF,oBAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,YAAY,CAAC;AACtC,yBAAA,IAAI,CACH,UAAU,CAAC,KAAK,IAAG;AACjB,wBAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;AAC9C,wBAAA,IAAI,CAAC,gBAAgB,CAAC,2CAA2C,CAAC,CAAC;AACnE,wBAAA,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;AAClB,qBAAC,CAAC,CACH;yBACA,SAAS,CAAC,QAAQ,IAAG;AACpB,wBAAA,IAAI,QAAQ,EAAE;AACZ,4BAAA,IAAI,CAAC,gBAAgB,CAAC,iCAAiC,CAAC,CAAC;AACzD,4BAAA,IAAI,CAAC,UAAU,EAAE,CAAC;AACnB,yBAAA;AACH,qBAAC,CAAC,CAAC;AACN,iBAAA;AACH,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,aAAa,CAAC,KAAgB,EAAA;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;AACzD,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,IAAI,EAAE;AACJ,gBAAA,KAAK,EAAE,cAAc;gBACrB,OAAO,EAAE,8CAA8C,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAI,EAAA,CAAA;AACjF,gBAAA,WAAW,EAAE,QAAQ;AACrB,gBAAA,UAAU,EAAE,QAAQ;AACpB,gBAAA,KAAK,EAAE,MAAM;AACd,aAAA;AACF,SAAA,CAAC,CAAC;QAEH,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,SAAS,IAAG;AAC5C,YAAA,IAAI,SAAS,EAAE;gBACb,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;AAClC,qBAAA,IAAI,CACH,UAAU,CAAC,KAAK,IAAG;AACjB,oBAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;AAC9C,oBAAA,IAAI,CAAC,gBAAgB,CAAC,2CAA2C,CAAC,CAAC;AACnE,oBAAA,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;AACnB,iBAAC,CAAC,CACH;qBACA,SAAS,CAAC,QAAQ,IAAG;AACpB,oBAAA,IAAI,QAAQ,EAAE;AACZ,wBAAA,IAAI,CAAC,gBAAgB,CAAC,iCAAiC,CAAC,CAAC;AACzD,wBAAA,IAAI,CAAC,UAAU,EAAE,CAAC;AACnB,qBAAA;AACH,iBAAC,CAAC,CAAC;AACN,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;IAED,kBAAkB,GAAA;;AAEhB,QAAA,IAAI,CAAC,gBAAgB,CAAC,wCAAwC,CAAC,CAAC;KACjE;IAED,mBAAmB,GAAA;QACjB,wEAAsE,CAAC,IAAI,CAAC,CAAC,EAAE,uBAAuB,EAAE,KAAI;YAC1G,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;AAC1D,gBAAA,KAAK,EAAE,OAAO;gBACd,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE;AACxC,aAAA,CAAC,CAAC;YAEH,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;AACzC,gBAAA,IAAI,MAAM,EAAE;AACV,oBAAA,IAAI,CAAC,gBAAgB,CAAC,+BAA+B,CAAC,CAAC;AACvD,oBAAA,IAAI,CAAC,SAAS,EAAE,CAAC;AAClB,iBAAA;AACH,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;KACJ;AAGD,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,IAAI,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC;;AAGnC,QAAA,IAAI,KAAK,EAAE;YACT,MAAM,WAAW,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;AAC3E,YAAA,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;AAChC,SAAA;QAED,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE;YAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;YAClD,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,IACrC,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;iBAC7C,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;iBAChD,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;AAChD,iBAAC,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CACvD,CAAC;AACH,SAAA;;AAGD,QAAA,IAAI,IAAI,CAAC,YAAY,KAAK,KAAK,EAAE;AAC/B,YAAA,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC;AAC/E,SAAA;AAGD,QAAA,IAAI,CAAC,kBAAkB,GAAG,YAAY,CAAC;KACxC;IAED,oBAAoB,GAAA;QAClB,IAAI,CAAC,WAAW,EAAE,CAAC;KACpB;IAGD,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;AAC1B,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAC;KAC3C;IAED,gBAAgB,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,WAAW,KAAK,EAAE;AACvB,YAAA,IAAI,CAAC,YAAY,KAAK,KAAK,CAAC;KACpC;AAED,IAAA,cAAc,CAAC,MAAc,EAAA;QAC3B,OAAO,MAAM,KAAK,QAAQ,GAAG,eAAe,GAAG,iBAAiB,CAAC;KAClE;IAED,SAAS,GAAA;QACP,IAAI,CAAC,SAAS,EAAE,CAAC;KAClB;AAED,IAAA,eAAe,CAAC,IAAY,EAAA;AAC1B,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KACxD;;IAGO,WAAW,CAAC,OAAe,EAAE,KAAU,EAAA;AAC7C,QAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACrB,QAAA,IAAI,CAAC,gBAAgB,CAAC,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,KAAK,CAAC,OAAO,IAAI,2BAA2B,CAAA,CAAE,CAAC,CAAC;KACtF;AAEO,IAAA,gBAAgB,CAAC,OAAe,EAAA;QACtC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE;AACnC,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,kBAAkB,EAAE,KAAK;AACzB,YAAA,gBAAgB,EAAE,QAAQ;AAC3B,SAAA,CAAC,CAAC;KACJ;;qHA7ZU,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAL,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAiB,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,uBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,6BAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAV,EAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAAH,IAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,uBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,mLC7DpC,usUA2PM,EAAA,MAAA,EAAA,CAAA,snLAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDrNF,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,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,EAAAA,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,EACZ,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,8BACb,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,8SACd,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,8BACd,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,iBAAiB,EACjB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAiB,8BACjB,wBAAwB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACxB,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,mBAAmB,+BACnB,0BAA0B,EAAA,QAAA,EAAA,wBAAA,EAAA,CAAA,EAAA,CAAA,CAAA;4FAKjB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBA3BnC,SAAS;+BACE,qBAAqB,EAAA,UAAA,EACnB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,cAAc;wBACd,kBAAkB;wBAClB,aAAa;wBACb,eAAe;wBACf,aAAa;wBACb,cAAc;wBACd,kBAAkB;wBAClB,eAAe;wBACf,aAAa;wBACb,cAAc;wBACd,aAAa;wBACb,iBAAiB;wBACjB,eAAe;wBACf,iBAAiB;wBACjB,wBAAwB;wBACxB,WAAW;wBACX,mBAAmB;wBACnB,0BAA0B;AAC3B,qBAAA,EAAA,QAAA,EAAA,usUAAA,EAAA,MAAA,EAAA,CAAA,snLAAA,CAAA,EAAA,CAAA;wTAaQ,WAAW,EAAA,CAAA;sBAAnB,KAAK;gBACI,UAAU,EAAA,CAAA;sBAAnB,MAAM;;;ME3BI,mBAAmB,CAAA;AAM9B,IAAA,WAAA,CACU,YAA0B,EAC1B,MAAiB,EACjB,QAAqB,EAAA;QAFrB,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;QAC1B,IAAM,CAAA,MAAA,GAAN,MAAM,CAAW;QACjB,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAa;AAR/B,QAAA,IAAA,CAAA,gBAAgB,GAAa,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACzF,IAAU,CAAA,UAAA,GAAgB,EAAE,CAAC;QAC7B,IAAkB,CAAA,kBAAA,GAAgB,EAAE,CAAC;QACrC,IAAW,CAAA,WAAA,GAAW,EAAE,CAAC;KAMrB;IAEJ,QAAQ,GAAA;QACN,IAAI,CAAC,UAAU,EAAE,CAAC;KACnB;IAED,UAAU,GAAA;QACR,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;;AAE/C,YAAA,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;AACzB,YAAA,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC;AACnC,SAAC,CAAC,CAAC;KACJ;IAGD,eAAe,GAAA;QACb,yEAA0E,CAAC,IAAI,CAAC,CAAC,EAAE,wBAAwB,EAAE,KAAI;YAC/G,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE;AAC3D,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;AACxB,aAAA,CAAC,CAAC;YAEH,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;AACzC,gBAAA,IAAI,MAAM,EAAE;oBACV,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC;AAC3C,wBAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;4BACjB,IAAI,CAAC,UAAU,EAAE,CAAC;AAClB,4BAAA,IAAI,CAAC,gBAAgB,CAAC,iCAAiC,CAAC,CAAC;yBAC1D;AACD,wBAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,4BAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;;AAE9C,4BAAA,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,+BAA+B,CAAC,EAAE;AACpF,gCAAA,IAAI,CAAC,UAAU,EAAE,CAAC;AAClB,gCAAA,IAAI,CAAC,gBAAgB,CAAC,iCAAiC,CAAC,CAAC;AAC1D,6BAAA;AAAM,iCAAA;;gCAEL,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,OAAO,IAAI,6BAA6B,CAAC;AACzF,gCAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;AAC9C,6BAAA;yBACF;AACF,qBAAA,CAAC,CAAC;AACJ,iBAAA;AACH,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,WAAW,CAAC,KAAgB,EAAA;QAC1B,yEAA0E,CAAC,IAAI,CAAC,CAAC,EAAE,wBAAwB,EAAE,KAAI;YAC/G,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE;AAC3D,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;AAC9B,aAAA,CAAC,CAAC;YAEH,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;AACzC,gBAAA,IAAI,MAAM,EAAE;oBACV,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC;AAC9C,wBAAA,IAAI,EAAE,CAAC,YAAY,KAAI;4BACrB,IAAI,CAAC,UAAU,EAAE,CAAC;AAClB,4BAAA,IAAI,CAAC,gBAAgB,CAAC,iCAAiC,CAAC,CAAC;yBAC1D;AACD,wBAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,4BAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;;AAE9C,4BAAA,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,+BAA+B,CAAC,EAAE;AACpF,gCAAA,IAAI,CAAC,UAAU,EAAE,CAAC;AAClB,gCAAA,IAAI,CAAC,gBAAgB,CAAC,iCAAiC,CAAC,CAAC;AAC1D,6BAAA;AAAM,iCAAA;;gCAEL,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,OAAO,IAAI,6BAA6B,CAAC;AACzF,gCAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;AAC9C,6BAAA;yBACF;AACF,qBAAA,CAAC,CAAC;AACJ,iBAAA;AACH,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,aAAa,CAAC,KAAgB,EAAA;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;AACzD,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,IAAI,EAAE;AACJ,gBAAA,KAAK,EAAE,mBAAmB;AAC1B,gBAAA,OAAO,EAAE,CAAA,gCAAA,EAAmC,KAAK,CAAC,IAAI,CAAG,CAAA,CAAA;AACzD,gBAAA,WAAW,EAAE,QAAQ;AACrB,gBAAA,UAAU,EAAE,QAAQ;AACpB,gBAAA,KAAK,EAAE,MAAM;AACd,aAAA;AACF,SAAA,CAAC,CAAC;QAEH,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,SAAS,IAAG;AAC5C,YAAA,IAAI,SAAS,EAAE;AACb,gBAAA,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,IAAG;AAC1D,oBAAA,IAAI,OAAO,EAAE;wBACX,IAAI,CAAC,UAAU,EAAE,CAAC;AAClB,wBAAA,IAAI,CAAC,gBAAgB,CAAC,iCAAiC,CAAC,CAAC;AAC1D,qBAAA;AACH,iBAAC,CAAC,CAAC;AACJ,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,WAAW,CAAC,KAAY,EAAA;QACtB,MAAM,WAAW,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;AAC3E,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;AAE/B,QAAA,IAAI,WAAW,EAAE;YACf,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,IACpD,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAC9C,KAAK,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CACvD,CAAC;AACH,SAAA;AAAM,aAAA;YACL,IAAI,CAAC,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;AAChD,SAAA;KACF;IAED,SAAS,GAAA;QACP,IAAI,CAAC,UAAU,EAAE,CAAC;KACnB;AAED,IAAA,cAAc,CAAC,MAAc,EAAA;QAC3B,OAAO,MAAM,KAAK,QAAQ,GAAG,eAAe,GAAG,iBAAiB,CAAC;KAClE;AAEO,IAAA,gBAAgB,CAAC,OAAe,EAAE,IAAA,GAA4B,SAAS,EAAA;QAC7E,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE;YACnC,QAAQ,EAAE,IAAI,KAAK,OAAO,GAAG,IAAI,GAAG,IAAI;AACxC,YAAA,kBAAkB,EAAE,KAAK;AACzB,YAAA,gBAAgB,EAAE,QAAQ;AAC1B,YAAA,UAAU,EAAE,IAAI,KAAK,OAAO,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,kBAAkB,CAAC;AACzE,SAAA,CAAC,CAAC;KACJ;;iHA9IU,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAxB,EAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAAM,IAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,mBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,EC5ChC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,k5FA6EM,EDrDF,MAAA,EAAA,CAAA,swEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,6VACZ,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,GAAA,CAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,8BACd,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,GAAA,CAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAiB,EACjB,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,onBACX,mBAAmB,EAAA,CAAA,EAAA,CAAA,CAAA;4FAKV,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAxB/B,SAAS;+BACE,iBAAiB,EAAA,UAAA,EACf,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,cAAc;wBACd,kBAAkB;wBAClB,aAAa;wBACb,eAAe;wBACf,aAAa;wBACb,cAAc;wBACd,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,aAAa;wBACb,iBAAiB;wBACjB,eAAe;wBACf,iBAAiB;wBACjB,WAAW;wBACX,mBAAmB;AACpB,qBAAA,EAAA,QAAA,EAAA,k5FAAA,EAAA,MAAA,EAAA,CAAA,swEAAA,CAAA,EAAA,CAAA;;;MEoBU,kBAAkB,CAAA;;AAOrB,IAAA,UAAU,CAAC,MAAW,EAAA;QAC5B,OAAO,MAAM,IAAI,MAAM,CAAC;KACzB;IAgCD,WACU,CAAA,WAAwB,EACxB,eAAgC,EAAA;QADhC,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QACxB,IAAe,CAAA,eAAA,GAAf,eAAe,CAAiB;QA1CjC,IAAqB,CAAA,qBAAA,GAAY,KAAK,CAAC;QACvC,IAAU,CAAA,UAAA,GAAW,EAAE,CAAC;QACxB,IAAiB,CAAA,iBAAA,GAAY,KAAK,CAAC;QACnC,IAAM,CAAA,MAAA,GAAW,EAAE,CAAC;AAMrB,QAAA,IAAA,CAAA,WAAW,GAAG,CAAC,IAAmB,EAAE,KAAa,KAAc;YACrE,OAAO;AACL,gBAAA,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACvD,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;AAC7B,gBAAA,KAAK,EAAE,KAAK;gBACZ,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC;AACJ,SAAC,CAAC;QAEF,IAAW,CAAA,WAAA,GAAG,IAAI,eAAe,CAC/B,IAAI,IAAI,IAAI,CAAC,KAAK,EAClB,IAAI,IAAI,IAAI,CAAC,UAAU,CACxB,CAAC;AAEF,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,gBAAgB,CAClC,IAAI,CAAC,WAAW,EAChB,IAAI,IAAI,IAAI,CAAC,KAAK,EAClB,IAAI,IAAI,IAAI,CAAC,UAAU,EACvB,IAAI,IAAI,IAAI,CAAC,QAAQ,CACtB,CAAC;AAEF,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7E,IAAW,CAAA,WAAA,GAAW,EAAE,CAAC;QACzB,IAAY,CAAA,YAAA,GAAoB,EAAE,CAAC;QACnC,IAAS,CAAA,SAAA,GAA4C,cAAc,CAAC;QA8cpE,IAAQ,CAAA,QAAA,GAAG,CAAC,CAAS,EAAE,IAAc,KAAK,IAAI,CAAC,UAAU,CAAC;KAzctD;IAEJ,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,qBAAqB,IAAI,IAAI,CAAC,UAAU,EAAE;YACjD,IAAI,CAAC,6BAA6B,EAAE,CAAC;AACtC,SAAA;AAAM,aAAA,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,MAAM,EAAE;YAChD,IAAI,CAAC,yBAAyB,EAAE,CAAC;AAClC,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;AAChC,SAAA;KACF;IAED,6BAA6B,GAAA;;AAE3B,QAAA,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,QAAQ,IAAG;AACzE,YAAA,IAAI,QAAQ,EAAE;;AAEZ,gBAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,eAAe,EAAE;;oBAErC,MAAM,aAAa,GAAoB,CAAC;4BACtC,IAAI,EAAE,QAAQ,CAAC,IAAI;4BACnB,WAAW,EAAE,QAAQ,CAAC,WAAW;4BACjC,EAAE,EAAE,QAAQ,CAAC,EAAE;AACf,4BAAA,KAAK,EAAE,CAAC;AACR,4BAAA,UAAU,EAAE,IAAI;AAChB,4BAAA,QAAQ,EAAE,EAAE;4BACZ,MAAM,EAAE,QAAQ,CAAC,MAAM;AACvB,4BAAA,IAAI,EAAE,eAAe;4BACrB,UAAU,EAAE,QAAQ,CAAC,UAAU;AAChC,yBAAA,CAAC,CAAC;oBAEH,IAAI,QAAQ,CAAC,UAAU,EAAE;;wBAEvB,MAAM,aAAa,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;;wBAG1D,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,YAAY,IAAG;AAC3D,4BAAA,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,IAC1C,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAC7B,CAAC;;4BAGF,MAAM,UAAU,GAAoB,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK;gCAC3D,IAAI,EAAE,CAAC,CAAC,IAAI;gCACZ,WAAW,EAAE,CAAC,CAAC,WAAW;gCAC1B,EAAE,EAAE,CAAC,CAAC,EAAE;AACR,gCAAA,KAAK,EAAE,CAAC;AACR,gCAAA,UAAU,EAAE,KAAK;gCACjB,MAAM,EAAE,CAAC,CAAC,MAAM;AAChB,gCAAA,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,eAAe,GAAG,eAAwB,GAAG,UAAmB;gCACjF,UAAU,EAAE,CAAC,CAAC,UAAU;AACzB,6BAAA,CAAC,CAAC,CAAC;AACJ,4BAAA,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,UAAU,CAAC;AAEvC,4BAAA,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC;AAClC,4BAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,aAAa,CAAC;;AAGrC,4BAAA,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACvE,gCAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,6BAAA;AACH,yBAAC,CAAC,CAAC;AACJ,qBAAA;AACF,iBAAA;AAAM,qBAAA;;oBAEL,MAAM,aAAa,GAAoB,CAAC;4BACtC,IAAI,EAAE,QAAQ,CAAC,IAAI;4BACnB,WAAW,EAAE,QAAQ,CAAC,WAAW;4BACjC,EAAE,EAAE,QAAQ,CAAC,EAAE;AACf,4BAAA,KAAK,EAAE,CAAC;AACR,4BAAA,UAAU,EAAE,IAAI;AAChB,4BAAA,QAAQ,EAAE,EAAE;4BACZ,MAAM,EAAE,QAAQ,CAAC,MAAM;AACvB,4BAAA,IAAI,EAAE,UAAmB;AAC1B,yBAAA,CAAC,CAAC;;oBAGH,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;wBAC1D,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAClC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CACnD,CAAC;AAEF,wBAAA,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;4BAC3B,MAAM,UAAU,GAAoB,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK;gCACzD,IAAI,EAAE,CAAC,CAAC,IAAI;gCACZ,WAAW,EAAE,CAAC,CAAC,WAAW;gCAC1B,EAAE,EAAE,CAAC,CAAC,EAAE;AACR,gCAAA,KAAK,EAAE,CAAC;AACR,gCAAA,UAAU,EAAE,KAAK;gCACjB,MAAM,EAAE,CAAC,CAAC,MAAM;AAChB,gCAAA,IAAI,EAAE,eAAwB;gCAC9B,UAAU,EAAE,CAAC,CAAC,UAAU;AACzB,6BAAA,CAAC,CAAC,CAAC;AAEJ,4BAAA,MAAM,UAAU,GAAkB;AAChC,gCAAA,IAAI,EAAE,gBAAgB;AACtB,gCAAA,WAAW,EAAE,qCAAqC;AAClD,gCAAA,EAAE,EAAE,gBAAgB;AACpB,gCAAA,KAAK,EAAE,CAAC;AACR,gCAAA,UAAU,EAAE,IAAI;AAChB,gCAAA,QAAQ,EAAE,UAAU;AACpB,gCAAA,MAAM,EAAE,QAAQ;AAChB,gCAAA,IAAI,EAAE,eAAwB;6BAC/B,CAAC;4BAEF,aAAa,CAAC,CAAC,CAAE,CAAC,QAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAC9C,yBAAA;AAED,wBAAA,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC;AAClC,wBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,aAAa,CAAC;;AAGrC,wBAAA,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACvE,4BAAA,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;AAC9B,yBAAA;AACH,qBAAC,CAAC,CAAC;AACJ,iBAAA;AACF,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;IAED,yBAAyB,GAAA;;AAEvB,QAAA,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,IAAI,IAAG;AACzD,YAAA,IAAI,IAAI,EAAE;;gBAER,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAC/C,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;AACvC,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;AACjC,gBAAA,MAAM,eAAe,GAAG,QAAQ,IAAI,QAAQ,IAAI,QAAQ,GAAG,KAAK,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC;;gBAGlF,MAAM,aAAa,GAAoB,CAAC;AACtC,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,WAAW,EAAE,eAAe;wBAC5B,EAAE,EAAE,IAAI,CAAC,EAAE;AACX,wBAAA,KAAK,EAAE,CAAC;AACR,wBAAA,UAAU,EAAE,IAAI;AAChB,wBAAA,QAAQ,EAAE,EAAE;wBACZ,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,QAAQ,GAAG,UAAU;AAC3C,wBAAA,IAAI,EAAE,MAAe;AACrB,wBAAA,QAAQ,EAAE,QAAQ;AACnB,qBAAA,CAAC,CAAC;;AAGH,gBAAA,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE;oBACvC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;;oBAG5D,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC;wBAChD,IAAI,EAAE,OAAO,IAAG;AACd,4BAAA,IAAI,OAAO,EAAE;gCACX,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAErD,gCAAA,MAAM,gBAAgB,GAAkB;AACtC,oCAAA,IAAI,EAAE,WAAW;AACjB,oCAAA,WAAW,EAAE,SAAS;AACtB,oCAAA,EAAE,EAAE,UAAU,GAAG,IAAI,CAAC,EAAE;AACxB,oCAAA,KAAK,EAAE,CAAC;AACR,oCAAA,UAAU,EAAE,KAAK;AACjB,oCAAA,MAAM,EAAE,QAAQ;AAChB,oCAAA,IAAI,EAAE,MAAe;AACrB,oCAAA,QAAQ,EAAE,SAAS;iCACpB,CAAC;AAEF,gCAAA,MAAM,WAAW,GAAkB;AACjC,oCAAA,IAAI,EAAE,YAAY;AAClB,oCAAA,WAAW,EAAE,SAAS;AACtB,oCAAA,EAAE,EAAE,iBAAiB;AACrB,oCAAA,KAAK,EAAE,CAAC;AACR,oCAAA,UAAU,EAAE,IAAI;oCAChB,QAAQ,EAAE,CAAC,gBAAgB,CAAC;AAC5B,oCAAA,MAAM,EAAE,QAAQ;AAChB,oCAAA,IAAI,EAAE,MAAe;iCACtB,CAAC;gCAEF,aAAa,CAAC,CAAC,CAAE,CAAC,QAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC9C,gCAAA,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;AACzC,6BAAA;yBACF;wBACD,KAAK,EAAE,MAAK;;AAEV,4BAAA,MAAM,gBAAgB,GAAkB;AACtC,gCAAA,IAAI,EAAE,SAAS;AACf,gCAAA,WAAW,EAAE,SAAS;AACtB,gCAAA,EAAE,EAAE,UAAU,GAAG,IAAI,CAAC,EAAE;AACxB,gCAAA,KAAK,EAAE,CAAC;AACR,gCAAA,UAAU,EAAE,KAAK;AACjB,gCAAA,MAAM,EAAE,QAAQ;AAChB,gCAAA,IAAI,EAAE,MAAe;AACrB,gCAAA,QAAQ,EAAE,SAAS;6BACpB,CAAC;AAEF,4BAAA,MAAM,WAAW,GAAkB;AACjC,gCAAA,IAAI,EAAE,YAAY;AAClB,gCAAA,WAAW,EAAE,SAAS;AACtB,gCAAA,EAAE,EAAE,iBAAiB;AACrB,gCAAA,KAAK,EAAE,CAAC;AACR,gCAAA,UAAU,EAAE,IAAI;gCAChB,QAAQ,EAAE,CAAC,gBAAgB,CAAC;AAC5B,gCAAA,MAAM,EAAE,QAAQ;AAChB,gCAAA,IAAI,EAAE,MAAe;6BACtB,CAAC;4BAEF,aAAa,CAAC,CAAC,CAAE,CAAC,QAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC9C,4BAAA,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;yBACzC;AACF,qBAAA,CAAC,CAAC;AACJ,iBAAA;;gBAGD,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC;oBAChD,IAAI,EAAE,MAAM,IAAG;AACb,wBAAA,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;4BAC/B,MAAM,eAAe,GAAoB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK;AACxD,gCAAA,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;AACjC,gCAAA,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;gCAChC,EAAE,EAAE,CAAC,CAAC,EAAE;AACR,gCAAA,KAAK,EAAE,CAAC;AACR,gCAAA,UAAU,EAAE,KAAK;gCACjB,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,QAAQ,GAAG,UAAU;AACxC,gCAAA,IAAI,EAAE,OAAgB;AACtB,gCAAA,KAAK,EAAE,CAAC,CAAC,WAAW,IAAI,CAAC;AAC1B,6BAAA,CAAC,CAAC,CAAC;AAEJ,4BAAA,MAAM,UAAU,GAAkB;AAChC,gCAAA,IAAI,EAAE,kBAAkB;AACxB,gCAAA,WAAW,EAAE,+BAA+B;AAC5C,gCAAA,EAAE,EAAE,kBAAkB;AACtB,gCAAA,KAAK,EAAE,CAAC;AACR,gCAAA,UAAU,EAAE,IAAI;AAChB,gCAAA,QAAQ,EAAE,eAAe;AACzB,gCAAA,MAAM,EAAE,QAAQ;AAChB,gCAAA,IAAI,EAAE,OAAgB;6BACvB,CAAC;4BAEF,aAAa,CAAC,CAAC,CAAE,CAAC,QAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAC7C,4BAAA,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;AACzC,yBAAA;qBACF;oBACD,KAAK,EAAE,MAAK;;AAEV,wBAAA,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;AAC5C,wBAAA,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;qBACzC;AACF,iBAAA,CAAC,CAAC;;AAGH,gBAAA,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;AACzC,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;;AAGO,IAAA,mBAAmB,CAAC,aAA8B,EAAA;AACxD,QAAA,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC;AAClC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,aAAa,CAAC;;AAGrC,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACvE,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;AAC9B,SAAA;KACF;;AAGO,IAAA,kBAAkB,CAAC,IAAU,EAAA;QACnC,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,OAAO,IAAI,CAAC,IAAI,CAAC;AAClB,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,EAAE;AACrC,YAAA,OAAO,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAI,CAAA,EAAA,IAAI,CAAC,SAAS,IAAI,EAAE,CAAA,CAAE,CAAC,IAAI,EAAE,CAAC;AAClE,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE;AAC5B,YAAA,OAAO,IAAI,CAAC,aAAa,CAAC,IAAc,CAAC;AAC1C,SAAA;QAED,OAAO,IAAI,CAAC,EAAE,CAAC;KAChB;;AAGO,IAAA,mBAAmB,CAAC,KAAgB,EAAA;QAC1C,IAAI,KAAK,CAAC,IAAI,EAAE;YACd,OAAO,KAAK,CAAC,IAAI,CAAC;AACnB,SAAA;AAED,QAAA,IAAI,KAAK,CAAC,aAAa,EAAE,IAAI,EAAE;AAC7B,YAAA,OAAO,KAAK,CAAC,aAAa,CAAC,IAAc,CAAC;AAC3C,SAAA;QAED,OAAO,KAAK,CAAC,EAAE,CAAC;KACjB;IAED,SAAS,GAAA;;AAEP,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,cAAc,EAAE;YACrC,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC7B,SAAA;AAAM,aAAA,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE;YACtC,IAAI,CAAC,sBAAsB,EAAE,CAAC;AAC/B,SAAA;AAAM,aAAA,IAAI,IAAI,CAAC,SAAS,KAAK,WAAW,EAAE;YACzC,IAAI,CAAC,yBAAyB,EAAE,CAAC;AAClC,SAAA;KACF;AAED,IAAA,SAAS,CAAC,GAA4C,EAAA;AACpD,QAAA,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;QAErB,IAAI,GAAG,KAAK,cAAc,EAAE;YAC1B,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC7B,SAAA;aAAM,IAAI,GAAG,KAAK,QAAQ,EAAE;YAC3B,IAAI,CAAC,sBAAsB,EAAE,CAAC;AAC/B,SAAA;aAAM,IAAI,GAAG,KAAK,WAAW,EAAE;YAC9B,IAAI,CAAC,yBAAyB,EAAE,CAAC;AAClC,SAAA;KACF;IAED,oBAAoB,GAAA;QAClB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,KAAK,IAAG;YAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;AACnD,YAAA,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;AACjC,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,YAAY,CAAC;;AAGpC,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACvE,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,iBAAiB,CAAC,KAAa,EAAA;;QAE7B,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,IACrC,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,KAAK,EAAE;AAC3C,aAAC,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,KAAK,EAAE,CAAC,CAC/C,CAAC;;AAGF,QAAA,MAAM,SAAS,GAAG,CAAC,IAAU,EAAE,KAAa,KAAmB;;YAE7D,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;;AAG/C,YAAA,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAClC,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,WAAW,KAAK,QAAQ,CAAC,CAC3D,CAAC;AAEF,YAAA,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YAE3E,OAAO;AACL,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,QAAQ,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;gBACzB,EAAE,EAAE,IAAI,CAAC,EAAE;AACX,gBAAA,KAAK,EAAE,KAAK;AACZ,gBAAA,UAAU,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;AAC/B,gBAAA,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ,GAAG,SAAS;gBACpD,KAAK,EAAE,QAAQ,CAAC,MAAM;gBACtB,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,QAAQ,GAAG,UAAU;AAC3C,gBAAA,IAAI,EAAE,MAAM;aACb,CAAC;AACJ,SAAC,CAAC;;AAGF,QAAA,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;KACtD;IAED,sBAAsB,GAAA;QACpB,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;YAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACxD,YAAA,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC;AACnC,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,cAAc,CAAC;;AAGtC,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACvE,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,mBAAmB,CAAC,MAAmB,EAAA;;AAErC,QAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqB,CAAC;AAC9C,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;;AAG/C,QAAA,MAAM,CAAC,OAAO,CAAC,KAAK,IAAG;YACrB,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;;YAG9B,IAAI,KAAK,CAAC,UAAU,EAAE;;gBAEpB,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC/C,gBAAA,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;gBACjE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;AACrC,aAAA;AAAM,iBAAA;gBACL,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAC9B,aAAA;AACH,SAAC,CAAC,CAAC;;AAGH,QAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;AAC3C,QAAA,UAAU,CAAC,OAAO,CAAC,IAAI,IAAG;AACxB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACjD,SAAC,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;;AAG/E,QAAA,MAAM,SAAS,GAAG,CAAC,KAAgB,EAAE,KAAa,EAAE,OAAA,GAAU,IAAI,GAAG,EAAU,KAAmB;;YAEhG,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;gBACzB,OAAO;oBACL,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,GAAG,uBAAuB;AAC/D,oBAAA,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;oBACpC,EAAE,EAAE,KAAK,CAAC,EAAE;AACZ,oBAAA,KAAK,EAAE,KAAK;AACZ,oBAAA,UAAU,EAAE,KAAK;AACjB,oBAAA,QAAQ,EAAE,SAAS;AACnB,oBAAA,KAAK,EAAE,KAAK,CAAC,WAAW,IAAI,CAAC;oBAC7B,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,QAAQ,GAAG,UAAU;AAC5C,oBAAA,IAAI,EAAE,OAAO;oBACb,UAAU,EAAE,KAAK,CAAC,UAAU;iBAC7B,CAAC;AACH,aAAA;AAED,YAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;;YAGtB,MAAM,WAAW,GAAgB,EAAE,CAAC;AACpC,YAAA,MAAM,CAAC,OAAO,CAAC,CAAC,IAAG;AACjB,gBAAA,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;AACnD,oBAAA,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACrB,iBAAA;AACH,aAAC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,IACzC,SAAS,CAAC,UAAU,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CACnD,CAAC;YAEF,OAAO;AACL,gBAAA,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;AACrC,gBAAA,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;gBACpC,EAAE,EAAE,KAAK,CAAC,EAAE;AACZ,gBAAA,KAAK,EAAE,KAAK;AACZ,gBAAA,UAAU,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;AAC/B,gBAAA,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ,GAAG,SAAS;AACpD,gBAAA,KAAK,EAAE,KAAK,CAAC,WAAW,IAAI,CAAC;gBAC7B,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,QAAQ,GAAG,UAAU;AAC5C,gBAAA,IAAI,EAAE,OAAO;gBACb,UAAU,EAAE,KAAK,CAAC,UAAU;aAC7B,CAAC;AACJ,SAAC,CAAC;;AAGF,QAAA,OAAO,cAAc,CAAC,GAAG,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC,CAAC;KAC5E;AAID,IAAA,cAAc,CAAC,MAAc,EAAA;QAC3B,OAAO,MAAM,KAAK,QAAQ,GAAG,eAAe,GAAG,iBAAiB,CAAC;KAClE;AAED,IAAA,WAAW,CAAC,KAAY,EAAA;QACtB,MAAM,WAAW,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAE3E,IAAI,CAAC,WAAW,EAAE;YAChB,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC;YACzC,OAAO;AACR,SAAA;;AAGD,QAAA,MAAM,UAAU,GAAG,CAAC,IAAmB,KAA0B;AAC/D,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAChE,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC;AACjF,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC;AAE7E,YAAA,IAAI,SAAS,IAAI,SAAS,IAAI,QAAQ,EAAE;AACtC,gBAAA,OAAO,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAC,CAAC;AAC3C,aAAA;;YAGD,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,gBAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ;qBACnC,GAAG,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;qBAC/B,MAAM,CAAC,KAAK,IAAI,KAAK,KAAK,IAAI,CAAoB,CAAC;AAEtD,gBAAA,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC/B,OAAO,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAC,CAAC;AAC9C,iBAAA;AACF,aAAA;YAED,OAAO,IAAI,CAAC;AACd,SAAC,CAAC;AAEF,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY;aACnC,GAAG,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;aAC7B,MAAM,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,CAAoB,CAAC;AAEpD,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,YAAY,CAAC;;AAGpC,QAAA,IAAI,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;AAC7C,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;AAC9B,SAAA;KACF;AAED,IAAA,WAAW,CAAC,IAAc,EAAA;QACxB,QAAO,IAAI,CAAC,IAAI;AACd,YAAA,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,UAAU,GAAG,oBAAoB,GAAG,QAAQ,CAAC;AAC3D,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,QAAQ,CAAC;AAClB,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,aAAa,CAAC;AACvB,YAAA,KAAK,eAAe;AAClB,gBAAA,OAAO,WAAW,CAAC;AACrB,YAAA;AACE,gBAAA,OAAO,QAAQ,CAAC;AACnB,SAAA;KACF;AAED,IAAA,kBAAkB,CAAC,IAAc,EAAA;QAC/B,QAAO,IAAI,CAAC,IAAI;AACd,YAAA,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;AAClD,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,WAAW,CAAC;AACrB,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,WAAW,CAAC;AACrB,YAAA,KAAK,eAAe;AAClB,gBAAA,OAAO,SAAS,CAAC;AACnB,YAAA;AACE,gBAAA,OAAO,WAAW,CAAC;AACtB,SAAA;KACF;IAED,yBAAyB,GAAA;QACvB,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,SAAS,IAAG;YACxD,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE,CAAC,SAAS,CAAC,cAAc,IAAG;gBAClE,MAAM,aAAa,GAAG,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;AAC7E,gBAAA,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC;AAClC,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,aAAa,CAAC;;AAGrC,gBAAA,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACvE,oBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,iBAAA;AACH,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;KACJ;IAGD,sBAAsB,CAAC,SAAqB,EAAE,cAA+B,EAAA;;AAE3E,QAAA,MAAM,WAAW,GAAG,IAAI,GAAG,EAAoC,CAAC;AAChE,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;;AAG/C,QAAA,SAAS,CAAC,OAAO,CAAC,QAAQ,IAAG;YAC3B,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;AACzC,SAAC,CAAC,CAAC;AAEH,QAAA,cAAc,CAAC,OAAO,CAAC,KAAK,IAAG;YAC7B,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;;YAGjC,IAAI,KAAK,CAAC,UAAU,EAAE;gBACpB,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBAChD,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AACjC,aAAA;AAAM,iBAAA;gBACL,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAC9B,aAAA;AACH,SAAC,CAAC,CAAC;;AAGH,QAAA,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;AAC7C,QAAA,UAAU,CAAC,OAAO,CAAC,IAAI,IAAG;AACxB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACnD,SAAC,CAAC,CAAC;;QAGH,MAAM,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;;AAGzF,QAAA,MAAM,SAAS,GAAG,CAAC,MAAgC,EAAE,KAAa,EAAE,OAAA,GAAU,IAAI,GAAG,EAAU,KAAmB;;YAEhH,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;gBAC1B,OAAO;AACL,oBAAA,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,uBAAuB;oBAC3C,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,EAAE,EAAE,MAAM,CAAC,EAAE;AACb,oBAAA,KAAK,EAAE,KAAK;AACZ,oBAAA,UAAU,EAAE,KAAK;AACjB,oBAAA,QAAQ,EAAE,SAAS;oBACnB,MAAM,EAAE,MAAM,CAAC,MAA+B;oBAC9C,IAAI,EAAE,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,GAAG,eAAe,GAAG,UAAU,IAAI,UAAU;AACtG,oBAAA,UAAU,EAAE,YAAY,IAAI,MAAM,GAAG,MAAM,CAAC,UAAU,GAAG,SAAS;iBACnE,CAAC;AACH,aAAA;AAED,YAAA,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;;YAGvB,MAAM,QAAQ,GAAoB,EAAE,CAAC;;AAGrC,YAAA,cAAc,CAAC,OAAO,CAAC,KAAK,IAAG;gBAC7B,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;AACtF,oBAAA,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC9D,iBAAA;AACH,aAAC,CAAC,CAAC;YAEH,OAAO;gBACL,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,EAAE,EAAE,MAAM,CAAC,EAAE;AACb,gBAAA,KAAK,EAAE,KAAK;AACZ,gBAAA,UAAU,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;AAC/B,gBAAA,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ,GAAG,SAAS;AACpD,gBAAA,KAAK,EAAE,eAAe,IAAI,MAAM,GAAG,MAAM,CAAC,aAAa,GAAG,SAAS;gBACnE,MAAM,EAAE,MAAM,CAAC,MAA+B;gBAC9C,IAAI,EAAE,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,GAAG,eAAe,GAAG,UAAU,IAAI,UAAU;AACtG,gBAAA,UAAU,EAAE,YAAY,IAAI,MAAM,GAAG,MAAM,CAAC,UAAU,GAAG,SAAS;aACnE,CAAC;AACJ,SAAC,CAAC;;QAGF,MAAM,cAAc,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC,CAAC;;QAG3F,SAAS;AACN,aAAA,MAAM,CAAC,QAAQ,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;aACxD,OAAO,CAAC,QAAQ,IAAG;YAClB,cAAc,CAAC,IAAI,CAAC;gBAClB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,EAAE,EAAE,QAAQ,CAAC,EAAE;AACf,gBAAA,KAAK,EAAE,CAAC;AACR,gBAAA,UAAU,EAAE,KAAK;gBACjB,MAAM,EAAE,QAAQ,CAAC,MAA+B;AAChD,gBAAA,IAAI,EAAE,UAAU;AACjB,aAAA,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;AAEL,QAAA,OAAO,cAAc,CAAC;KACvB;;gHAlrBU,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAX,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAwB,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,kBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,yNC5D/B,y4JAqGM,EAAA,MAAA,EAAA,CAAA,0pGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDtDF,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAnB,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,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,EAAA,aAAa,m6BACb,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAQ,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,8BACd,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,8BACd,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;4FAKF,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAjB9B,SAAS;+BACE,eAAe,EAAA,UAAA,EACb,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,aAAa;wBACb,aAAa;wBACb,eAAe;wBACf,cAAc;wBACd,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,WAAW;AACZ,qBAAA,EAAA,QAAA,EAAA,y4JAAA,EAAA,MAAA,EAAA,CAAA,0pGAAA,CAAA,EAAA,CAAA;0HAKQ,qBAAqB,EAAA,CAAA;sBAA7B,KAAK;gBACG,UAAU,EAAA,CAAA;sBAAlB,KAAK;gBACG,iBAAiB,EAAA,CAAA;sBAAzB,KAAK;gBACG,MAAM,EAAA,CAAA;sBAAd,KAAK;;;ME7CK,wBAAwB,CAAA;AACnC,IAAA,WAAA,CACU,eAAgC,EAChC,gBAAyC,EACzC,sBAAqD,EAAA;QAFrD,IAAe,CAAA,eAAA,GAAf,eAAe,CAAiB;QAChC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAyB;QACzC,IAAsB,CAAA,sBAAA,GAAtB,sBAAsB,CAA+B;KAC1D;AAEL;;AAEG;IACH,sBAAsB,GAAA;;;AAIpB,QAAA,OAAO,QAAQ,CAAC;AACd,YAAA,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE;AACnC,YAAA,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAA4B;AACnE,SAAA,CAAC,CAAC,IAAI;;QAELJ,KAAG,CAAC,CAAC,CAAC,SAAS,EAAE,cAAc,CAAC,KAAI;;;AAIlC,YAAA,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;;AAG/D,YAAA,MAAM,YAAY,GAAG,IAAI,GAAG,EAAiC,CAAC;AAC9D,YAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAoB,CAAC;AACrD,YAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;;;AAI3C,YAAA,cAAc,CAAC,OAAO,CAAC,KAAK,IAAG;AAC7B,gBAAA,MAAM,IAAI,GAA0B;oBAClC,EAAE,EAAE,KAAK,CAAC,EAAE;oBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,oBAAA,IAAI,EAAE,eAAe;AACrB,oBAAA,QAAQ,EAAE;wBACR,WAAW,EAAE,KAAK,CAAC,WAAW;wBAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;AAC5B,wBAAA,MAAM,EAAE,KAAK,CAAC,MAAM,KAAK,QAAQ;AAClC,qBAAA;AACD,oBAAA,QAAQ,EAAE,EAAE;iBACb,CAAC;gBAEF,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;;gBAGjC,IAAI,KAAK,CAAC,UAAU,EAAE;AACpB,oBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;;AAG3E,oBAAA,UAAU,CAAC,OAAO,CAAC,SAAS,IAAG;wBAC7B,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;;AAGzC,wBAAA,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE;AAC/C,4BAAA,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;;AAG/B,4BAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AACnC,gCAAA,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACpC,6BAAA;AACD,4BAAA,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAChD,yBAAA;AACH,qBAAC,CAAC,CAAC;AACJ,iBAAA;AACH,aAAC,CAAC,CAAC;;YAGH,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,OAAO,KAAI;;AAErC,gBAAA,IAAI,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;oBACjC,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAC1D,oBAAA,aAAa,CAAC,OAAO,CAAC,OAAO,IAAG;wBAC9B,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;wBAC5C,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE;4BACpD,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,gCAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;AACvC,4BAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC/B,yBAAA;AACH,qBAAC,CAAC,CAAC;AACJ,iBAAA;;AAGD,gBAAA,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;AAChE,gBAAA,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;AAC7C,oBAAA,OAAO;AACR,iBAAA;;AAGD,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;AAClF,gBAAA,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAiC,CAAC;;AAGrE,gBAAA,UAAU,CAAC,OAAO,CAAC,SAAS,IAAG;oBAC7B,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;;AAGzC,oBAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;AACxD,oBAAA,IAAI,QAAQ,EAAE;wBACZ,mBAAmB,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;AACnD,qBAAA;;AAEI,yBAAA,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE;;AAEpD,wBAAA,MAAM,eAAe,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;AACpE,wBAAA,IAAI,eAAe,IAAI,eAAe,CAAC,UAAU,EAAE;4BACjD,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IACvC,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,eAAe,CAAC,UAAU,EAAE,cAAc,CAAC,CACtE,CAAC;;AAGF,4BAAA,cAAc,CAAC,OAAO,CAAC,CAAC,IAAG;;gCAEzB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;oCAClC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;AAC/C,iCAAA;AACH,6BAAC,CAAC,CAAC;AACJ,yBAAA;AACF,qBAAA;AACH,iBAAC,CAAC,CAAC;;gBAGH,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;qBAC5D,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,aAAa,CAAC,KAAI;AACnC,oBAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;AAC1D,oBAAA,IAAI,CAAC,QAAQ;AAAE,wBAAA,OAAO,IAAI,CAAC;oBAE3B,OAAO;wBACL,EAAE,EAAE,QAAQ,CAAC,EAAE;AACf,wBAAA,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,aAAa,KAAK,SAAS,GAAG,aAAa,GAAG,EAAE,CAAC;AACxE,wBAAA,IAAI,EAAE,UAAU;AAChB,wBAAA,QAAQ,EAAE;4BACR,WAAW,EAAE,QAAQ,CAAC,WAAW;4BACjC,QAAQ,EAAE,QAAQ,CAAC,WAAW;AAC9B,4BAAA,MAAM,EAAE,QAAQ,CAAC,MAAM,KAAK,QAAQ;4BACpC,QAAQ,EAAE,aAAa,KAAK,SAAS;AACtC,yBAAA;qBACF,CAAC;AACJ,iBAAC,CAAC;qBACD,MAAM,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,CAA4B,CAAC;;AAG5D,gBAAA,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC5B,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,wBAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;oBACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;AACtC,iBAAA;AACH,aAAC,CAAC,CAAC;;YAGH,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;AACjD,iBAAA,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;;YAGlD,MAAM,kBAAkB,GAAG,SAAS;AACjC,iBAAA,MAAM,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;AACxE,iBAAA,GAAG,CAAC,QAAQ,KAAK;gBAChB,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,IAAI,EAAE,QAAQ,CAAC,IAAI;AACnB,gBAAA,IAAI,EAAE,UAAU;AAChB,gBAAA,QAAQ,EAAE;oBACR,WAAW,EAAE,QAAQ,CAAC,WAAW;oBACjC,QAAQ,EAAE,QAAQ,CAAC,WAAW;AAC9B,oBAAA,MAAM,EAAE,QAAQ,CAAC,MAAM,KAAK,QAAQ;AACrC,iBAAA;AACF,aAAA,CAAC,CAAC,CAAC;;;YAIN,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;;;;;;AAOpD,YAAA,MAAM,SAAS,GAA4B;AACzC,gBAAA;AACE,oBAAA,EAAE,EAAE,aAAa;AACjB,oBAAA,IAAI,EAAE,iBAAiB;AACvB,oBAAA,IAAI,EAAE,MAAM;oBACZ,QAAQ,EAAE,SAAS;AACpB,iBAAA;aACF,CAAC;;AAGF,YAAA,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE;gBACjC,SAAS,CAAC,IAAI,CAAC;AACb,oBAAA,EAAE,EAAE,gBAAgB;AACpB,oBAAA,IAAI,EAAE,qBAAqB;AAC3B,oBAAA,IAAI,EAAE,MAAM;AACZ,oBAAA,QAAQ,EAAE,kBAAkB;AAC7B,iBAAA,CAAC,CAAC;AACJ,aAAA;;AAGD,YAAA,OAAO,SAAS,CAAC;SAClB,CAAC,CACH,CAAC;KACH;;AAGO,IAAA,iBAAiB,CAAC,QAAkB,EAAE,UAAmB,EAAE,SAAuC,EAAE,EAAA;AAC1G,QAAA,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,KAAK,CAAC;;AAG9B,QAAA,OAAO,IAAI,CAAC,sBAAsB,CAAC,kBAAkB,CACnD,QAAQ,CAAC,EAAE,EACX,UAAU,EACV,MAAM;SACP,CAAC;KACH;;IAGO,oBAAoB,CAAC,QAAkB,EAAE,MAAoC,EAAA;QACnF,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;KACzF;;sHAxNU,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAsB,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,uBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,6BAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAxB,wBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,cAFvB,MAAM,EAAA,CAAA,CAAA;4FAEP,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAHpC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;MC0KY,0BAA0B,CAAA;AA8BrC,IAAA,WAAA,CAAoB,wBAAkD,EAAA;QAAlD,IAAwB,CAAA,wBAAA,GAAxB,wBAAwB,CAA0B;AA7B9D,QAAA,IAAA,CAAA,YAAY,GAAG,CAAC,IAA2B,EAAE,KAAa,KAAc;YAC9E,OAAO;AACL,gBAAA,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACvD,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,gBAAA,KAAK,EAAE,KAAK;gBACZ,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC;AACJ,SAAC,CAAC;QAEF,IAAW,CAAA,WAAA,GAAG,IAAI,eAAe,CAC/B,IAAI,IAAI,IAAI,CAAC,KAAK,EAClB,IAAI,IAAI,IAAI,CAAC,UAAU,CACxB,CAAC;AAEF,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,gBAAgB,CAClC,IAAI,CAAC,YAAY,EACjB,IAAI,IAAI,IAAI,CAAC,KAAK,EAClB,IAAI,IAAI,IAAI,CAAC,UAAU,EACvB,IAAI,IAAI,IAAI,CAAC,QAAQ,CACtB,CAAC;AAEF,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAE7E,IAAO,CAAA,OAAA,GAAG,IAAI,CAAC;QACf,IAAU,CAAA,UAAA,GAAG,EAAE,CAAC;QAChB,IAAY,CAAA,YAAA,GAA4B,EAAE,CAAC;QA+B3C,IAAQ,CAAA,QAAA,GAAG,CAAC,CAAS,EAAE,IAAc,KAAK,IAAI,CAAC,UAAU,CAAC;KA7BgB;IAE1E,QAAQ,GAAA;QACN,IAAI,CAAC,aAAa,EAAE,CAAC;KACtB;IAED,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;AAEpB,QAAA,IAAI,CAAC,wBAAwB,CAAC,sBAAsB,EAAE,CAAC,SAAS,CAAC;AAC/D,YAAA,IAAI,EAAE,CAAC,SAAS,KAAI;AAClB,gBAAA,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;AAC9B,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,SAAS,CAAC;AACjC,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;;AAGrB,gBAAA,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;oBACvE,IAAI,CAAC,WAAW,CAAC,SAAS;yBACvB,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC;AAChC,yBAAA,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,iBAAA;aACF;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;AAC1D,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;aACtB;AACF,SAAA,CAAC,CAAC;KACJ;AAID,IAAA,WAAW,CAAC,IAAc,EAAA;QACxB,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,cAAc,CAAC;AACxB,YAAA,KAAK,eAAe;AAClB,gBAAA,OAAO,QAAQ,CAAC;AAClB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,cAAc,CAAC;AACxB,YAAA;AACE,gBAAA,OAAO,QAAQ,CAAC;AACnB,SAAA;KACF;AAED,IAAA,gBAAgB,CAAC,IAAc,EAAA;QAC7B,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,eAAe,CAAC;AACzB,YAAA,KAAK,eAAe;AAClB,gBAAA,OAAO,oBAAoB,CAAC;AAC9B,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,WAAW,CAAC;AACrB,YAAA;AACE,gBAAA,OAAO,eAAe,CAAC;AAC1B,SAAA;KACF;IAED,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC;YACzC,OAAO;AACR,SAAA;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;;AAGjD,QAAA,MAAM,UAAU,GAAG,CAAC,IAA2B,KAAkC;;AAE/E,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAE/D,YAAA,IAAI,SAAS,EAAE;AACb,gBAAA,OAAO,EAAC,GAAG,IAAI,EAAC,CAAC;AAClB,aAAA;;YAGD,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7C,gBAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ;qBACnC,GAAG,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;qBAC/B,MAAM,CAAC,KAAK,IAAI,KAAK,KAAK,IAAI,CAA4B,CAAC;AAE9D,gBAAA,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC/B,OAAO,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAC,CAAC;AAC9C,iBAAA;AACF,aAAA;YAED,OAAO,IAAI,CAAC;AACd,SAAC,CAAC;AAEF,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY;aACnC,GAAG,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;aAC7B,MAAM,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,CAA4B,CAAC;AAE5D,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,YAAY,CAAC;;AAGpC,QAAA,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1F,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;AAC9B,SAAA;KACF;;wHAhIU,0BAA0B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,wBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA1B,0BAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,0BAA0B,EA1J3B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsDT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wkCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA/DC,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA7B,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,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,EACZ,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,4BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,wBAAwB,EACxB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,0WACd,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;4FA4JF,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAvKtC,SAAS;+BACE,wBAAwB,EAAA,UAAA,EACtB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,aAAa;wBACb,aAAa;wBACb,eAAe;wBACf,wBAAwB;wBACxB,kBAAkB;wBAClB,cAAc;wBACd,WAAW;qBACZ,EACS,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsDT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,wkCAAA,CAAA,EAAA,CAAA;;;MC/EU,iBAAiB,CAAA;IAE5B,WACU,CAAA,SAA2B,EACM,MAA4B,EAAA;QAD7D,IAAS,CAAA,SAAA,GAAT,SAAS,CAAkB;QACM,IAAM,CAAA,MAAA,GAAN,MAAM,CAAsB;KACnE;IAEJ,qBAAqB,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,OAAO,CAAC;KAClD;IAED,OAAO,GAAA;QACL,OAAO,IAAI,CAAC,qBAAqB,EAAE,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC;KAC/D;IAED,wBAAwB,GAAA;;AAEtB,QAAA,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;AACvE,QAAA,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC;;;KAIzB;IAED,0BAA0B,GAAA;AACxB,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;KACvB;IAED,8BAA8B,GAAA;AAC5B,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;KAC3D;;AA9BU,iBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,+CAIlB,uBAAuB,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAJtB,iBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA,CAAA;4FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;0BAKI,MAAM;2BAAC,uBAAuB,CAAA;;;MCqCtB,kBAAkB,CAAA;AA0B7B,IAAA,WAAA,CACU,eAAgC,EAChC,UAA6B,EAC7B,MAAiB,EACjB,QAAqB,EAAA;QAHrB,IAAe,CAAA,eAAA,GAAf,eAAe,CAAiB;QAChC,IAAU,CAAA,UAAA,GAAV,UAAU,CAAmB;QAC7B,IAAM,CAAA,MAAA,GAAN,MAAM,CAAW;QACjB,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAa;QA7B/B,IAAgB,CAAA,gBAAA,GAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACnE,IAAU,CAAA,UAAA,GAAe,EAAE,CAAC;QAC5B,IAAkB,CAAA,kBAAA,GAAe,EAAE,CAAC;QACpC,IAAgB,CAAA,gBAAA,GAAe,EAAE,CAAC;QAClC,IAAwB,CAAA,wBAAA,GAAe,EAAE,CAAC;QAC1C,IAAW,CAAA,WAAA,GAAW,EAAE,CAAC;;QAIzB,IAAY,CAAA,YAAA,GAAW,KAAK,CAAC;QAC7B,IAAiB,CAAA,iBAAA,GAAW,KAAK,CAAC;QAClC,IAAqB,CAAA,qBAAA,GAAa,EAAE,CAAC;;QAGrC,IAAc,CAAA,cAAA,GAAW,EAAE,CAAC;QAC5B,IAAmB,CAAA,mBAAA,GAAW,OAAO,CAAC;AACtC,QAAA,IAAA,CAAA,aAAa,GAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACjD,IAAkB,CAAA,kBAAA,GAAa,EAAE,CAAC;QAEzB,IAAW,CAAA,WAAA,GAAyC,WAAW,CAAC;AAC/D,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,YAAY,EAAwC,CAAC;QAEhF,IAAS,CAAA,SAAA,GAAyC,WAAW,CAAC;KAQ1D;IAEJ,QAAQ,GAAA;;QAEN,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;AACnC,SAAA;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,kBAAkB,EAAE,CAAC;KAC3B;AAED,IAAA,WAAW,CAAC,OAAsB,EAAA;;QAEhC,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,YAAY,EAAE;YACjE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC;AACtD,SAAA;KACF;IAED,aAAa,GAAA;;;QAIX,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC;AAC3D,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,OAAO,GAAG,UAAU,CAAC;AAEzE,QAAA,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,SAAS,CAAC,SAAS,IAAG;;AAE3F,YAAA,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;AAC/D,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAC;;AAG1C,YAAA,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE;gBAC7B,IAAI,CAAC,yBAAyB,EAAE,CAAC;AAClC,aAAA;AAAM,iBAAA;gBACL,IAAI,CAAC,yBAAyB,EAAE,CAAC;AAClC,aAAA;AAEH,SAAC,CAAC,CAAC;KACJ;IAED,uBAAuB,GAAA;;;AAGrB,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,KAAK,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC;AAElG,QAAA,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,SAAS,CAAC,SAAS,IAAG;;AAE3F,YAAA,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;AAC/D,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAC;;AAI5C,SAAC,CAAC,CAAC;KACJ;IAED,oBAAoB,GAAA;;;AAGlB,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,KAAK,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC;AAElG,QAAA,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,SAAS,CAAC,MAAM,IAAG;;YAE7F,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK;AAC3C,gBAAA,GAAG,KAAK;AACR,gBAAA,IAAI,EAAE,eAAwB;AAC/B,aAAA,CAAC,CAAC,CAAC;AACJ,YAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,gBAAgB,CAAC;;AAIxD,SAAC,CAAC,CAAC;KACJ;IAED,kBAAkB,GAAA;;;QAIhB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC;AAC3D,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,OAAO,GAAG,UAAU,CAAC;AAEzE,QAAA,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,SAAS,CAAC,MAAM,IAAG;;YAE7F,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK;AAC3C,gBAAA,GAAG,KAAK;AACR,gBAAA,IAAI,EAAE,eAAwB;AAC/B,aAAA,CAAC,CAAC,CAAC;AACJ,YAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,gBAAgB,CAAC;;;AAItD,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE;gBAC9B,IAAI,CAAC,yBAAyB,EAAE,CAAC;AAClC,aAAA;AAEH,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,SAAS,CAAC,GAAyC,EAAA;AACjD,QAAA,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;AACrB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;;QAI1B,IAAI,GAAG,KAAK,WAAW,EAAE;YACvB,IAAI,CAAC,aAAa,EAAE,CAAC;AACtB,SAAA;aAAM,IAAI,GAAG,KAAK,QAAQ,EAAE;YAC3B,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC3B,SAAA;KACF;IAGD,kBAAkB,GAAA;QAChB,wEAAsE,CAAC,IAAI,CAAC,CAAC,EAAE,uBAAuB,EAAE,KAAI;YAC1G,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;AAC1D,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,IAAI,EAAE;AACJ,oBAAA,MAAM,EAAE,KAAK;AACb,oBAAA,OAAO,EAAE,KAAK;AACd,oBAAA,kBAAkB,EAAE,IAAI,CAAC,UAAU,CAAC,qBAAqB,EAAE;AAC3D,oBAAA,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACnC,iBAAA;AACF,aAAA,CAAC,CAAC;YAEH,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;AACzC,gBAAA,IAAI,MAAM,EAAE;AACV,oBAAA,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,IAAG;wBAC/D,IAAI,CAAC,aAAa,EAAE,CAAC;AACrB,wBAAA,IAAI,CAAC,gBAAgB,CAAC,+BAA+B,CAAC,CAAC;AACzD,qBAAC,CAAC,CAAC;AACJ,iBAAA;AACH,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;KACJ;IAED,eAAe,GAAA;QACb,wEAAsE,CAAC,IAAI,CAAC,CAAC,EAAE,uBAAuB,EAAE,KAAI;YAC1G,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;AAC1D,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,IAAI,EAAE;AACJ,oBAAA,MAAM,EAAE,KAAK;AACb,oBAAA,OAAO,EAAE,IAAI;AACb,oBAAA,kBAAkB,EAAE,IAAI,CAAC,UAAU,CAAC,qBAAqB,EAAE;AAC3D,oBAAA,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACnC,iBAAA;AACF,aAAA,CAAC,CAAC;YAEH,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;AACzC,gBAAA,IAAI,MAAM,EAAE;;AAEV,oBAAA,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,IAAG;wBAC/D,IAAI,CAAC,aAAa,EAAE,CAAC;AACrB,wBAAA,IAAI,CAAC,gBAAgB,CAAC,qCAAqC,CAAC,CAAC;AAC/D,qBAAC,CAAC,CAAC;AACJ,iBAAA;AACH,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,cAAc,CAAC,QAAkB,EAAA;QAC/B,wEAAsE,CAAC,IAAI,CAAC,CAAC,EAAE,uBAAuB,EAAE,KAAI;YAC1G,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;AAC1D,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,IAAI,EAAE;oBACJ,QAAQ;AACR,oBAAA,MAAM,EAAE,IAAI;AACZ,oBAAA,OAAO,EAAE,QAAQ,CAAC,IAAI,KAAK,eAAe;AAC1C,oBAAA,kBAAkB,EAAE,IAAI,CAAC,UAAU,CAAC,qBAAqB,EAAE;AAC3D,oBAAA,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACnC,iBAAA;AACF,aAAA,CAAC,CAAC;YAEH,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;AACzC,gBAAA,IAAI,MAAM,EAAE;AACV,oBAAA,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,eAAe,IAAG;wBACtE,IAAI,CAAC,aAAa,EAAE,CAAC;AACrB,wBAAA,IAAI,CAAC,gBAAgB,CAAC,+BAA+B,CAAC,CAAC;AACzD,qBAAC,CAAC,CAAC;AACJ,iBAAA;AACH,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,gBAAgB,CAAC,QAAkB,EAAA;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;AACzD,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,IAAI,EAAE;AACJ,gBAAA,KAAK,EAAE,iBAAiB;AACxB,gBAAA,OAAO,EAAE,CAAA,gCAAA,EAAmC,QAAQ,CAAC,IAAI,CAAG,CAAA,CAAA;AAC5D,gBAAA,WAAW,EAAE,QAAQ;AACrB,gBAAA,UAAU,EAAE,QAAQ;AACpB,gBAAA,KAAK,EAAE,MAAM;AACd,aAAA;AACF,SAAA,CAAC,CAAC;QAEH,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,SAAS,IAAG;AAC5C,YAAA,IAAI,SAAS,EAAE;AACb,gBAAA,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,IAAG;AACnE,oBAAA,IAAI,OAAO,EAAE;AACX,wBAAA,IAAI,CAAC,aAAa,EAAE,CAAC;AACrB,wBAAA,IAAI,CAAC,gBAAgB,CAAC,+BAA+B,CAAC,CAAC;AACxD,qBAAA;AACH,iBAAC,CAAC,CAAC;AACJ,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,WAAW,CAAC,KAAY,EAAA;QACtB,MAAM,WAAW,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;AAC3E,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;AAE/B,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,WAAW,EAAE;YAClC,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC7B,SAAA;AAAM,aAAA,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE;YACtC,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC1B,SAAA;KACF;IAED,iBAAiB,GAAA;QACf,IAAI,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC;;QAG1C,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,IAC9B,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAClE,CAAC;AACH,SAAA;;QAGD,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,KAAK,OAAO,EAAE;AACpE,YAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAG;AACjC,gBAAA,OAAO,KAAK,CAAC,WAAW,KAAK,IAAI,CAAC,mBAAmB,CAAC;AACxD,aAAC,CAAC,CAAC;AACJ,SAAA;;QAGD,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;AAC7C,YAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,IAC9B,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACzC,KAAK,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;;gBAEhD,KAAK,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CACjD,CAAC;AACH,SAAA;AAED,QAAA,IAAI,CAAC,wBAAwB,GAAG,QAAQ,CAAC;KAC1C;AAED,IAAA,cAAc,CAAC,MAAc,EAAA;QAC3B,OAAO,MAAM,KAAK,QAAQ,GAAG,eAAe,GAAG,iBAAiB,CAAC;KAClE;AAED,IAAA,WAAW,CAAC,IAAY,EAAA;QACtB,OAAO,IAAI,KAAK,UAAU,GAAG,cAAc,GAAG,QAAQ,CAAC;KACxD;IAGD,yBAAyB,GAAA;;AAEvB,QAAA,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,YAAY,IAAG;AACtF,YAAA,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;;AAGvC,YAAA,YAAY,CAAC,OAAO,CAAC,CAAC,QAAa,KAAI;gBACrC,IAAI,QAAQ,CAAC,WAAW,IAAI,OAAO,QAAQ,CAAC,WAAW,KAAK,QAAQ,EAAE;AACpE,oBAAA,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACxC,iBAAA;AACH,aAAC,CAAC,CAAC;;AAGH,YAAA,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,IAAG;AACxF,gBAAA,SAAS,CAAC,OAAO,CAAC,CAAC,KAAU,KAAI;oBAC/B,IAAI,KAAK,CAAC,WAAW,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,EAAE;AAC9D,wBAAA,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACrC,qBAAA;AACH,iBAAC,CAAC,CAAC;AAEH,gBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5D,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;KACJ;IAED,yBAAyB,GAAA;AACvB,QAAA,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;;QAGvC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,QAAa,KAAI;YACxC,IAAI,QAAQ,CAAC,WAAW,IAAI,OAAO,QAAQ,CAAC,WAAW,KAAK,QAAQ,EAAE;AACpE,gBAAA,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACxC,aAAA;AACH,SAAC,CAAC,CAAC;;QAGH,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,KAAU,KAAI;YAC3C,IAAI,KAAK,CAAC,WAAW,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,EAAE;AAC9D,gBAAA,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACrC,aAAA;AACH,SAAC,CAAC,CAAC;AAEH,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC;KAC3D;IAED,cAAc,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,WAAW,EAAE;YAClC,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC7B,SAAA;AAAM,aAAA,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE;YACtC,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC1B,SAAA;KACF;IAED,mBAAmB,GAAA;;AAEjB,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE;AAC7B,YAAA,IAAI,IAAI,CAAC,SAAS,KAAK,WAAW,EAAE;gBAClC,IAAI,CAAC,uBAAuB,EAAE,CAAC;AAChC,aAAA;AAAM,iBAAA,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACtC,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC7B,aAAA;AACF,SAAA;AAAM,aAAA;;AAEL,YAAA,IAAI,IAAI,CAAC,SAAS,KAAK,WAAW,EAAE;gBAClC,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC7B,aAAA;AAAM,iBAAA,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACtC,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC1B,aAAA;AACF,SAAA;KACF;IAED,oBAAoB,GAAA;QAClB,IAAI,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;;QAGpC,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,IACjC,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CACrE,CAAC;AACH,SAAA;;QAGD,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC5B,YAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAa,KACvC,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC,mBAAmB,CAC/C,CAAC;AACH,SAAA;;QAGD,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;AAC7C,YAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,IACjC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC5C,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACnD,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CACpD,CAAC;AACH,SAAA;AAED,QAAA,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;KACpC;IAED,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;AAC9B,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;AAEtB,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,WAAW,EAAE;YAClC,IAAI,CAAC,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;AAChD,SAAA;AAAM,aAAA,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE;YACtC,IAAI,CAAC,wBAAwB,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAC5D,SAAA;KACF;IAED,gBAAgB,GAAA;AACd,QAAA,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;KAChF;IAED,SAAS,GAAA;AACP,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,WAAW,EAAE;YAClC,IAAI,CAAC,aAAa,EAAE,CAAC;AACtB,SAAA;AAAM,aAAA,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE;YACtC,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC3B,SAAA;KACF;IAED,OAAO,GAAA;AACL,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;KAClC;AAEO,IAAA,gBAAgB,CAAC,OAAe,EAAA;QACtC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE;AACnC,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,kBAAkB,EAAE,KAAK;AACzB,YAAA,gBAAgB,EAAE,QAAQ;AAC3B,SAAA,CAAC,CAAC;KACJ;;gHAxaU,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAiB,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAI,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAAvB,IAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,kBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,6KClD/B,8oVA+PM,EAAA,MAAA,EAAA,CAAA,giJAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDnOF,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,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,EAAAA,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,EACZ,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,8BACb,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,2SACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,GAAA,CAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAiB,EACjB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,GAAA,CAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,8BACf,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,mBAAmB,+BACnB,0BAA0B,EAAA,QAAA,EAAA,wBAAA,EAAA,CAAA,EAAA,CAAA,CAAA;4FAKjB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBA1B9B,SAAS;+BACE,eAAe,EAAA,UAAA,EACb,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,cAAc;wBACd,kBAAkB;wBAClB,aAAa;wBACb,eAAe;wBACf,aAAa;wBACb,cAAc;wBACd,kBAAkB;wBAClB,eAAe;wBACf,aAAa;wBACb,cAAc;wBACd,aAAa;wBACb,iBAAiB;wBACjB,eAAe;wBACf,iBAAiB;wBACjB,WAAW;wBACX,mBAAmB;wBACnB,0BAA0B;AAC3B,qBAAA,EAAA,QAAA,EAAA,8oVAAA,EAAA,MAAA,EAAA,CAAA,giJAAA,CAAA,EAAA,CAAA;oLAwBQ,WAAW,EAAA,CAAA;sBAAnB,KAAK;gBACI,UAAU,EAAA,CAAA;sBAAnB,MAAM;;;MEnBI,oBAAoB,CAAA;IAgB/B,WACU,CAAA,iBAAoC,EACpC,UAA6B,EAC7B,WAAwB,EACxB,eAAgC,EAChC,MAAiB,EACjB,QAAqB,EAAA;QALrB,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB,CAAmB;QACpC,IAAU,CAAA,UAAA,GAAV,UAAU,CAAmB;QAC7B,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QACxB,IAAe,CAAA,eAAA,GAAf,eAAe,CAAiB;QAChC,IAAM,CAAA,MAAA,GAAN,MAAM,CAAW;QACjB,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAa;AArB/B,QAAA,IAAA,CAAA,gBAAgB,GAAa,CAAC,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACjI,IAAU,CAAA,UAAA,GAAiB,EAAE,CAAC;QAC9B,IAAkB,CAAA,kBAAA,GAAiB,EAAE,CAAC;QACtC,IAAW,CAAA,WAAA,GAAW,EAAE,CAAC;;QAGzB,IAAmB,CAAA,mBAAA,GAAW,EAAE,CAAC;QACjC,IAAkB,CAAA,kBAAA,GAAa,EAAE,CAAC;QAClC,IAAc,CAAA,cAAA,GAAW,EAAE,CAAC;AAC5B,QAAA,IAAA,CAAA,aAAa,GAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;;QAGzC,IAAe,CAAA,eAAA,GAAoD,EAAE,CAAC;QACtE,IAAmB,CAAA,mBAAA,GAAoD,EAAE,CAAC;KAS9E;IAEJ,QAAQ,GAAA;QACN,IAAI,CAAC,cAAc,EAAE,CAAC;KACvB;IAED,cAAc,GAAA;;;QAGZ,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC;AAC3D,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,SAAS,GAAG,UAAU,CAAC;AAE3E,QAAA,QAAQ,CAAC;AACP,YAAA,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;AAClC,YAAA,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;AACxC,YAAA,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,CAAC;AAC5E,YAAA,cAAc,EAAE,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,CAAC;SACvF,CAAC,CAAC,SAAS,CAAC;AACX,YAAA,IAAI,EAAE,CAAC,IAAI,KAAI;;gBAEb,IAAI,CAAC,eAAe,GAAG;;oBAErB,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK;AACzB,wBAAA,EAAE,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE;AACzB,wBAAA,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAA,EAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,SAAS,IAAI,EAAE,CAAA,CAAE,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE;AACrG,wBAAA,IAAI,EAAE,MAAM;AACb,qBAAA,CAAC,CAAC;;oBAEH,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,KAAK;wBAC/B,EAAE,EAAE,KAAK,CAAC,EAAE;AACZ,wBAAA,IAAI,EAAE,KAAK,CAAC,IAAI,IAAK,KAAK,CAAC,aAAa,EAAE,IAAe,IAAI,KAAK,CAAC,EAAE;AACrE,wBAAA,IAAI,EAAE,OAAO;AACd,qBAAA,CAAC,CAAC;AACJ,iBAAA,CAAC,GAAG,CAAC,MAAM,KAAK;AACf,oBAAA,GAAG,MAAM;oBACT,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE;AAC/B,iBAAA,CAAC,CAAC,CAAC;;gBAGJ,IAAI,CAAC,mBAAmB,GAAG;;oBAEzB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,GAAG,CAAC,QAAQ,KAAK;wBAClF,EAAE,EAAE,QAAQ,CAAC,EAAE;wBACf,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,EAAE;AAC1D,wBAAA,IAAI,EAAE,UAAU;AACjB,qBAAA,CAAC,CAAC;;oBAEH,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,KAAK;wBACnC,EAAE,EAAE,KAAK,CAAC,EAAE;wBACZ,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,EAAE;AACjD,wBAAA,IAAI,EAAE,eAAe;AACtB,qBAAA,CAAC,CAAC;AACJ,iBAAA,CAAC,GAAG,CAAC,MAAM,KAAK;AACf,oBAAA,GAAG,MAAM;oBACT,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE;AAC/B,iBAAA,CAAC,CAAC,CAAC;;gBAGJ,IAAI,CAAC,eAAe,EAAE,CAAC;aACxB;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;AACnD,gBAAA,IAAI,CAAC,eAAe,EAAE,CAAC;aACxB;AACF,SAAA,CAAC,CAAC;KACJ;IAED,eAAe,GAAA;;;QAGb,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC;AAC3D,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,OAAO,GAAG,UAAU,CAAC;AAEzE,QAAA,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,SAAS,CAAC,KAAK,IAAG;AACrF,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;AACxB,YAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;;AAGhC,YAAA,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE;gBAC7B,IAAI,CAAC,yBAAyB,EAAE,CAAC;AAClC,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;AAEO,IAAA,kBAAkB,CAAC,IAAS,EAAA;QAClC,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,OAAO,IAAI,CAAC,IAAI,CAAC;AAClB,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,EAAE;AACrC,YAAA,OAAO,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAI,CAAA,EAAA,IAAI,CAAC,SAAS,IAAI,EAAE,CAAA,CAAE,CAAC,IAAI,EAAE,CAAC;AAClE,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE;AAC5B,YAAA,OAAO,IAAI,CAAC,aAAa,CAAC,IAAc,CAAC;AAC1C,SAAA;AAED,QAAA,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC;KAC9B;;;AAID,IAAA,gCAAgC,CAAC,UAAkB,EAAE,gBAAA,GAA4B,IAAI,EAAA;AACnF,QAAA,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,EAAE,CAAC;AAE3B,QAAA,MAAM,QAAQ,GAAG,gBAAgB,GAAG,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC;;QAGpF,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;;QAGtD,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,IAAG;AACzC,YAAA,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;gBAC1B,OAAO,KAAK,CAAC;AACd,aAAA;;AAGD,YAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AACzD,YAAA,IAAI,MAAM,EAAE;gBACV,OAAO,MAAM,CAAC,IAAI,CAAC;AACpB,aAAA;;AAGD,YAAA,OAAO,KAAK,CAAC;AACf,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KACjC;;AAGO,IAAA,qBAAqB,CAAC,UAAkB,EAAA;AAC9C,QAAA,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,EAAE,CAAC;QAE3B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,YAAY,GAAG,EAAE,CAAC;AAEtB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC1C,YAAA,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;AAE3B,YAAA,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE;;AAEhC,gBAAA,IAAI,YAAY,CAAC,IAAI,EAAE,EAAE;oBACvB,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;oBACjC,YAAY,GAAG,EAAE,CAAC;AACnB,iBAAA;;AAED,gBAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnB,aAAA;AAAM,iBAAA;gBACL,YAAY,IAAI,IAAI,CAAC;AACtB,aAAA;AACF,SAAA;;AAGD,QAAA,IAAI,YAAY,CAAC,IAAI,EAAE,EAAE;YACvB,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;AAClC,SAAA;AAED,QAAA,OAAO,MAAM,CAAC;KACf;;AAGO,IAAA,UAAU,CAAC,KAAa,EAAA;AAC9B,QAAA,OAAO,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC;KACvC;AAED,IAAA,cAAc,CAAC,IAAY,EAAA;;AAEzB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAC5B,aAAA,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;AACpB,aAAA,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;AACvB,aAAA,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;AACpB,aAAA,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AAClB,aAAA,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;;AAGtB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAC7B,QAAA,OAAO,CAAQ,KAAA,EAAA,IAAI,CAAI,CAAA,EAAA,SAAS,EAAE,CAAC;KACpC;IAED,cAAc,GAAA;QACZ,0EAA4E,CAAC,IAAI,CAAC,CAAC,EAAE,yBAAyB,EAAE,KAAI;YAClH,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;AAC5D,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,IAAI,EAAE;AACJ,oBAAA,MAAM,EAAE,KAAK;AACb,oBAAA,kBAAkB,EAAE,IAAI,CAAC,UAAU,CAAC,qBAAqB,EAAE;AAC3D,oBAAA,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACnC,iBAAA;AACF,aAAA,CAAC,CAAC;YAEH,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;AACzC,gBAAA,IAAI,MAAM,EAAE;;AAEV,oBAAA,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE;wBACd,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC9C,qBAAA;oBAED,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC;AACrD,wBAAA,IAAI,EAAE,CAAC,OAAO,KAAI;4BAChB,IAAI,CAAC,eAAe,EAAE,CAAC;AACvB,4BAAA,IAAI,CAAC,gBAAgB,CAAC,kCAAkC,CAAC,CAAC;yBAC3D;AACD,wBAAA,KAAK,EAAE,CAAC,KAAK,KAAI;4BACf,IAAI,CAAC,gBAAgB,CAAC,CAAA,4BAAA,EAA+B,KAAK,CAAC,OAAO,CAAE,CAAA,CAAC,CAAC;yBACvE;AACF,qBAAA,CAAC,CAAC;AACJ,iBAAA;AACH,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,UAAU,CAAC,IAAgB,EAAA;QACzB,0EAA4E,CAAC,IAAI,CAAC,CAAC,EAAE,yBAAyB,EAAE,KAAI;YAClH,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;AAC5D,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,IAAI,EAAE;oBACJ,IAAI;AACJ,oBAAA,MAAM,EAAE,IAAI;AACZ,oBAAA,kBAAkB,EAAE,IAAI,CAAC,UAAU,CAAC,qBAAqB,EAAE;AAC3D,oBAAA,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACnC,iBAAA;AACF,aAAA,CAAC,CAAC;YAEH,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;AACzC,gBAAA,IAAI,MAAM,EAAE;oBACV,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC;AACxD,wBAAA,IAAI,EAAE,CAAC,WAAW,KAAI;4BACpB,IAAI,CAAC,eAAe,EAAE,CAAC;AACvB,4BAAA,IAAI,CAAC,gBAAgB,CAAC,kCAAkC,CAAC,CAAC;yBAC3D;AACD,wBAAA,KAAK,EAAE,CAAC,KAAK,KAAI;4BACf,IAAI,CAAC,gBAAgB,CAAC,CAAA,4BAAA,EAA+B,KAAK,CAAC,OAAO,CAAE,CAAA,CAAC,CAAC;yBACvE;AACF,qBAAA,CAAC,CAAC;AACJ,iBAAA;AACH,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,YAAY,CAAC,IAAgB,EAAA;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;AACzD,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,IAAI,EAAE;AACJ,gBAAA,KAAK,EAAE,oBAAoB;AAC3B,gBAAA,OAAO,EAAE,CAAA,gCAAA,EAAmC,IAAI,CAAC,IAAI,CAAG,CAAA,CAAA;AACxD,gBAAA,WAAW,EAAE,QAAQ;AACrB,gBAAA,UAAU,EAAE,QAAQ;AACpB,gBAAA,KAAK,EAAE,MAAM;AACd,aAAA;AACF,SAAA,CAAC,CAAC;QAEH,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,SAAS,IAAG;AAC5C,YAAA,IAAI,SAAS,EAAE;gBACb,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC;AACzD,oBAAA,IAAI,EAAE,CAAC,OAAO,KAAI;AAChB,wBAAA,IAAI,OAAO,EAAE;4BACX,IAAI,CAAC,eAAe,EAAE,CAAC;AACvB,4BAAA,IAAI,CAAC,gBAAgB,CAAC,kCAAkC,CAAC,CAAC;AAC3D,yBAAA;AAAM,6BAAA;AACL,4BAAA,IAAI,CAAC,gBAAgB,CAAC,8BAA8B,CAAC,CAAC;AACvD,yBAAA;qBACF;AACD,oBAAA,KAAK,EAAE,CAAC,KAAK,KAAI;wBACf,IAAI,CAAC,gBAAgB,CAAC,CAAA,4BAAA,EAA+B,KAAK,CAAC,OAAO,CAAE,CAAA,CAAC,CAAC;qBACvE;AACF,iBAAA,CAAC,CAAC;AACJ,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,WAAW,CAAC,KAAY,EAAA;QACtB,IAAI,CAAC,WAAW,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;QAC5D,IAAI,CAAC,YAAY,EAAE,CAAC;KACrB;AAED,IAAA,cAAc,CAAC,MAAc,EAAA;QAC3B,OAAO,MAAM,KAAK,QAAQ,GAAG,eAAe,GAAG,iBAAiB,CAAC;KAClE;AAED,IAAA,iBAAiB,CAAC,WAAqB,EAAA;AACrC,QAAA,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAC/B;AAED,IAAA,kBAAkB,CAAC,IAAgB,EAAA;AACjC,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;KAC/B;AAED,IAAA,qBAAqB,CAAC,IAAgB,EAAA;QACpC,IAAI,CAAC,IAAI,CAAC,eAAe;AAAE,YAAA,OAAO,EAAE,CAAC;QAErC,IAAI,WAAW,GAAa,EAAE,CAAC;AAE/B,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;AACnC,YAAA,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9E,YAAA,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC5B,SAAA;QAED,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE;AAClE,YAAA,WAAW,CAAC,IAAI,CAAC,CAAG,EAAA,IAAI,CAAC,eAAe,CAAC,SAAS,CAAA,CAAA,EAAI,IAAI,CAAC,eAAe,CAAC,OAAO,CAAA,CAAE,CAAC,CAAC;AACvF,SAAA;QAED,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE;AAClE,YAAA,WAAW,CAAC,IAAI,CAAC,CAAG,EAAA,IAAI,CAAC,eAAe,CAAC,SAAS,CAAA,IAAA,EAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAA,CAAE,CAAC,CAAC;AAC1F,SAAA;AAED,QAAA,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAChC;IAED,yBAAyB,GAAA;AACvB,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU;AACjC,aAAA,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;aAClE,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC;aAC7B,MAAM,CAAC,WAAW,IAAI,WAAW,KAAK,SAAS,CAAa,CAAC;;AAGhE,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;KACpE;IAED,mBAAmB,GAAA;QACjB,IAAI,CAAC,YAAY,EAAE,CAAC;KACrB;IAED,cAAc,GAAA;QACZ,IAAI,CAAC,YAAY,EAAE,CAAC;KACrB;IAED,YAAY,GAAA;QACV,IAAI,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;;QAGpC,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;AAC7C,YAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,IAC7B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;AACvC,gBAAA,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACtD,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACjD,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACrD,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAChD,CAAC;AACH,SAAA;;QAGD,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,cAAc,CAAC,CAAC;AACzE,SAAA;;QAGD,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE;AACzD,YAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,mBAAmB,CAAC,CAAC;AACnF,SAAA;AAED,QAAA,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;KACpC;IAED,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;AAC9B,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;KAChD;IAED,gBAAgB,GAAA;AACd,QAAA,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;KAChF;IAED,SAAS,GAAA;QACP,IAAI,CAAC,cAAc,EAAE,CAAC;KACvB;IAED,OAAO,GAAA;AACL,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;KAClC;IAED,YAAY,CAAC,IAAY,EAAE,SAAiB,EAAA;QAC1C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS,EAAE;AACrC,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC;KAC7C;AAED,IAAA,mBAAmB,CAAC,UAAkB,EAAE,KAAa,EAAE,gBAAyB,EAAA;QAC9E,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,IAAI,EAAE,EAAE;YAC1C,OAAO;AACR,SAAA;QAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,gCAAgC,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QAE9F,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;AACzD,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,IAAI,EAAE;AACJ,gBAAA,KAAK,EAAE,KAAK;AACZ,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,UAAU,EAAE,KAAK;AACjB,gBAAA,WAAW,EAAE,OAAO;AACrB,aAAA;AACF,SAAA,CAAC,CAAC;KACJ;AAEO,IAAA,gBAAgB,CAAC,OAAe,EAAA;QACtC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE;AACnC,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,kBAAkB,EAAE,KAAK;AACzB,YAAA,gBAAgB,EAAE,QAAQ;AAC3B,SAAA,CAAC,CAAC;KACJ;;kHA5aU,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAc,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAD,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAE,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAnB,EAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAAH,IAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,oBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,4ECpDjC,m7IAuGM,EAAA,MAAA,EAAA,CAAA,0zGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDzEF,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,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,EAAAA,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,EACZ,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,8BACb,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,8BACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,GAAA,CAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAiB,EACjB,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,8BACf,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,gBAAgB,EAChB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,onBACX,mBAAmB,EAAA,CAAA,EAAA,CAAA,CAAA;4FAKV,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBA1BhC,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,cAAc;wBACd,kBAAkB;wBAClB,aAAa;wBACb,eAAe;wBACf,aAAa;wBACb,cAAc;wBACd,kBAAkB;wBAClB,eAAe;wBACf,aAAa;wBACb,cAAc;wBACd,aAAa;wBACb,iBAAiB;wBACjB,eAAe;wBACf,iBAAiB;wBACjB,gBAAgB;wBAChB,WAAW;wBACX,mBAAmB;AACpB,qBAAA,EAAA,QAAA,EAAA,m7IAAA,EAAA,MAAA,EAAA,CAAA,0zGAAA,CAAA,EAAA,CAAA;;;MEPU,uBAAuB,CAAA;AAQlC,IAAA,WAAA,CAC2C,MAA4B,EAAA;QAA5B,IAAM,CAAA,MAAA,GAAN,MAAM,CAAsB;QAR9D,IAAkB,CAAA,kBAAA,GAAW,EAAE,CAAC;QAChC,IAAS,CAAA,SAAA,GAAW,EAAE,CAAC;QACvB,IAAM,CAAA,MAAA,GAAW,EAAE,CAAC;AAE7B,QAAA,IAAA,CAAA,WAAW,GAAW,OAAO,CAAC;QAC9B,IAAK,CAAA,KAAA,GAAG,kBAAkB,CAAC;KAIvB;IAEJ,QAAQ,GAAA;;QAEN,IAAI,IAAI,CAAC,kBAAkB;YAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACtF,IAAI,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAC3D,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;KACnD;AAED,IAAA,kBAAkB,CAAC,IAAY,EAAA;AAC7B,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;KACzB;;AArBU,uBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,kBASxB,uBAAuB,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AATtB,uBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAjBxB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;AAcT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,+LAAA,EAAA,2YAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAtBC,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,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,EACZ,gBAAgB,EAAA,QAAA,EAAA,aAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,uBAAuB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,kBAAkB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,uBAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,kBAAkB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,oBAAoB,EAAA,QAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4FAmBX,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBA9BnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,cAChB,IAAI,EAAA,aAAA,EACD,iBAAiB,CAAC,IAAI,EAC5B,OAAA,EAAA;wBACP,YAAY;wBACZ,gBAAgB;wBAChB,uBAAuB;wBACvB,mBAAmB;wBACnB,kBAAkB;wBAClB,kBAAkB;wBAClB,oBAAoB;qBACrB,EACS,QAAA,EAAA,CAAA;;;;;;;;;;;;;;AAcT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,+LAAA,EAAA,2YAAA,CAAA,EAAA,CAAA;;0BAYE,MAAM;2BAAC,uBAAuB,CAAA;4CARxB,kBAAkB,EAAA,CAAA;sBAA1B,KAAK;gBACG,SAAS,EAAA,CAAA;sBAAjB,KAAK;gBACG,MAAM,EAAA,CAAA;sBAAd,KAAK;;;MCpBK,oBAAoB,CAAA;IAC/B,OAAO,OAAO,CAAC,MAA4B,EAAA;QACzC,OAAO;AACL,YAAA,QAAQ,EAAE,oBAAoB;AAC9B,YAAA,SAAS,EAAE;AACT,gBAAA;AACE,oBAAA,OAAO,EAAE,uBAAuB;AAChC,oBAAA,QAAQ,EAAE,MAAM;AACjB,iBAAA;;AAEF,aAAA;SACF,CAAC;KACH;;kHAZU,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAApB,oBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,YAR7B,YAAY;QACZ,YAAY;AACZ,QAAA,uBAAuB,aAGvB,uBAAuB,CAAA,EAAA,CAAA,CAAA;AAGd,oBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,YAR7B,YAAY;QACZ,YAAY;QACZ,uBAAuB,CAAA,EAAA,CAAA,CAAA;4FAMd,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAVhC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,YAAY;wBACZ,uBAAuB;AACxB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,uBAAuB;AACxB,qBAAA;AACF,iBAAA,CAAA;;;AChBY,MAAA,MAAM,GAAW;IAC5B,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE;AACpD,IAAA,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE;AACrD,IAAA,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,mBAAmB,EAAE;AACvD,IAAA,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,kBAAkB,EAAE;AACpD,IAAA,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,kBAAkB,EAAE;AACpD,IAAA,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,oBAAoB,EAAE;AACzD,IAAA,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE;;;MCiCxB,wBAAwB,CAAA;AAgCnC,IAAA,WAAA,CACU,WAAwB,EACxB,eAAgC,EAChC,gBAAyC,EAAA;QAFzC,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QACxB,IAAe,CAAA,eAAA,GAAf,eAAe,CAAiB;QAChC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAyB;QAlC1C,IAAW,CAAA,WAAA,GAAG,qBAAqB,CAAC;QACpC,IAAI,CAAA,IAAA,GAAG,EAAE,CAAC;QACV,IAAK,CAAA,KAAA,GAAG,YAAY,CAAC;QACrB,IAAI,CAAA,IAAA,GAAwB,MAAM,CAAC;QACnC,IAAQ,CAAA,QAAA,GAAG,KAAK,CAAC;QAEjB,IAAO,CAAA,OAAA,GAAY,KAAK,CAAC;AAKlC,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;AACxC,QAAA,IAAA,CAAA,gBAAgB,GAAmC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1D,IAAe,CAAA,eAAA,GAAG,CAAC,CAAC;QACpB,IAAW,CAAA,WAAA,GAAG,EAAE,CAAC;AACjB,QAAA,IAAA,CAAA,iBAAiB,GAAG,EAAE,CAAC;AACvB,QAAA,IAAA,CAAA,kBAAkB,GAAG,EAAE,CAAC;AACxB,QAAA,IAAA,CAAA,cAAc,GAAG,EAAE,CAAC;QACpB,IAAkB,CAAA,kBAAA,GAA4B,IAAI,CAAC;AACnD,QAAA,IAAA,CAAA,kBAAkB,GAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC9C,IAAQ,CAAA,QAAA,GAAuB,EAAE,CAAC;QAClC,IAAW,CAAA,WAAA,GAAuB,EAAE,CAAC;QACrC,IAAS,CAAA,SAAA,GAAG,KAAK,CAAC;QAClB,IAAQ,CAAA,QAAA,GAAG,KAAK,CAAC;QACjB,IAAY,CAAA,YAAA,GAAG,EAAE,CAAC;QACV,IAAa,CAAA,aAAA,GAAmB,EAAE,CAAC;AACnC,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,eAAe,CAAqB,EAAE,CAAC,CAAC;AAExD,QAAA,IAAA,CAAA,QAAQ,GAAQ,MAAK,GAAG,CAAC;AACzB,QAAA,IAAA,CAAA,SAAS,GAAQ,MAAK,GAAG,CAAC;AAyOlC,QAAA,IAAA,CAAA,SAAS,GAAG,CAAC,MAAwC,KAAY;;;AAG/D,YAAA,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE;AAC3C,gBAAA,OAAO,IAAI,CAAC,eAAe,EAAE,aAAa,EAAE,KAAK,IAAI,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC;AAChF,aAAA;AAED,YAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAC9B,gBAAA,OAAO,MAAM,CAAC;AACf,aAAA;;;AAID,YAAA,OAAO,IAAI,CAAC,eAAe,EAAE,aAAa,EAAE,KAAK,IAAI,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC;AACjF,SAAC,CAAA;KAjPG;IAEJ,QAAQ,GAAA;;AAEN,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE;YACxB,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACzB,SAAA;AAAM,aAAA;YACL,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC7B,SAAA;;AAGD,QAAA,IAAI,CAAC,gBAAgB,GAAG,aAAa,CAAC;AACpC,YAAA,IAAI,CAAC,SAAS;YACd,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,CACtC,SAAS,CAAC,EAAE,CAAC,EACb,YAAY,CAAC,GAAG,CAAC,EACjB,GAAG,CAAC,KAAK,IAAG;;gBAEV,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;;AAE/C,oBAAA,OAAO,EAAE,CAAC;AACX,iBAAA;gBACD,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AAC1C,aAAC,CAAC,CACH;AACF,SAAA,CAAC,CAAC,IAAI,CACL,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,KAAI;;YAE9B,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAC7C,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC9B,aAAA;AAED,YAAA,MAAM,aAAa,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;YAChD,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,IAC3B,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAClD,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACf,CAAC,CACH,CAAC;;AAGF,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,IAAG;;AAEhE,YAAA,IAAI,YAAoB,CAAC;YAEzB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;;gBAE/C,YAAY,GAAI,KAA0B,EAAE,IAAI,IAAI,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC;AAC/E,aAAA;AAAM,iBAAA;;AAEL,gBAAA,YAAY,GAAG,KAAK,IAAI,EAAE,CAAC;AAC3B,gBAAA,IAAI,CAAC,cAAc,GAAG,YAAY,CAAC;AACpC,aAAA;;AAGD,YAAA,IAAI,CAAC,iBAAiB,GAAG,YAAY,CAAC;YACtC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAAC;;AAGtE,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AACzC,SAAC,CAAC,CAAC;AAEH,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KAC9B;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;KACtD;IAEO,gBAAgB,GAAA;AACtB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAEtB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,IAAI,CAC7C,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK;AAC9B,YAAA,EAAE,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE;AACzB,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAA,EAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,SAAS,IAAI,EAAE,CAAA,CAAE,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE;AACrG,YAAA,IAAI,EAAE,MAAe;AACtB,SAAA,CAAC,CAAC,CAAC,EACJ,UAAU,CAAC,KAAK,IAAG;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;AAC7C,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,IAAI,CAC/C,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK;YACjC,EAAE,EAAE,KAAK,CAAC,EAAE;AACZ,YAAA,IAAI,EAAE,KAAK,CAAC,IAAI,IAAK,KAAK,CAAC,aAAa,EAAE,IAAe,IAAI,KAAK,CAAC,EAAE;AACrE,YAAA,IAAI,EAAE,OAAgB;AACvB,SAAA,CAAC,CAAC,CAAC,EACJ,UAAU,CAAC,KAAK,IAAG;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;AAC9C,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;QAEF,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAC/C,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,KAAI;;YAEtB,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK;AACpC,gBAAA,GAAG,IAAI;AACP,gBAAA,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE;AAC3B,aAAA,CAAC,CAAC,CAAC;YAEJ,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK;AACvC,gBAAA,GAAG,KAAK;AACR,gBAAA,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE;AAC7B,aAAA,CAAC,CAAC,CAAC;AAEJ,YAAA,OAAO,CAAC,GAAG,UAAU,EAAE,GAAG,WAAW,CAAC,CAAC;AACzC,SAAC,CAAC,EACF,QAAQ,CAAC,MAAK;AACZ,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACzB,SAAC,CAAC,CACH,CAAC,SAAS,CAAC;YACV,IAAI,EAAE,QAAQ,IAAG;AACf,gBAAA,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;AAC5B,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC/B;YACD,KAAK,EAAE,KAAK,IAAG;AACb,gBAAA,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;AAChD,gBAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;AACrB,gBAAA,IAAI,CAAC,YAAY,GAAG,4CAA4C,CAAC;AACjE,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;aACxB;AACF,SAAA,CAAC,CAAC;AAEH,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KAC9B;IAEO,oBAAoB,GAAA;AAC1B,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;;AAGtB,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,kBAAkB,KAAK,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,CAAC;QAE7I,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,IAAI,CACzF,GAAG,CAAC,SAAS,IAAI,SAAS;aACvB,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,UAAU,CAAC;AAChD,aAAA,GAAG,CAAC,QAAQ,KAAK;YAChB,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,EAAE;AAC1D,YAAA,IAAI,EAAE,UAAmB;AAC1B,SAAA,CAAC,CAAC,CACJ,EACD,UAAU,CAAC,KAAK,IAAG;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;AACjD,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;AAEF,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,IAAI,CAC3F,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK;YACjC,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,EAAE;AACjD,YAAA,IAAI,EAAE,eAAwB;AAC/B,SAAA,CAAC,CAAC,CAAC,EACJ,UAAU,CAAC,KAAK,IAAG;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;AACvD,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;QAEF,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CACnD,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,KAAI;;YAE1B,MAAM,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,KAAK;AAChD,gBAAA,GAAG,QAAQ;AACX,gBAAA,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,EAAE;AACnC,aAAA,CAAC,CAAC,CAAC;YAEJ,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK;AACvC,gBAAA,GAAG,KAAK;AACR,gBAAA,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE;AAC7B,aAAA,CAAC,CAAC,CAAC;AAEJ,YAAA,OAAO,CAAC,GAAG,cAAc,EAAE,GAAG,WAAW,CAAC,CAAC;AAC7C,SAAC,CAAC,EACF,QAAQ,CAAC,MAAK;AACZ,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACzB,SAAC,CAAC,CACH,CAAC,SAAS,CAAC;YACV,IAAI,EAAE,QAAQ,IAAG;AACf,gBAAA,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;AAC5B,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC/B;YACD,KAAK,EAAE,KAAK,IAAG;AACb,gBAAA,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;AAChD,gBAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;AACrB,gBAAA,IAAI,CAAC,YAAY,GAAG,4CAA4C,CAAC;AACjE,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;aACxB;AACF,SAAA,CAAC,CAAC;AAEH,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KAC9B;AAED,IAAA,cAAc,CAAC,KAAa,EAAA;AAC1B,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE,CAAC;;AAGtB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,cAAc,IAAI,KAAK,CAAC,MAAM,CAAC;;QAGrF,IAAI,QAAQ,GAAG,SAAS,CAAC;QACzB,OAAO,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE;AACrE,YAAA,QAAQ,EAAE,CAAC;AACZ,SAAA;;QAGD,IAAI,MAAM,GAAG,SAAS,CAAC;QACvB,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE;AACxE,YAAA,MAAM,EAAE,CAAC;AACV,SAAA;;QAGD,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACtD,QAAA,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;AAChC,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;;AAG/B,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;AAE5B,QAAA,OAAO,WAAW,CAAC;KACpB;AAkBD,IAAA,SAAS,CAAC,KAAoB,EAAA;;AAE5B,QAAA,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;;YAElC,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,IAAI,EAAE,CAAC;YACxD,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,cAAc,IAAI,CAAC,CAAC;AAE1E,YAAA,IAAI,YAAY,KAAK,EAAE,IAAI,SAAS,KAAK,CAAC,EAAE;;AAE1C,gBAAA,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;oBACrB,KAAK,CAAC,cAAc,EAAE,CAAC;AACxB,iBAAA;AACF,aAAA;;YAGD,IAAI,IAAI,CAAC,kBAAkB;AACvB,gBAAA,SAAS,KAAK,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE;;;gBAG5E,UAAU,CAAC,MAAK;AACd,oBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;;AAG/B,oBAAA,MAAM,MAAM,GAAG,SAAS,GAAG,CAAC,CAAC;AAC7B,oBAAA,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC;AAC9B,oBAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;iBACvB,EAAE,EAAE,CAAC,CAAC;AACR,aAAA;AACF,SAAA;KACF;AAED,IAAA,gBAAgB,CAAC,MAAwB,EAAA;;AAEvC,QAAA,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC;;AAGjC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC;AACxD,QAAA,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC;QACtC,MAAM,gBAAgB,GAAG,YAAY,CAAC,cAAc,IAAI,UAAU,CAAC,MAAM,CAAC;;;QAI1E,IAAI,QAAQ,GAAG,gBAAgB,CAAC;QAChC,IAAI,QAAQ,GAAG,KAAK,CAAC;;QAGrB,OAAO,QAAQ,GAAG,CAAC,EAAE;YACnB,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;YACtC,IAAI,IAAI,KAAK,GAAG,EAAE;gBAChB,QAAQ,GAAG,CAAC,QAAQ,CAAC;AACrB,gBAAA,QAAQ,EAAE,CAAC;AACX,gBAAA,IAAI,CAAC,QAAQ;AAAE,oBAAA,MAAM;AACtB,aAAA;AAAM,iBAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;gBACtD,MAAM;AACP,aAAA;AAAM,iBAAA;AACL,gBAAA,QAAQ,EAAE,CAAC;AACZ,aAAA;AACF,SAAA;;QAGD,IAAI,MAAM,GAAG,gBAAgB,CAAC;QAC9B,QAAQ,GAAG,KAAK,CAAC;AACjB,QAAA,OAAO,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE;AACjC,YAAA,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,IAAI,KAAK,GAAG,EAAE;AAChB,gBAAA,MAAM,EAAE,CAAC;gBACT,QAAQ,GAAG,CAAC,QAAQ,CAAC;AACrB,gBAAA,IAAI,CAAC,QAAQ;AAAE,oBAAA,MAAM;AACtB,aAAA;AAAM,iBAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;gBACtD,MAAM;AACP,aAAA;AAAM,iBAAA;AACL,gBAAA,MAAM,EAAE,CAAC;AACV,aAAA;AACF,SAAA;;QAGD,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7D,QAAA,MAAM,YAAY,GAAG,YAAY,GAAG,gBAAgB,GAAG,WAAW,CAAC;;QAGnE,MAAM,aAAa,GAAG,IAAI,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAAC;;AAGlE,QAAA,IAAI,CAAC,iBAAiB,GAAG,YAAY,CAAC;AACtC,QAAA,IAAI,CAAC,kBAAkB,GAAG,aAAa,CAAC;AACxC,QAAA,IAAI,CAAC,cAAc,GAAG,YAAY,CAAC;AACnC,QAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;;AAG9C,QAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;;QAG7B,UAAU,CAAC,MAAK;AACd,YAAA,MAAM,iBAAiB,GAAG,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC;AAC7D,YAAA,YAAY,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;YACrE,YAAY,CAAC,KAAK,EAAE,CAAC;;AAGrB,YAAA,IAAI,CAAC,eAAe,GAAG,iBAAiB,CAAC;AACzC,YAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;SACvB,EAAE,EAAE,CAAC,CAAC;KACR;IAED,oBAAoB,CAAC,MAAwB,EAAE,UAAkB,EAAA;AAC/D,QAAA,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,KAAK,CAAC;;QAG9B,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;AACrE,QAAA,OAAO,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC;KACzD;;AAGD,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;;AAGhC,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;AAC1D,YAAA,IAAI,CAAC,iBAAiB,GAAG,YAAY,CAAC;AACtC,YAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAC/C,SAAA;AAAM,aAAA;;AAEL,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC;;YAE3B,SAAS,CAAC,QAAQ,IAAG;AACnB,gBAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACvB,oBAAA,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;AACrB,iBAAA;AAAM,qBAAA;;oBAEL,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/C,iBAAA;AACH,aAAC,CAAC;;YAEF,GAAG,CAAC,MAAK;gBACP,MAAM,YAAY,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;AAC1D,gBAAA,IAAI,CAAC,iBAAiB,GAAG,YAAY,CAAC;AACtC,gBAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAC9C,gBAAA,OAAO,YAAY,CAAC;AACtB,aAAC,CAAC,CACH,CAAC,SAAS,EAAE,CAAC;;AAGd,YAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;AAC/B,YAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACxC,SAAA;KACF;AAED,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;KACpB;AAED,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;KACrB;AAED,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,UAAU,EAAE;AACd,YAAA,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;AAClC,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC;AACjC,SAAA;KACF;IAED,MAAM,GAAA;QACJ,IAAI,CAAC,SAAS,EAAE,CAAC;KAClB;AAED;;AAEG;AACK,IAAA,wBAAwB,CAAC,iBAAyB,EAAA;AACxD,QAAA,IAAI,CAAC,iBAAiB;AAAE,YAAA,OAAO,EAAE,CAAC;;QAGlC,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;;QAG7D,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,IAAG;AACzC,YAAA,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;gBAC1B,OAAO,KAAK,CAAC;AACd,aAAA;;AAGD,YAAA,IAAI,WAAW,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,YAAA,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAC5D,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACvC,SAAS,GAAG,IAAI,CAAC;AAClB,aAAA;;AAGD,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;AAClE,YAAA,IAAI,MAAM,EAAE;;AAEV,gBAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;;gBAEhE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAA,CAAA,CAAG,GAAG,QAAQ,CAAC;AACrF,aAAA;;AAGD,YAAA,OAAO,KAAK,CAAC;AACf,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KACjC;AAED;;AAEG;AACK,IAAA,wBAAwB,CAAC,kBAA0B,EAAA;AACzD,QAAA,IAAI,CAAC,kBAAkB;AAAE,YAAA,OAAO,EAAE,CAAC;;QAGnC,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;;QAG9D,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,IAAG;AACzC,YAAA,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;gBAC1B,OAAO,KAAK,CAAC;AACd,aAAA;;AAGD,YAAA,IAAI,WAAW,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,YAAA,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAC5D,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACvC,SAAS,GAAG,IAAI,CAAC;AAClB,aAAA;;AAGD,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC;AAChE,YAAA,IAAI,MAAM,EAAE;;gBAEV,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAA,CAAA,EAAI,MAAM,CAAC,IAAI,CAAA,CAAA,CAAG,GAAG,MAAM,CAAC,IAAI,CAAC;AAC9F,aAAA;;AAGD,YAAA,OAAO,KAAK,CAAC;AACf,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KACjC;AAED;;;AAGG;AACK,IAAA,qBAAqB,CAAC,UAAkB,EAAA;AAC9C,QAAA,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,EAAE,CAAC;QAE3B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,QAAQ,GAAG,KAAK,CAAC;AAErB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC1C,YAAA,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAE3B,IAAI,IAAI,KAAK,GAAG,EAAE;;gBAEhB,YAAY,IAAI,IAAI,CAAC;gBACrB,QAAQ,GAAG,CAAC,QAAQ,CAAC;AACtB,aAAA;AAAM,iBAAA,IAAI,CAAC,QAAQ,KAAK,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE;;AAEtD,gBAAA,IAAI,YAAY,CAAC,IAAI,EAAE,EAAE;oBACvB,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;oBACjC,YAAY,GAAG,EAAE,CAAC;AACnB,iBAAA;;AAED,gBAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnB,aAAA;AAAM,iBAAA;gBACL,YAAY,IAAI,IAAI,CAAC;AACtB,aAAA;AACF,SAAA;;AAGD,QAAA,IAAI,YAAY,CAAC,IAAI,EAAE,EAAE;YACvB,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;AAClC,SAAA;AAED,QAAA,OAAO,MAAM,CAAC;KACf;AAED;;AAEG;AACK,IAAA,UAAU,CAAC,KAAa,EAAA;AAC9B,QAAA,OAAO,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC;KACvC;AAED;;;AAGG;AACK,IAAA,iBAAiB,CAAC,WAAmB,EAAA;AAC3C,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;KACzC;AAED;;AAEG;AACK,IAAA,iBAAiB,CAAC,WAAmB,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,GAAG,CAAA,CAAA,EAAI,WAAW,CAAG,CAAA,CAAA,GAAG,WAAW,CAAC;KAC/E;;sHA1kBU,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAT,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAwB,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAN,uBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,wBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,EARxB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,IAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EAAA;AACT,QAAA;AACE,YAAA,OAAO,EAAE,iBAAiB;AAC1B,YAAA,WAAW,EAAE,UAAU,CAAC,MAAM,wBAAwB,CAAC;AACvD,YAAA,KAAK,EAAE,IAAI;AACZ,SAAA;AACF,KAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAYU,sBAAsB,ECzDnC,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,ikDAqCiB,iTDTb,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,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,mBAAmB,EACnB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,0WACd,qBAAqB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,KAAA,CAAA,eAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,8BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,KAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,mDAAA,EAAA,QAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACrB,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,oLACb,wBAAwB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;4FAYf,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAvBpC,SAAS;+BACE,sBAAsB,EAAA,UAAA,EACpB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,kBAAkB;wBAClB,cAAc;wBACd,qBAAqB;wBACrB,cAAc;wBACd,aAAa;wBACb,wBAAwB;qBACzB,EAGU,SAAA,EAAA;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,8BAA8B,CAAC;AACvD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA,EAAA,QAAA,EAAA,ikDAAA,EAAA,MAAA,EAAA,CAAA,0PAAA,CAAA,EAAA,CAAA;6JAGQ,WAAW,EAAA,CAAA;sBAAnB,KAAK;gBACG,IAAI,EAAA,CAAA;sBAAZ,KAAK;gBACG,KAAK,EAAA,CAAA;sBAAb,KAAK;gBACG,IAAI,EAAA,CAAA;sBAAZ,KAAK;gBACG,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBACG,kBAAkB,EAAA,CAAA;sBAA1B,KAAK;gBACG,OAAO,EAAA,CAAA;sBAAf,KAAK;gBAEwB,eAAe,EAAA,CAAA;sBAA5C,SAAS;uBAAC,iBAAiB,CAAA;gBACO,YAAY,EAAA,CAAA;sBAA9C,SAAS;uBAAC,sBAAsB,CAAA;;;MEVtB,yBAAyB,CAAA;;AAqBpC,IAAA,WAAA,CACU,EAAe,EACf,iBAAoC,EACrC,SAAkD,EACzB,IAK/B,EAAA;QARO,IAAE,CAAA,EAAA,GAAF,EAAE,CAAa;QACf,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB,CAAmB;QACrC,IAAS,CAAA,SAAA,GAAT,SAAS,CAAyC;QACzB,IAAI,CAAA,IAAA,GAAJ,IAAI,CAKnC;AA5BH,QAAA,IAAA,CAAA,oBAAoB,GAAG,CAAC,MAAM,CAAC,CAAC;AAChC,QAAA,IAAA,CAAA,qBAAqB,GAAG,CAAC,WAAW,CAAC,CAAC;QACtC,IAAgB,CAAA,gBAAA,GAAG,EAAE,CAAC;QACtB,IAAyB,CAAA,yBAAA,GAAG,KAAK,CAAC;AAClC,QAAA,IAAA,CAAA,QAAQ,GAAG;AACT,YAAA,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE;AAC5B,YAAA,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE;AAC5B,YAAA,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE;AAC7B,YAAA,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE;AAC/B,YAAA,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE;AAC9B,YAAA,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE;AAC5B,YAAA,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE;SAC/B,CAAC;QACF,IAAa,CAAA,aAAA,GAAG,KAAK,CAAC;QACtB,IAAa,CAAA,aAAA,GAAG,KAAK,CAAC;QACtB,IAAkB,CAAA,kBAAA,GAAG,KAAK,CAAC;KActB;IAEL,QAAQ,GAAA;QACN,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACtC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnC,SAAA;;AAGD,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE;YACnC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;AACnD,YAAA,IAAI,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,OAAO,EAAE;AAChD,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC3B,aAAA;AACD,YAAA,IAAI,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,OAAO,EAAE;AAChD,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC3B,aAAA;YACD,IAAI,WAAW,CAAC,UAAU,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AAC/D,gBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;AAChC,aAAA;AACF,SAAA;KACF;IAED,cAAc,GAAA;;QAEZ,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;QAEzF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;YAC5B,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACjC,WAAW,EAAE,CAAC,EAAE,CAAC;YACjB,WAAW,EAAE,CAAC,kBAAkB,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACxD,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC3C,kBAAkB,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC/C,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,EAAE,CAAC,QAAQ,CAAC;AAClB,YAAA,eAAe,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;gBAC7B,SAAS,EAAE,CAAC,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC,EAAE,CAAC;gBACb,SAAS,EAAE,CAAC,IAAI,CAAC;gBACjB,OAAO,EAAE,CAAC,IAAI,CAAC;gBACf,UAAU,EAAE,CAAC,EAAE,CAAC;aACjB,CAAC;AACH,SAAA,CAAC,CAAC;;AAGH,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACtB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC;AAC7C,SAAA;;KAGF;AAED,IAAA,YAAY,CAAC,IAAgB,EAAA;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,YAAA,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;AACnC,YAAA,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;YACnC,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;AACpB,SAAA,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,eAAe,EAAE;YACxB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC;AAC/C,gBAAA,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,SAAS;AACzC,gBAAA,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO;gBACrC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,IAAI;gBAC3F,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,IAAI;AACrF,gBAAA,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,UAAU,IAAI,EAAE;AAClD,aAAA,CAAC,CAAC;AACJ,SAAA;KACF;AAED,IAAA,gBAAgB,CAAC,KAAU,EAAA;AACzB,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC;AACnC,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACvB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,2BAA2B,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC7D,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC5D,SAAA;KACF;AAED,IAAA,gBAAgB,CAAC,KAAU,EAAA;AACzB,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC;AACnC,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACvB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,2BAA2B,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC/D,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC9D,SAAA;KACF;AAED,IAAA,qBAAqB,CAAC,KAAU,EAAA;AAC9B,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC;AACxC,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;AAC5B,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC/D,SAAA;KACF;IAED,sBAAsB,GAAA;AACpB,QAAA,IAAI,CAAC,yBAAyB,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC;AACjE,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;KAC5B;IAED,mBAAmB,GAAA;QACjB,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE;;YAEzD,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;;YAGvE,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE;;AAE5D,gBAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;;AAGpD,gBAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;AACzE,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,kBAAkB,EAAE,mBAAmB,CAAC,CAAC,CAAC;;AAGzF,gBAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;AAC5B,aAAA;AACF,SAAA;KACF;IAED,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;KACxB;;IAID,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;;AAEzB,YAAA,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;YACjC,OAAO;AACR,SAAA;;QAGD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;AAC9C,QAAA,MAAM,UAAU,GAAe;YAC7B,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE;YAC5B,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,cAAc,EAAE,SAAS,CAAC,cAAc;YACxC,kBAAkB,EAAE,SAAS,CAAC,kBAAkB;YAChD,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,MAAM,EAAE,SAAS,CAAC,MAAM;SACzB,CAAC;;QAGF,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,kBAAkB,EAAE;AACvE,YAAA,UAAU,CAAC,eAAe,GAAG,EAAE,CAAC;YAEhC,IAAI,IAAI,CAAC,aAAa,EAAE;gBACtB,UAAU,CAAC,eAAe,CAAC,SAAS,GAAG,SAAS,CAAC,eAAe,CAAC,SAAS,CAAC;gBAC3E,UAAU,CAAC,eAAe,CAAC,OAAO,GAAG,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC;AACxE,aAAA;YAED,IAAI,IAAI,CAAC,aAAa,EAAE;gBACtB,UAAU,CAAC,eAAe,CAAC,SAAS,GAAG,SAAS,CAAC,eAAe,CAAC,SAAS,CAAC;gBAC3E,UAAU,CAAC,eAAe,CAAC,OAAO,GAAG,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC;AACxE,aAAA;YAED,IAAI,IAAI,CAAC,kBAAkB,EAAE;gBAC3B,UAAU,CAAC,eAAe,CAAC,UAAU,GAAG,SAAS,CAAC,eAAe,CAAC,UAAU,CAAC;AAC9E,aAAA;AACF,SAAA;AAED,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;KAClC;IAED,OAAO,GAAA;AACL,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;KACnC;IAED,6BAA6B,GAAA;;AAE3B,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC;QACjE,OAAO,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,OAAO,CAAC;KACnE;;AAlNU,yBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,yGAyB1B,eAAe,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAzBd,yBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EC/CtC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,gnRA8LM,EDpKF,MAAA,EAAA,CAAA,wwCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,+PACZ,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,2SACf,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,oBAAoB,EACpB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,0TACb,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,aAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,KAAA,EAAA,KAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,wBAAwB,EACxB,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,mBAAmB,6bACnB,wBAAwB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;4FAKf,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAzBrC,SAAS;+BACE,wBAAwB,EAAA,UAAA,EACtB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,eAAe;wBACf,eAAe;wBACf,kBAAkB;wBAClB,cAAc;wBACd,eAAe;wBACf,iBAAiB;wBACjB,cAAc;wBACd,aAAa;wBACb,oBAAoB;wBACpB,aAAa;wBACb,mBAAmB;wBACnB,mBAAmB;wBACnB,wBAAwB;wBACxB,WAAW;wBACX,mBAAmB;wBACnB,wBAAwB;AACzB,qBAAA,EAAA,QAAA,EAAA,gnRAAA,EAAA,MAAA,EAAA,CAAA,wwCAAA,CAAA,EAAA,CAAA;;0BA6BE,MAAM;2BAAC,eAAe,CAAA;;;;;;;;MENd,uBAAuB,CAAA;AAoDlC,IAAA,WAAA,CACU,EAAe,EACf,eAAgC,EAChC,iBAAoC,EACpC,gBAAyC,EACzC,sBAAqD,EACtD,SAAgD,EACvB,IAM/B,EAAA;QAZO,IAAE,CAAA,EAAA,GAAF,EAAE,CAAa;QACf,IAAe,CAAA,eAAA,GAAf,eAAe,CAAiB;QAChC,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB,CAAmB;QACpC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAyB;QACzC,IAAsB,CAAA,sBAAA,GAAtB,sBAAsB,CAA+B;QACtD,IAAS,CAAA,SAAA,GAAT,SAAS,CAAuC;QACvB,IAAI,CAAA,IAAA,GAAJ,IAAI,CAMnC;AA/DH,QAAA,IAAA,CAAA,mBAAmB,GAAG,CAAC,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,oBAAoB,CAAC,CAAC;QAC5J,IAAc,CAAA,cAAA,GAAG,EAAE,CAAC;QACpB,IAAuB,CAAA,uBAAA,GAAG,KAAK,CAAC;QAChC,IAAgB,CAAA,gBAAA,GAAG,CAAC,CAAC;;QAGrB,IAAQ,CAAA,QAAA,GAAqC,EAAE,CAAC;QAChD,IAAc,CAAA,cAAA,GAAW,EAAE,CAAC;QAC5B,IAAgB,CAAA,gBAAA,GAAW,EAAE,CAAC;;QAG9B,IAAc,CAAA,cAAA,GAAG,KAAK,CAAC;QACvB,IAAY,CAAA,YAAA,GAAe,EAAE,CAAC;QAC9B,IAAc,CAAA,cAAA,GAAiB,EAAE,CAAC;;QAGlC,IAAmB,CAAA,mBAAA,GAAG,KAAK,CAAC;QAC5B,IAAY,CAAA,YAAA,GAAoB,EAAE,CAAC;QACnC,IAAoB,CAAA,oBAAA,GAAiB,EAAE,CAAC;;QAGxC,IAAmB,CAAA,mBAAA,GAAgE,EAAE,CAAC;QACtF,IAAkB,CAAA,kBAAA,GAAG,KAAK,CAAC;;AAGnB,QAAA,IAAA,CAAA,YAAY,GAAG,CAAC,IAAgB,EAAE,KAAa,KAAoB;YACzE,OAAO;AACL,gBAAA,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACvD,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,gBAAA,KAAK,EAAE,KAAK;gBACZ,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC;AACJ,SAAC,CAAC;QAEF,IAAW,CAAA,WAAA,GAAG,IAAI,eAAe,CAC/B,IAAI,IAAI,IAAI,CAAC,KAAK,EAClB,IAAI,IAAI,IAAI,CAAC,UAAU,CACxB,CAAC;AAEF,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,gBAAgB,CAClC,IAAI,CAAC,YAAY,EACjB,IAAI,IAAI,IAAI,CAAC,KAAK,EAClB,IAAI,IAAI,IAAI,CAAC,UAAU,EACvB,IAAI,IAAI,IAAI,CAAC,QAAQ,CACtB,CAAC;AAEF,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QA4X7E,IAAQ,CAAA,QAAA,GAAG,CAAC,CAAS,EAAE,IAAoB,KAAK,IAAI,CAAC,UAAU,CAAC;KA5W3D;IAEL,QAAQ,GAAA;QACN,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEhC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAC1C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACvC,SAAA;KACF;IAED,wBAAwB,GAAA;QACtB,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE,CAAC,SAAS,CAAC,YAAY,IAAG;;YAEpE,MAAM,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,mBAAmB,EAAE,GAAG,YAAY,CAAC,CAAC;;AAEvE,YAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACzE,SAAC,CAAC,CAAC;KACJ;IAED,cAAc,GAAA;;QAEZ,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;QAEzF,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;YAChC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACjC,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,eAAe,GAAG,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC/E,QAAQ,EAAE,CAAC,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC9E,UAAU,EAAE,CAAC,EAAE,CAAC;YAChB,MAAM,EAAE,CAAC,QAAQ,CAAC;YAClB,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;AAC/B,SAAA,CAAC,CAAC;;AAGH,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACtB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC;AAC9C,SAAA;KACF;AAED,IAAA,YAAY,CAAC,QAAkB,EAAA;AAC7B,QAAA,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;YAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI;AACnB,YAAA,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,EAAE;YACvC,IAAI,EAAE,QAAQ,CAAC,IAAI;AACnB,YAAA,QAAQ,EAAE,QAAQ,CAAC,WAAW,IAAI,EAAE;AACpC,YAAA,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,EAAE;YACrC,MAAM,EAAE,QAAQ,CAAC,MAAM;AACxB,SAAA,CAAC,CAAC;;AAGH,QAAA,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;KACzC;AAED,IAAA,wBAAwB,CAAC,QAAkB,EAAA;AACzC,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;;;QAInB,IAAI,QAAQ,CAAC,gBAAgB,EAAE;AAC7B,YAAA,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AACjE,gBAAA,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,UAAU,EAAE;AACxC,oBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACnD,iBAAA;AACH,aAAC,CAAC,CAAC;AACJ,SAAA;KACF;IAED,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE;;YAE9D,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;YAEzF,IAAI,aAAa,IAAI,CAAC,EAAE;;AAEtB,gBAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;AACnE,aAAA;AAAM,iBAAA;;AAEL,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACjB,oBAAA,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;AAC/B,oBAAA,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE;AACpC,iBAAA,CAAC,CAAC;AACJ,aAAA;;AAGD,YAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;AACzB,YAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;AAC5B,SAAA;KACF;AAED,IAAA,YAAY,CAAC,KAAa,EAAA;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACtC,QAAA,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC;AACnC,QAAA,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,KAAK,CAAC;AACvC,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;KAC5B;AAED,IAAA,cAAc,CAAC,KAAa,EAAA;QAC1B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;KAChC;IAED,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,uBAAuB,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC;AAC7D,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;KAC1B;IAED,iBAAiB,GAAA;QACf,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE;;AAErD,YAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;iBACjD,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;iBACvE,IAAI,CAAC,GAAG,CAAC,CAAC;;YAGb,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,IACxD,GAAG,CAAC,WAAW,EAAE,KAAK,iBAAiB,CAAC,WAAW,EAAE,CACtD,CAAC;AAEF,YAAA,IAAI,gBAAgB,EAAE;;AAEpB,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;AAC/D,aAAA;AAAM,iBAAA;;AAEL,gBAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACjD,gBAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;;AAGhC,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAC;AAChE,aAAA;;AAGD,YAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;AACzB,YAAA,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;AACtC,SAAA;KACF;IAED,iBAAiB,GAAA;AACf,QAAA,MAAM,WAAW,GAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK;YAC1C,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK;SACnD,CAAC;;AAGF,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAG;YAC3B,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;AACrC,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,WAAW,CAAC;KACpB;AAED,IAAA,WAAW,CAAC,KAAU,EAAA;;AAEpB,QAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC;;QAGpC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE;YACpF,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACzB,SAAA;;QAGD,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE;YACrF,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACzB,SAAA;;AAGD,QAAA,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;;YAE/D,IAAI,CAAC,uBAAuB,EAAE,CAAC;AAChC,SAAA;KACF;IAED,uBAAuB,GAAA;;AAGrB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AACjD,YAAA,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YAChD,OAAO;AACR,SAAA;AAED,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;AAC/B,QAAA,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;;AAI9B,QAAA,IAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAC;AACnB,YAAA,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC;AAC/E,gBAAA,IAAI,EAAE,CAAC,SAAS,KAAI;;;oBAIlB,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;;AAEvC,wBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;wBAChC,OAAO;AACR,qBAAA;;AAGD,oBAAA,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,KAAI;wBACjF,OAAO;4BACL,MAAM;AACN,4BAAA,QAAQ,EAAE,MAAM;4BAChB,WAAW;yBACZ,CAAC;AACJ,qBAAC,CAAC,CAAC;;AAGH,oBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;;AAGhC,oBAAA,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE;;AAExC,qBAAA;iBACF;AACD,gBAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,oBAAA,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;AAC5D,oBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;iBACjC;AACF,aAAA,CAAC,CAAC;AACF,SAAA;AACG,aAAA;;AAEJ,YAAA,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC;AACxE,gBAAA,IAAI,EAAE,CAAC,SAAS,KAAI;;;oBAIlB,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;;AAEvC,wBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;wBAChC,OAAO;AACR,qBAAA;;AAGD,oBAAA,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,KAAI;wBACjF,OAAO;4BACL,MAAM;AACN,4BAAA,QAAQ,EAAE,MAAM;4BAChB,WAAW;yBACZ,CAAC;AACJ,qBAAC,CAAC,CAAC;;AAGH,oBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;;AAGhC,oBAAA,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE;;AAExC,qBAAA;iBACF;AACD,gBAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,oBAAA,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;AAC5D,oBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;iBACjC;AACF,aAAA,CAAC,CAAC;AACJ,SAAA;KACA;IAED,gBAAgB,GAAA;QACd,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AAC/E,YAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;AACzB,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,EAAE,CAAC;YAC1B,OAAO;AACR,SAAA;AAED,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;;QAG3B,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,SAAS,IAAG;;YAExD,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;gBAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,IAAI,EAAE,CAAC;;AAGxD,gBAAA,MAAM,iBAAiB,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;;gBAGvE,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,MAAM,CAAC,QAAQ,IACzD,IAAI,CAAC,sBAAsB,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,CAChF,CAAC;AAEF,gBAAA,IAAI,CAAC,YAAY,GAAG,iBAAiB,CAAC;;AAGtC,gBAAA,MAAM,WAAW,GAAe;AAC9B,oBAAA,EAAE,EAAE,cAAc;AAClB,oBAAA,IAAI,EAAE,kBAAkB;AACxB,oBAAA,IAAI,EAAE,MAAM;oBACZ,QAAQ,EAAE,iBAAiB,CAAC,GAAG,CAAC,QAAQ,KAAK;wBAC3C,EAAE,EAAE,QAAQ,CAAC,EAAE;wBACf,IAAI,EAAE,QAAQ,CAAC,IAAI;AACnB,wBAAA,IAAI,EAAE,UAAU;AAChB,wBAAA,QAAQ,EAAE;4BACR,QAAQ,EAAE,QAAQ,CAAC,WAAW;4BAC9B,WAAW,EAAE,QAAQ,CAAC,WAAW;AAClC,yBAAA;AACF,qBAAA,CAAC,CAAC;iBACJ,CAAC;AAEF,gBAAA,IAAI,CAAC,cAAc,GAAG,CAAC,WAAW,CAAC,CAAC;gBACpC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC;AAC3C,gBAAA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;;gBAG5B,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,EAAE;oBAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC/C,oBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACnC,iBAAA;AACH,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;KACJ;IAED,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AACjD,YAAA,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;AAC/B,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,EAAE,CAAC;YAC1B,OAAO;AACR,SAAA;AAED,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;AAEhC,QAAA,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,IAAG;AAClF,YAAA,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;AAE3B,YAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;;AAErB,gBAAA,MAAM,gBAAgB,GAAe;AACnC,oBAAA,EAAE,EAAE,oBAAoB;AACxB,oBAAA,IAAI,EAAE,eAAe;AACrB,oBAAA,IAAI,EAAE,MAAM;oBACZ,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK;wBAC7B,EAAE,EAAE,KAAK,CAAC,EAAE;wBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,wBAAA,IAAI,EAAE,eAAe;AACrB,wBAAA,QAAQ,EAAE;4BACR,WAAW,EAAE,KAAK,CAAC,WAAW;4BAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;4BAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;AACrB,yBAAA;AACF,qBAAA,CAAC,CAAC;iBACJ,CAAC;AAEF,gBAAA,IAAI,CAAC,oBAAoB,GAAG,CAAC,gBAAgB,CAAC,CAAC;gBAC/C,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC;;gBAGjD,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,EAAE;oBAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC/C,oBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACnC,iBAAA;AACF,aAAA;AAAM,iBAAA;AACL,gBAAA,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;AAC/B,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,EAAE,CAAC;AAC3B,aAAA;AAED,YAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;SAClC,EAAE,KAAK,IAAG;AACT,YAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;AACrD,YAAA,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;AAC/B,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,EAAE,CAAC;AAC1B,YAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;AACnC,SAAC,CAAC,CAAC;KACJ;AAID,IAAA,WAAW,CAAC,IAAoB,EAAA;QAC9B,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,cAAc,CAAC;AACxB,YAAA,KAAK,eAAe;AAClB,gBAAA,OAAO,QAAQ,CAAC;AAClB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,UAAU,CAAC;AACpB,YAAA;AACE,gBAAA,OAAO,QAAQ,CAAC;AACnB,SAAA;KACF;AAED,IAAA,gBAAgB,CAAC,IAAoB,EAAA;QACnC,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,eAAe,CAAC;AACzB,YAAA,KAAK,eAAe;AAClB,gBAAA,OAAO,oBAAoB,CAAC;AAC9B,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,WAAW,CAAC;AACrB,YAAA;AACE,gBAAA,OAAO,eAAe,CAAC;AAC1B,SAAA;KACF;IAED,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;KACxB;AAEO,IAAA,kBAAkB,CAAC,IAAY,EAAA;QACrC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;AAC/B,YAAA,OAAO,YAAY,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AACjC,SAAA;;QAGD,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;AACnC,aAAA,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;AAC9B,aAAA,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;AACnB,aAAA,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;;AAGzB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,QAAA,OAAO,CAAG,EAAA,MAAM,CAAI,CAAA,EAAA,SAAS,EAAE,CAAC;KACjC;IAED,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;YAC7B,OAAO;AACR,SAAA;;QAGD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;;QAGlD,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE;YACpC,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACtD,SAAA;AAED,QAAA,MAAM,QAAQ,GAAa;AACzB,YAAA,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,SAAS,CAAC,IAAI;AACpB,YAAA,WAAW,EAAE,SAAS,CAAC,WAAW,IAAI,EAAE;YACxC,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,WAAW,EAAE,SAAS,CAAC,QAAQ;YAC/B,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,IAAI,EAAE;AAClD,YAAA,gBAAgB,EAAE,IAAI,CAAC,iBAAiB,EAAE;SAC3C,CAAC;AAEF,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;KAChC;IAED,OAAO,GAAA;AACL,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;KACnC;;AA7fU,uBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,mNA2DxB,eAAe,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AA3Dd,uBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EClEpC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,steA8RM,EDhPF,MAAA,EAAA,CAAA,s0IAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,6VACZ,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAiB,EACjB,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,oBAAoB,EACpB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAiB,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,0TACb,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,aAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,aAAA,EAAA,QAAA,EAAA,oFAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAxB,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,mBAAmB,EACnB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,wBAAwB,EACxB,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,spBACb,wBAAwB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAyB,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;4FAKf,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAxBnC,SAAS;+BACE,qBAAqB,EAAA,UAAA,EACnB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,eAAe;wBACf,eAAe;wBACf,kBAAkB;wBAClB,cAAc;wBACd,eAAe;wBACf,iBAAiB;wBACjB,aAAa;wBACb,oBAAoB;wBACpB,aAAa;wBACb,cAAc;wBACd,WAAW;wBACX,mBAAmB;wBACnB,wBAAwB;wBACxB,aAAa;wBACb,wBAAwB;AACzB,qBAAA,EAAA,QAAA,EAAA,steAAA,EAAA,MAAA,EAAA,CAAA,s0IAAA,CAAA,EAAA,CAAA;;0BA+DE,MAAM;2BAAC,eAAe,CAAA;;;;;;;;MEvEd,uBAAuB,CAAA;IAgClC,WACU,CAAA,YAA0B,EAC1B,gBAAyC,EAAA;QADzC,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;QAC1B,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAyB;AAjC3C,QAAA,IAAA,CAAA,WAAW,GAAG,CAAC,IAAe,EAAE,KAAa,KAAc;YACjE,OAAO;AACL,gBAAA,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACvD,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;AAC7B,gBAAA,KAAK,EAAE,KAAK;gBACZ,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC;AACJ,SAAC,CAAC;QAEF,IAAW,CAAA,WAAA,GAAG,IAAI,eAAe,CAC/B,IAAI,IAAI,IAAI,CAAC,KAAK,EAClB,IAAI,IAAI,IAAI,CAAC,UAAU,CACxB,CAAC;AAEF,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,gBAAgB,CAClC,IAAI,CAAC,WAAW,EAChB,IAAI,IAAI,IAAI,CAAC,KAAK,EAClB,IAAI,IAAI,IAAI,CAAC,UAAU,EACvB,IAAI,IAAI,IAAI,CAAC,QAAQ,CACtB,CAAC;AAEF,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7E,IAAW,CAAA,WAAA,GAAW,EAAE,CAAC;QACzB,IAAY,CAAA,YAAA,GAAgB,EAAE,CAAC;QAC/B,IAAS,CAAA,SAAA,GAAY,KAAK,CAAC;QAC3B,IAAQ,CAAA,QAAA,GAAY,KAAK,CAAC;QAC1B,IAAY,CAAA,YAAA,GAAW,EAAE,CAAC;QAsG1B,IAAQ,CAAA,QAAA,GAAG,CAAC,CAAS,EAAE,IAAc,KAAK,IAAI,CAAC,UAAU,CAAC;KAjGtD;IAEJ,QAAQ,GAAA;QACN,IAAI,CAAC,sBAAsB,EAAE,CAAC;KAC/B;IAED,sBAAsB,GAAA;AACpB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;AAEtB,QAAA,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC;AACtC,YAAA,IAAI,EAAE,CAAC,MAAM,KAAI;gBACf,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,IAAG;AAChD,oBAAA,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC;AACnC,oBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,cAAc,CAAC;;AAGtC,oBAAA,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACvE,wBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,qBAAA;AACD,oBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACzB,iBAAC,CAAC,CAAC;aACJ;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;AAC/C,gBAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;AACrB,gBAAA,IAAI,CAAC,YAAY,GAAG,0CAA0C,CAAC;AAC/D,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;aACxB;AACF,SAAA,CAAC,CAAC;KACJ;IAED,MAAM,cAAc,CAAC,MAAmB,EAAA;QACtC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AAClC,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;;AAGD,QAAA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAuB,CAAC;;AAGtD,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAC1B,IAAI,CAAC,KAAK,CAAC,UAAU;gBAAE,SAAS;;AAGhC,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;;YAG3E,MAAM,cAAc,GAAG,UAAU;iBAC9B,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC;iBACnC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC;iBACpB,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC;;AAG3D,YAAA,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC7B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;oBACjC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;AACjD,iBAAA;AACD,gBAAA,cAAc,CAAC,OAAO,CAAC,OAAO,IAAG;AAC/B,oBAAA,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;AAC7C,iBAAC,CAAC,CAAC;AACJ,aAAA;AACF,SAAA;;AAGD,QAAA,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;QACtC,cAAc,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAI;AACrC,YAAA,QAAQ,CAAC,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACpD,SAAC,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;;AAG1E,QAAA,MAAM,SAAS,GAAG,CAAC,KAAgB,EAAE,KAAa,KAAe;;AAE/D,YAAA,MAAM,aAAa,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;AACxE,YAAA,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;AAGhE,YAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,IAAI,SAAS,CAAC,UAAU,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YAEjF,OAAO;gBACL,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,EAAE,EAAE,KAAK,CAAC,EAAE;AACZ,gBAAA,KAAK,EAAE,KAAK;AACZ,gBAAA,UAAU,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;AAC/B,gBAAA,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ,GAAG,SAAS;gBACpD,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC;AACJ,SAAC,CAAC;;AAGF,QAAA,OAAO,cAAc,CAAC,GAAG,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;KACzD;AAID,IAAA,cAAc,CAAC,MAAc,EAAA;QAC3B,OAAO,MAAM,KAAK,QAAQ,GAAG,eAAe,GAAG,iBAAiB,CAAC;KAClE;AAED,IAAA,WAAW,CAAC,KAAY,EAAA;QACtB,MAAM,WAAW,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAE3E,IAAI,CAAC,WAAW,EAAE;YAChB,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC;YACzC,OAAO;AACR,SAAA;;AAGD,QAAA,MAAM,UAAU,GAAG,CAAC,IAAe,KAAsB;AACvD,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAChE,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC;YAEjF,IAAI,SAAS,IAAI,SAAS,EAAE;AAC1B,gBAAA,OAAO,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAC,CAAC;AAC3C,aAAA;;YAGD,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,gBAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ;qBACnC,GAAG,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;qBAC/B,MAAM,CAAC,CAAC,KAAK,KAAyB,KAAK,KAAK,IAAI,CAAC,CAAC;AAEzD,gBAAA,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC/B,OAAO,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAC,CAAC;AAC9C,iBAAA;AACF,aAAA;YAED,OAAO,IAAI,CAAC;AACd,SAAC,CAAC;AAEF,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY;aACnC,GAAG,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;aAC7B,MAAM,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,CAAgB,CAAC;AAEhD,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,YAAY,CAAC;;AAGpC,QAAA,IAAI,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;AAC7C,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;AAC9B,SAAA;KACF;;qHAnLU,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAX,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAG,uBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,uBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,+ECtDpC,m9HAgGM,EAAA,MAAA,EAAA,CAAA,i5FAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDvDF,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAArB,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,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,EAAA,aAAa,m6BACb,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAQ,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,8BACd,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,onBACX,wBAAwB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;4FAKf,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAjBnC,SAAS;+BACE,qBAAqB,EAAA,UAAA,EACnB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,aAAa;wBACb,aAAa;wBACb,eAAe;wBACf,cAAc;wBACd,kBAAkB;wBAClB,cAAc;wBACd,WAAW;wBACX,wBAAwB;AACzB,qBAAA,EAAA,QAAA,EAAA,m9HAAA,EAAA,MAAA,EAAA,CAAA,i5FAAA,CAAA,EAAA,CAAA;;;MEDU,8BAA8B,CAAA;IA+BzC,WACU,CAAA,WAAwB,EACxB,gBAAyC,EAAA;QADzC,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QACxB,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAyB;AAhC3C,QAAA,IAAA,CAAA,WAAW,GAAG,CAAC,IAAa,EAAE,KAAa,KAAc;YAC/D,OAAO;AACL,gBAAA,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACvD,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACvB,gBAAA,KAAK,EAAE,KAAK;gBACZ,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B,CAAC;AACJ,SAAC,CAAC;QAEF,IAAW,CAAA,WAAA,GAAG,IAAI,eAAe,CAC/B,IAAI,IAAI,IAAI,CAAC,KAAK,EAClB,IAAI,IAAI,IAAI,CAAC,UAAU,CACxB,CAAC;AAEF,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,gBAAgB,CAClC,IAAI,CAAC,WAAW,EAChB,IAAI,IAAI,IAAI,CAAC,KAAK,EAClB,IAAI,IAAI,IAAI,CAAC,UAAU,EACvB,IAAI,IAAI,IAAI,CAAC,QAAQ,CACtB,CAAC;AAEF,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7E,IAAW,CAAA,WAAA,GAAW,EAAE,CAAC;QACzB,IAAY,CAAA,YAAA,GAAc,EAAE,CAAC;QAC7B,IAAS,CAAA,SAAA,GAAY,KAAK,CAAC;QAC3B,IAAQ,CAAA,QAAA,GAAY,KAAK,CAAC;QAC1B,IAAY,CAAA,YAAA,GAAW,EAAE,CAAC;QAiF1B,IAAQ,CAAA,QAAA,GAAG,CAAC,CAAS,EAAE,IAAc,KAAK,IAAI,CAAC,UAAU,CAAC;KA5EtD;IAEJ,QAAQ,GAAA;QACN,IAAI,CAAC,oBAAoB,EAAE,CAAC;KAC7B;IAED,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;AAEtB,QAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC;AACpC,YAAA,IAAI,EAAE,CAAC,KAAK,KAAI;gBACd,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,IAAG;AAC7C,oBAAA,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;AACjC,oBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,YAAY,CAAC;;AAGpC,oBAAA,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACvE,wBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,qBAAA;AACD,oBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACzB,iBAAC,CAAC,CAAC;aACJ;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;AAC9C,gBAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;AACrB,gBAAA,IAAI,CAAC,YAAY,GAAG,0DAA0D,CAAC;AAC/E,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;aACxB;AACF,SAAA,CAAC,CAAC;KACJ;IAED,MAAM,cAAc,CAAC,KAAa,EAAA;QAChC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAChC,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;;AAGD,QAAA,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAkB,CAAC;;AAGtD,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,IAAI,IAAI,CAAC,UAAU,EAAE;gBACnB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;oBAC7C,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC9C,iBAAA;AACD,gBAAA,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AACtD,aAAA;AACF,SAAA;;QAGD,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;;AAGvF,QAAA,MAAM,SAAS,GAAG,CAAC,IAAU,EAAE,KAAa,KAAa;;AAEvD,YAAA,MAAM,aAAa,GAAG,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;;AAG7D,YAAA,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YAE3E,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,SAAS,IAAI,EAAE,CAAE,CAAA,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE;gBACvF,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,EAAE,EAAE,IAAI,CAAC,EAAE;AACX,gBAAA,KAAK,EAAE,KAAK;AACZ,gBAAA,UAAU,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;AAC/B,gBAAA,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ,GAAG,SAAS;gBACpD,SAAS,EAAE,QAAQ,CAAC,MAAM;aAC3B,CAAC;AACJ,SAAC,CAAC;;AAGF,QAAA,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;KACtD;AAID,IAAA,WAAW,CAAC,KAAY,EAAA;QACtB,MAAM,WAAW,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAE3E,IAAI,CAAC,WAAW,EAAE;YAChB,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC;YACzC,OAAO;AACR,SAAA;;AAGD,QAAA,MAAM,UAAU,GAAG,CAAC,IAAa,KAAoB;AACnD,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAChE,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC;YAElF,IAAI,SAAS,IAAI,aAAa,EAAE;AAC9B,gBAAA,OAAO,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAC,CAAC;AAC3C,aAAA;;YAGD,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,gBAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ;qBACnC,GAAG,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;qBAC/B,MAAM,CAAC,CAAC,KAAK,KAAuB,KAAK,KAAK,IAAI,CAAC,CAAC;AAEvD,gBAAA,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC/B,OAAO,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAC,CAAC;AAC9C,iBAAA;AACF,aAAA;YAED,OAAO,IAAI,CAAC;AACd,SAAC,CAAC;AAEF,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY;aACnC,GAAG,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;aAC7B,MAAM,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,CAAc,CAAC;AAE9C,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,YAAY,CAAC;;AAGpC,QAAA,IAAI,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;AAC7C,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;AAC9B,SAAA;KACF;;4HAzJU,8BAA8B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAX,WAAA,EAAA,EAAA,EAAA,KAAA,EAAA0B,uBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA9B,8BAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,8BAA8B,sFCjD3C,+nHA0FM,EAAA,MAAA,EAAA,CAAA,moFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDrDF,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAArB,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,EACZ,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,4BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,waACf,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,wBAAwB,kOACxB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;4FAKF,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAhB1C,SAAS;+BACE,4BAA4B,EAAA,UAAA,EAC1B,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,aAAa;wBACb,aAAa;wBACb,eAAe;wBACf,cAAc;wBACd,kBAAkB;wBAClB,wBAAwB;wBACxB,WAAW;AACZ,qBAAA,EAAA,QAAA,EAAA,+nHAAA,EAAA,MAAA,EAAA,CAAA,moFAAA,CAAA,EAAA,CAAA;;;MEqBU,wBAAwB,CAAA;AA0CnC,IAAA,WAAA,CACU,EAAe,EACf,WAAwB,EACxB,YAA0B,EAC1B,iBAAoC,EACpC,gBAAyC,EACzC,sBAAqD,EACtD,SAAiD,EACxB,IAA4C,EAAA;QAPpE,IAAE,CAAA,EAAA,GAAF,EAAE,CAAa;QACf,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QACxB,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;QAC1B,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB,CAAmB;QACpC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAyB;QACzC,IAAsB,CAAA,sBAAA,GAAtB,sBAAsB,CAA+B;QACtD,IAAS,CAAA,SAAA,GAAT,SAAS,CAAwC;QACxB,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAwC;QA/C9E,IAAK,CAAA,KAAA,GAAW,EAAE,CAAC;QACnB,IAAY,CAAA,YAAA,GAAgB,EAAE,CAAC;QAC/B,IAAgB,CAAA,gBAAA,GAAG,CAAC,CAAC;;QAGrB,IAAc,CAAA,cAAA,GAAG,KAAK,CAAC;QACvB,IAAY,CAAA,YAAA,GAAW,EAAE,CAAC;QAC1B,IAAc,CAAA,cAAA,GAAiB,EAAE,CAAC;;QAGlC,IAAgB,CAAA,gBAAA,GAAwE,EAAE,CAAC;QAC3F,IAAkB,CAAA,kBAAA,GAAG,KAAK,CAAC;;AAGnB,QAAA,IAAA,CAAA,YAAY,GAAG,CAAC,IAAgB,EAAE,KAAa,KAAoB;YACzE,OAAO;AACL,gBAAA,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACvD,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,gBAAA,KAAK,EAAE,KAAK;gBACZ,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC;AACJ,SAAC,CAAC;QAEF,IAAW,CAAA,WAAA,GAAG,IAAI,eAAe,CAC/B,IAAI,IAAI,IAAI,CAAC,KAAK,EAClB,IAAI,IAAI,IAAI,CAAC,UAAU,CACxB,CAAC;AAEF,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,gBAAgB,CAClC,IAAI,CAAC,YAAY,EACjB,IAAI,IAAI,IAAI,CAAC,KAAK,EAClB,IAAI,IAAI,IAAI,CAAC,UAAU,EACvB,IAAI,IAAI,IAAI,CAAC,QAAQ,CACtB,CAAC;AAEF,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAmM7E,IAAQ,CAAA,QAAA,GAAG,CAAC,CAAS,EAAE,IAAoB,KAAK,IAAI,CAAC,UAAU,CAAC;KAxL3D;IAEL,QAAQ,GAAA;QACN,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAExB,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACvC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACpC,SAAA;KACF;IAED,cAAc,GAAA;QACZ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;YAC7B,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACjC,WAAW,EAAE,CAAC,EAAE,CAAC;YACjB,UAAU,EAAE,CAAC,EAAE,CAAC;YAChB,WAAW,EAAE,CAAC,EAAE,CAAC;YACjB,KAAK,EAAE,CAAC,EAAE,CAAC;YACX,MAAM,EAAE,CAAC,QAAQ,CAAC;AACnB,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,YAAY,CAAC,KAAgB,EAAA;AAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;YACxB,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,YAAA,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;AACpC,YAAA,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;AAClC,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,KAAK,CAAC,MAAM;AACrB,SAAA,CAAC,CAAC;KACJ;IAED,SAAS,GAAA;QACP,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,KAAK,IAAG;AAC5C,YAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AACrB,SAAC,CAAC,CAAC;KACJ;IAED,gBAAgB,GAAA;QACd,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;;AAEvC,YAAA,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,IAAI,CAChCR,KAAG,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAChE,CAAC,SAAS,CAAC,MAAM,IAAG;AACnB,gBAAA,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;AAC7B,aAAC,CAAC,CAAC;AACJ,SAAA;AAAM,aAAA;YACL,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;AAC/C,gBAAA,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;AAC7B,aAAC,CAAC,CAAC;AACJ,SAAA;KACF;AAED,IAAA,WAAW,CAAC,KAAU,EAAA;;AAEpB,QAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC;;AAGpC,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE;YAC5D,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACzB,SAAA;;AAGD,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE;;YAE5D,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC7B,SAAA;KACF;IAED,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AACnD,YAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;AACzB,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,EAAE,CAAC;YAC1B,OAAO;AACR,SAAA;AAED,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;;QAG3B,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,KAAK,IAAG;;YAE5C,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;gBAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,IAAI,EAAE,CAAC;;gBAGrD,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,IACrC,IAAI,CAAC,sBAAsB,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,CAC5E,CAAC;AAEF,gBAAA,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC;;AAGlC,gBAAA,MAAM,WAAW,GAAe;AAC9B,oBAAA,EAAE,EAAE,cAAc;AAClB,oBAAA,IAAI,EAAE,SAAS;AACf,oBAAA,IAAI,EAAE,MAAM;oBACZ,QAAQ,EAAE,aAAa,CAAC,GAAG,CAAC,IAAI,KAAK;wBACnC,EAAE,EAAE,IAAI,CAAC,EAAE;AACX,wBAAA,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;AACnC,wBAAA,IAAI,EAAE,MAAM;AACZ,wBAAA,QAAQ,EAAE;4BACR,KAAK,EAAE,IAAI,CAAC,KAAK;4BACjB,UAAU,EAAE,IAAI,CAAC,UAAU;4BAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;AAChB,yBAAA;AACF,qBAAA,CAAC,CAAC;iBACJ,CAAC;AAEF,gBAAA,IAAI,CAAC,cAAc,GAAG,CAAC,WAAW,CAAC,CAAC;gBACpC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC;AAC3C,gBAAA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;;gBAG5B,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,EAAE;oBAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC/C,oBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACnC,iBAAA;AACH,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;KACJ;IAED,oBAAoB,GAAA;;AAElB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE;AAC3C,YAAA,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC7C,OAAO;AACR,SAAA;AACD,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;AAC/B,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;;AAE3B,QAAA,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC;AACtE,YAAA,IAAI,EAAE,CAAC,SAAS,KAAI;;;gBAIlB,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;;AAEvC,oBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;oBAChC,OAAO;AACR,iBAAA;;AAGD,gBAAA,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,KAAI;oBAClF,OAAO;wBACL,UAAU;AACV,wBAAA,YAAY,EAAE,UAAU;wBACxB,WAAW;qBACZ,CAAC;AACJ,iBAAC,CAAC,CAAC;;AAGH,gBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;;AAGhC,gBAAA,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;;AAErC,iBAAA;aACF;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;AACzD,gBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;aACjC;AACF,SAAA,CAAC,CAAC;KACJ;;AAGD,IAAA,kBAAkB,CAAC,IAAU,EAAA;QAC3B,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,OAAO,IAAI,CAAC,IAAI,CAAC;AAClB,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,EAAE;AACrC,YAAA,OAAO,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAI,CAAA,EAAA,IAAI,CAAC,SAAS,IAAI,EAAE,CAAA,CAAE,CAAC,IAAI,EAAE,CAAC;AAClE,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE;AAC5B,YAAA,OAAO,IAAI,CAAC,aAAa,CAAC,IAAc,CAAC;AAC1C,SAAA;QAED,OAAO,IAAI,CAAC,EAAE,CAAC;KAChB;AAID,IAAA,WAAW,CAAC,IAAoB,EAAA;QAC9B,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,QAAQ,CAAC;AAClB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,QAAQ,CAAC;AAClB,YAAA;AACE,gBAAA,OAAO,QAAQ,CAAC;AACnB,SAAA;KACF;AAED,IAAA,gBAAgB,CAAC,IAAoB,EAAA;QACnC,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,WAAW,CAAC;AACrB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,WAAW,CAAC;AACrB,YAAA;AACE,gBAAA,OAAO,WAAW,CAAC;AACtB,SAAA;KACF;IAED,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;KACxB;AAEO,IAAA,kBAAkB,CAAC,IAAY,EAAA;QACrC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;AAC/B,YAAA,OAAO,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AAC9B,SAAA;;AAGD,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;KACpB;IAED,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;YAC1B,OAAO;AACR,SAAA;AAED,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;;QAGvC,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE;YACjC,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACnD,SAAA;AAED,QAAA,MAAM,KAAK,GAAc;AACvB,YAAA,EAAE,EAAE,OAAO;AACX,YAAA,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,EAAE;AAC1B,YAAA,WAAW,EAAE,SAAS,CAAC,WAAW,IAAI,EAAE;AACxC,YAAA,UAAU,EAAE,SAAS,CAAC,UAAU,IAAI,EAAE;YACtC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,IAAI,CAAC;YAC9C,MAAM,EAAE,SAAS,CAAC,MAAM;SACzB,CAAC;AAEF,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;KAC7B;;AAvSU,wBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,wOAkDzB,eAAe,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAlDd,wBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,EClErC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,qmPA+JM,EDhHF,MAAA,EAAA,CAAA,igEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAQ,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,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,EAAAA,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,EAAA,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,0WACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAiB,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpB,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAd,GAAA,CAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,GAAA,CAAA,WAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAZ,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,mBAAmB,EACnB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,wBAAwB,EACxB,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,spBACb,wBAAwB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAyB,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;4FAKf,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAvBpC,SAAS;+BACE,uBAAuB,EAAA,UAAA,EACrB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,eAAe;wBACf,eAAe;wBACf,kBAAkB;wBAClB,cAAc;wBACd,eAAe;wBACf,iBAAiB;wBACjB,aAAa;wBACb,oBAAoB;wBACpB,aAAa;wBACb,WAAW;wBACX,mBAAmB;wBACnB,wBAAwB;wBACxB,aAAa;wBACb,wBAAwB;AACzB,qBAAA,EAAA,QAAA,EAAA,qmPAAA,EAAA,MAAA,EAAA,CAAA,igEAAA,CAAA,EAAA,CAAA;;0BAsDE,MAAM;2BAAC,eAAe,CAAA;;;;;;;;ME5Gd,eAAe,CAAA;IAC1B,WACsB,CAAA,WAAwB,EACS,MAA4B,EAAA;QAD7D,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QACS,IAAM,CAAA,MAAA,GAAN,MAAM,CAAsB;KAC/E;IAEJ,SAAS,CAAC,GAAyB,EAAE,IAAiB,EAAA;;AAEpD,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AAC5D,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACzB,SAAA;AAED,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;;AAG3C,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/D,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;QAIpD,MAAM,YAAY,GAAG,gBAAgB,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;;QAGnE,IAAI,CAAC,YAAY,EAAE;AACjB,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACzB,SAAA;;QAGD,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE;AACpC,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACzB,SAAA;;QAGD,IAAI;;YAEF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACrE,YAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,QAAQ,GAAG,GAAG,GAAG,QAAQ,CAAC;AAC3E,YAAA,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;;AAI1B,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;;AAGpE,YAAA,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC;AACxB,gBAAA,UAAU,EAAE;oBACV,eAAe,EAAE,CAAU,OAAA,EAAA,KAAK,CAAE,CAAA;AACnC,iBAAA;AACF,aAAA,CAAC,CAAC;AAGH,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC7B,SAAA;AAAC,QAAA,OAAO,KAAK,EAAE;;AAEd,YAAA,OAAO,CAAC,IAAI,CAAC,4DAA4D,EAAE,KAAK,CAAC,CAAC;AAClF,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACzB,SAAA;KACF;AAEO,IAAA,YAAY,CAAC,GAAW,EAAA;;QAE9B,IAAI,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;;QAEjD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;;AAE5C,QAAA,OAAO,UAAU,CAAC,WAAW,EAAE,CAAC;KACjC;;AAlEU,eAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,0DAGJ,uBAAuB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;iHAHlC,eAAe,EAAA,CAAA,CAAA;4FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B,UAAU;;0BAGN,QAAQ;;0BACR,QAAQ;;0BAAI,MAAM;2BAAC,uBAAuB,CAAA;;;ACX/C;;AAEG;AAEH;;ACJA;;AAEG;;;;"}